blob: 4de5f66efdc035ed4bfb56b06f7c3a804bd22180 [file] [log] [blame]
#
# 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+'&emsp; ', 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)