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
« 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
5# ruff: noqa: UP007
7from __future__ import annotations
9import sys
10from collections.abc import Iterable, Mapping, MutableMapping
11from typing import Any, Optional
13from typer import Argument, Exit, Typer
15from tomcli.cli._util import _std_cm
16from tomcli.toml import Reader, Writer, dump, load
18app = Typer()
21def get_part(data: MutableMapping[str, Any], selector: str) -> Any:
22 if selector == ".":
23 return data
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
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)