Coverage for cli / commands / config_cmd.py: 100.00%
40 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-10-28 16:19 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-10-28 16:19 +0000
1"""Configuration commands."""
3import sys
4from typing import Any
6import click
8from ..config import GCOConfig
9from ..output import confirm, get_output_formatter
11pass_config = click.make_pass_decorator(GCOConfig, ensure=True)
14@click.group(name="config-cmd")
15@pass_config
16def config_cmd(config: Any) -> None:
17 """Manage CLI configuration."""
20@config_cmd.command("show")
21@pass_config
22def show_config(config: Any) -> None:
23 """Show current configuration."""
24 formatter = get_output_formatter(config)
25 formatter.print(config.to_dict())
28@config_cmd.command("get")
29@click.argument("key", required=False)
30@pass_config
31def get_config(config: Any, key: Any) -> None:
32 """Read a configuration value by KEY (dotted path), or the full config.
34 Examples:
35 gco config-cmd get
36 gco config-cmd get default_region
37 """
38 formatter = get_output_formatter(config)
39 data = config.to_dict()
40 if not key:
41 formatter.print(data)
42 return
44 node: Any = data
45 for part in key.split("."):
46 if isinstance(node, dict) and part in node:
47 node = node[part]
48 else:
49 formatter.print_error(f"Config key not found: {key}")
50 sys.exit(1)
51 formatter.print({key: node})
54@config_cmd.command("init")
55@click.option("--force", "-f", is_flag=True, help="Overwrite existing config")
56@pass_config
57def init_config(config: Any, force: Any) -> None:
58 """Initialize configuration file."""
59 from pathlib import Path
61 config_path = Path.home() / ".gco" / "config.yaml"
63 if config_path.exists() and not force:
64 confirm(f"Config file exists at {config_path}. Overwrite?", abort=True)
66 config.save(str(config_path))
67 click.echo(f"Configuration saved to {config_path}")