Skip to content

Commit 114f42e

Browse files
committed
Added datatypes generation to jinja2 generator and new datatypes
Qdiscs and Tfilters datatypes are missing documentation to recreate their fields
1 parent dda655f commit 114f42e

File tree

2 files changed

+137
-14
lines changed

2 files changed

+137
-14
lines changed

sdbus_async/networkmanager/settings/datatypes.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,108 @@ class WireguardPeers(NetworkManagerSettingsMixin):
121121
allowed_ips: List[str] = field(
122122
metadata={'dbus_name': 'allowed-ips', 'dbus_type': 'as'},
123123
)
124+
125+
126+
@dataclass
127+
class RoutingRules(NetworkManagerSettingsMixin):
128+
action: Optional[int] = field(
129+
metadata={'dbus_name': 'action', 'dbus_type': 'y'},
130+
)
131+
dport_end: Optional[int] = field(
132+
metadata={'dbus_name': 'dport-end', 'dbus_type': 'q'},
133+
)
134+
dport_start: Optional[int] = field(
135+
metadata={'dbus_name': 'dport-start', 'dbus_type': 'q'},
136+
)
137+
family: Optional[int] = field(
138+
metadata={'dbus_name': 'family', 'dbus_type': 'i'},
139+
)
140+
from_prefix: Optional[str] = field(
141+
metadata={'dbus_name': 'from', 'dbus_type': 's'},
142+
)
143+
from_len: Optional[int] = field(
144+
metadata={'dbus_name': 'from-len', 'dbus_type': 'y'},
145+
)
146+
fwmark: Optional[int] = field(
147+
metadata={'dbus_name': 'fwmark', 'dbus_type': 'u'},
148+
)
149+
fwmask: Optional[int] = field(
150+
metadata={'dbus_name': 'fwmask', 'dbus_type': 'u'},
151+
)
152+
iifname: Optional[str] = field(
153+
metadata={'dbus_name': 'iifname', 'dbus_type': 's'},
154+
)
155+
invert: Optional[bool] = field(
156+
metadata={'dbus_name': 'invert', 'dbus_type': 'b'},
157+
)
158+
ipproto: Optional[str] = field(
159+
metadata={'dbus_name': 'ipproto', 'dbus_type': 's'},
160+
)
161+
oifname: Optional[str] = field(
162+
metadata={'dbus_name': 'oifname', 'dbus_type': 's'},
163+
)
164+
priority: Optional[int] = field(
165+
metadata={'dbus_name': 'priority', 'dbus_type': 'u'},
166+
)
167+
sport_end: Optional[int] = field(
168+
metadata={'dbus_name': 'sport-end', 'dbus_type': 'q'},
169+
)
170+
sport_start: Optional[int] = field(
171+
metadata={'dbus_name': 'sport-start', 'dbus_type': 'q'},
172+
)
173+
supress_prefixlength: Optional[int] = field(
174+
metadata={'dbus_name': 'supress-prefixlength', 'dbus_type': 'i'},
175+
)
176+
table: Optional[int] = field(
177+
metadata={'dbus_name': 'table', 'dbus_type': 'u'},
178+
)
179+
to: Optional[str] = field(
180+
metadata={'dbus_name': 'to', 'dbus_type': 's'},
181+
)
182+
tos: Optional[int] = field(
183+
metadata={'dbus_name': 'tos', 'dbus_type': 'y'},
184+
)
185+
to_len: Optional[int] = field(
186+
metadata={'dbus_name': 'to-len', 'dbus_type': 'y'},
187+
)
188+
range_end: Optional[int] = field(
189+
metadata={'dbus_name': 'range-end', 'dbus_type': 'u'},
190+
)
191+
range_start: Optional[int] = field(
192+
metadata={'dbus_name': 'range-start', 'dbus_type': 'u'},
193+
)
194+
195+
196+
@dataclass
197+
class Vfs(NetworkManagerSettingsMixin):
198+
index: str = field(
199+
metadata={'dbus_name': 'index', 'dbus_type': 's'},
200+
)
201+
mac: Optional[str] = field(
202+
metadata={'dbus_name': 'mac', 'dbus_type': 's'},
203+
)
204+
spoof_check: Optional[str] = field(
205+
metadata={'dbus_name': 'spoof-check', 'dbus_type': 's'},
206+
)
207+
trust: Optional[str] = field(
208+
metadata={'dbus_name': 'trust', 'dbus_type': 's'},
209+
)
210+
min_tx_rate: Optional[str] = field(
211+
metadata={'dbus_name': 'min-tx-rate', 'dbus_type': 's'},
212+
)
213+
max_tx_rate: Optional[str] = field(
214+
metadata={'dbus_name': 'max-tx-rate', 'dbus_type': 's'},
215+
)
216+
vlans: Optional[str] = field(
217+
metadata={'dbus_name': 'vlans', 'dbus_type': 's'},
218+
)
219+
220+
221+
@dataclass
222+
class Qdiscs(NetworkManagerSettingsMixin):
223+
...
224+
225+
226+
@dataclass
227+
class Tfilters(NetworkManagerSettingsMixin):
228+
...

tools/generate-settings-dataclasses-jinja.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,17 @@
8282
'id': 'pretty_id',
8383
}
8484

85-
datatypes_extra_imports: dict[str, list[str]] = {
86-
'wireguard': ['WireguardPeers'],
87-
'bridge': ['Vlans'],
88-
'team': ['LinkWatchers'],
89-
'ip4_config': ['AddressData', 'RouteData'],
90-
'ip6_config': ['AddressData', 'RouteData'],
85+
86+
array_of_vardicts_python_classes: dict[str, str] = {
87+
'peers': 'WireguardPeers',
88+
'vlans': 'Vlans',
89+
'address-data': 'AddressData',
90+
'route-data': 'RouteData',
91+
'routing-rules': 'RoutingRules',
92+
'vfs': 'Vfs',
93+
'qdiscs': 'Qdiscs',
94+
'tfilters': 'Tfilters',
95+
'link-watchers': 'LinkWatchers',
9196
}
9297

9398

@@ -102,7 +107,6 @@ def __init__(self, name: str,
102107
description: str,
103108
name_upper: str,
104109
dbus_type: str,
105-
python_type: str,
106110
parent: NmSettingsIntrospection,
107111
default: Optional[str] = None,
108112
) -> None:
@@ -111,7 +115,6 @@ def __init__(self, name: str,
111115
self.name_upper = name_upper
112116
self.python_name = name_upper.lower()
113117
self.dbus_type = dbus_type
114-
self.python_type = python_type
115118
self.default = default
116119

117120
if must_replace_name(self.python_name):
@@ -122,6 +125,17 @@ def __init__(self, name: str,
122125
if extra_typing is not None:
123126
parent.typing_imports.update(extra_typing)
124127

128+
@cached_property
129+
def python_type(self) -> str:
130+
if self.dbus_type == 'aa{sv}':
131+
return f"List[{array_of_vardicts_python_classes[self.name]}]"
132+
133+
return dbus_to_python_type_map[self.dbus_type]
134+
135+
@cached_property
136+
def python_inner_class(self) -> Optional[str]:
137+
return array_of_vardicts_python_classes.get(self.name)
138+
125139

126140
class NmSettingsIntrospection:
127141
def __init__(self, name: str, description: str, name_upper: str,
@@ -141,10 +155,12 @@ def snake_name(self) -> str:
141155

142156
@cached_property
143157
def datatypes_imports(self) -> list[str]:
144-
try:
145-
return datatypes_extra_imports[self.snake_name]
146-
except KeyError:
147-
return []
158+
datatypes_found: list[str] = []
159+
for x in self.properties:
160+
if (datatype := x.python_inner_class) is not None:
161+
datatypes_found.append(datatype)
162+
163+
return datatypes_found
148164

149165

150166
def extract_and_format_option_description(node: Element) -> str:
@@ -171,7 +187,6 @@ def convert_property(node: Element,
171187
dbus_type = dbus_name_type_map[unconverted_type.split('(')[1][:-1]]
172188

173189
options['dbus_type'] = dbus_type
174-
options['python_type'] = dbus_to_python_type_map[dbus_type]
175190
options['description'] = extract_and_format_option_description(node)
176191

177192
return NmSettingPropertyIntrospection(**options, parent=parent)
@@ -211,6 +226,9 @@ class {{ setting.python_class_name }}(NetworkManagerSettingsMixin):
211226
metadata={
212227
'dbus_name': '{{ property.name }}',
213228
'dbus_type': '{{ property.dbus_type }}',
229+
{%- if property.python_inner_class %}
230+
'dbus_inner_class': {{ property.python_inner_class }},
231+
{%- endif %}
214232
},
215233
default=None,
216234
){% endfor %}
@@ -224,7 +242,7 @@ class {{ setting.python_class_name }}(NetworkManagerSettingsMixin):
224242
def main(
225243
settings_xml_path: Path,
226244
regex_filter: Optional[Pattern] = None,
227-
) -> None:
245+
) -> None:
228246
tree = parse(settings_xml_path)
229247
introspection = generate_introspection(tree.getroot())
230248

0 commit comments

Comments
 (0)