61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Optional, List, Dict, Any
|
|
from enum import Enum
|
|
|
|
|
|
class Severity(str, Enum):
|
|
ERROR = "error"
|
|
WARNING = "warning"
|
|
INFO = "info"
|
|
SUGGESTION = "suggestion"
|
|
|
|
|
|
@dataclass
|
|
class Rule:
|
|
id: str
|
|
name: str
|
|
pattern: str
|
|
fix: str
|
|
description: str
|
|
severity: Severity = Severity.ERROR
|
|
language: Optional[str] = None
|
|
tool: Optional[str] = None
|
|
tags: List[str] = field(default_factory=list)
|
|
priority: int = 0
|
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
def __post_init__(self):
|
|
if isinstance(self.severity, str):
|
|
self.severity = Severity(self.severity)
|
|
|
|
def to_dict(self) -> Dict[str, Any]:
|
|
return {
|
|
'id': self.id,
|
|
'name': self.name,
|
|
'pattern': self.pattern,
|
|
'fix': self.fix,
|
|
'description': self.description,
|
|
'severity': self.severity.value if isinstance(self.severity, Severity) else self.severity,
|
|
'language': self.language,
|
|
'tool': self.tool,
|
|
'tags': self.tags,
|
|
'priority': self.priority,
|
|
'metadata': self.metadata,
|
|
}
|
|
|
|
@classmethod
|
|
def from_dict(cls, data: Dict[str, Any]) -> 'Rule':
|
|
return cls(
|
|
id=data.get('id', ''),
|
|
name=data.get('name', ''),
|
|
pattern=data.get('pattern', ''),
|
|
fix=data.get('fix', ''),
|
|
description=data.get('description', ''),
|
|
severity=data.get('severity', 'error'),
|
|
language=data.get('language'),
|
|
tool=data.get('tool'),
|
|
tags=data.get('tags', []),
|
|
priority=data.get('priority', 0),
|
|
metadata=data.get('metadata', {}),
|
|
)
|