From e15049f2e08cf1c6b947e5f3a8752d1c0dd903da Mon Sep 17 00:00:00 2001 From: Saumya Jain Date: Mon, 8 Apr 2024 15:26:55 +0200 Subject: [PATCH] Update formulas handling CURA-10901 --- printer-linter/src/printerlinter/factory.py | 2 +- .../src/printerlinter/linters/formulas.py | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index 20ee19dee4..4a6d4d8e55 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -19,7 +19,7 @@ def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]: if ".def" in file.suffixes and ".json" in file.suffixes: if file.stem in ("fdmprinter.def", "fdmextruder.def"): - return None + return [Formulas(file, settings)] return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)] if file.parent.stem == "meshes": diff --git a/printer-linter/src/printerlinter/linters/formulas.py b/printer-linter/src/printerlinter/linters/formulas.py index 05774742cf..37a61d9f78 100644 --- a/printer-linter/src/printerlinter/linters/formulas.py +++ b/printer-linter/src/printerlinter/linters/formulas.py @@ -1,20 +1,31 @@ import json -import re +import os from pathlib import Path from typing import Iterator +from UM.VersionUpgradeManager import VersionUpgradeManager +from unittest.mock import MagicMock from ..diagnostic import Diagnostic from .linter import Linter from configparser import ConfigParser -from ..replacement import Replacement - +from cura.CuraApplication import CuraApplication # To compare against the current SettingVersion. +from UM.Settings.DefinitionContainer import DefinitionContainer class Formulas(Linter): """ Finds issues in definition files, such as overriding default parameters """ def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) + self._all_keys = self.collectAllSettingIds() self._definition = {} + def collectAllSettingIds(self): + VersionUpgradeManager._VersionUpgradeManager__instance = VersionUpgradeManager(MagicMock()) + CuraApplication._initializeSettingDefinitions() + definition_container = DefinitionContainer("whatever") + with open(os.path.join(os.path.dirname(__file__), "..", "..","..","..", "resources", "definitions", "fdmprinter.def.json"), + encoding="utf-8") as data: + definition_container.deserialize(data.read()) + return definition_container.getAllKeys() def check(self) -> Iterator[Diagnostic]: if self._settings["checks"].get("diagnostic-incorrect-formula", False): @@ -33,7 +44,7 @@ class Formulas(Linter): for key, value_dict in definition["overrides"].items(): for value in value_dict: if value in ("enable", "resolve", "value", "minimum_value_warning", "maximum_value_warning", "maximum_value", "minimum_value"): - value_incorrect = self.checkValueIncorrect() + value_incorrect = self.checkValueIncorrect(value_dict[value].strip("=")) if value_incorrect: yield Diagnostic( @@ -77,5 +88,9 @@ class Formulas(Linter): return file_data - def checkValueIncorrect(self): - return True + def checkValueIncorrect(self, formula:str) -> bool: + try: + compiled_formula = compile(formula, "", "eval") + except SyntaxError: + return True + return False