From 937cc8727178b83667c92097246b92d1b73b299a Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Fri, 30 Jan 2026 20:35:28 +0000 Subject: [PATCH] Initial upload: git-insights-cli with CI/CD workflow --- src/formatters/markdown_formatter.py | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/formatters/markdown_formatter.py diff --git a/src/formatters/markdown_formatter.py b/src/formatters/markdown_formatter.py new file mode 100644 index 0000000..35274a0 --- /dev/null +++ b/src/formatters/markdown_formatter.py @@ -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)