Skip to content

Commit dda655f

Browse files
committed
Added support for imports of extra datatypes to jinja2 generator
1 parent 245f975 commit dda655f

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

tools/generate-settings-dataclasses-jinja.py

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,19 @@
1111
# 2. cd build
1212
# 3. ninja man/nm-settings-docs-dbus.xml
1313
from __future__ import annotations
14-
from argparse import ArgumentParser
15-
from pathlib import Path
16-
from xml.etree.ElementTree import parse, Element
1714

18-
from typing import List, Optional
19-
from re import compile as regex_compile
20-
from re import Pattern
21-
from jinja2 import Environment
2215
import builtins
2316
import keyword
17+
from argparse import ArgumentParser
18+
from functools import cached_property
19+
from pathlib import Path
20+
from re import Pattern
21+
from re import compile as regex_compile
2422
from textwrap import fill
23+
from typing import List, Optional
24+
from xml.etree.ElementTree import Element, parse
2525

26+
from jinja2 import Environment
2627

2728
dbus_to_python_extra_typing_imports = {
2829
"as": ("List", ),
@@ -81,6 +82,14 @@
8182
'id': 'pretty_id',
8283
}
8384

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'],
91+
}
92+
8493

8594
def must_replace_name(name: str) -> bool:
8695
return (keyword.iskeyword(name)
@@ -126,6 +135,17 @@ def __init__(self, name: str, description: str, name_upper: str,
126135

127136
self.properties: List[NmSettingPropertyIntrospection] = []
128137

138+
@cached_property
139+
def snake_name(self) -> str:
140+
return self.name_upper.lower()
141+
142+
@cached_property
143+
def datatypes_imports(self) -> list[str]:
144+
try:
145+
return datatypes_extra_imports[self.snake_name]
146+
except KeyError:
147+
return []
148+
129149

130150
def extract_and_format_option_description(node: Element) -> str:
131151
paragraphs: list[str] = []
@@ -179,7 +199,9 @@ def generate_introspection(root: Element) -> List[NmSettingsIntrospection]:
179199
from dataclasses import dataclass, field
180200
from typing import {{ setting.typing_imports|sort|join(', ') }}
181201
from .base import NetworkManagerSettingsMixin
182-
202+
{% if setting.datatypes_imports -%}
203+
from .datatypes import {{ setting.datatypes_imports|sort|join(', ') }}
204+
{% endif %}
183205
184206
@dataclass
185207
class {{ setting.python_class_name }}(NetworkManagerSettingsMixin):
@@ -206,15 +228,14 @@ def main(
206228
tree = parse(settings_xml_path)
207229
introspection = generate_introspection(tree.getroot())
208230

209-
settings_dir = Path('sdbus_async/networkmanager/settings/')
231+
settings_dir = Path('./sdbus_async/networkmanager/settings/')
210232
for setting in introspection:
211-
setting_sake_name = setting.name_upper.lower()
212233

213234
if regex_filter is not None:
214-
if not regex_filter.match(setting_sake_name):
235+
if not regex_filter.match(setting.snake_name):
215236
continue
216237

217-
setting_py_file = settings_dir / (setting_sake_name + '.py')
238+
setting_py_file = settings_dir / (setting.snake_name + '.py')
218239
with open(setting_py_file, mode='w') as f:
219240
f.write(settings_template.render(setting=setting))
220241

0 commit comments

Comments
 (0)