fix: add formatter modules
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled

This commit is contained in:
2026-02-01 08:21:01 +00:00
parent 223c9e5c3a
commit ce80611352

View File

@@ -2,7 +2,6 @@ from datetime import datetime
from typing import Any
from jinja2 import Template
from src.formatters.base import BaseFormatter
@@ -16,19 +15,20 @@ HTML_TEMPLATE = """
<style>
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 40px; background: #f5f5f5; }
.container { max-width: 900px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
h1 { color: #333; border-bottom: 2px solid #4a90d9; padding-bottom: 10px; }
h2 { color: #4a90d9; margin-top: 30px; }
.metric { display: inline-block; background: #e8f4fd; padding: 15px 25px; border-radius: 6px; margin: 5px; }
.metric-value { font-size: 28px; font-weight: bold; color: #4a90d9; }
.metric-label { font-size: 12px; color: #666; text-transform: uppercase; }
table { width: 100%; border-collapse: collapse; margin: 15px 0; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #eee; }
th { background: #f8f9fa; font-weight: 600; }
.trend-increasing { color: #28a745; }
.trend-decreasing { color: #dc3545; }
.trend-stable { color: #6c757d; }
.section { margin: 25px 0; padding: 20px; background: #fafafa; border-radius: 6px; }
.timestamp { color: #999; font-size: 14px; }
h1 { color: #333; border-bottom: 2px solid #4CAF50; padding-bottom: 10px; }
h2 { color: #555; margin-top: 30px; }
.metric { display: inline-block; background: #e8f5e9; padding: 15px 25px; margin: 10px; border-radius: 5px; text-align: center; }
.metric-value { font-size: 28px; font-weight: bold; color: #2e7d32; }
.metric-label { font-size: 12px; color: #666; margin-top: 5px; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
th { background: #4CAF50; color: white; }
tr:hover { background: #f5f5f5; }
.section { margin: 30px 0; padding: 20px; background: #fafafa; border-radius: 5px; }
.timestamp { color: #999; font-size: 14px; margin-bottom: 20px; }
.risk-high { color: #d32f2f; }
.risk-medium { color: #f57c00; }
.risk-low { color: #388e3c; }
</style>
</head>
<body>
@@ -39,7 +39,6 @@ HTML_TEMPLATE = """
{% if commit_analysis %}
<div class="section">
<h2>Commit Analysis</h2>
<div>
<div class="metric">
<div class="metric-value">{{ commit_analysis.total_commits }}</div>
<div class="metric-label">Total Commits</div>
@@ -52,18 +51,10 @@ HTML_TEMPLATE = """
<div class="metric-value">{{ "%.1f"|format(commit_analysis.average_commits_per_day) }}</div>
<div class="metric-label">Avg/Day</div>
</div>
</div>
<h3>Top Contributors</h3>
<table>
<tr><th>Author</th><th>Commits</th><th>Lines +</th><th>Lines -</th></tr>
<tr><th>Author</th><th>Commits</th></tr>
{% for author in commit_analysis.top_authors[:5] %}
<tr>
<td>{{ author.name }}</td>
<td>{{ author.commit_count }}</td>
<td style="color: #28a745;">{{ author.lines_added }}</td>
<td style="color: #dc3545;">{{ author.lines_deleted }}</td>
</tr>
<tr><td>{{ author.name }}</td><td>{{ author.commit_count }}</td></tr>
{% endfor %}
</table>
</div>
@@ -72,33 +63,30 @@ HTML_TEMPLATE = """
{% if velocity_analysis %}
<div class="section">
<h2>Velocity Analysis</h2>
<div>
<div class="metric">
<div class="metric-value">{{ velocity_analysis.commits_per_day }}</div>
<div class="metric-value">{{ "%.1f"|format(velocity_analysis.commits_per_day) }}</div>
<div class="metric-label">Commits/Day</div>
</div>
<div class="metric">
<div class="metric-value">{{ velocity_analysis.commits_per_week }}</div>
<div class="metric-value">{{ "%.1f"|format(velocity_analysis.commits_per_week) }}</div>
<div class="metric-label">Commits/Week</div>
</div>
<div class="metric">
<div class="metric-value trend-{{ velocity_analysis.velocity_trend }}">{{ velocity_analysis.velocity_trend|capitalize }}</div>
<div class="metric-value" style="color: {{ 'green' if velocity_analysis.velocity_trend == 'increasing' else 'orange' if velocity_analysis.velocity_trend == 'decreasing' else 'blue' }};">{{ velocity_analysis.velocity_trend|capitalize }}</div>
<div class="metric-label">Trend</div>
</div>
</div>
</div>
{% endif %}
{% if code_churn_analysis %}
<div class="section">
<h2>Code Churn</h2>
<div>
<div class="metric">
<div class="metric-value" style="color: #28a745;">+{{ code_churn_analysis.total_lines_added }}</div>
<div class="metric-value">{{ code_churn_analysis.total_lines_added }}</div>
<div class="metric-label">Lines Added</div>
</div>
<div class="metric">
<div class="metric-value" style="color: #dc3545;">-{{ code_churn_analysis.total_lines_deleted }}</div>
<div class="metric-value">{{ code_churn_analysis.total_lines_deleted }}</div>
<div class="metric-label">Lines Deleted</div>
</div>
<div class="metric">
@@ -106,26 +94,19 @@ HTML_TEMPLATE = """
<div class="metric-label">Net Change</div>
</div>
</div>
</div>
{% endif %}
{% if risky_commit_analysis and risky_commit_analysis.total_risky > 0 %}
{% if risky_commit_analysis %}
<div class="section">
<h2>Risky Commits</h2>
<p>{{ risky_commit_analysis.total_risky }} potentially risky commits detected</p>
{% if risky_commit_analysis.large_commits %}
<h3>Large Commits ({{ risky_commit_analysis.large_commits|length }})</h3>
<table>
<tr><th>SHA</th><th>Author</th><th>Changes</th></tr>
{% for commit in risky_commit_analysis.large_commits[:5] %}
<tr>
<td>{{ commit.sha }}</td>
<td>{{ commit.author_name }}</td>
<td>+{{ commit.additions }} / -{{ commit.deletions }}</td>
</tr>
{% endfor %}
</table>
{% endif %}
<div class="metric">
<div class="metric-value">{{ risky_commit_analysis.total_risky_commits }}</div>
<div class="metric-label">Total Risky</div>
</div>
<div class="metric">
<div class="metric-value">{{ "%.1f"|format(risky_commit_analysis.risk_score) }}%</div>
<div class="metric-label">Risk Score</div>
</div>
</div>
{% endif %}
</div>
@@ -144,8 +125,8 @@ class HTMLFormatter(BaseFormatter):
return template.render(
timestamp=datetime.now().isoformat(),
commit_analysis=getattr(data, "commit_analysis", None),
velocity_analysis=getattr(data, "velocity_analysis", None),
code_churn_analysis=getattr(data, "code_churn_analysis", None),
risky_commit_analysis=getattr(data, "risky_commit_analysis", None),
commit_analysis=data.commit_analysis if hasattr(data, "commit_analysis") else None,
velocity_analysis=data.velocity_analysis if hasattr(data, "velocity_analysis") else None,
code_churn_analysis=data.code_churn_analysis if hasattr(data, "code_churn_analysis") else None,
risky_commit_analysis=data.risky_commit_analysis if hasattr(data, "risky_commit_analysis") else None,
)