b276227cbb
tracker-policy-pr / check-pr (pull_request) Successful in 8s
test / integration-docker (pull_request) Successful in 17s
test / unit (pull_request) Successful in 48s
lint / lint (push) Failing after 2m56s
test / integration-firecracker (pull_request) Successful in 3m33s
test / coverage (pull_request) Successful in 21s
test / publish-infra (pull_request) Has been skipped
Split the cli package's two responsibilities out of __init__:
* commands/__init__.py now assembles the COMMANDS registry and
NO_MIGRATION_COMMANDS from the per-command modules — the command
surface lives entirely under commands/.
* __main__.py now owns main() (dispatch + migration gate + exit-code
mapping) alongside the runnable entry guard.
cli/__init__.py shrinks to a shim that re-exports main / COMMANDS /
NO_MIGRATION_COMMANDS, so bot_bottle.cli.main (repo-root cli.py entry)
and the tests' bot_bottle.cli.COMMANDS keep working unchanged. Verified
`python -m bot_bottle.cli` (runpy) and `cli.py` both dispatch; full unit
suite green (2243).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
"""Entry point + dispatcher for `python -m bot_bottle.cli`.
|
|
|
|
Maps `bot-bottle <command>` to its handler in the COMMANDS registry
|
|
(`bot_bottle.cli.commands`), enforces the schema-migration gate, and
|
|
translates handler exceptions into process exit codes. The repo-root
|
|
`cli.py` is the usual way in; this makes the package runnable too, so the
|
|
CLI works from an installed copy where there is no `cli.py` on disk.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
|
|
from ..errors import MissingEnvVarError
|
|
from ..log import Die, die, error
|
|
from ..manifest import ManifestError
|
|
from ..orchestrator.store.store_manager import StoreManager
|
|
from .commands import COMMANDS, NO_MIGRATION_COMMANDS
|
|
from .commands.help import cmd_help
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
if argv is None:
|
|
argv = sys.argv[1:]
|
|
if not argv:
|
|
cmd_help()
|
|
return 2
|
|
command = argv[0]
|
|
rest = argv[1:]
|
|
if command in ("-h", "--help"):
|
|
cmd_help()
|
|
return 0
|
|
handler = COMMANDS.get(command)
|
|
if handler is None:
|
|
cmd_help()
|
|
die(f"unknown command: {command}")
|
|
mgr = StoreManager.instance()
|
|
if command not in NO_MIGRATION_COMMANDS and not mgr.is_migrated():
|
|
sys.stderr.write("bot-bottle: database schema is out of date\n")
|
|
sys.stderr.write("Migrate now? [y/N] ")
|
|
sys.stderr.flush()
|
|
try:
|
|
answer = sys.stdin.readline().strip().lower()
|
|
except EOFError:
|
|
answer = ""
|
|
if answer != "y":
|
|
error("migration required — re-run and confirm to migrate")
|
|
return 1
|
|
mgr.migrate()
|
|
try:
|
|
return handler(rest) or 0
|
|
except MissingEnvVarError as e:
|
|
error(str(e))
|
|
return 1
|
|
except ManifestError as e:
|
|
error(str(e))
|
|
return 1
|
|
except Die as e:
|
|
return e.code if isinstance(e.code, int) else 1
|
|
except KeyboardInterrupt:
|
|
return 130
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|