Skip to content

Commit 36ccf18

Browse files
authored
Merge pull request #18 from bernhardkaindl/settings-helper-generate
Yes.
2 parents 92b78f3 + f2a9a0e commit 36ccf18

File tree

4 files changed

+100
-90
lines changed

4 files changed

+100
-90
lines changed

sdbus_async/networkmanager/settings.py

Lines changed: 4 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -20,74 +20,16 @@
2020
from __future__ import annotations
2121

2222
from dataclasses import dataclass, field, fields
23-
from functools import lru_cache
24-
from typing import Any, Dict, List, Optional, Type, cast
23+
from typing import Any, Dict, List, Optional
2524

26-
from .types import (
27-
NetworkManagerConnectionProperties,
28-
NetworkManagerSettingsDomain,
29-
)
25+
from .settings.base import NetworkManagerSettingsMixin
26+
from .settings.datatypes import AddressData, RouteData
27+
from .types import NetworkManagerConnectionProperties
3028

3129
# See https://networkmanager.dev/docs/api/latest/nm-settings-dbus.html
3230
# for list of all settings
3331

3432

35-
class NetworkManagerSettingsMixin:
36-
37-
def to_dbus(self) -> NetworkManagerSettingsDomain:
38-
new_dict: NetworkManagerSettingsDomain = {}
39-
40-
for x in fields(self):
41-
value = getattr(self, x.name)
42-
if value is None:
43-
continue
44-
45-
if x.metadata['dbus_type'] == 'aa{sv}':
46-
packed_variant = ('aa{sv}', [x.to_dbus() for x in value])
47-
else:
48-
packed_variant = (x.metadata['dbus_type'], value)
49-
50-
new_dict[x.metadata['dbus_name']] = packed_variant
51-
52-
return new_dict
53-
54-
@classmethod
55-
def _unpack_variant(cls, key: str, signature: str, value: Any) -> Any:
56-
if signature == 'aa{sv}':
57-
inner_class = cls.setting_name_to_inner_class(key)
58-
return [inner_class.from_dbus(x) for x in value]
59-
60-
return value
61-
62-
@classmethod
63-
def from_dbus(cls,
64-
dbus_dict: NetworkManagerSettingsDomain,
65-
) -> NetworkManagerSettingsMixin:
66-
67-
reverse_mapping = cls.setting_name_reverse_mapping()
68-
unvarianted_options = {
69-
reverse_mapping[k]: cls._unpack_variant(k, *v)
70-
for k, v in dbus_dict.items()}
71-
72-
return cls(**unvarianted_options)
73-
74-
@classmethod
75-
@lru_cache(maxsize=None)
76-
def setting_name_reverse_mapping(cls) -> Dict[str, str]:
77-
return {f.metadata['dbus_name']: f.name for f in fields(cls)}
78-
79-
@classmethod
80-
@lru_cache(maxsize=None)
81-
def setting_name_to_inner_class(cls, setting_name: str) -> Type[Any]:
82-
for x in fields(cls):
83-
if setting_name != x.metadata['dbus_name']:
84-
continue
85-
86-
return cast(Type[Any], x.metadata['dbus_inner_class'])
87-
88-
raise ValueError('Inner class not found')
89-
90-
9133
@dataclass
9234
class ConnectionSettings(NetworkManagerSettingsMixin):
9335
auth_retries: Optional[int] = field(
@@ -196,34 +138,6 @@ class ConnectionSettings(NetworkManagerSettingsMixin):
196138
)
197139

198140

199-
@dataclass
200-
class AddressData(NetworkManagerSettingsMixin):
201-
address: str = field(
202-
metadata={'dbus_name': 'address', 'dbus_type': 's'},
203-
)
204-
prefix: int = field(
205-
metadata={'dbus_name': 'prefix', 'dbus_type': 'u'},
206-
)
207-
208-
209-
@dataclass
210-
class RouteData(NetworkManagerSettingsMixin):
211-
dest: str = field(
212-
metadata={'dbus_name': 'dest', 'dbus_type': 's'},
213-
)
214-
prefix: int = field(
215-
metadata={'dbus_name': 'prefix', 'dbus_type': 'u'},
216-
)
217-
next_hop: Optional[str] = field(
218-
metadata={'dbus_name': 'next-hop', 'dbus_type': 's'},
219-
default=None,
220-
)
221-
metric: Optional[int] = field(
222-
metadata={'dbus_name': 'metric', 'dbus_type': 'u'},
223-
default=None,
224-
)
225-
226-
227141
@dataclass
228142
class Ipv4Settings(NetworkManagerSettingsMixin):
229143
address_data: Optional[List[AddressData]] = field(

sdbus_async/networkmanager/settings/__init__.py

Whitespace-only changes.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from __future__ import annotations
2+
from dataclasses import fields
3+
from functools import lru_cache
4+
from typing import Any, Dict, Type, cast
5+
6+
from ..types import (
7+
NetworkManagerSettingsDomain,
8+
)
9+
10+
11+
class NetworkManagerSettingsMixin:
12+
def to_dbus(self) -> NetworkManagerSettingsDomain:
13+
"""TODO: Add proper docstring"""
14+
new_dict: NetworkManagerSettingsDomain = {}
15+
16+
for x in fields(self):
17+
value = getattr(self, x.name)
18+
if value is None:
19+
continue
20+
21+
if x.metadata['dbus_type'] == 'aa{sv}':
22+
packed_variant = ('aa{sv}', [x.to_dbus() for x in value])
23+
else:
24+
packed_variant = (x.metadata['dbus_type'], value)
25+
26+
new_dict[x.metadata['dbus_name']] = packed_variant
27+
28+
return new_dict
29+
30+
@classmethod
31+
def _unpack_variant(cls, key: str, signature: str, value: Any) -> Any:
32+
if signature == 'aa{sv}':
33+
inner_class = cls.setting_name_to_inner_class(key)
34+
return [inner_class.from_dbus(x) for x in value]
35+
36+
return value
37+
38+
@classmethod
39+
def from_dbus(
40+
cls,
41+
dbus_dict: NetworkManagerSettingsDomain,
42+
) -> NetworkManagerSettingsMixin:
43+
"""TODO: Add proper docstring"""
44+
reverse_mapping = cls.setting_name_reverse_mapping()
45+
unvarianted_options = {
46+
reverse_mapping[k]: cls._unpack_variant(k, *v)
47+
for k, v in dbus_dict.items()
48+
}
49+
return cls(**unvarianted_options)
50+
51+
@classmethod
52+
@lru_cache(maxsize=None)
53+
def setting_name_reverse_mapping(cls) -> Dict[str, str]:
54+
return {f.metadata['dbus_name']: f.name for f in fields(cls)}
55+
56+
@classmethod
57+
@lru_cache(maxsize=None)
58+
def setting_name_to_inner_class(cls, setting_name: str) -> Type[Any]:
59+
for x in fields(cls):
60+
if setting_name != x.metadata['dbus_name']:
61+
continue
62+
return cast(Type[Any], x.metadata['dbus_inner_class'])
63+
64+
raise ValueError('Inner class not found')
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from dataclasses import dataclass, field
2+
from typing import Optional
3+
4+
from .base import NetworkManagerSettingsMixin
5+
6+
7+
@dataclass
8+
class AddressData(NetworkManagerSettingsMixin):
9+
address: str = field(
10+
metadata={'dbus_name': 'address', 'dbus_type': 's'},
11+
)
12+
prefix: int = field(
13+
metadata={'dbus_name': 'prefix', 'dbus_type': 'u'},
14+
)
15+
16+
17+
@dataclass
18+
class RouteData(NetworkManagerSettingsMixin):
19+
dest: str = field(
20+
metadata={'dbus_name': 'dest', 'dbus_type': 's'},
21+
)
22+
prefix: int = field(
23+
metadata={'dbus_name': 'prefix', 'dbus_type': 'u'},
24+
)
25+
next_hop: Optional[str] = field(
26+
metadata={'dbus_name': 'next-hop', 'dbus_type': 's'},
27+
default=None,
28+
)
29+
metric: Optional[int] = field(
30+
metadata={'dbus_name': 'metric', 'dbus_type': 'u'},
31+
default=None,
32+
)

0 commit comments

Comments
 (0)