Skip to content

Commit f2cea60

Browse files
author
Bernhard Kaindl
committed
tools/generate-settings-dataclasses.py: Fix bond.py, generate options.rst
1 parent 90754db commit f2cea60

File tree

3 files changed

+173
-14
lines changed

3 files changed

+173
-14
lines changed

docs/options.rst

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
Network Manager settings
2+
========================
3+
4+
.. autoclass:: sdbus_async.networkmanager.settings.ConnectionSettings
5+
:members:
6+
7+
.. autoclass:: sdbus_async.networkmanager.settings.Ipv4Settings
8+
:members:
9+
10+
.. autoclass:: sdbus_async.networkmanager.settings.Ipv6Settings
11+
:members:
12+
13+
.. autoclass:: sdbus_async.networkmanager.settings.AdslSettings
14+
:members:
15+
16+
.. autoclass:: sdbus_async.networkmanager.settings.BluetoothSettings
17+
:members:
18+
19+
.. autoclass:: sdbus_async.networkmanager.settings.BondSettings
20+
:members:
21+
22+
.. autoclass:: sdbus_async.networkmanager.settings.BondPortSettings
23+
:members:
24+
25+
.. autoclass:: sdbus_async.networkmanager.settings.BridgeSettings
26+
:members:
27+
28+
.. autoclass:: sdbus_async.networkmanager.settings.BridgePortSettings
29+
:members:
30+
31+
.. autoclass:: sdbus_async.networkmanager.settings.CdmaSettings
32+
:members:
33+
34+
.. autoclass:: sdbus_async.networkmanager.settings.DcbSettings
35+
:members:
36+
37+
.. autoclass:: sdbus_async.networkmanager.settings.EthernetSettings
38+
:members:
39+
40+
.. autoclass:: sdbus_async.networkmanager.settings.GsmSettings
41+
:members:
42+
43+
.. autoclass:: sdbus_async.networkmanager.settings.HostnameSettings
44+
:members:
45+
46+
.. autoclass:: sdbus_async.networkmanager.settings.Ieee8021XSettings
47+
:members:
48+
49+
.. autoclass:: sdbus_async.networkmanager.settings.InfinibandSettings
50+
:members:
51+
52+
.. autoclass:: sdbus_async.networkmanager.settings.IpTunnelSettings
53+
:members:
54+
55+
.. autoclass:: sdbus_async.networkmanager.settings.LowpanSettings
56+
:members:
57+
58+
.. autoclass:: sdbus_async.networkmanager.settings.MacsecSettings
59+
:members:
60+
61+
.. autoclass:: sdbus_async.networkmanager.settings.MacvlanSettings
62+
:members:
63+
64+
.. autoclass:: sdbus_async.networkmanager.settings.MatchSettings
65+
:members:
66+
67+
.. autoclass:: sdbus_async.networkmanager.settings.OlpcMeshSettings
68+
:members:
69+
70+
.. autoclass:: sdbus_async.networkmanager.settings.OvsBridgeSettings
71+
:members:
72+
73+
.. autoclass:: sdbus_async.networkmanager.settings.OvsDpdkSettings
74+
:members:
75+
76+
.. autoclass:: sdbus_async.networkmanager.settings.OvsExternalIdsSettings
77+
:members:
78+
79+
.. autoclass:: sdbus_async.networkmanager.settings.OvsInterfaceSettings
80+
:members:
81+
82+
.. autoclass:: sdbus_async.networkmanager.settings.OvsPatchSettings
83+
:members:
84+
85+
.. autoclass:: sdbus_async.networkmanager.settings.OvsPortSettings
86+
:members:
87+
88+
.. autoclass:: sdbus_async.networkmanager.settings.PppSettings
89+
:members:
90+
91+
.. autoclass:: sdbus_async.networkmanager.settings.PppoeSettings
92+
:members:
93+
94+
.. autoclass:: sdbus_async.networkmanager.settings.ProxySettings
95+
:members:
96+
97+
.. autoclass:: sdbus_async.networkmanager.settings.SerialSettings
98+
:members:
99+
100+
.. autoclass:: sdbus_async.networkmanager.settings.TeamSettings
101+
:members:
102+
103+
.. autoclass:: sdbus_async.networkmanager.settings.TeamPortSettings
104+
:members:
105+
106+
.. autoclass:: sdbus_async.networkmanager.settings.TunSettings
107+
:members:
108+
109+
.. autoclass:: sdbus_async.networkmanager.settings.UserSettings
110+
:members:
111+
112+
.. autoclass:: sdbus_async.networkmanager.settings.VethSettings
113+
:members:
114+
115+
.. autoclass:: sdbus_async.networkmanager.settings.VlanSettings
116+
:members:
117+
118+
.. autoclass:: sdbus_async.networkmanager.settings.VpnSettings
119+
:members:
120+
121+
.. autoclass:: sdbus_async.networkmanager.settings.VrfSettings
122+
:members:
123+
124+
.. autoclass:: sdbus_async.networkmanager.settings.VxlanSettings
125+
:members:
126+
127+
.. autoclass:: sdbus_async.networkmanager.settings.WifiP2PSettings
128+
:members:
129+
130+
.. autoclass:: sdbus_async.networkmanager.settings.WimaxSettings
131+
:members:
132+
133+
.. autoclass:: sdbus_async.networkmanager.settings.WireguardSettings
134+
:members:
135+
136+
.. autoclass:: sdbus_async.networkmanager.settings.WirelessSettings
137+
:members:
138+
139+
.. autoclass:: sdbus_async.networkmanager.settings.WirelessSecuritySettings
140+
:members:
141+
142+
.. autoclass:: sdbus_async.networkmanager.settings.WpanSettings
143+
:members:

sdbus_async/networkmanager/settings/bond.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class BondSettings(NetworkManagerSettingsMixin):
2020
name."""
2121
options: Optional[Dict[str, str]] = field(
2222
metadata={'dbus_name': 'options', 'dbus_type': 'a{ss}'},
23-
default={'Mode': 'Balance-Rr'},
23+
default=field(default_factory = lambda: {'mode': 'balance-rr'}),
2424
)
2525
"""Dictionary of key/value pairs of bonding options. Both keys and values
2626
must be strings. Option names must contain only alphanumeric characters (ie,

tools/generate-settings-dataclasses.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# Based on NetworkManager-1.39.2/tools/generate-docs-nm-settings-docs-merge.py
33
# SPDX-License-Identifier: LGPL-2.1-or-later
44
import collections
5+
import io
6+
import os
57
import textwrap
68
import xml.etree.ElementTree as ElementTree
79
from argparse import ArgumentParser
@@ -216,34 +218,46 @@ def find_first_not_none(itr: List[Any]) -> Optional[Any]:
216218
return next((i for i in itr if i is not None), None)
217219

218220

221+
# Generate docs/options.rst, see:
222+
# https://github.com/python-sdbus/python-sdbus-networkmanager/pull/39#issuecomment-1186522147
223+
def open_options_rst() -> io.TextIOWrapper:
224+
options_rst = open("docs/options.rst", "w")
225+
options_rst.write("Network Manager settings\n========================\n")
226+
return options_rst
227+
228+
229+
def append_sphinx_autoclass(options_rst: io.TextIOWrapper, classname: str) -> None:
230+
classpath = f"sdbus_async.networkmanager.settings.{classname}"
231+
options_rst.write(f"\n.. autoclass:: {classpath}\n :members:\n")
232+
233+
219234
# The code quality of this function is poor(Sourcery says 5%), needs refactoring,
220235
# also see the rework in tools/generate-settings-dataclasses-jinja.py
221236
def main(settings_xml_path: Path) -> None:
237+
options_rst = open_options_rst()
222238
gl_input_files = [settings_xml_path]
223239

224240
xml_roots = [ElementTree.parse(f).getroot() for f in gl_input_files]
225241
assert all(root.tag == "nm-setting-docs" for root in xml_roots)
226242
settings_roots = [node_to_dict(root, "setting", "name")
227243
for root in xml_roots]
228244

229-
root_node = ElementTree.Element("nm-setting-docs")
230-
231245
# Generate the file header
232246
license = "SPDX-License-Identifier: LGPL-2.1-or-later"
233-
script = ("This file was generated by "
234-
"tools/generate-settings-dataclasses.py")
247+
script = "This file was generated by tools/generate-settings-dataclasses.py"
235248
header = f"""# {license}\n# {script},
236249
# if possible, please make changes by also updating the script.\n"""
237250
i = open("sdbus_async/networkmanager/settings/__init__.py", mode="w")
238-
p = open("sdbus_async/networkmanager/settings/profile.py", mode="r")
239-
profile_py = open("sdbus_async/networkmanager/settings/profile.py").read()
251+
profile_path = "sdbus_async/networkmanager/settings/profile.py"
252+
profile_py = open(profile_path).read()
240253

241254
# define start and end markers for generating part of settings/profile.py:
242255
start_string = "# start of the generated list of settings classes\n"
243256
start_index = profile_py.index(start_string) + len(start_string)
244257
end_string = " # end of the generated list of settings classes\n"
245258
end_index = profile_py.index(end_string)
246-
p = open("sdbus_async/networkmanager/settings/profile.py", mode="w")
259+
profile_path_new = f"{profile_path}.new"
260+
p = open(profile_path_new, mode="w")
247261

248262
# write the file headers
249263
i.write(header)
@@ -296,7 +310,6 @@ def main(settings_xml_path: Path) -> None:
296310
f.write("\n\n")
297311

298312
# Generate the settings_class and it's entry in profile.py:
299-
setting_node = ElementTree.SubElement(root_node, "setting")
300313
if module != "connection":
301314
p.write(f" {module}: Optional[{classname}] = field(\n")
302315
p.write(f" metadata={{'dbus_name': '{settingname}',\n")
@@ -305,7 +318,7 @@ def main(settings_xml_path: Path) -> None:
305318
p.write(" )\n")
306319
f.write("@dataclass\n")
307320
f.write(f"class {classname}(NetworkManagerSettingsMixin):\n")
308-
setting_node.set("name", settingname)
321+
append_sphinx_autoclass(options_rst, classname)
309322

310323
# generate the docstring of the new settings_class
311324
desc = node_get_attr(settings, "description")
@@ -316,8 +329,6 @@ def main(settings_xml_path: Path) -> None:
316329
for property in iter_keys_of_dicts(properties, key_fcn_property_name, f'{settingname}.'):
317330
property_name = property[len(settingname)+1:]
318331
properties_attrs = [p.get(property_name) for p in properties]
319-
property_node = ElementTree.SubElement(setting_node, "property")
320-
property_node.set("name", property_name)
321332
t = node_get_attr(properties_attrs, "type")
322333
attribute = property_name.replace('-', '_')
323334
for builtin in ["id", "type"]:
@@ -371,9 +382,13 @@ def main(settings_xml_path: Path) -> None:
371382
f.write(line.replace(":@", ": ") + '\n')
372383
default = node_get_attr(properties_attrs, "default")
373384
if default in ["{}", "0", "-1"]:
374-
default = "None"
385+
default = None
375386
if optional:
376-
f.write(f" default={str(default).title()},\n")
387+
if dbustype == "a{ss}" and default:
388+
default = f"field(default_factory = lambda: {default})"
389+
else:
390+
default = str(default).title() # FALSE -> False
391+
f.write(f" default={default},\n")
377392
f.write(" )\n")
378393

379394
# Generate docstrings for attributes: Not stored by python,
@@ -401,6 +416,7 @@ def main(settings_xml_path: Path) -> None:
401416
i.write(f" '{cls}',\n")
402417
i.write(")\n")
403418
p.write(profile_py[end_index:])
419+
os.rename(profile_path_new, profile_path)
404420

405421

406422
if __name__ == '__main__':

0 commit comments

Comments
 (0)