Commit 7cd924ed authored by Jan Reimes's avatar Jan Reimes
Browse files

feat(03-01): create shared load_cli_config() utility

- Add cli/config.py with load_cli_config() function
- Loads config with correct precedence: CLI > Config > Env > Defaults
- Validates config at load time with clear error messages
- Stores loaded config in typer.Context for subcommand access
- Export from cli/__init__.py for easy importing
parent 516b1dff
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2,6 +2,9 @@

from __future__ import annotations

from tdoc_crawler.cli.config import load_cli_config
from tdoc_crawler.cli.config_cmd import config_app
from tdoc_crawler.cli.tdoc_app import tdoc_app
from tdoc_crawler.cli.spec_app import spec_app

__all__ = ["tdoc_app"]
__all__ = ["load_cli_config", "config_app", "tdoc_app", "spec_app"]
+58 −0
Original line number Diff line number Diff line
"""CLI configuration utilities for shared config loading."""

from __future__ import annotations

from pathlib import Path
from typing import TYPE_CHECKING

import typer
from rich.console import Console

if TYPE_CHECKING:
    from tdoc_crawler.config import TDocCrawlerConfig

console = Console()


def load_cli_config(
    ctx: typer.Context,
    config_file: Path | None = None,
) -> "TDocCrawlerConfig":
    """Load and validate TDocCrawlerConfig for CLI use.

    Loads config from (in precedence order):
    1. Explicit --config file (if provided)
    2. Discovered config files (mise-style hierarchy)
    3. Environment variables (via pydantic-settings)
    4. Hard-coded defaults

    Validates config at load time. On validation error, prints
    formatted error message and exits with code 1.

    Args:
        ctx: Typer context object for storing config
        config_file: Optional explicit config file path from --config

    Returns:
        Validated TDocCrawlerConfig instance

    Raises:
        typer.Exit: If config validation fails
    """
    from tdoc_crawler.config import TDocCrawlerConfig

    try:
        # Load config with optional explicit file
        config = TDocCrawlerConfig.from_settings(
            config_file=config_file,
            cwd=Path.cwd(),
        )

        # Store in context for subcommand access
        ctx.obj = config

        return config

    except Exception as e:
        console.print(f"[red]Configuration error:[/red] {e}")
        raise typer.Exit(code=1) from e