Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions analysis/file_analysis.py
Original file line number Diff line number Diff line change
@@ -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
51 changes: 2 additions & 49 deletions analyzer.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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()
main()
23 changes: 16 additions & 7 deletions test_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -30,22 +40,21 @@

from analysis.lines import count_todos_and_fixmes

from analysis.quality import get_health_rating

from reporting.terminal import display_quality_issues_metrics


# Helper function to capture stdout using a temporary file
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
Expand Down Expand Up @@ -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"
assert result["function_details"][1]["name"] == "test"
Loading