fix: add analyzer modules
This commit is contained in:
@@ -1,47 +1,49 @@
|
||||
from typing import List
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
|
||||
from src.analyzers.git_repository import GitRepository
|
||||
from src.models import RiskyCommitAnalysis
|
||||
from src.models.data_structures import RiskyCommitAnalysis
|
||||
|
||||
|
||||
@dataclass
|
||||
class RiskyCommitDetector:
|
||||
"""Detect risky and potentially problematic commits."""
|
||||
"""Detects risky commits."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
repo: GitRepository,
|
||||
days: int = 30,
|
||||
large_commit_threshold: int = 500,
|
||||
) -> None:
|
||||
"""Initialize RiskyCommitDetector."""
|
||||
self.repo = repo
|
||||
self.days = days
|
||||
self.large_commit_threshold = large_commit_threshold
|
||||
repo: GitRepository
|
||||
days: int
|
||||
|
||||
def analyze(self) -> RiskyCommitAnalysis:
|
||||
def analyze(self) -> Optional[RiskyCommitAnalysis]:
|
||||
"""Detect risky commits."""
|
||||
commits = self.repo.get_commits(since_days=self.days)
|
||||
commits = self.repo.get_commits()
|
||||
|
||||
if not commits:
|
||||
return RiskyCommitAnalysis()
|
||||
return None
|
||||
|
||||
large_commits = []
|
||||
large_change_commits = []
|
||||
merge_commits = []
|
||||
revert_commits = []
|
||||
|
||||
for commit in commits:
|
||||
if commit.lines_changed_count >= self.large_commit_threshold:
|
||||
large_commits.append(commit)
|
||||
|
||||
if commit.is_merge:
|
||||
if commit.is_revert:
|
||||
revert_commits.append(commit)
|
||||
elif commit.is_merge:
|
||||
merge_commits.append(commit)
|
||||
|
||||
if "revert" in commit.message.lower():
|
||||
revert_commits.append(commit)
|
||||
threshold = 500
|
||||
if commit.lines_added + commit.lines_deleted > threshold:
|
||||
large_change_commits.append(commit)
|
||||
|
||||
total_risky = len(large_change_commits) + len(merge_commits) + len(revert_commits)
|
||||
risk_score = total_risky / max(1, len(commits)) * 100
|
||||
|
||||
return RiskyCommitAnalysis(
|
||||
large_commits=large_commits[:20],
|
||||
total_risky_commits=total_risky,
|
||||
large_change_commits=sorted(
|
||||
large_change_commits,
|
||||
key=lambda c: c.lines_added + c.lines_deleted,
|
||||
reverse=True,
|
||||
)[:20],
|
||||
merge_commits=merge_commits[:20],
|
||||
revert_commits=revert_commits[:20],
|
||||
total_risky=len(large_commits) + len(merge_commits) + len(revert_commits),
|
||||
risk_score=risk_score,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user