docs: move generate-docs scripts from "libnm/" to "tools/"
They are not only used in "libnm/" directory. Move to "tools/".
This commit is contained in:
146
tools/generate-docs-nm-settings-docs-merge.py
Executable file
146
tools/generate-docs-nm-settings-docs-merge.py
Executable file
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: LGPL-2.1+
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
import collections
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
###############################################################################
|
||||
|
||||
_setting_name_order = [
|
||||
"connection",
|
||||
"6lowpan",
|
||||
"802-1x",
|
||||
"adsl",
|
||||
"bluetooth",
|
||||
"bond",
|
||||
"bridge",
|
||||
"bridge-port",
|
||||
"cdma",
|
||||
"dcb",
|
||||
"dummy",
|
||||
"ethtool",
|
||||
"generic",
|
||||
"gsm",
|
||||
"infiniband",
|
||||
"ipv4",
|
||||
"ipv6",
|
||||
"ip-tunnel",
|
||||
"macsec",
|
||||
"macvlan",
|
||||
"match",
|
||||
"802-11-olpc-mesh",
|
||||
"ovs-bridge",
|
||||
"ovs-dpdk",
|
||||
"ovs-interface",
|
||||
"ovs-patch",
|
||||
"ovs-port",
|
||||
"ppp",
|
||||
"pppoe",
|
||||
"proxy",
|
||||
"serial",
|
||||
"sriov",
|
||||
"tc",
|
||||
"team",
|
||||
"team-port",
|
||||
"tun",
|
||||
"user",
|
||||
"vlan",
|
||||
"vpn",
|
||||
"vrf",
|
||||
"vxlan",
|
||||
"wifi-p2p",
|
||||
"wimax",
|
||||
"802-3-ethernet",
|
||||
"wireguard",
|
||||
"802-11-wireless",
|
||||
"802-11-wireless-security",
|
||||
"wpan",
|
||||
]
|
||||
|
||||
def _setting_name_order_idx(name):
|
||||
try:
|
||||
return _setting_name_order.index(name)
|
||||
except ValueError:
|
||||
return len(_setting_name_order)
|
||||
|
||||
def key_fcn_setting_name(n1):
|
||||
return (_setting_name_order_idx(n1), n1)
|
||||
|
||||
def iter_keys_of_dicts(dicts, key = None):
|
||||
keys = set([k for d in dicts for k in d.keys()])
|
||||
return sorted(keys, key = key)
|
||||
|
||||
def node_to_dict(node, tag, key_attr):
|
||||
dictionary = collections.OrderedDict()
|
||||
if node is not None:
|
||||
for n in node.iter(tag):
|
||||
k = n.get(key_attr)
|
||||
assert(k is not None)
|
||||
dictionary[k] = n
|
||||
return dictionary
|
||||
|
||||
def node_get_attr(nodes, name):
|
||||
for n in nodes:
|
||||
if n is None:
|
||||
continue
|
||||
x = n.get(name, None)
|
||||
if x:
|
||||
return x
|
||||
return None
|
||||
|
||||
def node_set_attr(dst_node, name, nodes):
|
||||
x = node_get_attr(nodes, name)
|
||||
if x:
|
||||
dst_node.set(name, x)
|
||||
|
||||
###############################################################################
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print("%s [OUT_FILE] [SETTING_XML [...]]" % (sys.argv[0]))
|
||||
exit(1)
|
||||
|
||||
output_xml_file = sys.argv[1]
|
||||
|
||||
xml_roots = list([ET.parse(f).getroot() for f in sys.argv[2:]])
|
||||
|
||||
assert(all([root.tag == 'nm-setting-docs' for root in xml_roots]))
|
||||
|
||||
settings_roots = list([node_to_dict(root, 'setting', 'name') for root in xml_roots])
|
||||
|
||||
root_node = ET.Element('nm-setting-docs')
|
||||
|
||||
for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name):
|
||||
|
||||
settings = list([d.get(setting_name) for d in settings_roots])
|
||||
|
||||
setting_node = ET.SubElement(root_node, 'setting')
|
||||
|
||||
setting_node.set('name', setting_name)
|
||||
|
||||
node_set_attr(setting_node, 'description', settings)
|
||||
node_set_attr(setting_node, 'name_upper', settings)
|
||||
|
||||
properties = list([node_to_dict(s, 'property', 'name') for s in settings])
|
||||
|
||||
for property_name in iter_keys_of_dicts(properties):
|
||||
|
||||
properties_attrs = list([p.get(property_name) for p in properties])
|
||||
|
||||
property_node = ET.SubElement(setting_node, 'property')
|
||||
property_node.set('name', property_name)
|
||||
property_node.set('name_upper', property_name.upper().replace('-', '_'))
|
||||
|
||||
x = node_get_attr(properties_attrs, 'format')
|
||||
if x:
|
||||
property_node.set('type', x)
|
||||
else:
|
||||
node_set_attr(property_node, 'type', properties_attrs)
|
||||
|
||||
node_set_attr(property_node, 'default', properties_attrs)
|
||||
node_set_attr(property_node, 'description', properties_attrs)
|
||||
|
||||
ET.ElementTree(root_node).write(output_xml_file)
|
Reference in New Issue
Block a user