Skip to content

Commit

Permalink
Add redundancy check for G01/G02/G03 commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Argmaster committed Feb 1, 2025
1 parent c23252a commit 250b226
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 3 deletions.
11 changes: 10 additions & 1 deletion src/pygerber/gerber/linter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,19 @@
from pygerber.gerber.linter.event_ast_visitor import EventAstVisitor
from pygerber.gerber.linter.linter import Linter
from pygerber.gerber.linter.rule_violation import RuleViolation
from pygerber.gerber.linter.rules import DEP001, RULE_REGISTRY, Rule, StaticRule
from pygerber.gerber.linter.rules import (
DEP001,
DEP002,
GRB001,
RULE_REGISTRY,
Rule,
StaticRule,
)

__all__ = [
"DEP001",
"DEP002",
"GRB001",
"RULE_REGISTRY",
"EventAstVisitor",
"Linter",
Expand Down
1 change: 1 addition & 0 deletions src/pygerber/gerber/linter/linter.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def lint(self, ast: File) -> Iterable[RuleViolation]:
self.event_ast_visitor = EventAstVisitor()

for rule in self.rules:
rule.reset()
self._register_rule(rule)

ast.visit(self.event_ast_visitor)
Expand Down
37 changes: 36 additions & 1 deletion src/pygerber/gerber/linter/rules/GRB001.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,43 @@

from __future__ import annotations

from pygerber.gerber.ast.nodes import G01, G02, G03, ABclose, Node
from pygerber.gerber.linter.rules.rule import Rule, register_rule

class GRB001:

@register_rule
class GRB001(Rule):
"""Rule GRB001 class implements a specific linting rule."""

rule_id = "GRB001"
last_node: type[Node] | None = None

def get_violation_title(self) -> str:
"""Return a title of message that describes the rule violation."""
assert self.last_node is not None
return f"""Redundant {self.last_node.__qualname__} command."""

def get_violation_description(self) -> str:
"""Return a description of the rule violation."""
assert self.last_node is not None
return (
f"The {self.last_node.__qualname__} command after once issued "
"remains in effect until different G01/G02/G03 command changes "
" the interpolation mode. Some software tends to paste G01 command "
"before each D01 command, significantly increasing the file size."
)

def get_trigger_nodes(self) -> list[type[Node]]:
"""Return a list of node names that trigger the rule."""
return [G01, G02, G03, ABclose]

def node_callback(self, node: Node) -> None:
"""Check the node for violations."""
if isinstance(node, (G01, G02, G03)) and self.last_node == node.__class__:
self.report_violation(node.source_info)

self.last_node = node.__class__

def reset(self) -> None:
"""Reset the rule state."""
self.last_node = None
3 changes: 2 additions & 1 deletion src/pygerber/gerber/linter/rules/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

from pygerber.gerber.linter.rules.DEP001 import DEP001
from pygerber.gerber.linter.rules.DEP002 import DEP002
from pygerber.gerber.linter.rules.GRB001 import GRB001
from pygerber.gerber.linter.rules.rule import RULE_REGISTRY, Rule
from pygerber.gerber.linter.rules.static_rule import StaticRule

__all__ = ["DEP001", "DEP002", "RULE_REGISTRY", "Rule", "StaticRule"]
__all__ = ["DEP001", "DEP002", "GRB001", "RULE_REGISTRY", "Rule", "StaticRule"]
4 changes: 4 additions & 0 deletions src/pygerber/gerber/linter/rules/rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ def bind_rule_to_violation_collector(self, collector: ViolationCollector) -> Non
"""Bind the rule to the violation collector."""
self.collector = collector

@abstractmethod
def reset(self) -> None:
"""Reset the rule state."""

def report_violation(self, source_info: Optional[SourceInfo]) -> None:
"""Report a violation."""
if self.collector is not None:
Expand Down
3 changes: 3 additions & 0 deletions src/pygerber/gerber/linter/rules/static_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ def get_trigger_nodes(self) -> list[type[Node]]:
def node_callback(self, node: Node) -> None:
"""Check the node for violations."""
self.report_violation(node.source_info)

def reset(self) -> None:
"""Reset the rule state."""

0 comments on commit 250b226

Please sign in to comment.