f1tness_parser/app/cli.py
2026-10-22 23:46:29 +03:00

64 lines
2.1 KiB
Python

"""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()