| # |
| # Copyright (c) 2023 Project CHIP Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the 'License'); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an 'AS IS' BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| import os |
| from typing import TextIO |
| |
| from matter_yamltests.yaml_loader import SchemaTree, yaml_tree |
| |
| SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) |
| WARNING = ("<!---\n" |
| "This file is automatically generated by a script.\n" |
| "DO NOT HAND-EDIT THIS FILE.\n" |
| f"Script: {os.path.basename(__file__)}\n" |
| "-->\n\n") |
| |
| |
| def get_type_list_and_vars(typetuple) -> (list[type], bool): |
| "Returns a list of supported types for this type tuple and a bool indicating if variables are supported." |
| # If str is one of the supported types, and other base types are supported, |
| # this means it supports variables. |
| # This is a heuristic, but it's true for now. |
| try: |
| typelist = list(typetuple) |
| if str in typelist: |
| # The tuple passed from the yaml parser is a tuple of type classes |
| # Here, we directly compare to the base type because that's what |
| # we get from the parser (ex. (bool, int, str)) |
| reduced = [t for t in typelist if t != str] |
| if reduced != [list]: |
| return (reduced, True) |
| return (typelist, False) |
| except TypeError: |
| return ([typetuple], False) |
| |
| |
| def print_tree(f: TextIO, indent: str, tree: SchemaTree) -> None: |
| for tag, typetuple in tree.schema.items(): |
| vars_str = "" |
| typelist, vars = get_type_list_and_vars(typetuple) |
| vars_str = "Y" if vars else "" |
| typestr = ','.join([t.__name__ for t in typelist]) |
| |
| try: |
| child = tree.children[tag] |
| f.writelines([f'|{indent}{tag} | |{vars_str} |\n']) |
| print_tree(f, indent+'  ', child) |
| except (TypeError, KeyError): |
| f.writelines([f'|{indent}{tag} |{typestr}|{vars_str}|\n']) |
| |
| |
| def print_table(title: str, tree: SchemaTree) -> None: |
| doc_path = os.path.abspath(os.path.join( |
| SCRIPT_DIR, '..', '..', 'docs', 'testing', 'yaml_schema.md')) |
| with open(doc_path, "w") as f: |
| f.writelines(WARNING) |
| f.writelines('# YAML Schema\n\n') |
| f.writelines([f'{title}\n', |
| '|key | type| supports variables\n', |
| '|:---|:---|:---|\n']) |
| print_tree(f, '', tree) |
| |
| |
| print_table('YAML schema', yaml_tree) |