Add CLI, utils, and fixers modules
This commit is contained in:
70
src/utils/__init__.py
Normal file
70
src/utils/__init__.py
Normal 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
|
||||||
Reference in New Issue
Block a user