Skip to content

Commit 7275f42

Browse files
committed
Implement structural updates and clean up codebase for improved readability and maintainability
1 parent e1428e0 commit 7275f42

6 files changed

Lines changed: 115 additions & 742 deletions

File tree

.github/workflows/main.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
strategy:
1616
fail-fast: false
1717
matrix:
18-
python-version: ["3.9", "3.10", "3.11", "3.12"]
18+
python-version: ["3.11", "3.12", "3.13", "3.14"]
1919

2020
steps:
2121
- uses: actions/checkout@v6

pyproject.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ authors = [
77
{name = "Mick Vleeshouwer", email = "mick@imick.nl"},
88
]
99
license = {text = "MIT"}
10-
requires-python = ">=3.9,<4.0"
10+
requires-python = ">=3.11"
1111
keywords = ["sagemcom", "f@st"]
1212
dependencies = [
1313
"aiohttp>=3.7.3,<4.0.0",
1414
"pyhumps>=3.0.2,<4.0.0",
1515
"backoff>=1.10.0,<3.0",
16-
"backports-strenum>=1.3.1,<2.0; python_version < \"3.11\"",
1716
]
1817

1918
[project.urls]
@@ -48,7 +47,7 @@ only-packages = true
4847

4948
[tool.ruff]
5049
line-length = 140
51-
target-version = "py39"
50+
target-version = "py311"
5251

5352

5453
[tool.ruff.lint]

sagemcom_api/client.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from __future__ import annotations
44

5-
import asyncio
65
import hashlib
76
import json
87
import math
@@ -332,7 +331,7 @@ async def login(self):
332331

333332
try:
334333
response = await self.__api_request_async([actions], True)
335-
except asyncio.TimeoutError as exception:
334+
except TimeoutError as exception:
336335
raise LoginTimeoutException(
337336
"Login request timed-out. This could be caused by using the wrong encryption method, or using a (non) SSL connection."
338337
) from exception
@@ -358,7 +357,7 @@ async def logout(self):
358357

359358
async def get_encryption_method(self):
360359
"""Determine which encryption method to use for authentication and set it directly."""
361-
for encryption_method in EncryptionMethod: # ty: ignore[not-iterable]
360+
for encryption_method in EncryptionMethod:
362361
try:
363362
self.authentication_method = encryption_method
364363
self._password_hash = self.__generate_hash(self.password, encryption_method)
@@ -437,7 +436,7 @@ async def get_values_by_xpaths(self, xpaths, options: dict | None = None) -> dic
437436

438437
response = await self.__api_request_async(actions, False)
439438
values = [self.__get_response_value(response, i) for i in range(len(xpaths))]
440-
data = dict(zip(xpaths.keys(), values))
439+
data = dict(zip(xpaths.keys(), values, strict=True))
441440

442441
return data
443442

sagemcom_api/enums.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
"""Enums for the Sagemcom F@st client."""
22

3-
import sys
4-
from enum import unique
5-
6-
# Since we support Python versions lower than 3.11, we use
7-
# a backport for StrEnum when needed.
8-
if sys.version_info >= (3, 11):
9-
from enum import StrEnum
10-
else:
11-
from backports.strenum import StrEnum # ty: ignore[unresolved-import]
3+
from enum import StrEnum, unique
124

135

146
@unique

sagemcom_api/models.py

Lines changed: 91 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,51 @@
22

33
import dataclasses
44
from dataclasses import dataclass
5-
from typing import Any, Optional
5+
from typing import Any
66

77

88
# pylint: disable=too-many-instance-attributes
99
@dataclass
1010
class Device:
1111
"""Device connected to a router."""
1212

13-
uid: Optional[int] = None
14-
alias: Optional[str] = None
15-
phys_address: Optional[str] = None
16-
ip_address: Optional[str] = None
17-
address_source: Optional[str] = None
18-
dhcp_client: Optional[str] = None
19-
lease_time_remaining: Optional[int] = None
20-
associated_device: Optional[Any] = None
21-
layer1_interface: Optional[Any] = None
22-
layer3_interface: Optional[Any] = None
23-
vendor_class_id: Optional[Any] = None
24-
client_id: Optional[Any] = None
25-
user_class_id: Optional[Any] = None
26-
host_name: Optional[Any] = None
27-
active: Optional[bool] = None
28-
lease_start: Optional[int] = None
29-
lease_duration: Optional[int] = None
30-
interface_type: Optional[str] = None # enum!
31-
detected_device_type: Optional[str] = None
32-
active_last_change: Optional[Any] = None
33-
user_friendly_name: Optional[str] = None
34-
user_host_name: Optional[str] = None
35-
user_device_type: Optional[Any] = None # enum!
36-
icon: Optional[Any] = None
37-
room: Optional[Any] = None
38-
blacklist_enable: Optional[bool] = None
39-
blacklisted: Optional[bool] = None
40-
unblock_hours_count: Optional[int] = None
41-
blacklist_status: Optional[bool] = None
42-
blacklisted_according_to_schedule: Optional[bool] = None
43-
blacklisted_schedule: Optional[list] = None
44-
hidden: Optional[bool] = None
45-
options: Optional[list] = None
46-
vendor_class_idv6: Optional[Any] = None
47-
ipv4_addresses: Optional[list] = None
48-
ipv6_addresses: Optional[list] = None
49-
device_type_association: Optional[Any] = None
13+
uid: int | None = None
14+
alias: str | None = None
15+
phys_address: str | None = None
16+
ip_address: str | None = None
17+
address_source: str | None = None
18+
dhcp_client: str | None = None
19+
lease_time_remaining: int | None = None
20+
associated_device: Any | None = None
21+
layer1_interface: Any | None = None
22+
layer3_interface: Any | None = None
23+
vendor_class_id: Any | None = None
24+
client_id: Any | None = None
25+
user_class_id: Any | None = None
26+
host_name: Any | None = None
27+
active: bool | None = None
28+
lease_start: int | None = None
29+
lease_duration: int | None = None
30+
interface_type: str | None = None # enum!
31+
detected_device_type: str | None = None
32+
active_last_change: Any | None = None
33+
user_friendly_name: str | None = None
34+
user_host_name: str | None = None
35+
user_device_type: Any | None = None # enum!
36+
icon: Any | None = None
37+
room: Any | None = None
38+
blacklist_enable: bool | None = None
39+
blacklisted: bool | None = None
40+
unblock_hours_count: int | None = None
41+
blacklist_status: bool | None = None
42+
blacklisted_according_to_schedule: bool | None = None
43+
blacklisted_schedule: list | None = None
44+
hidden: bool | None = None
45+
options: list | None = None
46+
vendor_class_idv6: Any | None = None
47+
ipv4_addresses: list | None = None
48+
ipv6_addresses: list | None = None
49+
device_type_association: Any | None = None
5050

5151
# pylint:disable=fixme
5252
# TODO Remove extra kwargs before init
@@ -74,42 +74,42 @@ class DeviceInfo:
7474
"""Sagemcom Router representation."""
7575

7676
mac_address: str
77-
serial_number: Optional[str] = None
78-
manufacturer: Optional[Any] = None
79-
model_name: Optional[Any] = None
80-
model_number: Optional[Any] = None
81-
software_version: Optional[str] = None
82-
hardware_version: Optional[str] = None
83-
bootloader_version: Optional[Any] = None
84-
device_category: Optional[Any] = None
85-
manufacturer_oui: Optional[Any] = None
86-
product_class: Optional[str] = None
87-
description: Optional[str] = None
88-
additional_hardware_version: Optional[str] = None
89-
additional_software_version: Optional[str] = None
90-
external_firmware_version: Optional[str] = None
91-
internal_firmware_version: Optional[str] = None
92-
gui_firmware_version: Optional[str] = None
93-
guiapi_version: Optional[float] = None
94-
provisioning_code: Optional[str] = None
95-
up_time: Optional[int] = None
96-
first_use_date: Optional[str] = None
97-
mode: Optional[str] = None
98-
country: Optional[str] = None
99-
reboot_count: Optional[int] = None
100-
nodes_to_restore: Optional[str] = None
101-
router_name: Optional[str] = None
102-
reboot_status: Optional[float] = None
103-
reset_status: Optional[float] = None
104-
update_status: Optional[float] = None
105-
SNMP: Optional[bool] = None # pylint: disable=invalid-name
106-
first_connection: Optional[bool] = None
107-
build_date: Optional[str] = None
108-
spec_version: Optional[str] = None
109-
CLID: Optional[str] = None # pylint: disable=invalid-name
110-
flush_device_log: Optional[bool] = None
111-
locations: Optional[str] = None
112-
api_version: Optional[str] = None
77+
serial_number: str | None = None
78+
manufacturer: Any | None = None
79+
model_name: Any | None = None
80+
model_number: Any | None = None
81+
software_version: str | None = None
82+
hardware_version: str | None = None
83+
bootloader_version: Any | None = None
84+
device_category: Any | None = None
85+
manufacturer_oui: Any | None = None
86+
product_class: str | None = None
87+
description: str | None = None
88+
additional_hardware_version: str | None = None
89+
additional_software_version: str | None = None
90+
external_firmware_version: str | None = None
91+
internal_firmware_version: str | None = None
92+
gui_firmware_version: str | None = None
93+
guiapi_version: float | None = None
94+
provisioning_code: str | None = None
95+
up_time: int | None = None
96+
first_use_date: str | None = None
97+
mode: str | None = None
98+
country: str | None = None
99+
reboot_count: int | None = None
100+
nodes_to_restore: str | None = None
101+
router_name: str | None = None
102+
reboot_status: float | None = None
103+
reset_status: float | None = None
104+
update_status: float | None = None
105+
SNMP: bool | None = None # pylint: disable=invalid-name
106+
first_connection: bool | None = None
107+
build_date: str | None = None
108+
spec_version: str | None = None
109+
CLID: str | None = None # pylint: disable=invalid-name
110+
flush_device_log: bool | None = None
111+
locations: str | None = None
112+
api_version: str | None = None
113113

114114
# pylint:disable=fixme
115115
# TODO Remove extra kwargs before init
@@ -133,23 +133,23 @@ class PortMapping:
133133

134134
uid: int
135135
enable: bool
136-
status: Optional[str] = None # Enum
137-
alias: Optional[str] = None
138-
external_interface: Optional[str] = None
139-
all_external_interfaces: Optional[bool] = None
140-
lease_duration: Optional[int] = None
141-
external_port: Optional[int] = None
142-
external_port_end_range: Optional[int] = None
143-
internal_interface: Optional[str] = None
144-
internal_port: Optional[int] = None
145-
protocol: Optional[str] = None
146-
service: Optional[str] = None
147-
internal_client: Optional[str] = None
148-
public_ip: Optional[str] = None
149-
description: Optional[str] = None
150-
creator: Optional[str] = None
151-
target: Optional[str] = None
152-
lease_start: Optional[str] = None # Date?
136+
status: str | None = None # Enum
137+
alias: str | None = None
138+
external_interface: str | None = None
139+
all_external_interfaces: bool | None = None
140+
lease_duration: int | None = None
141+
external_port: int | None = None
142+
external_port_end_range: int | None = None
143+
internal_interface: str | None = None
144+
internal_port: int | None = None
145+
protocol: str | None = None
146+
service: str | None = None
147+
internal_client: str | None = None
148+
public_ip: str | None = None
149+
description: str | None = None
150+
creator: str | None = None
151+
target: str | None = None
152+
lease_start: str | None = None # Date?
153153

154154
# pylint:disable=fixme
155155
# TODO Remove extra kwargs before init

0 commit comments

Comments
 (0)