64 lines
2.1 KiB
Python
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()
|