T6: Decompose CLI — main.py → 9 command files, config.py → config_cmd.py
Split infrastructure/cli/: - main.py (330 LOC) → 9 files in infrastructure/cli/commands/: * init.py, forecast.py, scenario.py, whatif.py, compare.py * import_xlsx.py, export_xlsx.py, analyze.py, info.py - config.py (428 LOC) → commands/config_cmd.py (15 sub-commands) - main.py → app.py (entry point: registers all commands) - New: paths.py (MODEL_PATH, DATA_DIR) - New: services.py (composition root + helpers: load_model, save_model, build_services, resolve_currency, convert_value, fmt_amount) - cli/__init__.py (empty) удалён Each command module: <100 LOC. pyproject.toml: cf = infrastructure.cli.app:app tests/test_cli.py: import обновлён на infrastructure.cli.app CLI behavior идентично, все команды работают. Tests: 67/67 pass.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
"""cf compare — сравнить все сценарии."""
|
||||
import typer
|
||||
from rich.table import Table
|
||||
|
||||
from infrastructure.cli.i18n import t
|
||||
from infrastructure.cli.services import (
|
||||
build_services,
|
||||
console,
|
||||
convert_value,
|
||||
fmt_amount,
|
||||
load_model,
|
||||
resolve_currency,
|
||||
)
|
||||
|
||||
app = typer.Typer()
|
||||
|
||||
CURRENCY_OPTION = typer.Option(None, "--currency", "-c", help=t("cmd.forecast.opt.currency"))
|
||||
|
||||
|
||||
@app.command()
|
||||
def compare(
|
||||
months: int = typer.Option(12, "--months", "-m", help=t("cmd.compare.opt.months")),
|
||||
currency: str | None = CURRENCY_OPTION,
|
||||
) -> None:
|
||||
"""Сравнить все сценарии"""
|
||||
model = load_model()
|
||||
target_curr, symbol = resolve_currency(model, currency)
|
||||
_, scenario_service, _, converter = build_services(model)
|
||||
base_curr = model.base_currency
|
||||
results = scenario_service.compare(months)
|
||||
|
||||
table = Table(title=t("cmd.compare.title", currency=target_curr))
|
||||
table.add_column(t("cmd.compare.col.scenario"), style="cyan")
|
||||
table.add_column(t("cmd.forecast.col.balance"), justify="right")
|
||||
table.add_column(t("cmd.forecast.col.income"), justify="right")
|
||||
table.add_column(t("cmd.forecast.col.expenses"), justify="right")
|
||||
|
||||
for name, r in results.items():
|
||||
b = convert_value(converter, r["total_balance"], base_curr, target_curr)
|
||||
i = convert_value(converter, r["total_income"], base_curr, target_curr)
|
||||
e = convert_value(converter, r["total_expenses"], base_curr, target_curr)
|
||||
table.add_row(
|
||||
name,
|
||||
fmt_amount(b, target_curr, symbol),
|
||||
fmt_amount(i, target_curr, symbol),
|
||||
fmt_amount(e, target_curr, symbol),
|
||||
)
|
||||
console.print(table)
|
||||
Reference in New Issue
Block a user