diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index 8afad38344..e634d9decd 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -1,126 +1,126 @@ -#!/usr/bin/env python -import configparser -import json -import os -import sys - - -class PresetSettingsValidator: - - def __init__(self, cura_dir: str): - self._cura_dir = os.path.abspath(cura_dir) - self._resource_dir = os.path.join(self._cura_dir, "resources") - self._definitions_dir = os.path.join(self._resource_dir, "definitions") - self._preset_settings_dir = os.path.join(self._resource_dir, "preset_setting_visibility_groups") - - self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json") - - def validate(self) -> bool: - """ - Validates the preset settings files and returns True or False indicating whether there are invalid files. - """ - if not os.path.isfile(self._fdmprinter_def_path): - raise FileNotFoundError("[%s] is not a file or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._fdmprinter_def_path, self._cura_dir)) - - if not os.path.isdir(self._preset_settings_dir): - raise FileNotFoundError("[%s] is not a directory or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._preset_settings_dir, self._cura_dir)) - - # parse the definition file - setting_tree_dict = self._parse_definition_file(self._fdmprinter_def_path) - - has_invalid_files = False - - # go through all the preset settings files - for root_dir, _, filenames in os.walk(self._preset_settings_dir): - for filename in filenames: - file_path = os.path.join(root_dir, filename) - print("Validating [%s] ..." % file_path) - - incorrect_sections = [] - incorrect_settings = {} - - parser = configparser.ConfigParser(allow_no_value = True) - with open(file_path, "r", encoding = "utf-8") as f: - parser.read_file(f) - - for key in parser: - # skip general - if key in ("general", configparser.DEFAULTSECT): - continue - - if key not in setting_tree_dict: - incorrect_sections.append(key) - continue - - for setting_key in parser[key]: - if setting_key not in setting_tree_dict[key]: - if setting_key not in incorrect_settings: - incorrect_settings[setting_key] = {"seen_in": [], - "should_be_in": self._should_setting_be_in(setting_tree_dict, setting_key)} - - incorrect_settings[setting_key]["seen_in"].append(key) - - # show results - print("==========================================") - if incorrect_settings or incorrect_settings: - has_invalid_files = True - print("[INVALID] [%s] is invalid, details below" % file_path) - - # show details - for section_name in sorted(incorrect_sections): - print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name) - - for setting_name in sorted(incorrect_settings.keys()): - details_dict = incorrect_settings[setting_name] - msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"])) - if details_dict["should_be_in"] is not None: - msg += "but should be in section [%s] only." % details_dict["should_be_in"] - else: - msg += "but it cannot be found in fdmprinter.def.json" - print(msg) - - else: - print("[%s] is valid" % file_path) - print("==========================================") - - return not has_invalid_files - - def _parse_definition_file(self, file_path: str): - with open(file_path, "r", encoding = "utf-8") as f: - def_dict = json.load(f, encoding = "utf-8") - - tree_dict = {} - for key, item in def_dict.get("settings", {}).items(): - setting_list = [] - self._generate_tree(setting_list, item.get("children", {})) - tree_dict[key] = setting_list - - return tree_dict - - def _generate_tree(self, setting_list: list, setting_dict: dict): - for key, item in setting_dict.items(): - setting_list.append(key) - if "children" in item: - self._generate_tree(setting_list, item["children"]) - - def _should_setting_be_in(self, setting_dict: dict, setting_name: str) -> str: - """ - Check which section the given setting belongs to. Returns None if the setting cannot be found. - """ - section_name = None - for key, setting_list in setting_dict.items(): - if setting_name in setting_list: - section_name = key - break - return section_name - - -if __name__ == "__main__": - script_dir = os.path.dirname(os.path.realpath(__file__)) - cura_dir = os.path.abspath(os.path.join(script_dir, "..")) - - validator = PresetSettingsValidator(cura_dir) - is_everything_validate = validator.validate() - - ret_code = 0 if is_everything_validate else 1 - sys.exit(ret_code) +#!/usr/bin/env python +import configparser +import json +import os +import sys + + +class PresetSettingsValidator: + + def __init__(self, cura_dir: str): + self._cura_dir = os.path.abspath(cura_dir) + self._resource_dir = os.path.join(self._cura_dir, "resources") + self._definitions_dir = os.path.join(self._resource_dir, "definitions") + self._preset_settings_dir = os.path.join(self._resource_dir, "preset_setting_visibility_groups") + + self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json") + + def validate(self) -> bool: + """ + Validates the preset settings files and returns True or False indicating whether there are invalid files. + """ + if not os.path.isfile(self._fdmprinter_def_path): + raise FileNotFoundError("[%s] is not a file or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._fdmprinter_def_path, self._cura_dir)) + + if not os.path.isdir(self._preset_settings_dir): + raise FileNotFoundError("[%s] is not a directory or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._preset_settings_dir, self._cura_dir)) + + # parse the definition file + setting_tree_dict = self._parse_definition_file(self._fdmprinter_def_path) + + has_invalid_files = False + + # go through all the preset settings files + for root_dir, _, filenames in os.walk(self._preset_settings_dir): + for filename in filenames: + file_path = os.path.join(root_dir, filename) + print("Validating [%s] ..." % file_path) + + incorrect_sections = [] + incorrect_settings = {} + + parser = configparser.ConfigParser(allow_no_value = True) + with open(file_path, "r", encoding = "utf-8") as f: + parser.read_file(f) + + for key in parser: + # skip general + if key in ("general", configparser.DEFAULTSECT): + continue + + if key not in setting_tree_dict: + incorrect_sections.append(key) + continue + + for setting_key in parser[key]: + if setting_key not in setting_tree_dict[key]: + if setting_key not in incorrect_settings: + incorrect_settings[setting_key] = {"seen_in": [], + "should_be_in": self._should_setting_be_in(setting_tree_dict, setting_key)} + + incorrect_settings[setting_key]["seen_in"].append(key) + + # show results + print("==========================================") + if incorrect_settings or incorrect_settings: + has_invalid_files = True + print("[INVALID] [%s] is invalid, details below" % file_path) + + # show details + for section_name in sorted(incorrect_sections): + print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name) + + for setting_name in sorted(incorrect_settings.keys()): + details_dict = incorrect_settings[setting_name] + msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"])) + if details_dict["should_be_in"] is not None: + msg += "but should be in section [%s] only." % details_dict["should_be_in"] + else: + msg += "but it cannot be found in fdmprinter.def.json" + print(msg) + + else: + print("[%s] is valid" % file_path) + print("==========================================") + + return not has_invalid_files + + def _parse_definition_file(self, file_path: str): + with open(file_path, "r", encoding = "utf-8") as f: + def_dict = json.load(f, encoding = "utf-8") + + tree_dict = {} + for key, item in def_dict.get("settings", {}).items(): + setting_list = [] + self._generate_tree(setting_list, item.get("children", {})) + tree_dict[key] = setting_list + + return tree_dict + + def _generate_tree(self, setting_list: list, setting_dict: dict): + for key, item in setting_dict.items(): + setting_list.append(key) + if "children" in item: + self._generate_tree(setting_list, item["children"]) + + def _should_setting_be_in(self, setting_dict: dict, setting_name: str) -> str: + """ + Check which section the given setting belongs to. Returns None if the setting cannot be found. + """ + section_name = None + for key, setting_list in setting_dict.items(): + if setting_name in setting_list: + section_name = key + break + return section_name + + +if __name__ == "__main__": + script_dir = os.path.dirname(os.path.realpath(__file__)) + cura_dir = os.path.abspath(os.path.join(script_dir, "..")) + + validator = PresetSettingsValidator(cura_dir) + is_everything_validate = validator.validate() + + ret_code = 0 if is_everything_validate else 1 + sys.exit(ret_code)