Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +76 -36
- README.md +41 -41
- adapter_config.json +28 -28
- added_tokens.json +3 -3
- chat_template.json +3 -3
- config.json +37 -37
- gemma-ad/Lib/site-packages/InquirerPy/__init__.py +2 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/__init__.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/enum.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/exceptions.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/inquirer.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/resolver.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/separator.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/utils.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/__pycache__/validator.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/__init__.py +15 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/__init__.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/complex.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/control.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/list.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/simple.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/complex.py +294 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/control.py +227 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/list.py +238 -0
- gemma-ad/Lib/site-packages/InquirerPy/base/simple.py +378 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/__init__.py +1 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/__init__.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/instruction.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/message.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/spinner.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/validation.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/instruction.py +38 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/message.py +42 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/spinner.py +108 -0
- gemma-ad/Lib/site-packages/InquirerPy/containers/validation.py +60 -0
- gemma-ad/Lib/site-packages/InquirerPy/enum.py +7 -0
- gemma-ad/Lib/site-packages/InquirerPy/exceptions.py +25 -0
- gemma-ad/Lib/site-packages/InquirerPy/inquirer.py +17 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__init__.py +11 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/__init__.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/checkbox.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/confirm.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/expand.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/filepath.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/fuzzy.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/input.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/list.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/number.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/rawlist.cpython-311.pyc +0 -0
- gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/secret.cpython-311.pyc +0 -0
.gitattributes
CHANGED
@@ -1,36 +1,76 @@
|
|
1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
-
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
37 |
+
gemma-ad/Lib/site-packages/__pycache__/typing_extensions.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
38 |
+
gemma-ad/Lib/site-packages/charset_normalizer/md__mypyc.cp311-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
|
39 |
+
gemma-ad/Lib/site-packages/fsspec/__pycache__/spec.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
40 |
+
gemma-ad/Lib/site-packages/huggingface_hub/__pycache__/hf_api.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
41 |
+
gemma-ad/Lib/site-packages/huggingface_hub/inference/__pycache__/_client.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
42 |
+
gemma-ad/Lib/site-packages/huggingface_hub/inference/_generated/__pycache__/_async_client.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
43 |
+
gemma-ad/Lib/site-packages/idna/__pycache__/idnadata.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
44 |
+
gemma-ad/Lib/site-packages/idna/__pycache__/uts46data.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
45 |
+
gemma-ad/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
46 |
+
gemma-ad/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
47 |
+
gemma-ad/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe filter=lfs diff=lfs merge=lfs -text
|
48 |
+
gemma-ad/Lib/site-packages/pip/_vendor/distlib/t64.exe filter=lfs diff=lfs merge=lfs -text
|
49 |
+
gemma-ad/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe filter=lfs diff=lfs merge=lfs -text
|
50 |
+
gemma-ad/Lib/site-packages/pip/_vendor/distlib/w64.exe filter=lfs diff=lfs merge=lfs -text
|
51 |
+
gemma-ad/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
52 |
+
gemma-ad/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
53 |
+
gemma-ad/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
54 |
+
gemma-ad/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
55 |
+
gemma-ad/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
56 |
+
gemma-ad/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
57 |
+
gemma-ad/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
58 |
+
gemma-ad/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
59 |
+
gemma-ad/Lib/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/vi.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
60 |
+
gemma-ad/Lib/site-packages/prompt_toolkit/layout/__pycache__/containers.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
61 |
+
gemma-ad/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
62 |
+
gemma-ad/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
63 |
+
gemma-ad/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
64 |
+
gemma-ad/Lib/site-packages/setuptools/cli-arm64.exe filter=lfs diff=lfs merge=lfs -text
|
65 |
+
gemma-ad/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
66 |
+
gemma-ad/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
|
67 |
+
gemma-ad/Lib/site-packages/setuptools/gui-arm64.exe filter=lfs diff=lfs merge=lfs -text
|
68 |
+
gemma-ad/Lib/site-packages/yaml/_yaml.cp311-win_amd64.pyd filter=lfs diff=lfs merge=lfs -text
|
69 |
+
gemma-ad/Scripts/huggingface-cli.exe filter=lfs diff=lfs merge=lfs -text
|
70 |
+
gemma-ad/Scripts/normalizer.exe filter=lfs diff=lfs merge=lfs -text
|
71 |
+
gemma-ad/Scripts/pip.exe filter=lfs diff=lfs merge=lfs -text
|
72 |
+
gemma-ad/Scripts/pip3.11.exe filter=lfs diff=lfs merge=lfs -text
|
73 |
+
gemma-ad/Scripts/pip3.exe filter=lfs diff=lfs merge=lfs -text
|
74 |
+
gemma-ad/Scripts/python.exe filter=lfs diff=lfs merge=lfs -text
|
75 |
+
gemma-ad/Scripts/pythonw.exe filter=lfs diff=lfs merge=lfs -text
|
76 |
+
gemma-ad/Scripts/tqdm.exe filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
@@ -1,42 +1,42 @@
|
|
1 |
-
---
|
2 |
-
base_model:
|
3 |
-
- google/gemma-3-4b-it
|
4 |
-
tags:
|
5 |
-
- text-generation-inference
|
6 |
-
- transformers
|
7 |
-
- gemma-3
|
8 |
-
license: apache-2.0
|
9 |
-
language:
|
10 |
-
- en
|
11 |
-
pipeline_tag: text-generation
|
12 |
-
---
|
13 |
-
|
14 |
-
## Model Information
|
15 |
-
|
16 |
-
This is a fined tuned variant model of the Gemma-3 family with 4 billion parameters.
|
17 |
-
|
18 |
-
### Description
|
19 |
-
|
20 |
-
Gemma is a family of lightweight, state-of-the-art open models from Google.
|
21 |
-
Gemma 3 models can process text and generate text output.Gemma 3 has a large, 128K
|
22 |
-
context window, multilingual support in over 140 languages. Gemma 3 models are well-suited for a variety of text generation
|
23 |
-
tasks, including question answering, summarization, and reasoning.
|
24 |
-
|
25 |
-
### Inputs and outputs
|
26 |
-
|
27 |
-
- **Input:**
|
28 |
-
- Text string, such as a question, a prompt, or a document to be summarized
|
29 |
-
|
30 |
-
- Total input context of 128K tokens for the 4B.
|
31 |
-
|
32 |
-
- **Output:**
|
33 |
-
- Generated text in response to the input, such as an answer to a
|
34 |
-
question or a summary of a document
|
35 |
-
- Total output context of 8192 tokens
|
36 |
-
|
37 |
-
# Finetuned model
|
38 |
-
|
39 |
-
- **Author :** Anand Dey
|
40 |
-
- **License:** apache-2.0
|
41 |
-
- **Finetuned from model :** google/gemma-3-4b-it
|
42 |
- **Finetuned on custom prepared dataset
|
|
|
1 |
+
---
|
2 |
+
base_model:
|
3 |
+
- google/gemma-3-4b-it
|
4 |
+
tags:
|
5 |
+
- text-generation-inference
|
6 |
+
- transformers
|
7 |
+
- gemma-3
|
8 |
+
license: apache-2.0
|
9 |
+
language:
|
10 |
+
- en
|
11 |
+
pipeline_tag: text-generation
|
12 |
+
---
|
13 |
+
|
14 |
+
## Model Information
|
15 |
+
|
16 |
+
This is a fined tuned variant model of the Gemma-3 family with 4 billion parameters.
|
17 |
+
|
18 |
+
### Description
|
19 |
+
|
20 |
+
Gemma is a family of lightweight, state-of-the-art open models from Google.
|
21 |
+
Gemma 3 models can process text and generate text output.Gemma 3 has a large, 128K
|
22 |
+
context window, multilingual support in over 140 languages. Gemma 3 models are well-suited for a variety of text generation
|
23 |
+
tasks, including question answering, summarization, and reasoning.
|
24 |
+
|
25 |
+
### Inputs and outputs
|
26 |
+
|
27 |
+
- **Input:**
|
28 |
+
- Text string, such as a question, a prompt, or a document to be summarized
|
29 |
+
|
30 |
+
- Total input context of 128K tokens for the 4B.
|
31 |
+
|
32 |
+
- **Output:**
|
33 |
+
- Generated text in response to the input, such as an answer to a
|
34 |
+
question or a summary of a document
|
35 |
+
- Total output context of 8192 tokens
|
36 |
+
|
37 |
+
# Finetuned model
|
38 |
+
|
39 |
+
- **Author :** Anand Dey
|
40 |
+
- **License:** apache-2.0
|
41 |
+
- **Finetuned from model :** google/gemma-3-4b-it
|
42 |
- **Finetuned on custom prepared dataset
|
adapter_config.json
CHANGED
@@ -1,29 +1,29 @@
|
|
1 |
-
{
|
2 |
-
"alpha_pattern": {},
|
3 |
-
"auto_mapping": null,
|
4 |
-
"base_model_name_or_path": "unsloth/gemma-3-4b-it-unsloth-bnb-4bit",
|
5 |
-
"bias": "none",
|
6 |
-
"eva_config": null,
|
7 |
-
"exclude_modules": null,
|
8 |
-
"fan_in_fan_out": false,
|
9 |
-
"inference_mode": true,
|
10 |
-
"init_lora_weights": true,
|
11 |
-
"layer_replication": null,
|
12 |
-
"layers_pattern": null,
|
13 |
-
"layers_to_transform": null,
|
14 |
-
"loftq_config": {},
|
15 |
-
"lora_alpha": 8,
|
16 |
-
"lora_bias": false,
|
17 |
-
"lora_dropout": 0,
|
18 |
-
"megatron_config": null,
|
19 |
-
"megatron_core": "megatron.core",
|
20 |
-
"modules_to_save": null,
|
21 |
-
"peft_type": "LORA",
|
22 |
-
"r": 8,
|
23 |
-
"rank_pattern": {},
|
24 |
-
"revision": null,
|
25 |
-
"target_modules": "(?:.*?(?:language|text).*?(?:self_attn|attention|attn|mlp|feed_forward|ffn|dense).*?(?:k_proj|v_proj|q_proj|out_proj|fc1|fc2|o_proj|gate_proj|up_proj|down_proj).*?)|(?:\\bmodel\\.layers\\.[\\d]{1,}\\.(?:self_attn|attention|attn|mlp|feed_forward|ffn|dense)\\.(?:(?:k_proj|v_proj|q_proj|out_proj|fc1|fc2|o_proj|gate_proj|up_proj|down_proj)))",
|
26 |
-
"task_type": "CAUSAL_LM",
|
27 |
-
"use_dora": false,
|
28 |
-
"use_rslora": false
|
29 |
}
|
|
|
1 |
+
{
|
2 |
+
"alpha_pattern": {},
|
3 |
+
"auto_mapping": null,
|
4 |
+
"base_model_name_or_path": "unsloth/gemma-3-4b-it-unsloth-bnb-4bit",
|
5 |
+
"bias": "none",
|
6 |
+
"eva_config": null,
|
7 |
+
"exclude_modules": null,
|
8 |
+
"fan_in_fan_out": false,
|
9 |
+
"inference_mode": true,
|
10 |
+
"init_lora_weights": true,
|
11 |
+
"layer_replication": null,
|
12 |
+
"layers_pattern": null,
|
13 |
+
"layers_to_transform": null,
|
14 |
+
"loftq_config": {},
|
15 |
+
"lora_alpha": 8,
|
16 |
+
"lora_bias": false,
|
17 |
+
"lora_dropout": 0,
|
18 |
+
"megatron_config": null,
|
19 |
+
"megatron_core": "megatron.core",
|
20 |
+
"modules_to_save": null,
|
21 |
+
"peft_type": "LORA",
|
22 |
+
"r": 8,
|
23 |
+
"rank_pattern": {},
|
24 |
+
"revision": null,
|
25 |
+
"target_modules": "(?:.*?(?:language|text).*?(?:self_attn|attention|attn|mlp|feed_forward|ffn|dense).*?(?:k_proj|v_proj|q_proj|out_proj|fc1|fc2|o_proj|gate_proj|up_proj|down_proj).*?)|(?:\\bmodel\\.layers\\.[\\d]{1,}\\.(?:self_attn|attention|attn|mlp|feed_forward|ffn|dense)\\.(?:(?:k_proj|v_proj|q_proj|out_proj|fc1|fc2|o_proj|gate_proj|up_proj|down_proj)))",
|
26 |
+
"task_type": "CAUSAL_LM",
|
27 |
+
"use_dora": false,
|
28 |
+
"use_rslora": false
|
29 |
}
|
added_tokens.json
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
{
|
2 |
-
"<image_soft_token>": 262144
|
3 |
-
}
|
|
|
1 |
+
{
|
2 |
+
"<image_soft_token>": 262144
|
3 |
+
}
|
chat_template.json
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
{
|
2 |
-
"chat_template": "{{ bos_token }}\n{%- if messages[0]['role'] == 'system' -%}\n {%- if messages[0]['content'] is string -%}\n {%- set first_user_prefix = messages[0]['content'] + '\n\n' -%}\n {%- else -%}\n {%- set first_user_prefix = messages[0]['content'][0]['text'] + '\n\n' -%}\n {%- endif -%}\n {%- set loop_messages = messages[1:] -%}\n{%- else -%}\n {%- set first_user_prefix = \"\" -%}\n {%- set loop_messages = messages -%}\n{%- endif -%}\n{%- for message in loop_messages -%}\n {%- if (message['role'] == 'user') != (loop.index0 % 2 == 0) -%}\n {{ raise_exception(\"Conversation roles must alternate user/assistant/user/assistant/...\") }}\n {%- endif -%}\n {%- if (message['role'] == 'assistant') -%}\n {%- set role = \"model\" -%}\n {%- else -%}\n {%- set role = message['role'] -%}\n {%- endif -%}\n {{ '<start_of_turn>' + role + '\n' + (first_user_prefix if loop.first else \"\") }}\n {%- if message['content'] is string -%}\n {{ message['content'] | trim }}\n {%- elif message['content'] is iterable -%}\n {%- for item in message['content'] -%}\n {%- if item['type'] == 'image' -%}\n {{ '<start_of_image>' }}\n {%- elif item['type'] == 'text' -%}\n {{ item['text'] | trim }}\n {%- endif -%}\n {%- endfor -%}\n {%- else -%}\n {{ raise_exception(\"Invalid content type\") }}\n {%- endif -%}\n {{ '<end_of_turn>\n' }}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{ '<start_of_turn>model\n' }}\n{%- endif -%}\n"
|
3 |
-
}
|
|
|
1 |
+
{
|
2 |
+
"chat_template": "{{ bos_token }}\n{%- if messages[0]['role'] == 'system' -%}\n {%- if messages[0]['content'] is string -%}\n {%- set first_user_prefix = messages[0]['content'] + '\n\n' -%}\n {%- else -%}\n {%- set first_user_prefix = messages[0]['content'][0]['text'] + '\n\n' -%}\n {%- endif -%}\n {%- set loop_messages = messages[1:] -%}\n{%- else -%}\n {%- set first_user_prefix = \"\" -%}\n {%- set loop_messages = messages -%}\n{%- endif -%}\n{%- for message in loop_messages -%}\n {%- if (message['role'] == 'user') != (loop.index0 % 2 == 0) -%}\n {{ raise_exception(\"Conversation roles must alternate user/assistant/user/assistant/...\") }}\n {%- endif -%}\n {%- if (message['role'] == 'assistant') -%}\n {%- set role = \"model\" -%}\n {%- else -%}\n {%- set role = message['role'] -%}\n {%- endif -%}\n {{ '<start_of_turn>' + role + '\n' + (first_user_prefix if loop.first else \"\") }}\n {%- if message['content'] is string -%}\n {{ message['content'] | trim }}\n {%- elif message['content'] is iterable -%}\n {%- for item in message['content'] -%}\n {%- if item['type'] == 'image' -%}\n {{ '<start_of_image>' }}\n {%- elif item['type'] == 'text' -%}\n {{ item['text'] | trim }}\n {%- endif -%}\n {%- endfor -%}\n {%- else -%}\n {{ raise_exception(\"Invalid content type\") }}\n {%- endif -%}\n {{ '<end_of_turn>\n' }}\n{%- endfor -%}\n{%- if add_generation_prompt -%}\n {{ '<start_of_turn>model\n' }}\n{%- endif -%}\n"
|
3 |
+
}
|
config.json
CHANGED
@@ -1,38 +1,38 @@
|
|
1 |
-
{
|
2 |
-
"architectures": [
|
3 |
-
"Gemma3ForConditionalGeneration"
|
4 |
-
],
|
5 |
-
"boi_token_index": 255999,
|
6 |
-
"eoi_token_index": 256000,
|
7 |
-
"eos_token_id": [
|
8 |
-
1,
|
9 |
-
106
|
10 |
-
],
|
11 |
-
"image_token_index": 262144,
|
12 |
-
"initializer_range": 0.02,
|
13 |
-
"mm_tokens_per_image": 256,
|
14 |
-
"model_type": "gemma3",
|
15 |
-
"text_config": {
|
16 |
-
"hidden_size": 2560,
|
17 |
-
"intermediate_size": 10240,
|
18 |
-
"model_type": "gemma3_text",
|
19 |
-
"num_hidden_layers": 34,
|
20 |
-
"rope_scaling": {
|
21 |
-
"factor": 8.0,
|
22 |
-
"rope_type": "linear"
|
23 |
-
},
|
24 |
-
"sliding_window": 1024
|
25 |
-
},
|
26 |
-
"torch_dtype": "bfloat16",
|
27 |
-
"transformers_version": "4.50.0.dev0",
|
28 |
-
"vision_config": {
|
29 |
-
"hidden_size": 1152,
|
30 |
-
"image_size": 896,
|
31 |
-
"intermediate_size": 4304,
|
32 |
-
"model_type": "siglip_vision_model",
|
33 |
-
"num_attention_heads": 16,
|
34 |
-
"num_hidden_layers": 27,
|
35 |
-
"patch_size": 14,
|
36 |
-
"vision_use_head": false
|
37 |
-
}
|
38 |
}
|
|
|
1 |
+
{
|
2 |
+
"architectures": [
|
3 |
+
"Gemma3ForConditionalGeneration"
|
4 |
+
],
|
5 |
+
"boi_token_index": 255999,
|
6 |
+
"eoi_token_index": 256000,
|
7 |
+
"eos_token_id": [
|
8 |
+
1,
|
9 |
+
106
|
10 |
+
],
|
11 |
+
"image_token_index": 262144,
|
12 |
+
"initializer_range": 0.02,
|
13 |
+
"mm_tokens_per_image": 256,
|
14 |
+
"model_type": "gemma3",
|
15 |
+
"text_config": {
|
16 |
+
"hidden_size": 2560,
|
17 |
+
"intermediate_size": 10240,
|
18 |
+
"model_type": "gemma3_text",
|
19 |
+
"num_hidden_layers": 34,
|
20 |
+
"rope_scaling": {
|
21 |
+
"factor": 8.0,
|
22 |
+
"rope_type": "linear"
|
23 |
+
},
|
24 |
+
"sliding_window": 1024
|
25 |
+
},
|
26 |
+
"torch_dtype": "bfloat16",
|
27 |
+
"transformers_version": "4.50.0.dev0",
|
28 |
+
"vision_config": {
|
29 |
+
"hidden_size": 1152,
|
30 |
+
"image_size": 896,
|
31 |
+
"intermediate_size": 4304,
|
32 |
+
"model_type": "siglip_vision_model",
|
33 |
+
"num_attention_heads": 16,
|
34 |
+
"num_hidden_layers": 27,
|
35 |
+
"patch_size": 14,
|
36 |
+
"vision_use_head": false
|
37 |
+
}
|
38 |
}
|
gemma-ad/Lib/site-packages/InquirerPy/__init__.py
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
from InquirerPy.resolver import prompt, prompt_async
|
2 |
+
from InquirerPy.utils import get_style
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (371 Bytes). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/enum.cpython-311.pyc
ADDED
Binary file (643 Bytes). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/exceptions.cpython-311.pyc
ADDED
Binary file (1.75 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/inquirer.cpython-311.pyc
ADDED
Binary file (1.1 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/resolver.cpython-311.pyc
ADDED
Binary file (9.17 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/separator.cpython-311.pyc
ADDED
Binary file (1.4 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/utils.cpython-311.pyc
ADDED
Binary file (13.9 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/__pycache__/validator.cpython-311.pyc
ADDED
Binary file (8.08 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/base/__init__.py
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains base class for prompts.
|
2 |
+
|
3 |
+
BaseSimplePrompt ← InputPrompt ← SecretPrompt ...
|
4 |
+
↑
|
5 |
+
BaseComplexPrompt
|
6 |
+
↑
|
7 |
+
BaseListPrompt ← FuzzyPrompt
|
8 |
+
↑
|
9 |
+
ListPrompt ← ExpandPrompt ...
|
10 |
+
"""
|
11 |
+
|
12 |
+
from .complex import BaseComplexPrompt, FakeDocument
|
13 |
+
from .control import Choice, InquirerPyUIListControl
|
14 |
+
from .list import BaseListPrompt
|
15 |
+
from .simple import BaseSimplePrompt
|
gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (767 Bytes). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/complex.cpython-311.pyc
ADDED
Binary file (14.8 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/control.cpython-311.pyc
ADDED
Binary file (11.7 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/list.cpython-311.pyc
ADDED
Binary file (9.88 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/base/__pycache__/simple.cpython-311.pyc
ADDED
Binary file (19.1 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/base/complex.py
ADDED
@@ -0,0 +1,294 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Contains the interface class :class:`.BaseComplexPrompt` for more complex prompts and the mocked document class :class:`.FakeDocument`."""
|
2 |
+
import shutil
|
3 |
+
from dataclasses import dataclass
|
4 |
+
from typing import Any, Callable, List, Optional, Tuple, Union
|
5 |
+
|
6 |
+
from prompt_toolkit.application import Application
|
7 |
+
from prompt_toolkit.enums import EditingMode
|
8 |
+
from prompt_toolkit.filters.base import Condition, FilterOrBool
|
9 |
+
from prompt_toolkit.key_binding.key_bindings import KeyHandlerCallable
|
10 |
+
from prompt_toolkit.keys import Keys
|
11 |
+
|
12 |
+
from InquirerPy.base.simple import BaseSimplePrompt
|
13 |
+
from InquirerPy.enum import INQUIRERPY_KEYBOARD_INTERRUPT
|
14 |
+
from InquirerPy.utils import (
|
15 |
+
InquirerPySessionResult,
|
16 |
+
InquirerPyStyle,
|
17 |
+
InquirerPyValidate,
|
18 |
+
)
|
19 |
+
|
20 |
+
|
21 |
+
@dataclass
|
22 |
+
class FakeDocument:
|
23 |
+
"""A fake `prompt_toolkit` document class.
|
24 |
+
|
25 |
+
Work around to allow non-buffer type :class:`~prompt_toolkit.layout.UIControl` to use
|
26 |
+
:class:`~prompt_toolkit.validation.Validator`.
|
27 |
+
|
28 |
+
Args:
|
29 |
+
text: Content to be validated.
|
30 |
+
cursor_position: Fake cursor position.
|
31 |
+
"""
|
32 |
+
|
33 |
+
text: str
|
34 |
+
cursor_position: int = 0
|
35 |
+
|
36 |
+
|
37 |
+
class BaseComplexPrompt(BaseSimplePrompt):
|
38 |
+
"""A base class to create a more complex prompt that will involve :class:`~prompt_toolkit.application.Application`.
|
39 |
+
|
40 |
+
Note:
|
41 |
+
This class does not create :class:`~prompt_toolkit.layout.Layout` nor :class:`~prompt_toolkit.application.Application`,
|
42 |
+
it only contains the necessary attributes and helper functions to be consumed.
|
43 |
+
|
44 |
+
Note:
|
45 |
+
Use :class:`~InquirerPy.base.BaseListPrompt` to create a complex list prompt which involves multiple choices. It has
|
46 |
+
more methods and helper function implemented.
|
47 |
+
|
48 |
+
See Also:
|
49 |
+
:class:`~InquirerPy.base.BaseListPrompt`
|
50 |
+
:class:`~InquirerPy.prompts.fuzzy.FuzzyPrompt`
|
51 |
+
"""
|
52 |
+
|
53 |
+
def __init__(
|
54 |
+
self,
|
55 |
+
message: Union[str, Callable[[InquirerPySessionResult], str]],
|
56 |
+
style: Optional[InquirerPyStyle] = None,
|
57 |
+
border: bool = False,
|
58 |
+
vi_mode: bool = False,
|
59 |
+
qmark: str = "?",
|
60 |
+
amark: str = "?",
|
61 |
+
instruction: str = "",
|
62 |
+
long_instruction: str = "",
|
63 |
+
transformer: Optional[Callable[[Any], Any]] = None,
|
64 |
+
filter: Optional[Callable[[Any], Any]] = None,
|
65 |
+
validate: Optional[InquirerPyValidate] = None,
|
66 |
+
invalid_message: str = "Invalid input",
|
67 |
+
wrap_lines: bool = True,
|
68 |
+
raise_keyboard_interrupt: bool = True,
|
69 |
+
mandatory: bool = True,
|
70 |
+
mandatory_message: str = "Mandatory prompt",
|
71 |
+
session_result: Optional[InquirerPySessionResult] = None,
|
72 |
+
) -> None:
|
73 |
+
super().__init__(
|
74 |
+
message=message,
|
75 |
+
style=style,
|
76 |
+
vi_mode=vi_mode,
|
77 |
+
qmark=qmark,
|
78 |
+
amark=amark,
|
79 |
+
instruction=instruction,
|
80 |
+
transformer=transformer,
|
81 |
+
filter=filter,
|
82 |
+
invalid_message=invalid_message,
|
83 |
+
validate=validate,
|
84 |
+
wrap_lines=wrap_lines,
|
85 |
+
raise_keyboard_interrupt=raise_keyboard_interrupt,
|
86 |
+
mandatory=mandatory,
|
87 |
+
mandatory_message=mandatory_message,
|
88 |
+
session_result=session_result,
|
89 |
+
)
|
90 |
+
self._invalid_message = invalid_message
|
91 |
+
self._rendered = False
|
92 |
+
self._invalid = False
|
93 |
+
self._loading = False
|
94 |
+
self._application: Application
|
95 |
+
self._long_instruction = long_instruction
|
96 |
+
self._border = border
|
97 |
+
self._height_offset = 2 # prev prompt result + current prompt question
|
98 |
+
if self._border:
|
99 |
+
self._height_offset += 2
|
100 |
+
if self._long_instruction:
|
101 |
+
self._height_offset += 1
|
102 |
+
self._validation_window_bottom_offset = 0 if not self._long_instruction else 1
|
103 |
+
if self._wrap_lines:
|
104 |
+
self._validation_window_bottom_offset += (
|
105 |
+
self.extra_long_instruction_line_count
|
106 |
+
)
|
107 |
+
|
108 |
+
self._is_vim_edit = Condition(lambda: self._editing_mode == EditingMode.VI)
|
109 |
+
self._is_invalid = Condition(lambda: self._invalid)
|
110 |
+
self._is_displaying_long_instruction = Condition(
|
111 |
+
lambda: self._long_instruction != ""
|
112 |
+
)
|
113 |
+
|
114 |
+
def _redraw(self) -> None:
|
115 |
+
"""Redraw the application UI."""
|
116 |
+
self._application.invalidate()
|
117 |
+
|
118 |
+
def register_kb(
|
119 |
+
self, *keys: Union[Keys, str], filter: FilterOrBool = True
|
120 |
+
) -> Callable[[KeyHandlerCallable], KeyHandlerCallable]:
|
121 |
+
"""Decorate keybinding registration function.
|
122 |
+
|
123 |
+
Ensure that the `invalid` state is cleared on next keybinding entered.
|
124 |
+
"""
|
125 |
+
kb_dec = super().register_kb(*keys, filter=filter)
|
126 |
+
|
127 |
+
def decorator(func: KeyHandlerCallable) -> KeyHandlerCallable:
|
128 |
+
@kb_dec
|
129 |
+
def executable(event):
|
130 |
+
if self._invalid:
|
131 |
+
self._invalid = False
|
132 |
+
func(event)
|
133 |
+
|
134 |
+
return executable
|
135 |
+
|
136 |
+
return decorator
|
137 |
+
|
138 |
+
def _exception_handler(self, _, context) -> None:
|
139 |
+
"""Set exception handler for the event loop.
|
140 |
+
|
141 |
+
Skip the question and raise exception.
|
142 |
+
|
143 |
+
Args:
|
144 |
+
loop: Current event loop.
|
145 |
+
context: Exception context.
|
146 |
+
"""
|
147 |
+
self._status["answered"] = True
|
148 |
+
self._status["result"] = INQUIRERPY_KEYBOARD_INTERRUPT
|
149 |
+
self._status["skipped"] = True
|
150 |
+
self._application.exit(exception=context["exception"])
|
151 |
+
|
152 |
+
def _after_render(self, app: Optional[Application]) -> None:
|
153 |
+
"""Run after the :class:`~prompt_toolkit.application.Application` is rendered/updated.
|
154 |
+
|
155 |
+
Since this function is fired up on each render, adding a check on `self._rendered` to
|
156 |
+
process logics that should only run once.
|
157 |
+
|
158 |
+
Set event loop exception handler here, since its guaranteed that the event loop is running
|
159 |
+
in `_after_render`.
|
160 |
+
"""
|
161 |
+
if not self._rendered:
|
162 |
+
self._rendered = True
|
163 |
+
|
164 |
+
self._keybinding_factory()
|
165 |
+
self._on_rendered(app)
|
166 |
+
|
167 |
+
def _set_error(self, message: str) -> None:
|
168 |
+
"""Set error message and set invalid state.
|
169 |
+
|
170 |
+
Args:
|
171 |
+
message: Error message to display.
|
172 |
+
"""
|
173 |
+
self._invalid_message = message
|
174 |
+
self._invalid = True
|
175 |
+
|
176 |
+
def _get_error_message(self) -> List[Tuple[str, str]]:
|
177 |
+
"""Obtain the error message dynamically.
|
178 |
+
|
179 |
+
Returns:
|
180 |
+
FormattedText in list of tuple format.
|
181 |
+
"""
|
182 |
+
return [
|
183 |
+
(
|
184 |
+
"class:validation-toolbar",
|
185 |
+
self._invalid_message,
|
186 |
+
)
|
187 |
+
]
|
188 |
+
|
189 |
+
def _on_rendered(self, _: Optional[Application]) -> None:
|
190 |
+
"""Run once after the UI is rendered. Acts like `ComponentDidMount`."""
|
191 |
+
pass
|
192 |
+
|
193 |
+
def _get_prompt_message(self) -> List[Tuple[str, str]]:
|
194 |
+
"""Get the prompt message to display.
|
195 |
+
|
196 |
+
Returns:
|
197 |
+
Formatted text in list of tuple format.
|
198 |
+
"""
|
199 |
+
pre_answer = (
|
200 |
+
"class:instruction",
|
201 |
+
" %s " % self.instruction if self.instruction else " ",
|
202 |
+
)
|
203 |
+
post_answer = ("class:answer", " %s" % self.status["result"])
|
204 |
+
return super()._get_prompt_message(pre_answer, post_answer)
|
205 |
+
|
206 |
+
def _run(self) -> Any:
|
207 |
+
"""Run the application."""
|
208 |
+
return self.application.run()
|
209 |
+
|
210 |
+
async def _run_async(self) -> None:
|
211 |
+
"""Run the application asynchronously."""
|
212 |
+
return await self.application.run_async()
|
213 |
+
|
214 |
+
@property
|
215 |
+
def application(self) -> Application:
|
216 |
+
"""Get the application.
|
217 |
+
|
218 |
+
:class:`.BaseComplexPrompt` requires :attr:`.BaseComplexPrompt._application` to be defined since this class
|
219 |
+
doesn't implement :class:`~prompt_toolkit.layout.Layout` and :class:`~prompt_toolkit.application.Application`.
|
220 |
+
|
221 |
+
Raises:
|
222 |
+
NotImplementedError: When `self._application` is not defined.
|
223 |
+
"""
|
224 |
+
if not self._application:
|
225 |
+
raise NotImplementedError
|
226 |
+
return self._application
|
227 |
+
|
228 |
+
@application.setter
|
229 |
+
def application(self, value: Application) -> None:
|
230 |
+
self._application = value
|
231 |
+
|
232 |
+
@property
|
233 |
+
def height_offset(self) -> int:
|
234 |
+
"""int: Height offset to apply."""
|
235 |
+
if not self._wrap_lines:
|
236 |
+
return self._height_offset
|
237 |
+
return self.extra_line_count + self._height_offset
|
238 |
+
|
239 |
+
@property
|
240 |
+
def total_message_length(self) -> int:
|
241 |
+
"""int: Total length of the message."""
|
242 |
+
total_message_length = 0
|
243 |
+
if self._qmark:
|
244 |
+
total_message_length += len(self._qmark)
|
245 |
+
total_message_length += 1 # Extra space if qmark is present
|
246 |
+
total_message_length += len(str(self._message))
|
247 |
+
total_message_length += 1 # Extra space between message and instruction
|
248 |
+
total_message_length += len(str(self._instruction))
|
249 |
+
if self._instruction:
|
250 |
+
total_message_length += 1 # Extra space behind the instruction
|
251 |
+
return total_message_length
|
252 |
+
|
253 |
+
@property
|
254 |
+
def extra_message_line_count(self) -> int:
|
255 |
+
"""int: Get the extra lines created caused by line wrapping.
|
256 |
+
|
257 |
+
Minus 1 on the totoal message length as we only want the extra line.
|
258 |
+
24 // 24 will equal to 1 however we only want the value to be 1 when we have 25 char
|
259 |
+
which will create an extra line.
|
260 |
+
"""
|
261 |
+
term_width, _ = shutil.get_terminal_size()
|
262 |
+
return (self.total_message_length - 1) // term_width
|
263 |
+
|
264 |
+
@property
|
265 |
+
def extra_long_instruction_line_count(self) -> int:
|
266 |
+
"""int: Get the extra lines created caused by line wrapping.
|
267 |
+
|
268 |
+
See Also:
|
269 |
+
:attr:`.BaseComplexPrompt.extra_message_line_count`
|
270 |
+
"""
|
271 |
+
if self._long_instruction:
|
272 |
+
term_width, _ = shutil.get_terminal_size()
|
273 |
+
return (len(self._long_instruction) - 1) // term_width
|
274 |
+
else:
|
275 |
+
return 0
|
276 |
+
|
277 |
+
@property
|
278 |
+
def extra_line_count(self) -> int:
|
279 |
+
"""Get the extra lines created caused by line wrapping.
|
280 |
+
|
281 |
+
Used mainly to calculate how much additional offset should be applied when getting
|
282 |
+
the height.
|
283 |
+
|
284 |
+
Returns:
|
285 |
+
Total extra lines created due to line wrapping.
|
286 |
+
"""
|
287 |
+
result = 0
|
288 |
+
|
289 |
+
# message wrap
|
290 |
+
result += self.extra_message_line_count
|
291 |
+
# long instruction wrap
|
292 |
+
result += self.extra_long_instruction_line_count
|
293 |
+
|
294 |
+
return result
|
gemma-ad/Lib/site-packages/InquirerPy/base/control.py
ADDED
@@ -0,0 +1,227 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Contains the content control class :class:`.InquirerPyUIListControl`."""
|
2 |
+
from abc import abstractmethod
|
3 |
+
from dataclasses import asdict, dataclass
|
4 |
+
from typing import Any, Callable, Dict, List, Optional, Tuple, cast
|
5 |
+
|
6 |
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
7 |
+
|
8 |
+
from InquirerPy.exceptions import InvalidArgument, RequiredKeyNotFound
|
9 |
+
from InquirerPy.separator import Separator
|
10 |
+
from InquirerPy.utils import InquirerPyListChoices, InquirerPySessionResult
|
11 |
+
|
12 |
+
__all__ = ["Choice", "InquirerPyUIListControl"]
|
13 |
+
|
14 |
+
|
15 |
+
@dataclass
|
16 |
+
class Choice:
|
17 |
+
"""Class to create choices for list type prompts.
|
18 |
+
|
19 |
+
A simple dataclass that can be used as an alternate to using :class:`dict`
|
20 |
+
when working with choices.
|
21 |
+
|
22 |
+
Args:
|
23 |
+
value: The value of the choice when user selects this choice.
|
24 |
+
name: The value that should be presented to the user prior/after selection of the choice.
|
25 |
+
This value is optional, if not provided, it will fallback to the string representation of `value`.
|
26 |
+
enabled: Indicates if the choice should be pre-selected.
|
27 |
+
This only has effects when the prompt has `multiselect` enabled.
|
28 |
+
"""
|
29 |
+
|
30 |
+
value: Any
|
31 |
+
name: Optional[str] = None
|
32 |
+
enabled: bool = False
|
33 |
+
|
34 |
+
def __post_init__(self):
|
35 |
+
"""Assign strinify value to name if not present."""
|
36 |
+
if self.name is None:
|
37 |
+
self.name = str(self.value)
|
38 |
+
|
39 |
+
|
40 |
+
class InquirerPyUIListControl(FormattedTextControl):
|
41 |
+
"""A base class to create :class:`~prompt_toolkit.layout.UIControl` to display list type contents.
|
42 |
+
|
43 |
+
Args:
|
44 |
+
choices(InquirerPyListChoices): List of choices to display as the content.
|
45 |
+
Can also be a callable or async callable that returns a list of choices.
|
46 |
+
default: Default value, this will affect the cursor position.
|
47 |
+
multiselect: Indicate if the current prompt has `multiselect` enabled.
|
48 |
+
session_result: Current session result.
|
49 |
+
"""
|
50 |
+
|
51 |
+
def __init__(
|
52 |
+
self,
|
53 |
+
choices: InquirerPyListChoices,
|
54 |
+
default: Any = None,
|
55 |
+
multiselect: bool = False,
|
56 |
+
session_result: Optional[InquirerPySessionResult] = None,
|
57 |
+
) -> None:
|
58 |
+
self._session_result = session_result or {}
|
59 |
+
self._selected_choice_index: int = 0
|
60 |
+
self._choice_func = None
|
61 |
+
self._multiselect = multiselect
|
62 |
+
self._default = (
|
63 |
+
default
|
64 |
+
if not isinstance(default, Callable)
|
65 |
+
else cast(Callable, default)(self._session_result)
|
66 |
+
)
|
67 |
+
self._raw_choices = (
|
68 |
+
choices
|
69 |
+
if not isinstance(choices, Callable)
|
70 |
+
else cast(Callable, choices)(self._session_result)
|
71 |
+
)
|
72 |
+
self._choices = self._get_choices(self._raw_choices, self._default)
|
73 |
+
self._safety_check()
|
74 |
+
self._format_choices()
|
75 |
+
super().__init__(self._get_formatted_choices)
|
76 |
+
|
77 |
+
def _get_choices(self, choices: List[Any], default: Any) -> List[Dict[str, Any]]:
|
78 |
+
"""Process the raw user input choices and format it into dictionary.
|
79 |
+
|
80 |
+
Args:
|
81 |
+
choices: List of chices to display.
|
82 |
+
default: Default value, this will affect the :attr:`.InquirerPyUIListControl.selected_choice_index`
|
83 |
+
|
84 |
+
Returns:
|
85 |
+
List of choices.
|
86 |
+
|
87 |
+
Raises:
|
88 |
+
RequiredKeyNotFound: When the provided choice is missing the `name` or `value` key.
|
89 |
+
"""
|
90 |
+
processed_choices: List[Dict[str, Any]] = []
|
91 |
+
try:
|
92 |
+
for index, choice in enumerate(choices, start=0):
|
93 |
+
if isinstance(choice, dict):
|
94 |
+
if choice["value"] == default:
|
95 |
+
self.selected_choice_index = index
|
96 |
+
processed_choices.append(
|
97 |
+
{
|
98 |
+
"name": str(choice["name"]),
|
99 |
+
"value": choice["value"],
|
100 |
+
"enabled": choice.get("enabled", False)
|
101 |
+
if self._multiselect
|
102 |
+
else False,
|
103 |
+
}
|
104 |
+
)
|
105 |
+
elif isinstance(choice, Separator):
|
106 |
+
if self.selected_choice_index == index:
|
107 |
+
self.selected_choice_index = (
|
108 |
+
self.selected_choice_index + 1
|
109 |
+
) % len(choices)
|
110 |
+
processed_choices.append(
|
111 |
+
{"name": str(choice), "value": choice, "enabled": False}
|
112 |
+
)
|
113 |
+
elif isinstance(choice, Choice):
|
114 |
+
dict_choice = asdict(choice)
|
115 |
+
if dict_choice["value"] == default:
|
116 |
+
self.selected_choice_index = index
|
117 |
+
if not self._multiselect:
|
118 |
+
dict_choice["enabled"] = False
|
119 |
+
processed_choices.append(dict_choice)
|
120 |
+
else:
|
121 |
+
if choice == default:
|
122 |
+
self.selected_choice_index = index
|
123 |
+
processed_choices.append(
|
124 |
+
{"name": str(choice), "value": choice, "enabled": False}
|
125 |
+
)
|
126 |
+
except KeyError:
|
127 |
+
raise RequiredKeyNotFound(
|
128 |
+
"dictionary type of choice require a 'name' key and a 'value' key"
|
129 |
+
)
|
130 |
+
return processed_choices
|
131 |
+
|
132 |
+
@property
|
133 |
+
def selected_choice_index(self) -> int:
|
134 |
+
"""int: Current highlighted index."""
|
135 |
+
return self._selected_choice_index
|
136 |
+
|
137 |
+
@selected_choice_index.setter
|
138 |
+
def selected_choice_index(self, value: int) -> None:
|
139 |
+
self._selected_choice_index = value
|
140 |
+
|
141 |
+
@property
|
142 |
+
def choices(self) -> List[Dict[str, Any]]:
|
143 |
+
"""List[Dict[str, Any]]: Get all processed choices."""
|
144 |
+
return self._choices
|
145 |
+
|
146 |
+
@choices.setter
|
147 |
+
def choices(self, value: List[Dict[str, Any]]) -> None:
|
148 |
+
self._choices = value
|
149 |
+
|
150 |
+
def _safety_check(self) -> None:
|
151 |
+
"""Validate processed choices.
|
152 |
+
|
153 |
+
Check if the choices are empty or if it only contains :class:`~InquirerPy.separator.Separator`.
|
154 |
+
"""
|
155 |
+
if not self.choices:
|
156 |
+
raise InvalidArgument("argument choices cannot be empty")
|
157 |
+
should_proceed: bool = False
|
158 |
+
for choice in self.choices:
|
159 |
+
if not isinstance(choice["value"], Separator):
|
160 |
+
should_proceed = True
|
161 |
+
break
|
162 |
+
if not should_proceed:
|
163 |
+
raise InvalidArgument(
|
164 |
+
"argument choices should contain choices other than separator"
|
165 |
+
)
|
166 |
+
|
167 |
+
def _get_formatted_choices(self) -> List[Tuple[str, str]]:
|
168 |
+
"""Get all choices in formatted text format.
|
169 |
+
|
170 |
+
Returns:
|
171 |
+
List of choices in formatted text form.
|
172 |
+
"""
|
173 |
+
display_choices = []
|
174 |
+
|
175 |
+
for index, choice in enumerate(self.choices):
|
176 |
+
if index == self.selected_choice_index:
|
177 |
+
display_choices += self._get_hover_text(choice)
|
178 |
+
else:
|
179 |
+
display_choices += self._get_normal_text(choice)
|
180 |
+
display_choices.append(("", "\n"))
|
181 |
+
if display_choices:
|
182 |
+
display_choices.pop()
|
183 |
+
return display_choices
|
184 |
+
|
185 |
+
def _format_choices(self) -> None:
|
186 |
+
"""Perform post processing on the choices.
|
187 |
+
|
188 |
+
Additional customisation to the choices after :meth:`.InquirerPyUIListControl._get_choices` call.
|
189 |
+
"""
|
190 |
+
pass
|
191 |
+
|
192 |
+
@abstractmethod
|
193 |
+
def _get_hover_text(self, choice) -> List[Tuple[str, str]]:
|
194 |
+
"""Generate the formatted text for hovered choice.
|
195 |
+
|
196 |
+
Returns:
|
197 |
+
Formatted text in list of tuple format.
|
198 |
+
"""
|
199 |
+
pass
|
200 |
+
|
201 |
+
@abstractmethod
|
202 |
+
def _get_normal_text(self, choice) -> List[Tuple[str, str]]:
|
203 |
+
"""Generate the formatted text for non-hovered choices.
|
204 |
+
|
205 |
+
Returns:
|
206 |
+
Formatted text in list of tuple format.
|
207 |
+
"""
|
208 |
+
pass
|
209 |
+
|
210 |
+
@property
|
211 |
+
def choice_count(self) -> int:
|
212 |
+
"""int: Total count of choices."""
|
213 |
+
return len(self.choices)
|
214 |
+
|
215 |
+
@property
|
216 |
+
def selection(self) -> Dict[str, Any]:
|
217 |
+
"""Dict[str, Any]: Current selected choice."""
|
218 |
+
return self.choices[self.selected_choice_index]
|
219 |
+
|
220 |
+
@property
|
221 |
+
def loading(self) -> bool:
|
222 |
+
"""bool: Indicate if the content control is loading."""
|
223 |
+
return self._loading
|
224 |
+
|
225 |
+
@loading.setter
|
226 |
+
def loading(self, value: bool) -> None:
|
227 |
+
self._loading = value
|
gemma-ad/Lib/site-packages/InquirerPy/base/list.py
ADDED
@@ -0,0 +1,238 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Contains the base class :class:`.BaseListPrompt` which can be used to create a prompt involving choices."""
|
2 |
+
from abc import abstractmethod
|
3 |
+
from typing import Any, Callable, List, Optional
|
4 |
+
|
5 |
+
from prompt_toolkit.filters.base import Condition
|
6 |
+
from prompt_toolkit.keys import Keys
|
7 |
+
|
8 |
+
from InquirerPy.base.complex import BaseComplexPrompt
|
9 |
+
from InquirerPy.base.control import InquirerPyUIListControl
|
10 |
+
from InquirerPy.separator import Separator
|
11 |
+
from InquirerPy.utils import (
|
12 |
+
InquirerPyKeybindings,
|
13 |
+
InquirerPyMessage,
|
14 |
+
InquirerPySessionResult,
|
15 |
+
InquirerPyStyle,
|
16 |
+
InquirerPyValidate,
|
17 |
+
)
|
18 |
+
|
19 |
+
|
20 |
+
class BaseListPrompt(BaseComplexPrompt):
|
21 |
+
"""A base class to create a complex prompt involving choice selections (i.e. list) using `prompt_toolkit` Application.
|
22 |
+
|
23 |
+
Note:
|
24 |
+
This class does not create :class:`~prompt_toolkit.layout.Layout` nor :class:`~prompt_toolkit.application.Application`,
|
25 |
+
it only contains the necessary attributes and helper functions to be consumed.
|
26 |
+
|
27 |
+
See Also:
|
28 |
+
:class:`~InquirerPy.prompts.list.ListPrompt`
|
29 |
+
:class:`~InquirerPy.prompts.fuzzy.FuzzyPrompt`
|
30 |
+
"""
|
31 |
+
|
32 |
+
def __init__(
|
33 |
+
self,
|
34 |
+
message: InquirerPyMessage,
|
35 |
+
style: Optional[InquirerPyStyle] = None,
|
36 |
+
vi_mode: bool = False,
|
37 |
+
qmark: str = "?",
|
38 |
+
amark: str = "?",
|
39 |
+
instruction: str = "",
|
40 |
+
long_instruction: str = "",
|
41 |
+
border: bool = False,
|
42 |
+
transformer: Optional[Callable[[Any], Any]] = None,
|
43 |
+
filter: Optional[Callable[[Any], Any]] = None,
|
44 |
+
validate: Optional[InquirerPyValidate] = None,
|
45 |
+
invalid_message: str = "Invalid input",
|
46 |
+
multiselect: bool = False,
|
47 |
+
keybindings: Optional[InquirerPyKeybindings] = None,
|
48 |
+
cycle: bool = True,
|
49 |
+
wrap_lines: bool = True,
|
50 |
+
raise_keyboard_interrupt: bool = True,
|
51 |
+
mandatory: bool = True,
|
52 |
+
mandatory_message: str = "Mandatory prompt",
|
53 |
+
session_result: Optional[InquirerPySessionResult] = None,
|
54 |
+
) -> None:
|
55 |
+
super().__init__(
|
56 |
+
message=message,
|
57 |
+
style=style,
|
58 |
+
border=border,
|
59 |
+
vi_mode=vi_mode,
|
60 |
+
qmark=qmark,
|
61 |
+
amark=amark,
|
62 |
+
transformer=transformer,
|
63 |
+
filter=filter,
|
64 |
+
invalid_message=invalid_message,
|
65 |
+
validate=validate,
|
66 |
+
instruction=instruction,
|
67 |
+
long_instruction=long_instruction,
|
68 |
+
wrap_lines=wrap_lines,
|
69 |
+
raise_keyboard_interrupt=raise_keyboard_interrupt,
|
70 |
+
mandatory=mandatory,
|
71 |
+
mandatory_message=mandatory_message,
|
72 |
+
session_result=session_result,
|
73 |
+
)
|
74 |
+
|
75 |
+
self._content_control: InquirerPyUIListControl
|
76 |
+
self._multiselect = multiselect
|
77 |
+
self._is_multiselect = Condition(lambda: self._multiselect)
|
78 |
+
self._cycle = cycle
|
79 |
+
|
80 |
+
if not keybindings:
|
81 |
+
keybindings = {}
|
82 |
+
|
83 |
+
self.kb_maps = {
|
84 |
+
"down": [
|
85 |
+
{"key": "down"},
|
86 |
+
{"key": "c-n", "filter": ~self._is_vim_edit},
|
87 |
+
{"key": "j", "filter": self._is_vim_edit},
|
88 |
+
],
|
89 |
+
"up": [
|
90 |
+
{"key": "up"},
|
91 |
+
{"key": "c-p", "filter": ~self._is_vim_edit},
|
92 |
+
{"key": "k", "filter": self._is_vim_edit},
|
93 |
+
],
|
94 |
+
"toggle": [
|
95 |
+
{"key": "space"},
|
96 |
+
],
|
97 |
+
"toggle-down": [
|
98 |
+
{"key": Keys.Tab},
|
99 |
+
],
|
100 |
+
"toggle-up": [
|
101 |
+
{"key": Keys.BackTab},
|
102 |
+
],
|
103 |
+
"toggle-all": [
|
104 |
+
{"key": "alt-r"},
|
105 |
+
{"key": "c-r"},
|
106 |
+
],
|
107 |
+
"toggle-all-true": [
|
108 |
+
{"key": "alt-a"},
|
109 |
+
{"key": "c-a"},
|
110 |
+
],
|
111 |
+
"toggle-all-false": [],
|
112 |
+
**keybindings,
|
113 |
+
}
|
114 |
+
|
115 |
+
self.kb_func_lookup = {
|
116 |
+
"down": [{"func": self._handle_down}],
|
117 |
+
"up": [{"func": self._handle_up}],
|
118 |
+
"toggle": [{"func": self._handle_toggle_choice}],
|
119 |
+
"toggle-down": [
|
120 |
+
{"func": self._handle_toggle_choice},
|
121 |
+
{"func": self._handle_down},
|
122 |
+
],
|
123 |
+
"toggle-up": [
|
124 |
+
{"func": self._handle_toggle_choice},
|
125 |
+
{"func": self._handle_up},
|
126 |
+
],
|
127 |
+
"toggle-all": [{"func": self._handle_toggle_all}],
|
128 |
+
"toggle-all-true": [{"func": self._handle_toggle_all, "args": [True]}],
|
129 |
+
"toggle-all-false": [{"func": self._handle_toggle_all, "args": [False]}],
|
130 |
+
}
|
131 |
+
|
132 |
+
@property
|
133 |
+
def content_control(self) -> InquirerPyUIListControl:
|
134 |
+
"""Get the content controller object.
|
135 |
+
|
136 |
+
Needs to be an instance of :class:`~InquirerPy.base.control.InquirerPyUIListControl`.
|
137 |
+
|
138 |
+
Each :class:`.BaseComplexPrompt` requires a `content_control` to display custom
|
139 |
+
contents for the prompt.
|
140 |
+
|
141 |
+
Raises:
|
142 |
+
NotImplementedError: When `self._content_control` is not found.
|
143 |
+
"""
|
144 |
+
if not self._content_control:
|
145 |
+
raise NotImplementedError
|
146 |
+
return self._content_control
|
147 |
+
|
148 |
+
@content_control.setter
|
149 |
+
def content_control(self, value: InquirerPyUIListControl) -> None:
|
150 |
+
self._content_control = value
|
151 |
+
|
152 |
+
@property
|
153 |
+
def result_name(self) -> Any:
|
154 |
+
"""Get the result value that should be printed to the terminal.
|
155 |
+
|
156 |
+
In multiselect scenario, return result as a list.
|
157 |
+
"""
|
158 |
+
if self._multiselect:
|
159 |
+
return [choice["name"] for choice in self.selected_choices]
|
160 |
+
else:
|
161 |
+
try:
|
162 |
+
return self.content_control.selection["name"]
|
163 |
+
except IndexError:
|
164 |
+
return ""
|
165 |
+
|
166 |
+
@property
|
167 |
+
def result_value(self) -> Any:
|
168 |
+
"""Get the result value that should return to the user.
|
169 |
+
|
170 |
+
In multiselect scenario, return result as a list.
|
171 |
+
"""
|
172 |
+
if self._multiselect:
|
173 |
+
return [choice["value"] for choice in self.selected_choices]
|
174 |
+
else:
|
175 |
+
try:
|
176 |
+
return self.content_control.selection["value"]
|
177 |
+
except IndexError:
|
178 |
+
return ""
|
179 |
+
|
180 |
+
@property
|
181 |
+
def selected_choices(self) -> List[Any]:
|
182 |
+
"""List[Any]: Get all user selected choices."""
|
183 |
+
|
184 |
+
def filter_choice(choice):
|
185 |
+
return not isinstance(choice, Separator) and choice["enabled"]
|
186 |
+
|
187 |
+
return list(filter(filter_choice, self.content_control.choices))
|
188 |
+
|
189 |
+
def _handle_down(self, _) -> bool:
|
190 |
+
"""Handle event when user attempts to move down.
|
191 |
+
|
192 |
+
Returns:
|
193 |
+
Boolean indicating if the action hits the cap.
|
194 |
+
"""
|
195 |
+
if self._cycle:
|
196 |
+
self.content_control.selected_choice_index = (
|
197 |
+
self.content_control.selected_choice_index + 1
|
198 |
+
) % self.content_control.choice_count
|
199 |
+
return False
|
200 |
+
else:
|
201 |
+
self.content_control.selected_choice_index += 1
|
202 |
+
if (
|
203 |
+
self.content_control.selected_choice_index
|
204 |
+
>= self.content_control.choice_count
|
205 |
+
):
|
206 |
+
self.content_control.selected_choice_index = (
|
207 |
+
self.content_control.choice_count - 1
|
208 |
+
)
|
209 |
+
return True
|
210 |
+
return False
|
211 |
+
|
212 |
+
def _handle_up(self, _) -> bool:
|
213 |
+
"""Handle event when user attempts to move up.
|
214 |
+
|
215 |
+
Returns:
|
216 |
+
Boolean indicating if the action hits the cap.
|
217 |
+
"""
|
218 |
+
if self._cycle:
|
219 |
+
self.content_control.selected_choice_index = (
|
220 |
+
self.content_control.selected_choice_index - 1
|
221 |
+
) % self.content_control.choice_count
|
222 |
+
return False
|
223 |
+
else:
|
224 |
+
self.content_control.selected_choice_index -= 1
|
225 |
+
if self.content_control.selected_choice_index < 0:
|
226 |
+
self.content_control.selected_choice_index = 0
|
227 |
+
return True
|
228 |
+
return False
|
229 |
+
|
230 |
+
@abstractmethod
|
231 |
+
def _handle_toggle_choice(self, event) -> None:
|
232 |
+
"""Handle event when user attempting to toggle the state of the chocie."""
|
233 |
+
pass
|
234 |
+
|
235 |
+
@abstractmethod
|
236 |
+
def _handle_toggle_all(self, event, value: bool) -> None:
|
237 |
+
"""Handle event when user attempting to alter the state of all choices."""
|
238 |
+
pass
|
gemma-ad/Lib/site-packages/InquirerPy/base/simple.py
ADDED
@@ -0,0 +1,378 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Contains the base class :class:`.BaseSimplePrompt`."""
|
2 |
+
import os
|
3 |
+
import re
|
4 |
+
from abc import ABC, abstractmethod
|
5 |
+
from typing import (
|
6 |
+
TYPE_CHECKING,
|
7 |
+
Any,
|
8 |
+
Callable,
|
9 |
+
Dict,
|
10 |
+
List,
|
11 |
+
Optional,
|
12 |
+
Tuple,
|
13 |
+
Union,
|
14 |
+
cast,
|
15 |
+
)
|
16 |
+
|
17 |
+
from prompt_toolkit.enums import EditingMode
|
18 |
+
from prompt_toolkit.filters.base import Condition, FilterOrBool
|
19 |
+
from prompt_toolkit.key_binding.key_bindings import KeyBindings, KeyHandlerCallable
|
20 |
+
from prompt_toolkit.keys import Keys
|
21 |
+
from prompt_toolkit.styles.style import Style
|
22 |
+
from prompt_toolkit.validation import Validator
|
23 |
+
|
24 |
+
from InquirerPy.enum import INQUIRERPY_KEYBOARD_INTERRUPT
|
25 |
+
from InquirerPy.exceptions import RequiredKeyNotFound
|
26 |
+
from InquirerPy.utils import (
|
27 |
+
InquirerPyMessage,
|
28 |
+
InquirerPySessionResult,
|
29 |
+
InquirerPyStyle,
|
30 |
+
InquirerPyValidate,
|
31 |
+
get_style,
|
32 |
+
)
|
33 |
+
|
34 |
+
if TYPE_CHECKING:
|
35 |
+
from prompt_toolkit.key_binding.key_processor import KeyPressEvent
|
36 |
+
|
37 |
+
|
38 |
+
class BaseSimplePrompt(ABC):
|
39 |
+
"""The base class to create a simple terminal input prompt.
|
40 |
+
|
41 |
+
Note:
|
42 |
+
No actual :class:`~prompt_toolkit.application.Application` is created by this class.
|
43 |
+
This class only creates some common interface and attributes that can be easily used
|
44 |
+
by `prompt_toolkit`.
|
45 |
+
|
46 |
+
To have a functional prompt, you'll at least have to implement the :meth:`.BaseSimplePrompt._run`
|
47 |
+
and :meth:`.BaseSimplePrompt._get_prompt_message`.
|
48 |
+
|
49 |
+
See Also:
|
50 |
+
:class:`~InquirerPy.prompts.input.InputPrompt`
|
51 |
+
"""
|
52 |
+
|
53 |
+
def __init__(
|
54 |
+
self,
|
55 |
+
message: InquirerPyMessage,
|
56 |
+
style: Optional[InquirerPyStyle] = None,
|
57 |
+
vi_mode: bool = False,
|
58 |
+
qmark: str = "?",
|
59 |
+
amark: str = "?",
|
60 |
+
instruction: str = "",
|
61 |
+
validate: Optional[InquirerPyValidate] = None,
|
62 |
+
invalid_message: str = "Invalid input",
|
63 |
+
transformer: Optional[Callable[[Any], Any]] = None,
|
64 |
+
filter: Optional[Callable[[Any], Any]] = None,
|
65 |
+
default: Any = "",
|
66 |
+
wrap_lines: bool = True,
|
67 |
+
raise_keyboard_interrupt: bool = True,
|
68 |
+
mandatory: bool = True,
|
69 |
+
mandatory_message: str = "Mandatory prompt",
|
70 |
+
session_result: Optional[InquirerPySessionResult] = None,
|
71 |
+
) -> None:
|
72 |
+
self._mandatory = mandatory
|
73 |
+
self._mandatory_message = mandatory_message
|
74 |
+
self._result = session_result or {}
|
75 |
+
self._message = (
|
76 |
+
message
|
77 |
+
if not isinstance(message, Callable)
|
78 |
+
else cast(Callable, message)(self._result)
|
79 |
+
)
|
80 |
+
self._instruction = instruction
|
81 |
+
self._default = (
|
82 |
+
default if not isinstance(default, Callable) else default(self._result)
|
83 |
+
)
|
84 |
+
self._style = Style.from_dict(style.dict if style else get_style().dict)
|
85 |
+
self._qmark = qmark
|
86 |
+
self._amark = amark
|
87 |
+
self._status = {"answered": False, "result": None, "skipped": False}
|
88 |
+
self._kb = KeyBindings()
|
89 |
+
self._lexer = "class:input"
|
90 |
+
self._transformer = transformer
|
91 |
+
self._filter = filter
|
92 |
+
self._wrap_lines = wrap_lines
|
93 |
+
self._editing_mode = (
|
94 |
+
EditingMode.VI
|
95 |
+
if vi_mode or bool(os.getenv("INQUIRERPY_VI_MODE", False))
|
96 |
+
else EditingMode.EMACS
|
97 |
+
)
|
98 |
+
if isinstance(validate, Validator):
|
99 |
+
self._validator = validate
|
100 |
+
else:
|
101 |
+
self._validator = Validator.from_callable(
|
102 |
+
validate if validate else lambda _: True,
|
103 |
+
invalid_message,
|
104 |
+
move_cursor_to_end=True,
|
105 |
+
)
|
106 |
+
self._raise_kbi = not os.getenv(
|
107 |
+
"INQUIRERPY_NO_RAISE_KBI", not raise_keyboard_interrupt
|
108 |
+
)
|
109 |
+
self._is_rasing_kbi = Condition(lambda: self._raise_kbi)
|
110 |
+
|
111 |
+
self._kb_maps = {
|
112 |
+
"answer": [{"key": Keys.Enter}],
|
113 |
+
"interrupt": [
|
114 |
+
{"key": "c-c", "filter": self._is_rasing_kbi},
|
115 |
+
{"key": "c-d", "filter": ~self._is_rasing_kbi},
|
116 |
+
],
|
117 |
+
"skip": [{"key": "c-z"}, {"key": "c-c", "filter": ~self._is_rasing_kbi}],
|
118 |
+
}
|
119 |
+
self._kb_func_lookup = {
|
120 |
+
"answer": [{"func": self._handle_enter}],
|
121 |
+
"interrupt": [{"func": self._handle_interrupt}],
|
122 |
+
"skip": [{"func": self._handle_skip}],
|
123 |
+
}
|
124 |
+
|
125 |
+
def _keybinding_factory(self):
|
126 |
+
"""Register all keybindings in `self._kb_maps`.
|
127 |
+
|
128 |
+
It's required to call this function at the end of prompt constructor if
|
129 |
+
it inherits from :class:`~InquirerPy.base.simple.BaseSimplePrompt` or
|
130 |
+
:class:`~InquirerPy.base.complex.BaseComplexPrompt`.
|
131 |
+
"""
|
132 |
+
|
133 |
+
def _factory(keys, filter, action):
|
134 |
+
if action not in self.kb_func_lookup:
|
135 |
+
raise RequiredKeyNotFound(f"keybinding action {action} not found")
|
136 |
+
if not isinstance(keys, list):
|
137 |
+
keys = [keys]
|
138 |
+
|
139 |
+
@self.register_kb(*keys, filter=filter)
|
140 |
+
def _(event):
|
141 |
+
for method in self.kb_func_lookup[action]:
|
142 |
+
method["func"](event, *method.get("args", []))
|
143 |
+
|
144 |
+
for key, item in self.kb_maps.items():
|
145 |
+
if not isinstance(item, list):
|
146 |
+
item = [item]
|
147 |
+
for kb in item:
|
148 |
+
_factory(kb["key"], kb.get("filter", Condition(lambda: True)), key)
|
149 |
+
|
150 |
+
@abstractmethod
|
151 |
+
def _set_error(self, message: str) -> None:
|
152 |
+
"""Set the error message for the prompt.
|
153 |
+
|
154 |
+
Args:
|
155 |
+
message: Error message to set.
|
156 |
+
"""
|
157 |
+
pass
|
158 |
+
|
159 |
+
def _handle_skip(self, event: Optional["KeyPressEvent"]) -> None:
|
160 |
+
"""Handle the event when attempting to skip a prompt.
|
161 |
+
|
162 |
+
Skip the prompt if the `_mandatory` field is False, otherwise
|
163 |
+
show an error message that the prompt cannot be skipped.
|
164 |
+
"""
|
165 |
+
if not self._mandatory:
|
166 |
+
self.status["answered"] = True
|
167 |
+
self.status["skipped"] = True
|
168 |
+
self.status["result"] = None
|
169 |
+
if event:
|
170 |
+
event.app.exit(result=None)
|
171 |
+
else:
|
172 |
+
self._set_error(message=self._mandatory_message)
|
173 |
+
|
174 |
+
def _handle_interrupt(self, event: Optional["KeyPressEvent"]) -> None:
|
175 |
+
"""Handle the event when a KeyboardInterrupt signal is sent."""
|
176 |
+
self.status["answered"] = True
|
177 |
+
self.status["result"] = INQUIRERPY_KEYBOARD_INTERRUPT
|
178 |
+
self.status["skipped"] = True
|
179 |
+
if event:
|
180 |
+
event.app.exit(result=INQUIRERPY_KEYBOARD_INTERRUPT)
|
181 |
+
|
182 |
+
@abstractmethod
|
183 |
+
def _handle_enter(self, event: Optional["KeyPressEvent"]) -> None:
|
184 |
+
"""Handle the event when user attempt to answer the question."""
|
185 |
+
pass
|
186 |
+
|
187 |
+
@property
|
188 |
+
def status(self) -> Dict[str, Any]:
|
189 |
+
"""Dict[str, Any]: Get current prompt status.
|
190 |
+
|
191 |
+
The status contains 3 keys: "answered" and "result".
|
192 |
+
answered: If the current prompt is answered.
|
193 |
+
result: The result of the user answer.
|
194 |
+
skipped: If the prompt is skipped.
|
195 |
+
"""
|
196 |
+
return self._status
|
197 |
+
|
198 |
+
@status.setter
|
199 |
+
def status(self, value) -> None:
|
200 |
+
self._status = value
|
201 |
+
|
202 |
+
def register_kb(
|
203 |
+
self, *keys: Union[Keys, str], filter: FilterOrBool = True, **kwargs
|
204 |
+
) -> Callable[[KeyHandlerCallable], KeyHandlerCallable]:
|
205 |
+
"""Keybinding registration decorator.
|
206 |
+
|
207 |
+
This decorator wraps around the :meth:`prompt_toolkit.key_binding.KeyBindings.add` with
|
208 |
+
added feature to process `alt` realted keybindings.
|
209 |
+
|
210 |
+
By default, `prompt_toolkit` doesn't process `alt` related keybindings,
|
211 |
+
it requires `alt-ANY` to `escape` + `ANY`.
|
212 |
+
|
213 |
+
Args:
|
214 |
+
keys: The keys to bind that can trigger the function.
|
215 |
+
filter: :class:`~prompt_toolkit.filter.Condition` to indicate if this keybinding should be active.
|
216 |
+
|
217 |
+
Returns:
|
218 |
+
A decorator that should be applied to the function thats intended to be active when the keys
|
219 |
+
are pressed.
|
220 |
+
|
221 |
+
Examples:
|
222 |
+
>>> @self.register_kb("alt-j")
|
223 |
+
... def test(event):
|
224 |
+
... pass
|
225 |
+
"""
|
226 |
+
alt_pattern = re.compile(r"^alt-(.*)")
|
227 |
+
|
228 |
+
def decorator(func: KeyHandlerCallable) -> KeyHandlerCallable:
|
229 |
+
formatted_keys = []
|
230 |
+
for key in keys:
|
231 |
+
match = alt_pattern.match(key)
|
232 |
+
if match:
|
233 |
+
formatted_keys.append("escape")
|
234 |
+
formatted_keys.append(match.group(1))
|
235 |
+
else:
|
236 |
+
formatted_keys.append(key)
|
237 |
+
|
238 |
+
@self._kb.add(*formatted_keys, filter=filter, **kwargs)
|
239 |
+
def executable(event) -> None:
|
240 |
+
func(event)
|
241 |
+
|
242 |
+
return executable
|
243 |
+
|
244 |
+
return decorator
|
245 |
+
|
246 |
+
@abstractmethod
|
247 |
+
def _get_prompt_message(
|
248 |
+
self, pre_answer: Tuple[str, str], post_answer: Tuple[str, str]
|
249 |
+
) -> List[Tuple[str, str]]:
|
250 |
+
"""Get the question message in formatted text form to display in the prompt.
|
251 |
+
|
252 |
+
This function is mainly used to render the question message dynamically based
|
253 |
+
on the current status (answered or not answered) of the prompt.
|
254 |
+
|
255 |
+
Note:
|
256 |
+
The function requires implementation when inheriting :class:`.BaseSimplePrompt`.
|
257 |
+
You should call `super()._get_prompt_message(pre_answer, post_answer)` in
|
258 |
+
the implemented `_get_prompt_message`.
|
259 |
+
|
260 |
+
Args:
|
261 |
+
pre_answer: The message to display before the question is answered.
|
262 |
+
post_answer: The information to display after the question is answered.
|
263 |
+
|
264 |
+
Returns:
|
265 |
+
Formatted text in list of tuple format.
|
266 |
+
"""
|
267 |
+
display_message = []
|
268 |
+
if self.status["skipped"]:
|
269 |
+
display_message.append(("class:skipped", self._qmark))
|
270 |
+
display_message.append(
|
271 |
+
("class:skipped", "%s%s " % (" " if self._qmark else "", self._message))
|
272 |
+
)
|
273 |
+
elif self.status["answered"]:
|
274 |
+
display_message.append(("class:answermark", self._amark))
|
275 |
+
display_message.append(
|
276 |
+
(
|
277 |
+
"class:answered_question",
|
278 |
+
"%s%s" % (" " if self._amark else "", self._message),
|
279 |
+
)
|
280 |
+
)
|
281 |
+
display_message.append(
|
282 |
+
post_answer
|
283 |
+
if not self._transformer
|
284 |
+
else (
|
285 |
+
"class:answer",
|
286 |
+
" %s" % self._transformer(self.status["result"]),
|
287 |
+
)
|
288 |
+
)
|
289 |
+
else:
|
290 |
+
display_message.append(("class:questionmark", self._qmark))
|
291 |
+
display_message.append(
|
292 |
+
(
|
293 |
+
"class:question",
|
294 |
+
"%s%s" % (" " if self._qmark else "", self._message),
|
295 |
+
)
|
296 |
+
)
|
297 |
+
display_message.append(pre_answer)
|
298 |
+
return display_message
|
299 |
+
|
300 |
+
@abstractmethod
|
301 |
+
def _run(self) -> Any:
|
302 |
+
"""Abstractmethod to enforce a run function is implemented.
|
303 |
+
|
304 |
+
All prompt instance requires a `_run` call to initialise and run an instance of
|
305 |
+
`PromptSession` or `Application`.
|
306 |
+
"""
|
307 |
+
pass
|
308 |
+
|
309 |
+
@abstractmethod
|
310 |
+
async def _run_async(self) -> Any:
|
311 |
+
"""Abstractmethod to enforce a run function is implemented.
|
312 |
+
|
313 |
+
All prompt instance requires a `_run_async` call to initialise and run an instance of
|
314 |
+
`PromptSession` or `Application`.
|
315 |
+
"""
|
316 |
+
pass
|
317 |
+
|
318 |
+
def execute(self, raise_keyboard_interrupt: Optional[bool] = None) -> Any:
|
319 |
+
"""Run the prompt and get the result.
|
320 |
+
|
321 |
+
Args:
|
322 |
+
raise_keyboard_interrupt: **Deprecated**. Set this parameter on the prompt initialisation instead.
|
323 |
+
|
324 |
+
Returns:
|
325 |
+
Value of the user answer. Types varies depending on the prompt.
|
326 |
+
|
327 |
+
Raises:
|
328 |
+
KeyboardInterrupt: When `ctrl-c` is pressed and `raise_keyboard_interrupt` is True.
|
329 |
+
"""
|
330 |
+
result = self._run()
|
331 |
+
if raise_keyboard_interrupt is not None:
|
332 |
+
self._raise_kbi = not os.getenv(
|
333 |
+
"INQUIRERPY_NO_RAISE_KBI", not raise_keyboard_interrupt
|
334 |
+
)
|
335 |
+
if result == INQUIRERPY_KEYBOARD_INTERRUPT:
|
336 |
+
raise KeyboardInterrupt
|
337 |
+
if not self._filter:
|
338 |
+
return result
|
339 |
+
return self._filter(result)
|
340 |
+
|
341 |
+
async def execute_async(self) -> None:
|
342 |
+
"""Run the prompt asynchronously and get the result.
|
343 |
+
|
344 |
+
Returns:
|
345 |
+
Value of the user answer. Types varies depending on the prompt.
|
346 |
+
|
347 |
+
Raises:
|
348 |
+
KeyboardInterrupt: When `ctrl-c` is pressed and `raise_keyboard_interrupt` is True.
|
349 |
+
"""
|
350 |
+
result = await self._run_async()
|
351 |
+
if result == INQUIRERPY_KEYBOARD_INTERRUPT:
|
352 |
+
raise KeyboardInterrupt
|
353 |
+
if not self._filter:
|
354 |
+
return result
|
355 |
+
return self._filter(result)
|
356 |
+
|
357 |
+
@property
|
358 |
+
def instruction(self) -> str:
|
359 |
+
"""str: Instruction to display next to question."""
|
360 |
+
return self._instruction
|
361 |
+
|
362 |
+
@property
|
363 |
+
def kb_maps(self) -> Dict[str, Any]:
|
364 |
+
"""Dict[str, Any]: Keybinding mappings."""
|
365 |
+
return self._kb_maps
|
366 |
+
|
367 |
+
@kb_maps.setter
|
368 |
+
def kb_maps(self, value: Dict[str, Any]) -> None:
|
369 |
+
self._kb_maps = {**self._kb_maps, **value}
|
370 |
+
|
371 |
+
@property
|
372 |
+
def kb_func_lookup(self) -> Dict[str, Any]:
|
373 |
+
"""Dict[str, Any]: Keybinding function lookup mappings.."""
|
374 |
+
return self._kb_func_lookup
|
375 |
+
|
376 |
+
@kb_func_lookup.setter
|
377 |
+
def kb_func_lookup(self, value: Dict[str, Any]) -> None:
|
378 |
+
self._kb_func_lookup = {**self._kb_func_lookup, **value}
|
gemma-ad/Lib/site-packages/InquirerPy/containers/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from .spinner import SpinnerWindow
|
gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (282 Bytes). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/instruction.cpython-311.pyc
ADDED
Binary file (2.24 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/message.cpython-311.pyc
ADDED
Binary file (2.32 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/spinner.cpython-311.pyc
ADDED
Binary file (5.97 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/containers/__pycache__/validation.cpython-311.pyc
ADDED
Binary file (3.18 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/containers/instruction.py
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains :class:`.InstructionWindow` which can be used to display long instructions."""
|
2 |
+
|
3 |
+
from typing import TYPE_CHECKING
|
4 |
+
|
5 |
+
from prompt_toolkit.layout.containers import ConditionalContainer, Window
|
6 |
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
7 |
+
|
8 |
+
if TYPE_CHECKING:
|
9 |
+
from prompt_toolkit.filters.base import FilterOrBool
|
10 |
+
from prompt_toolkit.formatted_text.base import AnyFormattedText
|
11 |
+
|
12 |
+
|
13 |
+
class InstructionWindow(ConditionalContainer):
|
14 |
+
"""Conditional `prompt_toolkit` :class:`~prompt_toolkit.layout.Window` that displays long instructions.
|
15 |
+
|
16 |
+
Args:
|
17 |
+
message: Long instructions to display.
|
18 |
+
filter: Condition to display the instruction window.
|
19 |
+
"""
|
20 |
+
|
21 |
+
def __init__(self, message: str, filter: "FilterOrBool", **kwargs) -> None:
|
22 |
+
self._message = message
|
23 |
+
super().__init__(
|
24 |
+
Window(
|
25 |
+
FormattedTextControl(text=self._get_message),
|
26 |
+
dont_extend_height=True,
|
27 |
+
**kwargs
|
28 |
+
),
|
29 |
+
filter=filter,
|
30 |
+
)
|
31 |
+
|
32 |
+
def _get_message(self) -> "AnyFormattedText":
|
33 |
+
"""Get long instruction to display.
|
34 |
+
|
35 |
+
Returns:
|
36 |
+
FormattedText in list of tuple format.
|
37 |
+
"""
|
38 |
+
return [("class:long_instruction", self._message)]
|
gemma-ad/Lib/site-packages/InquirerPy/containers/message.py
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains the main message window :class:`~prompt_toolkit.container.Container`."""
|
2 |
+
|
3 |
+
from typing import TYPE_CHECKING
|
4 |
+
|
5 |
+
from prompt_toolkit.layout.containers import ConditionalContainer, Window
|
6 |
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
7 |
+
from prompt_toolkit.layout.dimension import LayoutDimension
|
8 |
+
|
9 |
+
if TYPE_CHECKING:
|
10 |
+
from prompt_toolkit.filters.base import FilterOrBool
|
11 |
+
from prompt_toolkit.formatted_text.base import AnyFormattedText
|
12 |
+
|
13 |
+
|
14 |
+
class MessageWindow(ConditionalContainer):
|
15 |
+
"""Main window to display question to the user.
|
16 |
+
|
17 |
+
Args:
|
18 |
+
message: The message to display in the terminal.
|
19 |
+
filter: Condition that this message window should be displayed.
|
20 |
+
Use a loading condition to only display this window while its not loading.
|
21 |
+
wrap_lines: Enable line wrapping if the message is too long.
|
22 |
+
show_cursor: Display cursor.
|
23 |
+
"""
|
24 |
+
|
25 |
+
def __init__(
|
26 |
+
self,
|
27 |
+
message: "AnyFormattedText",
|
28 |
+
filter: "FilterOrBool",
|
29 |
+
wrap_lines: bool = True,
|
30 |
+
show_cursor: bool = True,
|
31 |
+
**kwargs
|
32 |
+
) -> None:
|
33 |
+
super().__init__(
|
34 |
+
content=Window(
|
35 |
+
height=LayoutDimension.exact(1) if not wrap_lines else None,
|
36 |
+
content=FormattedTextControl(message, show_cursor=show_cursor),
|
37 |
+
wrap_lines=wrap_lines,
|
38 |
+
dont_extend_height=True,
|
39 |
+
**kwargs
|
40 |
+
),
|
41 |
+
filter=filter,
|
42 |
+
)
|
gemma-ad/Lib/site-packages/InquirerPy/containers/spinner.py
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains spinner related resources.
|
2 |
+
|
3 |
+
Note:
|
4 |
+
The spinner is not a standalone spinner to run in the terminal
|
5 |
+
but rather a `prompt_toolkit` :class:`~prompt_toolkit.layout.Window` that displays a spinner.
|
6 |
+
|
7 |
+
Use library such as `yaspin <https://github.com/pavdmyt/yaspin>`_ if you need a plain spinner.
|
8 |
+
"""
|
9 |
+
import asyncio
|
10 |
+
from typing import TYPE_CHECKING, Callable, List, NamedTuple, Optional, Tuple, Union
|
11 |
+
|
12 |
+
from prompt_toolkit.filters.utils import to_filter
|
13 |
+
from prompt_toolkit.layout.containers import ConditionalContainer, Window
|
14 |
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
15 |
+
|
16 |
+
if TYPE_CHECKING:
|
17 |
+
from prompt_toolkit.filters.base import Filter
|
18 |
+
|
19 |
+
__all__ = ["SPINNERS", "SpinnerWindow"]
|
20 |
+
|
21 |
+
|
22 |
+
class SPINNERS(NamedTuple):
|
23 |
+
"""Presets of spinner patterns.
|
24 |
+
|
25 |
+
See Also:
|
26 |
+
https://github.com/pavdmyt/yaspin/blob/master/yaspin/data/spinners.json
|
27 |
+
|
28 |
+
This only contains some basic ones thats ready to use. For more patterns, checkout the
|
29 |
+
URL above.
|
30 |
+
|
31 |
+
Examples:
|
32 |
+
>>> from InquirerPy import inquirer
|
33 |
+
>>> from InquirerPy.spinner import SPINNERS
|
34 |
+
>>> inquirer.select(message="", choices=lambda _: [1, 2, 3], spinner_pattern=SPINNERS.dots)
|
35 |
+
"""
|
36 |
+
|
37 |
+
dots = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
|
38 |
+
dots2 = ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"]
|
39 |
+
line = ["-", "\\", "|", "/"]
|
40 |
+
line2 = ["⠂", "-", "–", "—", "–", "-"]
|
41 |
+
pipe = ["┤", "┘", "┴", "└", "├", "┌", "┬", "┐"]
|
42 |
+
star = ["✶", "✸", "✹", "✺", "✹", "✷"]
|
43 |
+
star2 = ["+", "x", "*"]
|
44 |
+
flip = ["_", "_", "_", "-", "`", "`", "'", "´", "-", "_", "_", "_"]
|
45 |
+
hamburger = ["☱", "☲", "☴"]
|
46 |
+
grow_vertical = ["▁", "▃", "▄", "▅", "▆", "▇", "▆", "▅", "▄", "▃"]
|
47 |
+
grow_horizontal = ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "▊", "▋", "▌", "▍", "▎"]
|
48 |
+
box_bounce = ["▖", "▘", "▝", "▗"]
|
49 |
+
triangle = ["◢", "◣", "◤", "◥"]
|
50 |
+
arc = ["◜", "◠", "◝", "◞", "◡", "◟"]
|
51 |
+
circle = ["◡", "⊙", "◠"]
|
52 |
+
|
53 |
+
|
54 |
+
class SpinnerWindow(ConditionalContainer):
|
55 |
+
"""Conditional `prompt_toolkit` :class:`~prompt_toolkit.layout.Window` that displays a spinner.
|
56 |
+
|
57 |
+
Args:
|
58 |
+
loading: A :class:`~prompt_toolkit.filters.Condition` to indicate if the spinner should be visible.
|
59 |
+
redraw: A redraw function (i.e. :meth:`~prompt_toolkit.application.Application.invalidate`) to refresh the UI.
|
60 |
+
pattern: List of pattern to display as the spinner.
|
61 |
+
delay: Spinner refresh frequency.
|
62 |
+
text: Loading text to display.
|
63 |
+
"""
|
64 |
+
|
65 |
+
def __init__(
|
66 |
+
self,
|
67 |
+
loading: "Filter",
|
68 |
+
redraw: Callable[[], None],
|
69 |
+
pattern: Optional[Union[List[str], SPINNERS]] = None,
|
70 |
+
delay: float = 0.1,
|
71 |
+
text: str = "",
|
72 |
+
) -> None:
|
73 |
+
self._loading = to_filter(loading)
|
74 |
+
self._spinning = False
|
75 |
+
self._redraw = redraw
|
76 |
+
self._pattern = pattern or SPINNERS.line
|
77 |
+
self._char = self._pattern[0]
|
78 |
+
self._delay = delay
|
79 |
+
self._text = text or "Loading ..."
|
80 |
+
|
81 |
+
super().__init__(
|
82 |
+
content=Window(content=FormattedTextControl(text=self._get_text)),
|
83 |
+
filter=self._loading,
|
84 |
+
)
|
85 |
+
|
86 |
+
def _get_text(self) -> List[Tuple[str, str]]:
|
87 |
+
"""Dynamically get the text for the :class:`~prompt_toolkit.layout.Window`.
|
88 |
+
|
89 |
+
Returns:
|
90 |
+
Formatted text.
|
91 |
+
"""
|
92 |
+
return [
|
93 |
+
("class:spinner_pattern", self._char),
|
94 |
+
("", " "),
|
95 |
+
("class:spinner_text", self._text),
|
96 |
+
]
|
97 |
+
|
98 |
+
async def start(self) -> None:
|
99 |
+
"""Start the spinner."""
|
100 |
+
if self._spinning:
|
101 |
+
return
|
102 |
+
self._spinning = True
|
103 |
+
while self._loading():
|
104 |
+
for char in self._pattern:
|
105 |
+
await asyncio.sleep(self._delay)
|
106 |
+
self._char = char
|
107 |
+
self._redraw()
|
108 |
+
self._spinning = False
|
gemma-ad/Lib/site-packages/InquirerPy/containers/validation.py
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains :class:`.ValidationWindow` which can be used to display error."""
|
2 |
+
|
3 |
+
from typing import Optional
|
4 |
+
|
5 |
+
from prompt_toolkit.filters.base import FilterOrBool
|
6 |
+
from prompt_toolkit.formatted_text.base import AnyFormattedText
|
7 |
+
from prompt_toolkit.layout.containers import ConditionalContainer, Float, Window
|
8 |
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
9 |
+
|
10 |
+
|
11 |
+
class ValidationWindow(ConditionalContainer):
|
12 |
+
"""Conditional `prompt_toolkit` :class:`~prompt_toolkit.layout.Window` that displays error.
|
13 |
+
|
14 |
+
Args:
|
15 |
+
invalid_message: Error message to display when error occured.
|
16 |
+
filter: Condition to display the error window.
|
17 |
+
"""
|
18 |
+
|
19 |
+
def __init__(
|
20 |
+
self, invalid_message: AnyFormattedText, filter: FilterOrBool, **kwargs
|
21 |
+
) -> None:
|
22 |
+
super().__init__(
|
23 |
+
Window(
|
24 |
+
FormattedTextControl(invalid_message), dont_extend_height=True, **kwargs
|
25 |
+
),
|
26 |
+
filter=filter,
|
27 |
+
)
|
28 |
+
|
29 |
+
|
30 |
+
class ValidationFloat(Float):
|
31 |
+
""":class:`~prompt_toolkit.layout.Float` wrapper around :class:`.ValidationWindow`.
|
32 |
+
|
33 |
+
Args:
|
34 |
+
invalid_message: Error message to display when error occured.
|
35 |
+
filter: Condition to display the error window.
|
36 |
+
left: Distance to left.
|
37 |
+
right: Distance to right.
|
38 |
+
bottom: Distance to bottom.
|
39 |
+
top: Distance to top.
|
40 |
+
"""
|
41 |
+
|
42 |
+
def __init__(
|
43 |
+
self,
|
44 |
+
invalid_message: AnyFormattedText,
|
45 |
+
filter: FilterOrBool,
|
46 |
+
left: Optional[int] = None,
|
47 |
+
right: Optional[int] = None,
|
48 |
+
bottom: Optional[int] = None,
|
49 |
+
top: Optional[int] = None,
|
50 |
+
**kwargs
|
51 |
+
) -> None:
|
52 |
+
super().__init__(
|
53 |
+
content=ValidationWindow(
|
54 |
+
invalid_message=invalid_message, filter=filter, **kwargs
|
55 |
+
),
|
56 |
+
left=left,
|
57 |
+
right=right,
|
58 |
+
bottom=bottom,
|
59 |
+
top=top,
|
60 |
+
)
|
gemma-ad/Lib/site-packages/InquirerPy/enum.py
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains common constants."""
|
2 |
+
INQUIRERPY_KEYBOARD_INTERRUPT: str = "INQUIRERPY_KEYBOARD_INTERRUPT"
|
3 |
+
|
4 |
+
INQUIRERPY_POINTER_SEQUENCE: str = "\u276f"
|
5 |
+
INQUIRERPY_FILL_CIRCLE_SEQUENCE: str = "\u25c9"
|
6 |
+
INQUIRERPY_EMPTY_CIRCLE_SEQUENCE: str = "\u25cb"
|
7 |
+
INQUIRERPY_QMARK_SEQUENCE: str = "\u003f"
|
gemma-ad/Lib/site-packages/InquirerPy/exceptions.py
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains exceptions that will be raised by `InquirerPy`."""
|
2 |
+
|
3 |
+
|
4 |
+
class InvalidArgument(Exception):
|
5 |
+
"""Provided argument is invalid.
|
6 |
+
|
7 |
+
Args:
|
8 |
+
message: Exception message.
|
9 |
+
"""
|
10 |
+
|
11 |
+
def __init__(self, message: str = "invalid argument"):
|
12 |
+
self._message = message
|
13 |
+
super().__init__(self._message)
|
14 |
+
|
15 |
+
|
16 |
+
class RequiredKeyNotFound(Exception):
|
17 |
+
"""Missing required keys in dictionary.
|
18 |
+
|
19 |
+
Args:
|
20 |
+
message: Exception message.
|
21 |
+
"""
|
22 |
+
|
23 |
+
def __init__(self, message="required key not found"):
|
24 |
+
self.message = message
|
25 |
+
super().__init__(self.message)
|
gemma-ad/Lib/site-packages/InquirerPy/inquirer.py
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Servers as another entry point for `InquirerPy`.
|
2 |
+
|
3 |
+
See Also:
|
4 |
+
:ref:`index:Alternate Syntax`.
|
5 |
+
|
6 |
+
`inquirer` directly interact with individual prompt classes. It’s more flexible, easier to customise and also provides IDE type hintings/completions.
|
7 |
+
"""
|
8 |
+
from InquirerPy.prompts import CheckboxPrompt as checkbox
|
9 |
+
from InquirerPy.prompts import ConfirmPrompt as confirm
|
10 |
+
from InquirerPy.prompts import ExpandPrompt as expand
|
11 |
+
from InquirerPy.prompts import FilePathPrompt as filepath
|
12 |
+
from InquirerPy.prompts import FuzzyPrompt as fuzzy
|
13 |
+
from InquirerPy.prompts import InputPrompt as text
|
14 |
+
from InquirerPy.prompts import ListPrompt as select
|
15 |
+
from InquirerPy.prompts import NumberPrompt as number
|
16 |
+
from InquirerPy.prompts import RawlistPrompt as rawlist
|
17 |
+
from InquirerPy.prompts import SecretPrompt as secret
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__init__.py
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""Module contains import of all prompts classes."""
|
2 |
+
from InquirerPy.prompts.checkbox import CheckboxPrompt
|
3 |
+
from InquirerPy.prompts.confirm import ConfirmPrompt
|
4 |
+
from InquirerPy.prompts.expand import ExpandPrompt
|
5 |
+
from InquirerPy.prompts.filepath import FilePathPrompt
|
6 |
+
from InquirerPy.prompts.fuzzy import FuzzyPrompt
|
7 |
+
from InquirerPy.prompts.input import InputPrompt
|
8 |
+
from InquirerPy.prompts.list import ListPrompt
|
9 |
+
from InquirerPy.prompts.number import NumberPrompt
|
10 |
+
from InquirerPy.prompts.rawlist import RawlistPrompt
|
11 |
+
from InquirerPy.prompts.secret import SecretPrompt
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/__init__.cpython-311.pyc
ADDED
Binary file (1.07 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/checkbox.cpython-311.pyc
ADDED
Binary file (12.5 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/confirm.cpython-311.pyc
ADDED
Binary file (11 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/expand.cpython-311.pyc
ADDED
Binary file (23.6 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/filepath.cpython-311.pyc
ADDED
Binary file (11 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/fuzzy.cpython-311.pyc
ADDED
Binary file (33.6 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/input.cpython-311.pyc
ADDED
Binary file (14 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/list.cpython-311.pyc
ADDED
Binary file (18.8 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/number.cpython-311.pyc
ADDED
Binary file (30.5 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/rawlist.cpython-311.pyc
ADDED
Binary file (15.3 kB). View file
|
|
gemma-ad/Lib/site-packages/InquirerPy/prompts/__pycache__/secret.cpython-311.pyc
ADDED
Binary file (7.27 kB). View file
|
|