diff options
Diffstat (limited to 'docs/_ext')
-rw-r--r-- | docs/_ext/testcoverage.py | 43 | ||||
-rw-r--r-- | docs/_ext/vyos.py | 116 |
2 files changed, 135 insertions, 24 deletions
diff --git a/docs/_ext/testcoverage.py b/docs/_ext/testcoverage.py index 3d1461a9..efe6e01d 100644 --- a/docs/_ext/testcoverage.py +++ b/docs/_ext/testcoverage.py @@ -1,14 +1,13 @@ ''' generate json with all commands from xml for vyos documentation coverage - ''' - import sys import os import json import re import logging +import datetime from io import BytesIO from lxml import etree as ET @@ -33,11 +32,32 @@ input_data = [ } ] +vyos_commands_dir = "_include/coverage" + node_data = { 'cfgcmd': {}, 'opcmd': {}, } + +def get_vyos_commands(): + return_data = None + for (dirpath, dirnames, filenames) in os.walk(vyos_commands_dir): + for file in filenames: + with open(f"{vyos_commands_dir}/{file}") as f: + data = json.load(f) + + if not return_data: + return_data = data + + # find latestes export + if datetime.datetime.fromisoformat(return_data['date']) < datetime.datetime.fromisoformat(data['date']): + return_data = data + + return return_data + + + def get_properties(p): props = {} props['valueless'] = False @@ -155,12 +175,18 @@ def get_properties(p): def process_node(n, f): + props_elem = n.find("properties") children = n.find("children") command = n.find("command") children_nodes = [] owner = n.get("owner") node_type = n.tag + defaultvalue = n.find("defaultValue") + + if defaultvalue is not None: + defaultvalue = defaultvalue.text + name = n.get("name") props = get_properties(props_elem) @@ -198,7 +224,9 @@ def process_node(n, f): 'children': children_nodes, 'props': props, 'command': test_command, - 'filename': f + 'filename': f, + 'defaultvalue': defaultvalue + } return node @@ -212,9 +240,11 @@ def create_commands(data, parent_list=[], level=0): 'tag_help': [], 'level': level, 'no_childs': False, - 'filename': None + 'filename': None, + 'defaultvalue': None, } command['filename'] = data['filename'] + command['defaultvalue'] = data['defaultvalue'] command['name'].extend(parent_list) command['name'].append(data['name']) @@ -328,6 +358,7 @@ def get_working_commands(): 'children': [], 'command': node_data[kind][entry]['command'], 'filename': node_data[kind][entry]['filename'], + 'defaultvalue': node_data[kind][entry]['defaultvalue'] } config_tree_new[kind][node_0]['children'].extend(node_data[kind][entry]['children']) @@ -378,6 +409,4 @@ def override_element(l: list): el.getparent().remove(el) if __name__ == "__main__": - res = get_working_commands() - print(json.dumps(res)) - #print(res['cfgcmd'][0]) + get_vyos_commands() diff --git a/docs/_ext/vyos.py b/docs/_ext/vyos.py index caa51a90..61b7519d 100644 --- a/docs/_ext/vyos.py +++ b/docs/_ext/vyos.py @@ -2,13 +2,14 @@ import re import json import os from datetime import datetime +from unittest import defaultTestLoader from docutils import io, nodes, utils, statemachine from docutils.parsers.rst.roles import set_classes from docutils.parsers.rst import Directive, directives, states from sphinx.util.docutils import SphinxDirective -from testcoverage import get_working_commands +from testcoverage import get_working_commands, get_vyos_commands from sphinx.util import logging @@ -29,6 +30,11 @@ def setup(app): 'html' ) app.add_config_value( + 'vyos_commands', + get_vyos_commands(), + 'html' + ) + app.add_config_value( 'vyos_coverage', { 'cfgcmd': [0,len(app.config.vyos_working_commands['cfgcmd'])], @@ -393,6 +399,21 @@ class OpcmdlistDirective(Directive): return [oplist] +def get_default_value(title_text, config, cfgmode): + title_text = strip_cmd(title_text) + for cmd in config.vyos_working_commands[cfgmode]: + cmd_joined = ' '.join(cmd['name']) + cmd_striped = strip_cmd(cmd_joined) + if "table-size" in cmd['name']: + pass + #print(cmd) + #print(cmd_striped) + #print(title_text) + #print() + if cmd_striped == title_text: + if cmd['defaultvalue']: + return cmd['defaultvalue'] + return None class CmdDirective(SphinxDirective): @@ -405,19 +426,31 @@ class CmdDirective(SphinxDirective): content_list = [] title_text = '' content_text = '' + defaultvalue = None has_body = False cfgmode = self.custom_class + "cmd" + try: + if '' in self.content: + index = self.content.index('') + title_list = self.content[0:index] + content_list = self.content[index + 1:] + + title_text = ' '.join(title_list) + content_text = content_text + '\n'.join(content_list) + has_body = True + else: + title_list = self.content + title_text = ' '.join(title_list) + except Exception as e: + print("error", e) - if '' in self.content: - index = self.content.index('') - title_list = self.content[0:index] - content_list = self.content[index + 1:] - title_text = ' '.join(title_list) - content_text = '\n'.join(content_list) - has_body = True - else: - title_text = ' '.join(self.content) + # render defaultvalue + if os.getenv('VYOS_DEFAULT') or ':defaultvalue:' in title_text: + value = get_default_value(title_list, self.config, cfgmode) + title_text = title_text.replace(":defaultvalue:", '') + if value: + defaultvalue = f"default: {value}\n" anchor_id = nodes.make_id(self.custom_class + "cmd-" + title_text) target = nodes.target(ids=[anchor_id]) @@ -439,6 +472,11 @@ class CmdDirective(SphinxDirective): heading_element['classes'] += [self.custom_class + 'cmd-heading'] panel_element.append(heading_element) + if defaultvalue: + defaultvalue_element = nodes.paragraph(text=defaultvalue) + defaultvalue_element['classes'] = ["defaultvalue"] + panel_element.append(defaultvalue_element) + append_list = { 'docname': self.env.docname, @@ -521,9 +559,11 @@ def strip_cmd(cmd, debug=False): if debug: print(cmd) cmd = re.sub('\s+','',cmd) + cmd = cmd.replace(':defaultvalue:','') if debug: print(cmd) print("") + return cmd def build_row(app, fromdocname, rowdata): @@ -550,17 +590,20 @@ def build_row(app, fromdocname, rowdata): -def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): +def process_coverage(app, fromdocname, doccmd, xmlcmd, vyoscmd, cli_type): coverage_list = {} strip_true_list = [] for cmd in doccmd: coverage_item = { 'doccmd': None, 'xmlcmd': None, + 'vyoscmd': None, 'doccmd_item': None, 'xmlcmd_item': None, + 'vyoscmd_item': None, 'indocs': False, 'inxml': False, + 'invyos': False, 'xmlfilename': None } coverage_item['doccmd'] = cmd['cmd'] @@ -576,10 +619,13 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): coverage_item = { 'doccmd': None, 'xmlcmd': None, + 'vyoscmd': None, 'doccmd_item': None, 'xmlcmd_item': None, + 'vyoscmd_item': None, 'indocs': False, 'inxml': False, + 'invyos': False, 'xmlfilename': None } coverage_item['xmlcmd'] = cmd['cmd'] @@ -592,7 +638,33 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): coverage_list[strip]['xmlcmd_item'] = cmd coverage_list[strip]['inxml'] = True coverage_list[strip]['xmlfilename'] = cmd['filename'] - strip_true_list.append(strip) + + + for item in vyoscmd[cli_type]: + cmd = ' '.join(item['cmd']) + strip = strip_cmd(cmd) + if strip not in coverage_list.keys(): + coverage_item = { + 'doccmd': None, + 'xmlcmd': None, + 'vyoscmd': None, + 'doccmd_item': None, + 'xmlcmd_item': None, + 'vyoscmd_item': None, + 'indocs': False, + 'inxml': False, + 'invyos': False, + 'xmlfilename': None + } + coverage_item['vyoscmd'] = cmd + coverage_item['invyos'] = True + coverage_list[strip] = dict(coverage_item) + else: + coverage_list[strip]['vyoscmd'] = cmd + coverage_list[strip]['invyos'] = True + if coverage_list[strip]['indocs'] and coverage_list[strip]['inxml']: + strip_true_list.append(strip) + strip_true_list = list(set(strip_true_list)) @@ -605,11 +677,11 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): table = nodes.table() - tgroup = nodes.tgroup(cols=3) + tgroup = nodes.tgroup(cols=4) table += tgroup - header = (f'Status {len(strip_true_list)}/{len(coverage_list)}', 'Documentaion', 'XML') - colwidths = (5, 50 , 50) + header = (f'Status {len(strip_true_list)}/{len(coverage_list)}', 'Documentation', 'XML', f'in VyOS {vyoscmd["os"]}') + colwidths = (5, 33 , 33, 33) table = nodes.table() tgroup = nodes.tgroup(cols=len(header)) table += tgroup @@ -623,6 +695,7 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): for entry in sorted(coverage_list): doc_cmd_text = [] doc_xml_text = [] + doc_vyos_text = [] if coverage_list[entry]['indocs']: doc_cmd_text.append(coverage_list[entry]['doccmd_item']) else: @@ -633,8 +706,14 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): doc_xml_text.append(coverage_list[entry]['xmlcmd']) else: doc_xml_text.append('Nothing found in XML Definitions') + + if coverage_list[entry]['invyos']: + doc_vyos_text.append(coverage_list[entry]['vyoscmd']) + else: + doc_vyos_text.append('Nothing found in VyOS') + - if not coverage_list[entry]['indocs'] or not coverage_list[entry]['inxml']: + if not coverage_list[entry]['indocs'] or not coverage_list[entry]['inxml'] or not coverage_list[entry]['invyos']: status = False else: status = True @@ -643,7 +722,8 @@ def process_coverage(app, fromdocname, doccmd, xmlcmd, cli_type): ( status, doc_cmd_text, - doc_xml_text + doc_xml_text, + doc_vyos_text ) ) @@ -678,6 +758,7 @@ def process_cmd_nodes(app, doctree, fromdocname): fromdocname, env.vyos_cfgcmd, app.config.vyos_working_commands['cfgcmd'], + app.config.vyos_commands, 'cfgcmd' ) ) @@ -695,6 +776,7 @@ def process_cmd_nodes(app, doctree, fromdocname): fromdocname, env.vyos_opcmd, app.config.vyos_working_commands['opcmd'], + app.config.vyos_commands, 'opcmd' ) ) |