84 lines
1.9 KiB
Python
84 lines
1.9 KiB
Python
from pydantic import BaseModel, Field
|
|
from typing import List, Optional
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
|
|
class RiskLevel(str, Enum):
|
|
SAFE = "SAFE"
|
|
REVIEW = "REVIEW"
|
|
RISKY = "RISKY"
|
|
|
|
|
|
class SecurityIssue(BaseModel):
|
|
type: str
|
|
severity: str
|
|
line_number: Optional[int] = None
|
|
file_path: Optional[str] = None
|
|
description: str
|
|
recommendation: str
|
|
|
|
|
|
class ComplianceViolation(BaseModel):
|
|
rule: str
|
|
severity: str
|
|
file_path: Optional[str] = None
|
|
description: str
|
|
suggestion: str
|
|
|
|
|
|
class SecurityScore(BaseModel):
|
|
risk: float
|
|
issues: List[SecurityIssue] = []
|
|
summary: str
|
|
confidence: float = 0.8
|
|
cost: float = 0.0
|
|
|
|
|
|
class ComplianceScore(BaseModel):
|
|
risk: float
|
|
violations: List[ComplianceViolation] = []
|
|
passed_checks: List[str] = []
|
|
summary: str
|
|
|
|
|
|
class RiskAssessment(BaseModel):
|
|
overall_risk: float
|
|
risk_level: RiskLevel
|
|
security_score: SecurityScore
|
|
compliance_score: ComplianceScore
|
|
recommendation: str
|
|
confidence: float = 0.8
|
|
|
|
|
|
class PullRequest(BaseModel):
|
|
repo: str
|
|
number: int
|
|
title: str
|
|
author: str
|
|
url: str
|
|
diff: str
|
|
files_changed: List[str] = []
|
|
created_at: datetime
|
|
labels: List[str] = []
|
|
|
|
|
|
class ReviewResult(BaseModel):
|
|
pr: PullRequest
|
|
risk_assessment: RiskAssessment
|
|
reviewed_at: datetime = Field(default_factory=datetime.now)
|
|
|
|
def to_summary(self):
|
|
risk = self.risk_assessment
|
|
level_marker = "SAFE" if risk.risk_level == RiskLevel.SAFE else "REVIEW" if risk.risk_level == RiskLevel.REVIEW else "RISKY"
|
|
|
|
summary = f"""PR #{self.pr.number}: {self.pr.title}
|
|
Overall Risk: {risk.overall_risk:.2f} - {level_marker}
|
|
|
|
Security: {risk.security_score.risk:.2f} - {risk.security_score.summary}
|
|
Compliance: {risk.compliance_score.risk:.2f} - {risk.compliance_score.summary}
|
|
|
|
Recommendation: {risk.recommendation}
|
|
"""
|
|
return summary.strip()
|