Add CLI, utils, and fixers modules
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled

This commit is contained in:
2026-01-29 23:11:58 +00:00
parent 7b9a423efb
commit 5772b7362e

70
src/utils/__init__.py Normal file
View File

@@ -0,0 +1,70 @@
"""Utility functions for file handling and output."""
from pathlib import Path
from typing import Optional
def get_file_language(file_path: Path) -> Optional[str]:
"""Determine programming language from file extension."""
extension_map = {
".py": "python",
".js": "javascript",
".ts": "typescript",
".jsx": "javascript",
".tsx": "typescript",
}
return extension_map.get(file_path.suffix.lower())
def is_supported_file(file_path: Path) -> bool:
"""Check if file is supported for analysis."""
return get_file_language(file_path) is not None
def read_source_file(file_path: Path) -> Optional[str]:
"""Read source file contents."""
try:
return file_path.read_text(encoding="utf-8")
except (UnicodeDecodeError, FileNotFoundError):
return None
def write_source_file(file_path: Path, content: str) -> bool:
"""Write source file contents."""
try:
file_path.write_text(content, encoding="utf-8")
return True
except (UnicodeDecodeError, FileNotFoundError, PermissionError):
return False
def create_backup(file_path: Path) -> Optional[Path]:
"""Create a backup of the file."""
try:
backup_path = file_path.with_suffix(file_path.suffix + ".bak")
backup_path.write_text(file_path.read_text(encoding="utf-8"), encoding="utf-8")
return backup_path
except (FileNotFoundError, PermissionError):
return None
def remove_backup(file_path: Path) -> bool:
"""Remove a backup file."""
try:
backup_path = file_path.with_suffix(file_path.suffix + ".bak")
if backup_path.exists():
backup_path.unlink()
return True
except (FileNotFoundError, PermissionError):
return False
def count_lines_of_code(source_code: str) -> int:
"""Count lines of code (excluding empty lines and comments)."""
lines = source_code.split("\n")
code_lines = 0
for line in lines:
stripped = line.strip()
if stripped and not stripped.startswith("#"):
code_lines += 1
return code_lines