From 00ac479b0de0b59633eff38f8d5fe249f2a8d81f Mon Sep 17 00:00:00 2001 From: Michele Carignani <michele.carignani@etsi.org> Date: Sun, 29 Nov 2020 11:50:09 +0100 Subject: [PATCH] add example module --- src/example.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/example.py diff --git a/src/example.py b/src/example.py new file mode 100644 index 0000000..c2360ba --- /dev/null +++ b/src/example.py @@ -0,0 +1,99 @@ +#!/bin/python3 +''' +Class and utilities to parse and export examples of data models in TOSCA +''' +import re +import traceback + +from docx.text.paragraph import Paragraph + +class Example(): + + def __init__(self, filename, text): + self.filename = filename + self.text = text + +def is_start_of_example(line: str): + ''' + Returns true if the line marks the start of an examples. + Check if lines starts with "tosca_definitions_version:" + ''' + if not isinstance(line, str): + raise ValueError("NOT A STRING") + + return line.startswith("tosca_definitions_version:") + +def is_body_of_example(line: str): + ''' + Returns true if the line is part of the body of an example. + ''' + return line.startswith("imports:") or\ + line.startswith("node_types:") or\ + line.startswith("topology_template:") or\ + line.startswith("description:") or\ + line.startswith("data_types:") or\ + line.startswith(" ") or\ + line.startswith(" ") or\ + line == "" + +def get_example_file_name(line: str): + ''' + ''' + matches = re.search(r'[a-zA-Z0-9_.]*.yaml', line) + if matches is not None: + return matches.group(0) + return "" + +def parse_all_examples(txt): + ''' + Parses TOSCA examples. Txt is a list of Docx items (Paragraph, etc.). + Returns a list of Example objects + ''' + + res = [] + new_example = "" + filename = "" + i = 1 + clause = "" + for line in txt: + + if isinstance(line, Paragraph): + linetext = str(line.text) + if "Heading" in line.style.name: + clause = linetext.split("\t")[0] + i = 1 + elif isinstance(line, str): + linetext = line + else: + continue + + if is_start_of_example(linetext): + filename = get_example_file_name(previous_line) + if filename == "": + filename = "{:02d}".format(i) + ".yaml" + i = i + 1 + filename = clause+"-"+filename + new_example = "# " + filename + "\n" + linetext + elif new_example != "" and is_body_of_example(linetext): + new_example = new_example + "\n" + linetext + elif len(new_example) > 0: + res.append(Example(filename, new_example)) + new_example = "" + + previous_line = linetext + + return res + +def generate_examples_between(a_id, b_id, content, EXAMPLES): + + try: + examples = parse_all_examples(content[a_id:b_id]) + except: + track = traceback.format_exc() + print(track) + return 0 + + for example in examples: + EXAMPLES[example.filename] = example + + return len(examples) \ No newline at end of file -- GitLab