""" Configuration management for TinyTorch CLI. """ import os import sys from pathlib import Path from typing import Dict, Any, Optional, List from dataclasses import dataclass @dataclass class CLIConfig: """Configuration for TinyTorch CLI.""" # Project paths project_root: Path assignments_dir: Path tinytorch_dir: Path bin_dir: Path modules_dir: Path # Alias for assignments_dir # Environment settings python_min_version: tuple = (3, 8) required_packages: list = None # type: ignore # CLI settings verbose: bool = False no_color: bool = False def __post_init__(self): """Initialize default values.""" if self.required_packages is None: self.required_packages = ['numpy', 'pytest', 'rich'] @classmethod def from_project_root(cls, project_root: Optional[Path] = None) -> 'CLIConfig': """Create config from project root directory.""" if project_root is None: # Auto-detect project root current = Path.cwd() while current != current.parent: if (current / 'pyproject.toml').exists(): project_root = current break current = current.parent else: project_root = Path.cwd() modules_path = project_root / 'modules' / 'source' return cls( project_root=project_root, assignments_dir=modules_path, modules_dir=modules_path, # Same as assignments_dir tinytorch_dir=project_root / 'tinytorch', bin_dir=project_root / 'bin' ) def validate(self) -> List[str]: """Validate the configuration and return any issues.""" issues = [] # Check Python version if sys.version_info < self.python_min_version: issues.append(f"Python {'.'.join(map(str, self.python_min_version))}+ required, " f"found {sys.version_info.major}.{sys.version_info.minor}") # Check virtual environment in_venv = (hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) if not in_venv: issues.append("Virtual environment not activated. Run: source .venv/bin/activate") # Check required directories if not self.assignments_dir.exists(): issues.append(f"Assignments directory not found: {self.assignments_dir}") if not self.tinytorch_dir.exists(): issues.append(f"TinyTorch package not found: {self.tinytorch_dir}") # Check required packages for package in self.required_packages: try: __import__(package) except ImportError: issues.append(f"Missing dependency: {package}. Run: pip install -r requirements.txt") return issues