diff --git a/printer-linter/README.md b/printer-linter/README.md index 64246e5440..fc6a9a8e29 100644 --- a/printer-linter/README.md +++ b/printer-linter/README.md @@ -8,4 +8,26 @@ From the Cura root folder. ```python3 printer-linter/src/terminal.py "flashforge_dreamer_nx.def.json" "flashforge_base.def.json" --fix --format``` ## Developing +### Printer Linter Rules +Inside ```.printer-linter``` you can find a list of rules. These are seperated into roughly three categories. + +1. Checks + 1. These rules are about checking if a file meets some requirements that can't be fixed by replacing its content. + 2. An example of a check is ```diagnostic-mesh-file-extension``` this checks if a mesh file extension is acceptable. +2. Format + 1. These rules are purely about how a file is structured, not content. + 2. An example of a format rule is ```format-definition-bracket-newline``` This rule says that when assigning a dict value the bracket should go on a new line. +3. Fixes + 1. These are about the content of the file. + 2. An example of a fix is ```diagnostic-definition-redundant-override``` This removes settings that have already been defined by a parent definition + +### Linters +Linters find issues within a file. There are separate linters for each type of file. The linter that is used is decided by the create function in factory.py. All linters implement the abstract class Linter. + +A Linter class returns an iterator of Diagnostics, each diagnostic is an issue with the file. The diagnostics can also contain suggested fixes. + +### Formatters +Formatters load a file reformat it and write it to disk. There are separate formatters for each file type. All formatters implement the abstract class Formatter. + +Formatters should format based on the Format rules in .printer-linter diff --git a/printer-linter/src/printerlinter/__init__.py b/printer-linter/src/printerlinter/__init__.py index a157443ff5..3ec571c3c6 100644 --- a/printer-linter/src/printerlinter/__init__.py +++ b/printer-linter/src/printerlinter/__init__.py @@ -1,4 +1,4 @@ from .diagnostic import Diagnostic -from .factory import create +from .factory import getLinter -__all__ = ["Diagnostic", "create"] +__all__ = ["Diagnostic", "getLinter"] diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index 24f1b504cf..7cff08df2c 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -3,12 +3,12 @@ from typing import Optional from .linters.profile import Profile from .linters.defintion import Definition -from .linters.diagnostic_generator import DiagnosticGenerator +from .linters.linter import Linter from .linters.meshes import Meshes -def create(file: Path, settings: dict) -> Optional[DiagnosticGenerator]: - """ Returns a DiagnosticGenerator depending on the file format """ +def getLinter(file: Path, settings: dict) -> Optional[Linter]: + """ Returns a Linter depending on the file format """ if not file.exists(): return None elif ".inst" in file.suffixes and ".cfg" in file.suffixes: diff --git a/printer-linter/src/printerlinter/linters/__init__.py b/printer-linter/src/printerlinter/linters/__init__.py index bf16caa933..a4a48acb3d 100644 --- a/printer-linter/src/printerlinter/linters/__init__.py +++ b/printer-linter/src/printerlinter/linters/__init__.py @@ -1,6 +1,6 @@ from .profile import Profile from .meshes import Meshes -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter from .defintion import Definition -__all__ = ["Profile", "Meshes", "DiagnosticGenerator", "Definition"] \ No newline at end of file +__all__ = ["Profile", "Meshes", "Linter", "Definition"] \ No newline at end of file diff --git a/printer-linter/src/printerlinter/linters/defintion.py b/printer-linter/src/printerlinter/linters/defintion.py index 7e80bcdff1..909265e829 100644 --- a/printer-linter/src/printerlinter/linters/defintion.py +++ b/printer-linter/src/printerlinter/linters/defintion.py @@ -4,11 +4,11 @@ from pathlib import Path from typing import Iterator from ..diagnostic import Diagnostic -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter from ..replacement import Replacement -class Definition(DiagnosticGenerator): +class Definition(Linter): """ Finds issues in definition files, such as overriding default parameters """ def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) diff --git a/printer-linter/src/printerlinter/linters/diagnostic_generator.py b/printer-linter/src/printerlinter/linters/linter.py similarity index 93% rename from printer-linter/src/printerlinter/linters/diagnostic_generator.py rename to printer-linter/src/printerlinter/linters/linter.py index b259487828..fbcd91196d 100644 --- a/printer-linter/src/printerlinter/linters/diagnostic_generator.py +++ b/printer-linter/src/printerlinter/linters/linter.py @@ -5,7 +5,7 @@ from typing import Iterator from ..diagnostic import Diagnostic -class DiagnosticGenerator(ABC): +class Linter(ABC): def __init__(self, file: Path, settings: dict) -> None: """ Yields Diagnostics for file, these are issues with the file such as bad text format or too large file size. diff --git a/printer-linter/src/printerlinter/linters/meshes.py b/printer-linter/src/printerlinter/linters/meshes.py index d31c54fdcd..d49caf7dc9 100644 --- a/printer-linter/src/printerlinter/linters/meshes.py +++ b/printer-linter/src/printerlinter/linters/meshes.py @@ -2,10 +2,10 @@ from pathlib import Path from typing import Iterator from ..diagnostic import Diagnostic -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter -class Meshes(DiagnosticGenerator): +class Meshes(Linter): def __init__(self, file: Path, settings: dict) -> None: """ Finds issues in model files, such as incorrect file format or too large size """ super().__init__(file, settings) diff --git a/printer-linter/src/printerlinter/linters/profile.py b/printer-linter/src/printerlinter/linters/profile.py index ac48084943..85cc2d9f0b 100644 --- a/printer-linter/src/printerlinter/linters/profile.py +++ b/printer-linter/src/printerlinter/linters/profile.py @@ -1,9 +1,9 @@ from typing import Iterator from ..diagnostic import Diagnostic -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter -class Profile(DiagnosticGenerator): +class Profile(Linter): def check(self) -> Iterator[Diagnostic]: yield diff --git a/printer-linter/src/printerlinter/replacement.py b/printer-linter/src/printerlinter/replacement.py index 340365a5c3..b9f390107d 100644 --- a/printer-linter/src/printerlinter/replacement.py +++ b/printer-linter/src/printerlinter/replacement.py @@ -1,6 +1,5 @@ from pathlib import Path - class Replacement: def __init__(self, file: Path, offset: int, length: int, replacement_text: str): """ Replacement text for file between offset and offset+length. diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 68be569351..3591d841a4 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -65,13 +65,12 @@ def main() -> None: def diagnoseIssuesWithFile(file: Path, settings: dict) -> List[Diagnostic]: """ For file, runs all diagnostic checks in settings and returns a list of diagnostics """ - # Find correct diagnostic generator for file - diagnostic_generator = factory.create(file, settings) + linter = factory.getLinter(file, settings) - if not diagnostic_generator: + if not linter: return [] - return list(filter(lambda d: d is not None, diagnostic_generator.check())) + return list(filter(lambda d: d is not None, linter.check())) def applyFixesToFile(file, settings, full_body_check) -> None: