From 4c14f8a78b6b51d1876b97e9515e058e82932cb7 Mon Sep 17 00:00:00 2001 From: Azaucifer <47237500+Azaucifer@users.noreply.github.com> Date: Mon, 7 Sep 2026 13:23:59 +0530 Subject: [PATCH] refactor: extract file analysis --- analysis/file_analysis.py | 49 +++++++++++++++++++++++++++++++++++++ analyzer.py | 51 ++------------------------------------- test_analyzer.py | 23 ++++++++++++------ 3 files changed, 67 insertions(+), 56 deletions(-) create mode 100644 analysis/file_analysis.py diff --git a/analysis/file_analysis.py b/analysis/file_analysis.py new file mode 100644 index 0000000..345f461 --- /dev/null +++ b/analysis/file_analysis.py @@ -0,0 +1,49 @@ +import ast + +from analysis.lines import analyze_lines +from analysis.ast_analysis import analyze_ast +from analysis.quality import ( + analyze_quality, + calculate_health_score, +) + + +def analyze_file(file): + # encoding with utf-8 as it causes "unicode error" on windows + with file.open(encoding="utf-8") as f: + source = f.read() + lines = source.splitlines() + + tree = parse_python_file(source, file) + + if tree is None: + return + + line_data = analyze_lines(lines) + ast_data = analyze_ast(tree) + quality_data = analyze_quality(ast_data["function_details"]) + health_score = calculate_health_score( + ast_data["function_details"], + line_data["todos"], + line_data["fixmes"], + ) + + # ** is used to unpack dictionaries + return { + "file": file, + "total_lines": len(lines), + **line_data, + **ast_data, + "issues": quality_data, + "health_score": health_score, + } + + +def parse_python_file(source, file): + try: + return ast.parse(source) + + # handling the syntax errors + except SyntaxError as err: + print(f"Syntax error in {file}: {err}") + return None diff --git a/analyzer.py b/analyzer.py index 2e54dcf..9bab0b9 100644 --- a/analyzer.py +++ b/analyzer.py @@ -1,13 +1,7 @@ from pathlib import Path -import ast import argparse -from analysis.lines import analyze_lines -from analysis.ast_analysis import analyze_ast -from analysis.quality import ( - analyze_quality, - calculate_health_score, -) +from analysis.file_analysis import analyze_file from reporting.terminal import ( generate_codebase_summary, @@ -83,46 +77,5 @@ def analyze_codebase( generate_json_report(results, output_file) -def analyze_file(file): - # encoding with utf-8 as it causes "unicode error" on windows - with file.open(encoding="utf-8") as f: - source = f.read() - lines = source.splitlines() - - tree = parse_python_file(source, file) - - if tree is None: - return - - line_data = analyze_lines(lines) - ast_data = analyze_ast(tree) - quality_data = analyze_quality(ast_data["function_details"]) - health_score = calculate_health_score( - ast_data["function_details"], - line_data["todos"], - line_data["fixmes"], - ) - - # ** is used to unpack dictionaries - return { - "file": file, - "total_lines": len(lines), - **line_data, - **ast_data, - "issues": quality_data, - "health_score": health_score, - } - - -def parse_python_file(source, file): - try: - return ast.parse(source) - - # handling the syntax errors - except SyntaxError as err: - print(f"Syntax error in {file}: {err}") - return None - - if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/test_analyzer.py b/test_analyzer.py index d086e39..5f00162 100644 --- a/test_analyzer.py +++ b/test_analyzer.py @@ -6,12 +6,22 @@ import json from analyzer import ( + main, +) + +from analysis.file_analysis import ( analyze_file, + parse_python_file, +) + +from analysis.lines import ( analyze_lines, +) + +from analysis.quality import ( analyze_quality, calculate_health_score, - parse_python_file, - main, + get_health_rating, ) from analysis.ast_analysis import ( @@ -30,8 +40,6 @@ from analysis.lines import count_todos_and_fixmes -from analysis.quality import get_health_rating - from reporting.terminal import display_quality_issues_metrics @@ -39,13 +47,14 @@ def capture_output(func, *args, **kwargs): """Capture stdout while running a function""" import tempfile + old_stdout = sys.stdout - temp_file = tempfile.NamedTemporaryFile(mode='w+', delete=False) + temp_file = tempfile.NamedTemporaryFile(mode="w+", delete=False) sys.stdout = temp_file try: func(*args, **kwargs) temp_file.flush() - with open(temp_file.name, 'r') as f: + with open(temp_file.name, "r") as f: return f.read() finally: sys.stdout = old_stdout @@ -1018,4 +1027,4 @@ def test(): result = analyze_functions(tree) assert result["functions"] == 2 assert result["function_details"][0]["name"] == "test" - assert result["function_details"][1]["name"] == "test" \ No newline at end of file + assert result["function_details"][1]["name"] == "test"