Add formatters module (JSON, Markdown, HTML, Dashboard)
This commit is contained in:
@@ -10,103 +10,32 @@ HTML_TEMPLATE = """
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Git Insights Report</title>
|
||||
<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); }
|
||||
body { font-family: sans-serif; margin: 40px; background: #f5f5f5; }
|
||||
.container { max-width: 900px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; }
|
||||
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; }
|
||||
.metric { display: inline-block; background: #e8f5e9; padding: 15px; margin: 10px; border-radius: 5px; }
|
||||
.metric-value { font-size: 24px; font-weight: bold; color: #2e7d32; }
|
||||
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>
|
||||
<div class="container">
|
||||
<h1>Git Insights Report</h1>
|
||||
<p class="timestamp">Generated: {{ timestamp }}</p>
|
||||
|
||||
<p>Generated: {{ timestamp }}</p>
|
||||
{% if commit_analysis %}
|
||||
<div class="section">
|
||||
<h2>Commit Analysis</h2>
|
||||
<div class="metric">
|
||||
<div class="metric-value">{{ commit_analysis.total_commits }}</div>
|
||||
<div class="metric-label">Total Commits</div>
|
||||
<div>Total Commits</div>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<div class="metric-value">{{ commit_analysis.unique_authors }}</div>
|
||||
<div class="metric-label">Authors</div>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<div class="metric-value">{{ "%.1f"|format(commit_analysis.average_commits_per_day) }}</div>
|
||||
<div class="metric-label">Avg/Day</div>
|
||||
</div>
|
||||
<table>
|
||||
<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></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if velocity_analysis %}
|
||||
<div class="section">
|
||||
<h2>Velocity Analysis</h2>
|
||||
<div class="metric">
|
||||
<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">{{ "%.1f"|format(velocity_analysis.commits_per_week) }}</div>
|
||||
<div class="metric-label">Commits/Week</div>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<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>
|
||||
{% endif %}
|
||||
|
||||
{% if code_churn_analysis %}
|
||||
<div class="section">
|
||||
<h2>Code Churn</h2>
|
||||
<div class="metric">
|
||||
<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">{{ code_churn_analysis.total_lines_deleted }}</div>
|
||||
<div class="metric-label">Lines Deleted</div>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<div class="metric-value">{{ code_churn_analysis.net_change }}</div>
|
||||
<div class="metric-label">Net Change</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if risky_commit_analysis %}
|
||||
<div class="section">
|
||||
<h2>Risky Commits</h2>
|
||||
<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>Authors</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -122,11 +51,7 @@ class HTMLFormatter(BaseFormatter):
|
||||
def format(data: Any) -> str:
|
||||
"""Format data as HTML."""
|
||||
template = Template(HTML_TEMPLATE)
|
||||
|
||||
return template.render(
|
||||
timestamp=datetime.now().isoformat(),
|
||||
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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user