You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.9 KiB
Python

11 months ago
"""Check if conversion rules are valid.
The files to be checked are in the directory of ../miot/specs/
To run this script, PYTHONPATH must be set first.
See test_all.sh for the usage.
You can run all tests by running:
```
./test_all.sh
```
"""
import sys
import os
import json
def load_json(file_path: str) -> dict:
"""Load json file."""
with open(file_path, "r", encoding="utf-8") as file:
data = json.load(file)
return data
def dict_str_str(d: dict) -> bool:
"""restricted format: dict[str, str]"""
if not isinstance(d, dict):
return False
for k, v in d.items():
if not isinstance(k, str) or not isinstance(v, str):
return False
return True
def dict_str_dict(d: dict) -> bool:
"""restricted format: dict[str, dict]"""
if not isinstance(d, dict):
return False
for k, v in d.items():
if not isinstance(k, str) or not isinstance(v, dict):
return False
return True
def nested_2_dict_str_str(d: dict) -> bool:
"""restricted format: dict[str, dict[str, str]]"""
if not dict_str_dict(d):
return False
for v in d.values():
if not dict_str_str(v):
return False
return True
def nested_3_dict_str_str(d: dict) -> bool:
"""restricted format: dict[str, dict[str, dict[str, str]]]"""
if not dict_str_dict(d):
return False
for v in d.values():
if not nested_2_dict_str_str(v):
return False
return True
def spec_filter(d: dict) -> bool:
"""restricted format: dict[str, dict[str, list<str>]]"""
if not dict_str_dict(d):
return False
for value in d.values():
for k, v in value.items():
if not isinstance(k, str) or not isinstance(v, list):
return False
if not all(isinstance(i, str) for i in v):
return False
return True
def bool_trans(d: dict) -> bool:
"""dict[str, dict[str, str] | dict[str, dict[str, str]] ]"""
if not isinstance(d, dict):
return False
if "data" not in d or "translate" not in d:
return False
if not dict_str_str(d["data"]):
return False
if not nested_3_dict_str_str(d["translate"]):
return False
return True
def main():
script_name = os.path.basename(__file__)
source_dir = "../miot/specs"
if not bool_trans(load_json(f"{source_dir}/bool_trans.json")):
print(script_name, "bool_trans FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/multi_lang.json")):
print(script_name, "multi_lang FAIL")
sys.exit(1)
if not spec_filter(load_json(f"{source_dir}/spec_filter.json")):
print(script_name, "spec_filter FAIL")
sys.exit(1)
if not nested_2_dict_str_str(load_json(
f"{source_dir}/std_ex_actions.json")):
print(script_name, "std_ex_actions.json FAIL")
sys.exit(1)
if not nested_2_dict_str_str(load_json(
f"{source_dir}/std_ex_devices.json")):
print(script_name, "std_ex_devices.json FAIL")
sys.exit(1)
if not nested_2_dict_str_str(load_json(f"{source_dir}/std_ex_events.json")):
print(script_name, "std_ex_events.json FAIL")
sys.exit(1)
if not nested_2_dict_str_str(load_json(
f"{source_dir}/std_ex_properties.json")):
print(script_name, "std_ex_properties.json FAIL")
sys.exit(1)
if not nested_2_dict_str_str(load_json(
f"{source_dir}/std_ex_services.json")):
print(script_name, "std_ex_services.json FAIL")
sys.exit(1)
if not nested_2_dict_str_str(load_json(f"{source_dir}/std_ex_values.json")):
print(script_name, "std_ex_values.json FAIL")
sys.exit(1)
source_dir = "../miot/i18n"
if not nested_3_dict_str_str(load_json(f"{source_dir}/de.json")):
print(script_name, "i18n de.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/en.json")):
print(script_name, "i18n en.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/es.json")):
print(script_name, "i18n es.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/fr.json")):
print(script_name, "i18n fr.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/ja.json")):
print(script_name, "i18n ja.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/ru.json")):
print(script_name, "i18n ru.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/zh-Hans.json")):
print(script_name, "i18n zh-Hans.json FAIL")
sys.exit(1)
if not nested_3_dict_str_str(load_json(f"{source_dir}/zh-Hant.json")):
print(script_name, "i18n zh-Hant.json FAIL")
sys.exit(1)
print(script_name, "PASS")
if __name__ == "__main__":
main()