Files
TinyTorch/tito/core/config.py
Vijay Janapa Reddi d892a10492 Simplify export workflow: remove module_paths.txt, use dynamic discovery
- Remove unnecessary module_paths.txt file for cleaner architecture
- Update export command to discover modules dynamically from modules/source/
- Simplify nbdev command to support --all and module-specific exports
- Use single source of truth: nbdev settings.ini for module paths
- Clean up import structure in setup module for proper nbdev export
- Maintain clean separation between module discovery and export logic

This implements a proper software engineering approach with:
- Single source of truth (settings.ini)
- Dynamic discovery (no hardcoded paths)
- Clean CLI interface (tito package nbdev --export [--all|module])
- Robust error handling with helpful feedback
2025-07-12 17:19:22 -04:00

84 lines
2.8 KiB
Python

"""
Configuration management for TinyTorch CLI.
"""
import os
import sys
from pathlib import Path
from typing import Dict, Any, Optional
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
# 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()
return cls(
project_root=project_root,
assignments_dir=project_root / 'modules' / 'source',
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