#!/usr/bin/env python3 """Entry point for python -m generator.""" import os import sys from pathlib import Path from dotenv import load_dotenv from .errors import GenerationError, ModelGeneratorError from .generate import generate_models from .utils.env import get_db_config, try_env from .utils.print import error, info, success # Load environment variables load_dotenv() def main() -> int: """Enter entry point for the model generator. Returns: Exit code (0 for success, non-zero for failure) """ try: success('Starting SQLAlchemy model generation...') info('Checking environment...') try_env() info('Reading database configuration...') db_config = get_db_config() info(f'\tDatabase: {db_config}') info('Reading output directory...') db_vendor = db_config.get_vendor().lower() db_name = db_config.database.lower() output_dir = os.environ.get( 'OUTPUT_DIR', f'abacus_models/{db_vendor}/{db_name}' ) output_dir = Path(str(output_dir)) info(f'\tOutput directory: {output_dir}') if output_dir.exists(): info('Clearing output directory...') for file in output_dir.glob('*.py'): file.unlink() else: info('Creating output directory...') output_dir.mkdir(parents=True, exist_ok=True) info('Creating missing __init__.py files...') _create_init_files(output_dir, 'abacus_models') info('Creating SQLAlchemy engine....') engine = db_config.get_engine() try: generate_models(engine, output_dir) except Exception as e: raise GenerationError(f'Failed to generate models: {e}') from e finally: engine.dispose() success('\nSuccessfully generated models!') return 0 except ModelGeneratorError as e: error(f'\nError: {e}') return 1 except Exception as e: error(f'\nUnexpected error: {e}') import traceback traceback.print_exc() return 1 def _create_init_files(local_dir, root_dir): """Create __init__.py files in each directory from local_dir to root_dir (exclusive).""" local_dir = os.path.abspath(local_dir) root_dir = os.path.abspath(root_dir) if not os.path.isdir(local_dir): raise ValueError(f"Directory '{local_dir}' does not exist.") if not os.path.isdir(root_dir): raise ValueError(f"Directory '{root_dir}' does not exist.") if not local_dir.startswith(root_dir): raise ValueError(f"Directory '{local_dir}' is not a subdirectory '{root_dir}'.") current_dir = local_dir while current_dir != root_dir: # Create a __init__.py file if it does not already exist init_file_path = os.path.join(current_dir, '__init__.py') if not os.path.exists(init_file_path): with open(init_file_path, 'x') as f: f.write('"""Generated SQLAlchemy module."""\n') current_dir = os.path.dirname(current_dir) if __name__ == '__main__': sys.exit(main())