Initial Commit
This commit is contained in:
71
backend/cli.py
Normal file
71
backend/cli.py
Normal file
@@ -0,0 +1,71 @@
|
||||
import argparse
|
||||
import asyncio
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
from backend import config
|
||||
from backend.database import init_db
|
||||
from backend.news_service import process_and_store_news
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser(prog="clawfort", description="ClawFort operations CLI")
|
||||
subparsers = parser.add_subparsers(dest="command", required=True)
|
||||
|
||||
force_fetch_parser = subparsers.add_parser(
|
||||
"force-fetch",
|
||||
help="Run one immediate news fetch cycle",
|
||||
description="Trigger one immediate news fetch run outside scheduler cadence.",
|
||||
)
|
||||
force_fetch_parser.set_defaults(handler=handle_force_fetch)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
def validate_runtime() -> None:
|
||||
if not config.PERPLEXITY_API_KEY and not config.OPENROUTER_API_KEY:
|
||||
raise RuntimeError(
|
||||
"No provider API key configured. Set PERPLEXITY_API_KEY or OPENROUTER_API_KEY in the environment."
|
||||
)
|
||||
|
||||
|
||||
def handle_force_fetch(_: argparse.Namespace) -> int:
|
||||
start = time.monotonic()
|
||||
|
||||
try:
|
||||
validate_runtime()
|
||||
os.makedirs("data", exist_ok=True)
|
||||
init_db()
|
||||
|
||||
stored_count = asyncio.run(process_and_store_news())
|
||||
elapsed = time.monotonic() - start
|
||||
|
||||
print(f"force-fetch succeeded: stored={stored_count} elapsed={elapsed:.1f}s")
|
||||
return 0
|
||||
except Exception as exc:
|
||||
logger.exception("force-fetch failed")
|
||||
print(f"force-fetch failed: {exc}", file=sys.stderr)
|
||||
print(
|
||||
"Check API keys, network connectivity, and provider status, then retry the command.",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 1
|
||||
|
||||
|
||||
def main(argv: list[str] | None = None) -> int:
|
||||
parser = build_parser()
|
||||
args = parser.parse_args(argv)
|
||||
handler = args.handler
|
||||
return handler(args)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user