diff --git a/hcloud/actions/domain.py b/hcloud/actions/domain.py index aa7f2fd9..fd14bfcf 100644 --- a/hcloud/actions/domain.py +++ b/hcloud/actions/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from .._exceptions import HCloudException from ..core import BaseDomain @@ -59,8 +57,8 @@ def __init__( self.status = status self.progress = progress - self.started = isoparse(started) if started else None - self.finished = isoparse(finished) if finished else None + self.started = self._parse_datetime(started) + self.finished = self._parse_datetime(finished) self.resources = resources self.error = error diff --git a/hcloud/certificates/domain.py b/hcloud/certificates/domain.py index 6b231ed1..455ea4ad 100644 --- a/hcloud/certificates/domain.py +++ b/hcloud/certificates/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -69,9 +67,9 @@ def __init__( self.certificate = certificate self.domain_names = domain_names self.fingerprint = fingerprint - self.not_valid_before = isoparse(not_valid_before) if not_valid_before else None - self.not_valid_after = isoparse(not_valid_after) if not_valid_after else None - self.created = isoparse(created) if created else None + self.not_valid_before = self._parse_datetime(not_valid_before) + self.not_valid_after = self._parse_datetime(not_valid_after) + self.created = self._parse_datetime(created) self.labels = labels self.status = status diff --git a/hcloud/core/domain.py b/hcloud/core/domain.py index b2ac1972..245d658b 100644 --- a/hcloud/core/domain.py +++ b/hcloud/core/domain.py @@ -1,6 +1,9 @@ from __future__ import annotations -from typing import Any +from datetime import datetime +from typing import Any, overload + +from dateutil.parser import isoparse class BaseDomain: @@ -27,6 +30,16 @@ def __eq__(self, other: Any) -> bool: return False return True + @overload + def _parse_datetime(self, value: str) -> datetime: ... + @overload + def _parse_datetime(self, value: None) -> None: ... + + def _parse_datetime(self, value: str | None) -> datetime | None: + if value is None: + return None + return isoparse(value) + class DomainIdentityMixin: diff --git a/hcloud/deprecation/domain.py b/hcloud/deprecation/domain.py index 152a24e4..c34915b3 100644 --- a/hcloud/deprecation/domain.py +++ b/hcloud/deprecation/domain.py @@ -1,7 +1,5 @@ from __future__ import annotations -from dateutil.parser import isoparse - from ..core import BaseDomain @@ -28,7 +26,5 @@ def __init__( announced: str | None = None, unavailable_after: str | None = None, ): - self.announced = isoparse(announced) if announced else None - self.unavailable_after = ( - isoparse(unavailable_after) if unavailable_after else None - ) + self.announced = self._parse_datetime(announced) + self.unavailable_after = self._parse_datetime(unavailable_after) diff --git a/hcloud/firewalls/domain.py b/hcloud/firewalls/domain.py index 991eb8ba..d644a051 100644 --- a/hcloud/firewalls/domain.py +++ b/hcloud/firewalls/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING, Any -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -46,7 +44,7 @@ def __init__( self.rules = rules self.applied_to = applied_to self.labels = labels - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) class FirewallRule(BaseDomain): diff --git a/hcloud/floating_ips/domain.py b/hcloud/floating_ips/domain.py index 1b02d8c0..a9114170 100644 --- a/hcloud/floating_ips/domain.py +++ b/hcloud/floating_ips/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -83,7 +81,7 @@ def __init__( self.blocked = blocked self.protection = protection self.labels = labels - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.name = name diff --git a/hcloud/images/domain.py b/hcloud/images/domain.py index 497bedb4..ee610ff9 100644 --- a/hcloud/images/domain.py +++ b/hcloud/images/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -96,11 +94,11 @@ def __init__( self.id = id self.name = name self.type = type - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.description = description self.image_size = image_size self.disk_size = disk_size - self.deprecated = isoparse(deprecated) if deprecated else None + self.deprecated = self._parse_datetime(deprecated) self.bound_to = bound_to self.os_flavor = os_flavor self.os_version = os_version diff --git a/hcloud/load_balancers/domain.py b/hcloud/load_balancers/domain.py index fbedf650..8aa8b1f5 100644 --- a/hcloud/load_balancers/domain.py +++ b/hcloud/load_balancers/domain.py @@ -3,8 +3,6 @@ import warnings from typing import TYPE_CHECKING, Any, Literal -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -93,7 +91,7 @@ def __init__( ): self.id = id self.name = name - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.public_net = public_net self.private_net = private_net self.location = location diff --git a/hcloud/metrics/domain.py b/hcloud/metrics/domain.py index c7e1f55a..69091d27 100644 --- a/hcloud/metrics/domain.py +++ b/hcloud/metrics/domain.py @@ -3,8 +3,6 @@ from datetime import datetime from typing import Literal -from dateutil.parser import isoparse - from ..core import BaseDomain TimeSeries = dict[str, dict[Literal["values"], list[tuple[float, str]]]] @@ -41,7 +39,7 @@ def __init__( step: float, time_series: TimeSeries, ): - self.start = isoparse(start) - self.end = isoparse(end) + self.start = self._parse_datetime(start) + self.end = self._parse_datetime(end) self.step = step self.time_series = time_series diff --git a/hcloud/networks/domain.py b/hcloud/networks/domain.py index 44311143..63c0d7b7 100644 --- a/hcloud/networks/domain.py +++ b/hcloud/networks/domain.py @@ -3,8 +3,6 @@ import warnings from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -65,7 +63,7 @@ def __init__( ): self.id = id self.name = name - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.ip_range = ip_range self.subnets = subnets self.routes = routes diff --git a/hcloud/placement_groups/domain.py b/hcloud/placement_groups/domain.py index 43151404..59958ace 100644 --- a/hcloud/placement_groups/domain.py +++ b/hcloud/placement_groups/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -50,7 +48,7 @@ def __init__( self.labels = labels self.servers = servers self.type = type - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) class CreatePlacementGroupResponse(BaseDomain): diff --git a/hcloud/primary_ips/domain.py b/hcloud/primary_ips/domain.py index 7cb0fa6f..e6217b01 100644 --- a/hcloud/primary_ips/domain.py +++ b/hcloud/primary_ips/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -84,7 +82,7 @@ def __init__( self.blocked = blocked self.protection = protection self.labels = labels - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.name = name self.assignee_id = assignee_id self.assignee_type = assignee_type diff --git a/hcloud/servers/domain.py b/hcloud/servers/domain.py index df9c0a43..d94068eb 100644 --- a/hcloud/servers/domain.py +++ b/hcloud/servers/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING, Literal -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -135,7 +133,7 @@ def __init__( self.id = id self.name = name self.status = status - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.public_net = public_net self.server_type = server_type self.datacenter = datacenter diff --git a/hcloud/ssh_keys/domain.py b/hcloud/ssh_keys/domain.py index 8f8bddad..1d957ba1 100644 --- a/hcloud/ssh_keys/domain.py +++ b/hcloud/ssh_keys/domain.py @@ -1,7 +1,5 @@ from __future__ import annotations -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin @@ -46,4 +44,4 @@ def __init__( self.fingerprint = fingerprint self.public_key = public_key self.labels = labels - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) diff --git a/hcloud/storage_boxes/domain.py b/hcloud/storage_boxes/domain.py index 7d94fcb2..85470954 100644 --- a/hcloud/storage_boxes/domain.py +++ b/hcloud/storage_boxes/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING, Any, Literal -from dateutil.parser import isoparse - from ..actions import BoundAction from ..core import BaseDomain, DomainIdentityMixin from ..locations import BoundLocation, Location @@ -82,7 +80,7 @@ def __init__( self.access_settings = access_settings self.stats = stats self.status = status - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) class StorageBoxAccessSettings(BaseDomain): @@ -285,7 +283,7 @@ def __init__( self.is_automatic = is_automatic self.labels = labels self.storage_box = storage_box - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.stats = stats @@ -386,7 +384,7 @@ def __init__( self.access_settings = access_settings self.labels = labels self.storage_box = storage_box - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) class StorageBoxSubaccountAccessSettings(BaseDomain): diff --git a/hcloud/volumes/domain.py b/hcloud/volumes/domain.py index f2934373..4c4fcb7f 100644 --- a/hcloud/volumes/domain.py +++ b/hcloud/volumes/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -77,7 +75,7 @@ def __init__( self.id = id self.name = name self.server = server - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.location = location self.size = size self.linux_device = linux_device diff --git a/hcloud/zones/domain.py b/hcloud/zones/domain.py index cb80ef5c..ad24035f 100644 --- a/hcloud/zones/domain.py +++ b/hcloud/zones/domain.py @@ -2,8 +2,6 @@ from typing import TYPE_CHECKING, Any, Literal, TypedDict -from dateutil.parser import isoparse - from ..core import BaseDomain, DomainIdentityMixin if TYPE_CHECKING: @@ -78,7 +76,7 @@ def __init__( ): self.id = id self.name = name - self.created = isoparse(created) if created else None + self.created = self._parse_datetime(created) self.mode = mode self.ttl = ttl self.labels = labels @@ -185,11 +183,7 @@ def __init__( ): self.assigned = assigned self.delegated = delegated - self.delegation_last_check = ( - isoparse(delegation_last_check) - if delegation_last_check is not None - else None - ) + self.delegation_last_check = self._parse_datetime(delegation_last_check) self.delegation_status = delegation_status diff --git a/tests/unit/core/test_domain.py b/tests/unit/core/test_domain.py index 73cab892..bfef1129 100644 --- a/tests/unit/core/test_domain.py +++ b/tests/unit/core/test_domain.py @@ -99,7 +99,7 @@ class ActionDomain(BaseDomain, DomainIdentityMixin): def __init__(self, id, name="name1", started=None): self.id = id self.name = name - self.started = isoparse(started) if started else None + self.started = self._parse_datetime(started) class SomeOtherDomain(BaseDomain):