import logging import sys from pathlib import Path def setup_logging(level: str = "info", log_file: str | None = None) -> logging.Logger: logger = logging.getLogger("aicr") logger.setLevel(getattr(logging, level.upper(), logging.INFO)) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) if log_file: file_handler = logging.FileHandler(log_file) file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger def get_file_language(filename: str) -> str: ext_map = { ".py": "python", ".js": "javascript", ".ts": "typescript", ".go": "go", ".rs": "rust", ".java": "java", ".c": "c", ".cpp": "cpp", ".h": "c", ".hpp": "cpp", ".jsx": "javascript", ".tsx": "typescript", ".rb": "ruby", ".php": "php", ".swift": "swift", ".kt": "kotlin", ".scala": "scala", } ext = Path(filename).suffix.lower() return ext_map.get(ext, "unknown") def sanitize_output(text: str) -> str: return text.strip() def truncate_text(text: str, max_length: int = 2000, suffix: str = "...") -> str: if len(text) <= max_length: return text return text[:max_length - len(suffix)] + suffix def format_file_size(size: float) -> str: KB_SIZE = 1024 for unit in ["B", "KB", "MB", "GB"]: if size < KB_SIZE: return f"{size:.1f}{unit}" size /= 1024 return f"{size:.1f}TB"