diff --git a/src/gdiffer/cli.py b/src/gdiffer/cli.py index c026cfa..c772c74 100644 --- a/src/gdiffer/cli.py +++ b/src/gdiffer/cli.py @@ -1,6 +1,3 @@ -"""CLI interface for git diff explainer.""" - -import json import sys import click @@ -14,8 +11,7 @@ from gdiffer.output import OutputFormat, OutputFormatter from gdiffer.parser import parse_diff -def create_analysis(files: list[DiffFile], verbose: bool = False) -> DiffAnalysis: - """Create a complete analysis from parsed diff files.""" +def create_analysis(files, verbose=False): analysis = DiffAnalysis() language_detector = LanguageDetector() code_analyzer = CodeAnalyzer() @@ -62,7 +58,6 @@ def create_analysis(files: list[DiffFile], verbose: bool = False) -> DiffAnalysi analysis.total_changes += hunk.new_lines analysis.total_files = len(files) - return analysis @@ -77,8 +72,7 @@ def create_analysis(files: list[DiffFile], verbose: bool = False) -> DiffAnalysi help="Output format", ) @click.pass_context -def main(ctx: click.Context, verbose: bool, output: str): - """A CLI tool that parses git diffs and provides intelligent explanations.""" +def main(ctx, verbose, output): ctx.ensure_object(dict) ctx.obj["verbose"] = verbose ctx.obj["output"] = output @@ -89,8 +83,7 @@ def main(ctx: click.Context, verbose: bool, output: str): @click.option("--file", "-f", type=click.Path(exists=True), help="Read diff from file") @click.option("--stdin", "-s", is_flag=True, help="Read diff from stdin") @click.pass_context -def explain(ctx: click.Context, diff_input: str | None, file: str | None, stdin: bool): - """Explain git diff changes with intelligent analysis.""" +def explain(ctx, diff_input, file, stdin): verbose = ctx.obj.get("verbose", False) output_format = ctx.obj.get("output", "terminal") @@ -105,7 +98,7 @@ def explain(ctx: click.Context, diff_input: str | None, file: str | None, stdin: diff_content = diff_input else: click.echo("No diff provided. Use --stdin, --file, or pass diff as argument.", err=True) - click.echo("\nUsage examples:") + click.echo("\nUsage examples:", err=True) click.echo(" gdiffer explain 'diff --git a/file.py...'", err=True) click.echo(" git diff | gdiffer explain --stdin", err=True) click.echo(" gdiffer explain --file changes.diff", err=True) @@ -140,8 +133,7 @@ def explain(ctx: click.Context, diff_input: str | None, file: str | None, stdin: @click.option("--file", "-f", type=click.Path(exists=True), help="Read diff from file") @click.option("--stdin", "-s", is_flag=True, help="Read diff from stdin") @click.pass_context -def issues(ctx: click.Context, file: str | None, stdin: bool): - """Show only detected issues and security concerns.""" +def issues(ctx, file, stdin): diff_content = "" if stdin: @@ -186,16 +178,17 @@ def issues(ctx: click.Context, file: str | None, stdin: bool): all_issues.sort(key=lambda x: severity_priority.get(x.get("severity", ""), 4)) if ctx.obj.get("output") == "json": - click.echo(json.dumps(all_issues, indent=2)) + click.echo(__import__("json").dumps(all_issues, indent=2)) else: for issue in all_issues: severity = issue["severity"].upper() - color = { + color_map = { "critical": "red", "high": "orange3", "medium": "yellow", "low": "cyan", - }.get(issue["severity"], "white") + } + color = color_map.get(issue["severity"], "white") click.echo(f"[{color}][{severity}][/] {issue['title']}") click.echo(f" File: {issue['file']}:{issue['line']}") click.echo(f" {issue['description']}") @@ -213,8 +206,7 @@ def issues(ctx: click.Context, file: str | None, stdin: bool): @click.option("--file", "-f", type=click.Path(exists=True), help="Read diff from file") @click.option("--stdin", "-s", is_flag=True, help="Read diff from stdin") @click.pass_context -def summarize(ctx: click.Context, file: str | None, stdin: bool): - """Show only a brief summary of changes.""" +def summarize(ctx, file, stdin): diff_content = "" if stdin: @@ -271,8 +263,7 @@ def summarize(ctx: click.Context, file: str | None, stdin: bool): sys.exit(1) -def format_analysis_json(analysis: DiffAnalysis) -> str: - """Format analysis as JSON string.""" +def format_analysis_json(analysis): result = { "summary": { "total_files": analysis.total_files, @@ -309,4 +300,4 @@ def format_analysis_json(analysis: DiffAnalysis) -> str: result["files"].append(file_data) - return json.dumps(result, indent=2) + return __import__("json").dumps(result, indent=2)