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

1"""Configuration commands.""" 

2 

3import sys 

4from typing import Any 

5 

6import click 

7 

8from ..config import GCOConfig 

9from ..output import confirm, get_output_formatter 

10 

11pass_config = click.make_pass_decorator(GCOConfig, ensure=True) 

12 

13 

14@click.group(name="config-cmd") 

15@pass_config 

16def config_cmd(config: Any) -> None: 

17 """Manage CLI configuration.""" 

18 

19 

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()) 

26 

27 

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. 

33 

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 

43 

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}) 

52 

53 

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 

60 

61 config_path = Path.home() / ".gco" / "config.yaml" 

62 

63 if config_path.exists() and not force: 

64 confirm(f"Config file exists at {config_path}. Overwrite?", abort=True) 

65 

66 config.save(str(config_path)) 

67 click.echo(f"Configuration saved to {config_path}")