check_preset_settings.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #!/usr/bin/env python
  2. import configparser
  3. import json
  4. import os
  5. import sys
  6. class PresetSettingsValidator:
  7. def __init__(self, cura_dir: str):
  8. self._cura_dir = os.path.abspath(cura_dir)
  9. self._resource_dir = os.path.join(self._cura_dir, "resources")
  10. self._definitions_dir = os.path.join(self._resource_dir, "definitions")
  11. self._preset_settings_dir = os.path.join(self._resource_dir, "preset_setting_visibility_groups")
  12. self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json")
  13. def validate(self) -> bool:
  14. """
  15. Validates the preset settings files and returns True or False indicating whether there are invalid files.
  16. """
  17. if not os.path.isfile(self._fdmprinter_def_path):
  18. 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))
  19. if not os.path.isdir(self._preset_settings_dir):
  20. 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))
  21. # parse the definition file
  22. setting_tree_dict = self._parse_definition_file(self._fdmprinter_def_path)
  23. has_invalid_files = False
  24. # go through all the preset settings files
  25. for root_dir, _, filenames in os.walk(self._preset_settings_dir):
  26. for filename in filenames:
  27. file_path = os.path.join(root_dir, filename)
  28. print("Validating [%s] ..." % file_path)
  29. incorrect_sections = []
  30. incorrect_settings = {}
  31. parser = configparser.ConfigParser(allow_no_value = True)
  32. with open(file_path, "r", encoding = "utf-8") as f:
  33. parser.read_file(f)
  34. for key in parser:
  35. # skip general
  36. if key in ("general", configparser.DEFAULTSECT):
  37. continue
  38. if key not in setting_tree_dict:
  39. incorrect_sections.append(key)
  40. continue
  41. for setting_key in parser[key]:
  42. if setting_key not in setting_tree_dict[key]:
  43. if setting_key not in incorrect_settings:
  44. incorrect_settings[setting_key] = {"seen_in": [],
  45. "should_be_in": self._should_setting_be_in(setting_tree_dict, setting_key)}
  46. incorrect_settings[setting_key]["seen_in"].append(key)
  47. # show results
  48. print("==========================================")
  49. if incorrect_sections or incorrect_settings:
  50. has_invalid_files = True
  51. print("[INVALID] [%s] is invalid, details below" % file_path)
  52. # show details
  53. for section_name in sorted(incorrect_sections):
  54. print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name)
  55. for setting_name in sorted(incorrect_settings.keys()):
  56. details_dict = incorrect_settings[setting_name]
  57. msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"]))
  58. if details_dict["should_be_in"] is not None:
  59. msg += "but should be in section [%s] only." % details_dict["should_be_in"]
  60. else:
  61. msg += "but it cannot be found in fdmprinter.def.json"
  62. print(msg)
  63. else:
  64. print("[%s] is valid" % file_path)
  65. print("==========================================")
  66. return not has_invalid_files
  67. def _parse_definition_file(self, file_path: str):
  68. with open(file_path, "r", encoding = "utf-8") as f:
  69. def_dict = json.load(f, encoding = "utf-8")
  70. tree_dict = {}
  71. for key, item in def_dict.get("settings", {}).items():
  72. setting_list = []
  73. self._generate_tree(setting_list, item.get("children", {}))
  74. tree_dict[key] = setting_list
  75. return tree_dict
  76. def _generate_tree(self, setting_list: list, setting_dict: dict):
  77. for key, item in setting_dict.items():
  78. setting_list.append(key)
  79. if "children" in item:
  80. self._generate_tree(setting_list, item["children"])
  81. def _should_setting_be_in(self, setting_dict: dict, setting_name: str) -> str:
  82. """
  83. Check which section the given setting belongs to. Returns None if the setting cannot be found.
  84. """
  85. section_name = None
  86. for key, setting_list in setting_dict.items():
  87. if setting_name in setting_list:
  88. section_name = key
  89. break
  90. return section_name
  91. if __name__ == "__main__":
  92. script_dir = os.path.dirname(os.path.realpath(__file__))
  93. cura_dir = os.path.abspath(os.path.join(script_dir, ".."))
  94. validator = PresetSettingsValidator(cura_dir)
  95. is_everything_validate = validator.validate()
  96. ret_code = 0 if is_everything_validate else 1
  97. sys.exit(ret_code)