Add rule and finding models

This commit is contained in:
2026-01-29 21:26:08 +00:00
parent fcf70753c3
commit 774b9bb4c4

View File

@@ -1,14 +1,10 @@
"""Finding model for validation results.""" """Finding model."""
import re import re
from dataclasses import dataclass from dataclasses import dataclass
from typing import Optional from typing import Optional
@dataclass @dataclass
class Finding: class Finding:
"""Represents a validation finding."""
rule_id: str rule_id: str
rule_name: str rule_name: str
severity: str severity: str
@@ -19,52 +15,19 @@ class Finding:
matched_text: str = "" matched_text: str = ""
context: str = "" context: str = ""
def to_dict(self) -> dict: def to_dict(self):
"""Convert finding to dictionary."""
return { return {
"rule_id": self.rule_id, "rule_id": self.rule_id, "rule_name": self.rule_name,
"rule_name": self.rule_name, "severity": self.severity, "message": self.message,
"severity": self.severity, "suggestion": self.suggestion, "line_number": self.line_number,
"message": self.message, "column": self.column, "matched_text": self.matched_text, "context": self.context,
"suggestion": self.suggestion,
"line_number": self.line_number,
"column": self.column,
"matched_text": self.matched_text,
"context": self.context,
} }
@classmethod @classmethod
def from_match( def from_match(cls, rule, match, line_number=None, context=""):
cls,
rule,
match: re.Match[str],
line_number: Optional[int] = None,
context: str = "",
) -> "Finding":
"""Create a Finding from a regex match."""
return cls( return cls(
rule_id=rule.id, rule_id=rule.id, rule_name=rule.name, severity=rule.severity,
rule_name=rule.name, message=rule.message, suggestion=rule.suggestion,
severity=rule.severity, line_number=line_number, column=match.start() + 1 if match.start() >= 0 else None,
message=rule.message, matched_text=match.group(0), context=context,
suggestion=rule.suggestion,
line_number=line_number,
column=match.start() + 1 if match.start() >= 0 else None,
matched_text=match.group(0),
context=context,
)
@classmethod
def from_dict(cls, data: dict) -> "Finding":
"""Create a Finding from a dictionary."""
return cls(
rule_id=data["rule_id"],
rule_name=data["rule_name"],
severity=data["severity"],
message=data["message"],
suggestion=data.get("suggestion", ""),
line_number=data.get("line_number"),
column=data.get("column"),
matched_text=data.get("matched_text", ""),
context=data.get("context", ""),
) )