Skip to content

Commit 18fbfd8

Browse files
Add autodocs for nested and __map_ parameters (#216) (#220)
* Use new rst functions of GPL * Add optional "context" for description of structs * Make multiline text from yaml more robust * Do not sort the parameters (cherry picked from commit 11916f8) Co-authored-by: Christoph Fröhlich <christophfroehlich@users.noreply.github.com>
1 parent c31b843 commit 18fbfd8

File tree

1 file changed

+69
-3
lines changed

1 file changed

+69
-3
lines changed

_ext/generate_parameter_library.py

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,96 @@
22
from sphinx.util.docutils import SphinxDirective
33
from sphinx.util.nodes import nested_parse_with_titles
44
from docutils.statemachine import ViewList
5+
import yaml
6+
import re
57
from generate_parameter_library_py.parse_yaml import (
68
GenerateCode,
79
)
810
from generate_parameter_library_py.generate_markdown import (
911
DefaultConfigMarkdown,
10-
ParameterDetailMarkdown
12+
ParameterDetailMarkdown,
13+
RuntimeParameterDetailMarkdown
1114
)
1215

16+
def insert_additional_parameters_after(items, keys, insert_map):
17+
for key in insert_map.keys():
18+
# Define the level you're looking for
19+
level_to_find = key.split('.')[0]
20+
21+
# Reverse keys and find the index of the first occurrence of the level
22+
reversed_keys = list(reversed(keys))
23+
reversed_index = next((index for (index, item) in enumerate(reversed_keys) if item.split('.')[0] == level_to_find), None)
24+
25+
if reversed_index is not None:
26+
# If the level is found, insert the runtime_param_item after it in the original list
27+
index = len(keys) - 1 - reversed_index
28+
items = items[:index+1] + [insert_map[key]] + items[index+1:]
29+
keys = keys[:index+1] + [key] + keys[index+1:]
30+
else:
31+
# If the level is not found, append the runtime_param_item to the end of the list
32+
items.append(insert_map[key])
33+
keys.append(key)
34+
return items, keys
35+
36+
def insert_additional_parameters_before(items, keys, insert_map):
37+
for key in insert_map.keys():
38+
# Define the level you're looking for
39+
level_to_find = key.split('.')[0]
40+
41+
# Find the index of the first occurrence of the level in items
42+
index = next((index for (index, item) in enumerate(keys) if item.split('.')[0] == level_to_find), None)
43+
44+
if index is not None:
45+
# If the level is found, insert the runtime_param_item after it
46+
items = items[:index] + [insert_map[key]] + items[index:]
47+
keys = keys[:index] + [key] + keys[index:]
48+
else:
49+
# If the level is not found, append the runtime_param_item to the end of the list
50+
items.append(insert_map[key])
51+
keys.append(key)
52+
return items, keys
53+
1354
class GeneraterParameterLibraryDetails(SphinxDirective):
1455
required_arguments = 1
15-
optional_arguments = 0
56+
optional_arguments = 1 # context yaml file, "key: string"
1657

1758
def run(self):
1859
# get the absolute path from sphinx tree
1960
yaml_file = self.env.relfn2path(self.arguments[0], self.env.docname)[0]
61+
if len(self.arguments) > 1:
62+
context_yaml_file = self.env.relfn2path(self.arguments[1], self.env.docname)[0]
63+
with open(context_yaml_file, 'r') as file:
64+
context_yaml_data = yaml.safe_load(file)
65+
else:
66+
context_yaml_data = {}
2067

2168
gen_param_struct = GenerateCode("rst")
2269
gen_param_struct.parse(yaml_file, "")
2370

71+
# general parameters
2472
param_details = [
2573
ParameterDetailMarkdown(param)
2674
for param in gen_param_struct.declare_parameters
2775
]
28-
docs = "\n".join(str(val) for val in param_details)
76+
# runtime parameters, i.e., such with a __map_ key
77+
runtime_param_details = [
78+
RuntimeParameterDetailMarkdown(param)
79+
for param in gen_param_struct.declare_dynamic_parameters
80+
]
81+
82+
param_strings_keys = [detail.declare_parameters.parameter_name for detail in param_details]
83+
param_items = [str(detail) for detail in param_details]
84+
runtime_param_strings_map = {detail.declare_parameters.parameter_name: str(detail) for detail in runtime_param_details}
85+
# add optional context data from yaml. we don't use a jinja template here -> add the indent manually
86+
context_strings_map = {key: str(key) + "\n" +
87+
'\n'.join(' ' + line for line in str(value).replace('\\t', ' ').splitlines()) + "\n"
88+
for key, value in context_yaml_data.items()}
89+
90+
param_items, param_strings_keys = insert_additional_parameters_after(param_items, param_strings_keys, runtime_param_strings_map)
91+
param_items, param_strings_keys = insert_additional_parameters_before(param_items, param_strings_keys, context_strings_map)
92+
93+
docs = "\n".join(param_items)
94+
2995
# print(docs)
3096

3197
# Add the content one line at a time.

0 commit comments

Comments
 (0)