Initial upload: git-insights-cli with CI/CD workflow
This commit is contained in:
65
src/formatters/markdown_formatter.py
Normal file
65
src/formatters/markdown_formatter.py
Normal file
@@ -0,0 +1,65 @@
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
from src.formatters.base import BaseFormatter
|
||||
|
||||
|
||||
class MarkdownFormatter(BaseFormatter):
|
||||
"""Markdown output formatter."""
|
||||
|
||||
@staticmethod
|
||||
def format(data: Any) -> str:
|
||||
"""Format data as Markdown."""
|
||||
lines = ["# Git Insights Report", f"Generated: {datetime.now().isoformat()}", ""]
|
||||
|
||||
if hasattr(data, "commit_analysis") and data.commit_analysis:
|
||||
ca = data.commit_analysis
|
||||
lines.extend([
|
||||
"## Commit Analysis",
|
||||
f"- **Total Commits**: {ca.total_commits}",
|
||||
f"- **Unique Authors**: {ca.unique_authors}",
|
||||
f"- **Avg Commits/Day**: {ca.average_commits_per_day:.1f}",
|
||||
"",
|
||||
"### Top Contributors",
|
||||
"| Author | Commits |",
|
||||
"|--------|---------|",
|
||||
])
|
||||
for author in ca.top_authors[:5]:
|
||||
lines.append(f"| {author.name} | {author.commit_count} |")
|
||||
lines.append("")
|
||||
|
||||
if hasattr(data, "velocity_analysis") and data.velocity_analysis:
|
||||
va = data.velocity_analysis
|
||||
lines.extend([
|
||||
"## Velocity Analysis",
|
||||
f"- **Commits/Day**: {va.commits_per_day:.1f}",
|
||||
f"- **Commits/Week**: {va.commits_per_week:.1f}",
|
||||
f"- **Trend**: {va.velocity_trend}",
|
||||
f"- **Most Active Day**: {va.most_active_day}",
|
||||
"",
|
||||
])
|
||||
|
||||
if hasattr(data, "code_churn_analysis") and data.code_churn_analysis:
|
||||
cc = data.code_churn_analysis
|
||||
lines.extend([
|
||||
"## Code Churn",
|
||||
f"- **Lines Added**: {cc.total_lines_added:,}",
|
||||
f"- **Lines Deleted**: {cc.total_lines_deleted:,}",
|
||||
f"- **Net Change**: {cc.net_change:+,}",
|
||||
f"- **Avg Churn/Commit**: {cc.average_churn_per_commit:.1f}",
|
||||
"",
|
||||
])
|
||||
|
||||
if hasattr(data, "risky_commit_analysis") and data.risky_commit_analysis:
|
||||
ra = data.risky_commit_analysis
|
||||
lines.extend([
|
||||
"## Risky Commits",
|
||||
f"- **Total Risky**: {ra.total_risky_commits}",
|
||||
f"- **Risk Score**: {ra.risk_score:.1f}%",
|
||||
f"- **Large Changes**: {len(ra.large_change_commits)}",
|
||||
f"- **Merge Commits**: {len(ra.merge_commits)}",
|
||||
f"- **Reverts**: {len(ra.revert_commits)}",
|
||||
"",
|
||||
])
|
||||
|
||||
return "\n".join(lines)
|
||||
Reference in New Issue
Block a user