forked from ShigureLab/gh-llm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptions.py
More file actions
96 lines (80 loc) 路 2.61 KB
/
Copy pathoptions.py
File metadata and controls
96 lines (80 loc) 路 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from __future__ import annotations
import sys
from difflib import get_close_matches
from pathlib import Path
from typing import TYPE_CHECKING, Any, NoReturn
if TYPE_CHECKING:
from collections.abc import Callable
def add_body_input_arguments(
parser: Any,
*,
required: bool,
body_help: str,
file_help: str,
default: str | None = None,
) -> None:
group = parser.add_mutually_exclusive_group(required=required)
body_kwargs: dict[str, object] = {"help": body_help}
if default is not None:
body_kwargs["default"] = default
group.add_argument("--body", **body_kwargs)
group.add_argument(
"-F",
"--body-file",
help=file_help,
)
def read_text_from_path_or_stdin(path: str) -> str:
if path == "-":
return sys.stdin.read()
return Path(path).read_text(encoding="utf-8")
def resolve_file_or_inline_text(
args: Any,
*,
text_attr: str,
file_attr: str,
default: str = "",
) -> str:
file_path = getattr(args, file_attr, None)
if file_path is not None:
return read_text_from_path_or_stdin(str(file_path))
text = getattr(args, text_attr, None)
if text is None:
return default
return str(text)
def resolve_subject[T](
*,
selector: str | None,
repo: str | None,
selector_flag: str,
resolver: Callable[[str | None, str | None], T],
) -> T:
_validate_selector_for_repo(selector=selector, repo=repo, selector_flag=selector_flag)
return resolver(selector, repo)
def maybe_resolve_subject[T](
*,
selector: str | None,
repo: str | None,
selector_flag: str,
resolver: Callable[[str | None, str | None], T],
) -> T | None:
_validate_selector_for_repo(selector=selector, repo=repo, selector_flag=selector_flag)
if selector is None:
return None
return resolver(selector, repo)
def _validate_selector_for_repo(*, selector: str | None, repo: str | None, selector_flag: str) -> None:
if repo is not None and selector is None:
raise RuntimeError(f"`{selector_flag}` is required when `--repo` is provided")
def raise_unknown_option_value(
*,
flag: str,
token: str,
valid_values: list[str],
alias_values: list[str] | None = None,
) -> NoReturn:
candidates = list(valid_values)
if alias_values:
candidates.extend(alias_values)
suggestion = get_close_matches(token, candidates, n=1, cutoff=0.6)
suggest_text = f" Did you mean '{suggestion[0]}'?" if suggestion else ""
valid_text = ", ".join(valid_values)
raise RuntimeError(f"unknown {flag} option: {token}. Valid values: {valid_text}.{suggest_text}")