Coverage for src/tomcli/cli/get.py: 97%

34 statements  

« prev     ^ index     » next       coverage.py v7.2.3, created at 2023-04-13 11:39 +0300

1# Copyright (C) 2023 Maxwell G <maxwell@gtmx.me> 

2# 

3# SPDX-License-Identifier: MIT 

4 

5# ruff: noqa: UP007 

6 

7from __future__ import annotations 

8 

9import sys 

10from collections.abc import Iterable, Mapping, MutableMapping 

11from typing import Any, Optional 

12 

13from typer import Argument, Exit, Typer 

14 

15from tomcli.cli._util import _std_cm 

16from tomcli.toml import Reader, Writer, dump, load 

17 

18app = Typer() 

19 

20 

21def get_part(data: MutableMapping[str, Any], selector: str) -> Any: 

22 if selector == ".": 

23 return data 

24 

25 cur = data 

26 parts = selector.split(".") 

27 idx = 0 

28 try: 

29 for idx, part in enumerate(parts): # noqa: B007 

30 cur = cur[part] 

31 except (IndexError, KeyError): 

32 up_to = ".".join(parts[: idx + 1]) 

33 msg = f"Invalid selector {selector!r}: could not find {up_to!r}" 

34 raise Exit(msg) from None 

35 return cur 

36 

37 

38@app.command() 

39def get( 

40 path: str = Argument(...), 

41 selector: str = Argument("."), 

42 reader: Optional[Reader] = None, 

43 writer: Optional[Writer] = None, 

44): 

45 allow_fallback_r = bool(reader) 

46 allow_fallback_w = bool(writer) 

47 reader = reader or Reader.TOMLKIT 

48 writer = writer or Writer.TOMLKIT 

49 with _std_cm(path, sys.stdin.buffer, "rb") as fp: 

50 data = load(fp, reader, allow_fallback_r) 

51 selected = get_part(data, selector) 

52 if isinstance(selected, Mapping): 

53 dump(selected, sys.stdout.buffer, writer, allow_fallback_w) 

54 else: 

55 print(selected)