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