From dcd673a6052e84508159ec423148d44d025a484c Mon Sep 17 00:00:00 2001 From: Saumya Jain Date: Wed, 10 Apr 2024 10:53:17 +0200 Subject: [PATCH] Refactor and enhance formula linter in printer-linter module The update improves formula linting by refining the identification and correction processes of formula typos. It establishes a list of standard formula names and delimiters for better match and replacement operations. Additionally, it enhances error reporting, providing users with more specific and instructive feedback. The Cura settings list retrieval method has been optimized as well. Related Task: CURA-10901 --- .../src/printerlinter/linters/formulas.py | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/printer-linter/src/printerlinter/linters/formulas.py b/printer-linter/src/printerlinter/linters/formulas.py index e10cd0b2b0..53a059f7d2 100644 --- a/printer-linter/src/printerlinter/linters/formulas.py +++ b/printer-linter/src/printerlinter/linters/formulas.py @@ -1,7 +1,8 @@ import difflib import json -import re import os +import re +from configparser import ConfigParser from pathlib import Path from typing import Iterator from unittest.mock import MagicMock @@ -10,23 +11,29 @@ from UM.Settings.DefinitionContainer import DefinitionContainer from UM.VersionUpgradeManager import VersionUpgradeManager from cura.CuraApplication import CuraApplication from cura.Settings.CuraFormulaFunctions import CuraFormulaFunctions + from ..diagnostic import Diagnostic from ..replacement import Replacement from .linter import Linter -from configparser import ConfigParser + +FORMULA_NAMES = [ + "extruderValue", "extruderValues", "anyExtruderWithMaterial", "anyExtruderNrWithOrDefault", + "resolveOrValue", "defaultExtruderPosition", "valueFromContainer", "extruderValueFromContainer" +] + +DELIMITERS = [r'\+', '-', '=', '/', '\*', r'\(', r'\)', r'\[', r'\]', '{', '}', ' ', '^'] + class Formulas(Linter): - """ Finds issues in definition files, such as overriding default parameters """ + """Finds issues in definition files, such as overriding default parameters.""" + def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) - self._cura_formula_functions = CuraFormulaFunctions(self) - formula_names = ["extruderValue", "extruderValues", "anyExtruderWithMaterial", "anyExtruderNrWithOrDefault" - , "resolveOrValue", "defaultExtruderPosition", "valueFromContainer", "extruderValueFromContainer"] - self._cura_settings_list = list(self.getCuraSettingsList()) + formula_names + self._cura_correction_strings = FORMULA_NAMES + list(self.getCuraSettingList()) self._definition = {} - def getCuraSettingsList(self) -> list: - if VersionUpgradeManager._VersionUpgradeManager__instance ==None: + def getCuraSettingList(self) -> list: + if VersionUpgradeManager._VersionUpgradeManager__instance is None: VersionUpgradeManager._VersionUpgradeManager__instance = VersionUpgradeManager(MagicMock()) CuraApplication._initializeSettingDefinitions() definition_container = DefinitionContainer("whatever") @@ -133,21 +140,16 @@ class Formulas(Linter): else: return False - def _correctTyposInFormula(self, input): - delimiters = [r'\+', '-', '=', '/', '\*', r'\(', r'\)', r'\[', r'\]', '{','}', ' ', '^'] + def _correctTyposInFormula(self, formula): + pattern = '|'.join(DELIMITERS) + tokens = re.split(pattern, formula) - # Create pattern - pattern = '|'.join(delimiters) - - # Split string based on pattern - tokens = re.split(pattern, input) - output = input + output = formula for token in tokens: - # If the token does not contain a parenthesis, we treat it as a word if '(' not in token and ')' not in token: cleaned_token = re.sub(r'[^\w\s]', '', token) - matches = difflib.get_close_matches(cleaned_token, self._cura_settings_list, n=1, cutoff=0.8) - if matches: - output = output.replace(cleaned_token, matches[0]) - + possible_matches = difflib.get_close_matches(cleaned_token, self._cura_correction_strings, n=1, cutoff=0.8) + if possible_matches: + output = output.replace(cleaned_token, possible_matches[0]) return output +