Skip to content

Commit 48561a6

Browse files
authored
refactor: improve type hints (#273)
* refactor: add type hints * refactor: create to_payload for load_balancer domains * chore: enable mypy disallow_untyped_defs
1 parent ec7c4d2 commit 48561a6

20 files changed

Lines changed: 312 additions & 302 deletions

File tree

hcloud/_client.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import time
4+
from typing import NoReturn
45

56
import requests
67

@@ -167,21 +168,21 @@ def _get_headers(self) -> dict:
167168
}
168169
return headers
169170

170-
def _raise_exception_from_response(self, response: requests.Response):
171+
def _raise_exception_from_response(self, response: requests.Response) -> NoReturn:
171172
raise APIException(
172173
code=response.status_code,
173174
message=response.reason,
174175
details={"content": response.content},
175176
)
176177

177-
def _raise_exception_from_content(self, content: dict):
178+
def _raise_exception_from_content(self, content: dict) -> NoReturn:
178179
raise APIException(
179180
code=content["error"]["code"],
180181
message=content["error"]["message"],
181182
details=content["error"]["details"],
182183
)
183184

184-
def request(
185+
def request( # type: ignore[no-untyped-def]
185186
self,
186187
method: str,
187188
url: str,

hcloud/core/client.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def __init__(self, client: Client):
1919
"""
2020
self._client = client
2121

22-
def _get_all(
22+
def _get_all( # type: ignore[no-untyped-def]
2323
self,
2424
list_function: Callable,
2525
*args,
@@ -49,11 +49,11 @@ def _get_all(
4949

5050
return results
5151

52-
def get_all(self, *args, **kwargs) -> list:
52+
def get_all(self, *args, **kwargs) -> list: # type: ignore[no-untyped-def]
5353
assert hasattr(self, "get_list")
5454
return self._get_all(self.get_list, *args, **kwargs)
5555

56-
def get_actions(self, *args, **kwargs) -> list[BoundAction]:
56+
def get_actions(self, *args, **kwargs) -> list[BoundAction]: # type: ignore[no-untyped-def]
5757
if not hasattr(self, "get_actions_list"):
5858
raise ValueError("this endpoint does not support get_actions method")
5959

@@ -65,7 +65,7 @@ class GetEntityByNameMixin:
6565
Use as a mixin for ClientEntityBase classes
6666
"""
6767

68-
def get_by_name(self, name: str):
68+
def get_by_name(self, name: str): # type: ignore[no-untyped-def]
6969
assert hasattr(self, "get_list")
7070
entities, _ = self.get_list(name=name)
7171
return entities[0] if entities else None
@@ -94,7 +94,7 @@ def __init__(
9494
self.complete = complete
9595
self.data_model = self.model.from_dict(data)
9696

97-
def __getattr__(self, name: str):
97+
def __getattr__(self, name: str): # type: ignore[no-untyped-def]
9898
"""Allow magical access to the properties of the model
9999
:param name: str
100100
:return:
@@ -105,8 +105,9 @@ def __getattr__(self, name: str):
105105
value = getattr(self.data_model, name)
106106
return value
107107

108-
def reload(self):
108+
def reload(self) -> None:
109109
"""Reloads the model and tries to get all data from the APIx"""
110+
assert hasattr(self._client, "get_by_id")
110111
bound_model = self._client.get_by_id(self.data_model.id)
111112
self.data_model = bound_model.data_model
112113
self.complete = True

hcloud/core/domain.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class BaseDomain:
55
__slots__ = ()
66

77
@classmethod
8-
def from_dict(cls, data: dict):
8+
def from_dict(cls, data: dict): # type: ignore[no-untyped-def]
99
supported_data = {k: v for k, v in data.items() if k in cls.__slots__}
1010
return cls(**supported_data)
1111

hcloud/firewalls/domain.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import TYPE_CHECKING
3+
from typing import TYPE_CHECKING, Any
44

55
from dateutil.parser import isoparse
66

@@ -33,12 +33,12 @@ class Firewall(BaseDomain):
3333

3434
def __init__(
3535
self,
36-
id=None,
37-
name=None,
38-
labels=None,
39-
rules=None,
40-
applied_to=None,
41-
created=None,
36+
id: int | None = None,
37+
name: str | None = None,
38+
labels: dict[str, str] | None = None,
39+
rules: list[FirewallRule] | None = None,
40+
applied_to: list[FirewallResource] | None = None,
41+
created: str | None = None,
4242
):
4343
self.id = id
4444
self.name = name
@@ -107,18 +107,18 @@ def __init__(
107107
self.destination_ips = destination_ips or []
108108
self.description = description
109109

110-
def to_payload(self):
111-
payload = {
110+
def to_payload(self) -> dict[str, Any]:
111+
payload: dict[str, Any] = {
112112
"direction": self.direction,
113113
"protocol": self.protocol,
114114
"source_ips": self.source_ips,
115115
}
116116
if len(self.destination_ips) > 0:
117-
payload.update({"destination_ips": self.destination_ips})
117+
payload["destination_ips"] = self.destination_ips
118118
if self.port is not None:
119-
payload.update({"port": self.port})
119+
payload["port"] = self.port
120120
if self.description is not None:
121-
payload.update({"description": self.description})
121+
payload["description"] = self.description
122122
return payload
123123

124124

@@ -150,15 +150,13 @@ def __init__(
150150
self.server = server
151151
self.label_selector = label_selector
152152

153-
def to_payload(self):
154-
payload = {"type": self.type}
153+
def to_payload(self) -> dict[str, Any]:
154+
payload: dict[str, Any] = {"type": self.type}
155155
if self.server is not None:
156-
payload.update({"server": {"id": self.server.id}})
156+
payload["server"] = {"id": self.server.id}
157157

158158
if self.label_selector is not None:
159-
payload.update(
160-
{"label_selector": {"selector": self.label_selector.selector}}
161-
)
159+
payload["label_selector"] = {"selector": self.label_selector.selector}
162160
return payload
163161

164162

@@ -168,7 +166,7 @@ class FirewallResourceLabelSelector(BaseDomain):
168166
:param selector: str Target label selector
169167
"""
170168

171-
def __init__(self, selector=None):
169+
def __init__(self, selector: str | None = None):
172170
self.selector = selector
173171

174172

hcloud/floating_ips/domain.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
if TYPE_CHECKING:
1010
from ..actions import BoundAction
11+
from ..locations import BoundLocation
12+
from ..servers import BoundServer
1113
from .client import BoundFloatingIP
1214

1315

@@ -57,18 +59,18 @@ class FloatingIP(BaseDomain):
5759

5860
def __init__(
5961
self,
60-
id=None,
61-
type=None,
62-
description=None,
63-
ip=None,
64-
server=None,
65-
dns_ptr=None,
66-
home_location=None,
67-
blocked=None,
68-
protection=None,
69-
labels=None,
70-
created=None,
71-
name=None,
62+
id: int | None = None,
63+
type: str | None = None,
64+
description: str | None = None,
65+
ip: str | None = None,
66+
server: BoundServer | None = None,
67+
dns_ptr: list[dict] | None = None,
68+
home_location: BoundLocation | None = None,
69+
blocked: bool | None = None,
70+
protection: dict | None = None,
71+
labels: dict[str, str] | None = None,
72+
created: str | None = None,
73+
name: str | None = None,
7274
):
7375
self.id = id
7476
self.type = type

hcloud/isos/domain.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ class Iso(BaseDomain, DomainIdentityMixin):
2626

2727
def __init__(
2828
self,
29-
id=None,
30-
name=None,
31-
type=None,
32-
architecture=None,
33-
description=None,
34-
deprecated=None,
29+
id: int | None = None,
30+
name: str | None = None,
31+
type: str | None = None,
32+
architecture: str | None = None,
33+
description: str | None = None,
34+
deprecated: str | None = None,
3535
):
3636
self.id = id
3737
self.name = name

hcloud/load_balancer_types/domain.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ class LoadBalancerType(BaseDomain, DomainIdentityMixin):
3838

3939
def __init__(
4040
self,
41-
id=None,
42-
name=None,
43-
description=None,
44-
max_connections=None,
45-
max_services=None,
46-
max_targets=None,
47-
max_assigned_certificates=None,
48-
prices=None,
41+
id: int | None = None,
42+
name: str | None = None,
43+
description: str | None = None,
44+
max_connections: int | None = None,
45+
max_services: int | None = None,
46+
max_targets: int | None = None,
47+
max_assigned_certificates: int | None = None,
48+
prices: dict | None = None,
4949
):
5050
self.id = id
5151
self.name = name

0 commit comments

Comments
 (0)