"""Command line helpers. python -m app.cli import [--replace] Imports all trainings from the Obsidian and Apple notes into the database. The schema must already exist (`alembic upgrade head`). """ import argparse import asyncio import logging from app.config import settings from app.core.database.connection import create_engine, create_session_factory from app.core.database.repository import TrainingRepository from app.core.parsers.apple import AppleNotesParser from app.core.parsers.obsidian import ObsidianNotesParser async def import_notes(replace: bool) -> None: parsers = [ObsidianNotesParser(), AppleNotesParser()] trainings = [] for parser in parsers: parsed = parser.parse_file() print( f"{type(parser).__name__}: {len(parsed)} trainings, " f"{len(parser.errors)} skipped lines" ) trainings.extend(parsed) engine = create_engine(settings.get_postgres_database_url()) try: async with create_session_factory(engine)() as session: repository = TrainingRepository(session) existing = await repository.count() if existing and not replace: raise SystemExit( f"Database already has {existing} trainings, " "use --replace to overwrite them" ) if replace: await repository.delete_all() await repository.save_many(trainings) finally: await engine.dispose() print(f"Imported {len(trainings)} trainings") def main() -> None: logging.basicConfig(level=logging.WARNING) arg_parser = argparse.ArgumentParser(prog="app.cli") subcommands = arg_parser.add_subparsers(dest="command", required=True) import_parser = subcommands.add_parser("import", help="import notes into the DB") import_parser.add_argument( "--replace", action="store_true", help="delete existing trainings first" ) args = arg_parser.parse_args() if args.command == "import": asyncio.run(import_notes(replace=args.replace)) if __name__ == "__main__": main()