"""CLI entry point: ``python -m jobsource.main``. Parses arguments and delegates to :func:`~jobsource.pipeline.run_batch`. All heavy imports are deferred past the argument parse so ``--help`` exits immediately with no dependency overhead. Usage examples:: python -m jobsource.main --help python -m jobsource.main --batch-size 20 --search "software engineer" --location "United States" python -m jobsource.main --search "data engineer" --search "ML engineer" --hours-old 48 """ from __future__ import annotations import argparse import logging import sys def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="python -m jobsource.main", description=( "AI Job Source Agent -- emit company_name, career_page_url, " "open_position_url for recently posted LinkedIn jobs." ), ) parser.add_argument( "--batch-size", type=int, default=None, help="Number of new jobs to process this run (default from config).", ) parser.add_argument( "--search", action="append", metavar="TERM", help="Search term; repeatable. Overrides config search terms.", ) parser.add_argument( "--location", default=None, help="Job location filter (default from config).", ) parser.add_argument( "--hours-old", type=int, default=None, help="Only jobs posted within this many hours (default from config).", ) return parser def main(argv: list[str] | None = None) -> int: args = build_parser().parse_args(argv) # Configure root logger so pipeline/cascade INFO and WARNING messages are # visible on the terminal. Deferred past parse_args so --help stays instant. logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)-8s %(name)s: %(message)s", datefmt="%H:%M:%S", ) from jobsource.pipeline import run_batch # deferred: keeps --help fast before heavy deps run_batch( batch_size=args.batch_size, search_terms=args.search, # None or list[str] from --search repeats location=args.location, hours_old=args.hours_old, ) return 0 if __name__ == "__main__": raise SystemExit(main())