Skip to content

Commit 632f1e8

Browse files
author
Bernhard Kaindl
committed
to avoid circular imports, move the MixIn into a base module
1 parent 92b78f3 commit 632f1e8

File tree

3 files changed

+67
-62
lines changed

3 files changed

+67
-62
lines changed

sdbus_async/networkmanager/settings.py

Lines changed: 3 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -20,74 +20,15 @@
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 .types import NetworkManagerConnectionProperties
3027

3128
# See https://networkmanager.dev/docs/api/latest/nm-settings-dbus.html
3229
# for list of all settings
3330

3431

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-
9132
@dataclass
9233
class ConnectionSettings(NetworkManagerSettingsMixin):
9334
auth_retries: Optional[int] = 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')

0 commit comments

Comments
 (0)