InquirerPrompt 0.3.4__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- inquirerprompt-0.4.1/.editorconfig +43 -0
- inquirerprompt-0.4.1/.github/SECURITY.md +35 -0
- inquirerprompt-0.4.1/.github/dependabot.yml +23 -0
- inquirerprompt-0.4.1/.github/workflows/cd.yml +72 -0
- inquirerprompt-0.4.1/.github/workflows/ci.yml +96 -0
- inquirerprompt-0.4.1/.github/workflows/codeql.yml +40 -0
- inquirerprompt-0.4.1/.github/workflows/compat.yml +78 -0
- inquirerprompt-0.4.1/.gitignore +147 -0
- inquirerprompt-0.4.1/.markdownlint-cli2.jsonc +50 -0
- inquirerprompt-0.4.1/.pre-commit-config.yaml +9 -0
- inquirerprompt-0.4.1/.prettierignore +33 -0
- inquirerprompt-0.4.1/.prettierrc +82 -0
- inquirerprompt-0.4.1/.readthedocs.yaml +19 -0
- inquirerprompt-0.4.1/AGENTS.md +107 -0
- inquirerprompt-0.4.1/CHANGELOG.md +2364 -0
- inquirerprompt-0.4.1/InquirerPrompt/__init__.py +4 -0
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/base/complex.py +21 -4
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/base/control.py +20 -8
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/base/list.py +4 -4
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/base/simple.py +3 -3
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/containers/instruction.py +1 -1
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/containers/message.py +2 -2
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/containers/spinner.py +6 -4
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/containers/validation.py +1 -1
- inquirerprompt-0.4.1/InquirerPrompt/inquirer.py +31 -0
- inquirerprompt-0.4.1/InquirerPrompt/prompts/__init__.py +25 -0
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/checkbox.py +17 -9
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/confirm.py +5 -5
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/expand.py +25 -15
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/filepath.py +6 -6
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/fuzzy.py +44 -23
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/input.py +6 -6
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/list.py +25 -16
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/number.py +15 -9
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/rawlist.py +16 -11
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/prompts/secret.py +3 -3
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/resolver.py +26 -22
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/separator.py +1 -1
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/utils.py +58 -9
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/validator.py +2 -2
- {inquirerprompt-0.3.4 → inquirerprompt-0.4.1}/PKG-INFO +73 -30
- {inquirerprompt-0.3.4 → inquirerprompt-0.4.1}/README.md +57 -10
- inquirerprompt-0.4.1/Taskfile.yml +208 -0
- inquirerprompt-0.4.1/buildspec.yml +23 -0
- inquirerprompt-0.4.1/docs/Makefile +23 -0
- inquirerprompt-0.4.1/docs/conf.py +37 -0
- inquirerprompt-0.4.1/docs/index.md +189 -0
- inquirerprompt-0.4.1/docs/pages/api.md +159 -0
- inquirerprompt-0.4.1/docs/pages/changelog.md +3 -0
- inquirerprompt-0.4.1/docs/pages/color_print.md +31 -0
- inquirerprompt-0.4.1/docs/pages/compat_report.md +19 -0
- inquirerprompt-0.4.1/docs/pages/compatibility.md +39 -0
- inquirerprompt-0.4.1/docs/pages/dynamic.md +384 -0
- inquirerprompt-0.4.1/docs/pages/env.md +193 -0
- inquirerprompt-0.4.1/docs/pages/faq.md +105 -0
- inquirerprompt-0.4.1/docs/pages/height.md +160 -0
- inquirerprompt-0.4.1/docs/pages/inquirer.md +60 -0
- inquirerprompt-0.4.1/docs/pages/kb.md +340 -0
- inquirerprompt-0.4.1/docs/pages/patched_print.md +29 -0
- inquirerprompt-0.4.1/docs/pages/prompt.md +146 -0
- inquirerprompt-0.4.1/docs/pages/prompts/checkbox.md +95 -0
- inquirerprompt-0.4.1/docs/pages/prompts/confirm.md +141 -0
- inquirerprompt-0.4.1/docs/pages/prompts/expand.md +169 -0
- inquirerprompt-0.4.1/docs/pages/prompts/filepath.md +78 -0
- inquirerprompt-0.4.1/docs/pages/prompts/fuzzy.md +187 -0
- inquirerprompt-0.4.1/docs/pages/prompts/input.md +132 -0
- inquirerprompt-0.4.1/docs/pages/prompts/list.md +157 -0
- inquirerprompt-0.4.1/docs/pages/prompts/number.md +266 -0
- inquirerprompt-0.4.1/docs/pages/prompts/rawlist.md +84 -0
- inquirerprompt-0.4.1/docs/pages/prompts/secret.md +53 -0
- inquirerprompt-0.4.1/docs/pages/raise_kbi.md +194 -0
- inquirerprompt-0.4.1/docs/pages/separator.md +83 -0
- inquirerprompt-0.4.1/docs/pages/style.md +151 -0
- inquirerprompt-0.4.1/docs/pages/validator.md +310 -0
- inquirerprompt-0.4.1/docs/requirements.txt +5 -0
- inquirerprompt-0.4.1/examples/__init__.py +0 -0
- inquirerprompt-0.4.1/examples/alternate/__init__.py +0 -0
- inquirerprompt-0.4.1/examples/alternate/checkbox.py +46 -0
- inquirerprompt-0.4.1/examples/alternate/confirm.py +14 -0
- inquirerprompt-0.4.1/examples/alternate/expand.py +36 -0
- inquirerprompt-0.4.1/examples/alternate/filepath.py +23 -0
- inquirerprompt-0.4.1/examples/alternate/fuzzy.py +51 -0
- inquirerprompt-0.4.1/examples/alternate/input.py +30 -0
- inquirerprompt-0.4.1/examples/alternate/list.py +32 -0
- inquirerprompt-0.4.1/examples/alternate/number.py +20 -0
- inquirerprompt-0.4.1/examples/alternate/rawlist.py +37 -0
- inquirerprompt-0.4.1/examples/alternate/secret.py +26 -0
- inquirerprompt-0.4.1/examples/async.py +19 -0
- inquirerprompt-0.4.1/examples/classic/__init__.py +0 -0
- inquirerprompt-0.4.1/examples/classic/checkbox.py +51 -0
- inquirerprompt-0.4.1/examples/classic/confirm.py +28 -0
- inquirerprompt-0.4.1/examples/classic/expand.py +48 -0
- inquirerprompt-0.4.1/examples/classic/filepath.py +31 -0
- inquirerprompt-0.4.1/examples/classic/fuzzy.py +58 -0
- inquirerprompt-0.4.1/examples/classic/input.py +35 -0
- inquirerprompt-0.4.1/examples/classic/list.py +34 -0
- inquirerprompt-0.4.1/examples/classic/number.py +26 -0
- inquirerprompt-0.4.1/examples/classic/rawlist.py +43 -0
- inquirerprompt-0.4.1/examples/classic/secret.py +33 -0
- inquirerprompt-0.4.1/examples/colored_choices.py +136 -0
- inquirerprompt-0.4.1/examples/demo_alternate.py +61 -0
- inquirerprompt-0.4.1/examples/demo_classic.py +71 -0
- inquirerprompt-0.4.1/examples/inquirer.py +23 -0
- inquirerprompt-0.4.1/examples/pizza.py +63 -0
- inquirerprompt-0.4.1/examples/prompt.py +33 -0
- inquirerprompt-0.4.1/examples/requirements.txt +1 -0
- inquirerprompt-0.4.1/pyproject.toml +149 -0
- inquirerprompt-0.4.1/pyrightconfig.json +10 -0
- inquirerprompt-0.4.1/scripts/compat_check.py +192 -0
- inquirerprompt-0.4.1/tests/__init__.py +0 -0
- inquirerprompt-0.4.1/tests/base/__init__.py +0 -0
- inquirerprompt-0.4.1/tests/base/test_complex.py +376 -0
- inquirerprompt-0.4.1/tests/base/test_control.py +303 -0
- inquirerprompt-0.4.1/tests/base/test_list.py +327 -0
- inquirerprompt-0.4.1/tests/base/test_simple.py +191 -0
- inquirerprompt-0.4.1/tests/conftest.py +31 -0
- inquirerprompt-0.4.1/tests/containers/__init__.py +0 -0
- inquirerprompt-0.4.1/tests/containers/test_instruction.py +9 -0
- inquirerprompt-0.4.1/tests/containers/test_spinner.py +55 -0
- inquirerprompt-0.4.1/tests/prompts/__init__.py +0 -0
- inquirerprompt-0.4.1/tests/prompts/test_checkbox.py +220 -0
- inquirerprompt-0.4.1/tests/prompts/test_confirm.py +296 -0
- inquirerprompt-0.4.1/tests/prompts/test_expand.py +339 -0
- inquirerprompt-0.4.1/tests/prompts/test_filepath.py +293 -0
- inquirerprompt-0.4.1/tests/prompts/test_fuzzy.py +990 -0
- inquirerprompt-0.4.1/tests/prompts/test_input.py +284 -0
- inquirerprompt-0.4.1/tests/prompts/test_list.py +185 -0
- inquirerprompt-0.4.1/tests/prompts/test_number.py +494 -0
- inquirerprompt-0.4.1/tests/prompts/test_rawlist.py +226 -0
- inquirerprompt-0.4.1/tests/prompts/test_secret.py +158 -0
- inquirerprompt-0.4.1/tests/style.py +31 -0
- inquirerprompt-0.4.1/tests/test_colored_choices.py +258 -0
- inquirerprompt-0.4.1/tests/test_inquirer.py +20 -0
- inquirerprompt-0.4.1/tests/test_resolver.py +484 -0
- inquirerprompt-0.4.1/tests/test_utils.py +143 -0
- inquirerprompt-0.4.1/tests/test_validator.py +75 -0
- inquirerprompt-0.4.1/uv.lock +3094 -0
- inquirerprompt-0.3.4/InquirerPy/__init__.py +0 -4
- inquirerprompt-0.3.4/InquirerPy/inquirer.py +0 -31
- inquirerprompt-0.3.4/InquirerPy/prompts/__init__.py +0 -25
- inquirerprompt-0.3.4/pyproject.toml +0 -98
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/base/__init__.py +0 -0
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/containers/__init__.py +0 -0
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/enum.py +0 -0
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/exceptions.py +0 -0
- {inquirerprompt-0.3.4/InquirerPy → inquirerprompt-0.4.1/InquirerPrompt}/py.typed +0 -0
- {inquirerprompt-0.3.4 → inquirerprompt-0.4.1}/LICENSE +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# EditorConfig for consistent formatting across the project
|
|
2
|
+
# See: https://editorconfig.org/
|
|
3
|
+
|
|
4
|
+
root = true
|
|
5
|
+
|
|
6
|
+
# Default formatting (all files)
|
|
7
|
+
[*]
|
|
8
|
+
charset = utf-8
|
|
9
|
+
end_of_line = lf
|
|
10
|
+
insert_final_newline = true
|
|
11
|
+
trim_trailing_whitespace = true
|
|
12
|
+
indent_style = space
|
|
13
|
+
max_line_length = 200
|
|
14
|
+
indent_size = 4
|
|
15
|
+
|
|
16
|
+
# Shell scripts (bash, sh, bash-like)
|
|
17
|
+
[*.{sh,bash,inc,command},*.zsh,.zshrc,.zshenv,.zprofile,.zshaliases]
|
|
18
|
+
indent_size = 2
|
|
19
|
+
# Shfmt specific options (when ignoreEditorconfig = false in VSCode settings)
|
|
20
|
+
# See: https://github.com/mvdan/sh
|
|
21
|
+
# shell_variant = bash
|
|
22
|
+
# shell_variant = zsh
|
|
23
|
+
# binary_next_line = false # boolean operators stay on same line
|
|
24
|
+
case_indent = true # indent case patterns
|
|
25
|
+
# func_next_line = false # function braces on same line
|
|
26
|
+
space_redirects = true # space after redirection operators
|
|
27
|
+
# simplify = false # don't remove redundant code
|
|
28
|
+
switch_case_indent = true # indent case patterns
|
|
29
|
+
keep_padding = true # keep padding around redirects
|
|
30
|
+
function_next_line = true
|
|
31
|
+
|
|
32
|
+
# Markdown documentation
|
|
33
|
+
[*.{md,markdown}]
|
|
34
|
+
trim_trailing_whitespace = true
|
|
35
|
+
max_line_length = 3000
|
|
36
|
+
indent_size = 2
|
|
37
|
+
|
|
38
|
+
# YAML/JSON configuration
|
|
39
|
+
[*.{yaml,yml,json}]
|
|
40
|
+
indent_style = space
|
|
41
|
+
|
|
42
|
+
[Makefile]
|
|
43
|
+
indent_style = tab
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
If you discover a security vulnerability in InquirerPrompt, please report it
|
|
6
|
+
responsibly:
|
|
7
|
+
|
|
8
|
+
1. **Do not open a public GitHub issue.**
|
|
9
|
+
2. Email the maintainer at **tobias.hochguertel@googlemail.com** with a
|
|
10
|
+
description of the vulnerability and steps to reproduce.
|
|
11
|
+
3. You will receive an acknowledgment within 48 hours.
|
|
12
|
+
4. A fix will be prepared and a security advisory published on GitHub once
|
|
13
|
+
the fix is released.
|
|
14
|
+
|
|
15
|
+
## Supported Versions
|
|
16
|
+
|
|
17
|
+
| Version | Supported |
|
|
18
|
+
|---------|-----------|
|
|
19
|
+
| latest `main` / `dev` | Yes |
|
|
20
|
+
| tagged releases on `main` | Yes |
|
|
21
|
+
| older versions | No — please upgrade |
|
|
22
|
+
|
|
23
|
+
## Scope
|
|
24
|
+
|
|
25
|
+
This policy covers the `InquirerPrompt` package (PyPI) and the
|
|
26
|
+
`tobiashochguertel/InquirerPrompt` repository. It does not cover the
|
|
27
|
+
upstream `kazhala/InquirerPy` project — report upstream vulnerabilities
|
|
28
|
+
through their channels.
|
|
29
|
+
|
|
30
|
+
## Security Features Enabled
|
|
31
|
+
|
|
32
|
+
- Secret scanning (with push protection)
|
|
33
|
+
- Dependabot security alerts and automated security updates
|
|
34
|
+
- CodeQL code scanning (on `main` and `dev`)
|
|
35
|
+
- Branch protection on `main` (no force pushes, no deletions)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
open-pull-requests-limit: 5
|
|
8
|
+
labels:
|
|
9
|
+
- dependencies
|
|
10
|
+
- python
|
|
11
|
+
commit-message:
|
|
12
|
+
prefix: "chore(deps)"
|
|
13
|
+
|
|
14
|
+
- package-ecosystem: github-actions
|
|
15
|
+
directory: /
|
|
16
|
+
schedule:
|
|
17
|
+
interval: weekly
|
|
18
|
+
open-pull-requests-limit: 5
|
|
19
|
+
labels:
|
|
20
|
+
- dependencies
|
|
21
|
+
- github-actions
|
|
22
|
+
commit-message:
|
|
23
|
+
prefix: "chore(deps)"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: CD — Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
# Centralized version pins — adjust here to update all jobs
|
|
13
|
+
env:
|
|
14
|
+
UV_VERSION: "0.5.18"
|
|
15
|
+
PYTHON_VERSION: "3.12"
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
release:
|
|
19
|
+
name: Semantic Release
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
# Only run on non-fork repositories
|
|
22
|
+
if: github.repository_owner == 'tobiashochguertel'
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
token: ${{ secrets.GH_RELEASE_TOKEN }}
|
|
28
|
+
|
|
29
|
+
- name: Set up Python
|
|
30
|
+
uses: actions/setup-python@v5
|
|
31
|
+
with:
|
|
32
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
33
|
+
|
|
34
|
+
- name: Install uv
|
|
35
|
+
uses: astral-sh/setup-uv@v5
|
|
36
|
+
with:
|
|
37
|
+
version: ${{ env.UV_VERSION }}
|
|
38
|
+
enable-cache: true
|
|
39
|
+
cache-dependency-glob: "uv.lock"
|
|
40
|
+
|
|
41
|
+
- name: Install dependencies
|
|
42
|
+
run: uv sync --group dev
|
|
43
|
+
|
|
44
|
+
- name: Check if release needed
|
|
45
|
+
id: check
|
|
46
|
+
run: |
|
|
47
|
+
NEXT_TAG=$(uv run semantic-release version --print-tag 2>/dev/null || echo "")
|
|
48
|
+
if [ -n "$NEXT_TAG" ]; then
|
|
49
|
+
echo "released=true" >> "$GITHUB_OUTPUT"
|
|
50
|
+
echo "tag=$NEXT_TAG" >> "$GITHUB_OUTPUT"
|
|
51
|
+
else
|
|
52
|
+
echo "released=false" >> "$GITHUB_OUTPUT"
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
- name: Run semantic-release version
|
|
56
|
+
if: steps.check.outputs.released == 'true'
|
|
57
|
+
run: uv run semantic-release -vv version
|
|
58
|
+
env:
|
|
59
|
+
GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
|
|
60
|
+
|
|
61
|
+
- name: Publish to PyPI
|
|
62
|
+
if: steps.check.outputs.released == 'true'
|
|
63
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
64
|
+
with:
|
|
65
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
66
|
+
packages-dir: dist/
|
|
67
|
+
|
|
68
|
+
- name: Upload dist artifacts to GitHub release
|
|
69
|
+
if: steps.check.outputs.released == 'true'
|
|
70
|
+
run: uv run semantic-release -vv publish
|
|
71
|
+
env:
|
|
72
|
+
GH_TOKEN: ${{ secrets.GH_RELEASE_TOKEN }}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, dev]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
# Centralized version pins — adjust here to update all jobs
|
|
15
|
+
env:
|
|
16
|
+
UV_VERSION: "0.5.18"
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
lint:
|
|
20
|
+
name: Lint
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
- name: Install uv
|
|
29
|
+
uses: astral-sh/setup-uv@v5
|
|
30
|
+
with:
|
|
31
|
+
version: ${{ env.UV_VERSION }}
|
|
32
|
+
enable-cache: true
|
|
33
|
+
cache-dependency-glob: "uv.lock"
|
|
34
|
+
- name: Install dependencies
|
|
35
|
+
run: uv sync --group dev
|
|
36
|
+
- name: Run ruff check
|
|
37
|
+
run: uv run ruff check InquirerPrompt/ tests/
|
|
38
|
+
- name: Run ruff format
|
|
39
|
+
run: uv run ruff format --check InquirerPrompt/ tests/
|
|
40
|
+
- name: Run pyright
|
|
41
|
+
run: uv run pyright InquirerPrompt
|
|
42
|
+
|
|
43
|
+
test:
|
|
44
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
strategy:
|
|
47
|
+
fail-fast: false
|
|
48
|
+
matrix:
|
|
49
|
+
# Add/remove Python versions here
|
|
50
|
+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@v4
|
|
54
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
55
|
+
uses: actions/setup-python@v5
|
|
56
|
+
with:
|
|
57
|
+
python-version: ${{ matrix.python-version }}
|
|
58
|
+
- name: Install uv
|
|
59
|
+
uses: astral-sh/setup-uv@v5
|
|
60
|
+
with:
|
|
61
|
+
version: ${{ env.UV_VERSION }}
|
|
62
|
+
enable-cache: true
|
|
63
|
+
cache-dependency-glob: "uv.lock"
|
|
64
|
+
- name: Install dependencies
|
|
65
|
+
run: uv sync --group dev --python ${{ matrix.python-version }}
|
|
66
|
+
- name: Run tests
|
|
67
|
+
run: uv run pytest tests/ -v --tb=short
|
|
68
|
+
|
|
69
|
+
coverage:
|
|
70
|
+
name: Coverage
|
|
71
|
+
runs-on: ubuntu-latest
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
- name: Set up Python
|
|
75
|
+
uses: actions/setup-python@v5
|
|
76
|
+
with:
|
|
77
|
+
python-version: "3.12"
|
|
78
|
+
- name: Install uv
|
|
79
|
+
uses: astral-sh/setup-uv@v5
|
|
80
|
+
with:
|
|
81
|
+
version: ${{ env.UV_VERSION }}
|
|
82
|
+
enable-cache: true
|
|
83
|
+
cache-dependency-glob: "uv.lock"
|
|
84
|
+
- name: Install dependencies
|
|
85
|
+
run: uv sync --group dev
|
|
86
|
+
- name: Run coverage
|
|
87
|
+
run: |
|
|
88
|
+
uv run coverage run -m pytest tests/
|
|
89
|
+
uv run coverage xml
|
|
90
|
+
uv run coverage report
|
|
91
|
+
- name: Upload coverage to Codecov
|
|
92
|
+
uses: codecov/codecov-action@v5
|
|
93
|
+
with:
|
|
94
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
95
|
+
fail_ci_if_error: false
|
|
96
|
+
files: ./coverage.xml
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: CodeQL
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, dev]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: "0 6 * * 1"
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
analyze:
|
|
14
|
+
name: Analyze
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
permissions:
|
|
17
|
+
security-events: write
|
|
18
|
+
actions: read
|
|
19
|
+
contents: read
|
|
20
|
+
|
|
21
|
+
strategy:
|
|
22
|
+
fail-fast: false
|
|
23
|
+
matrix:
|
|
24
|
+
language: [python]
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
|
|
29
|
+
- name: Initialize CodeQL
|
|
30
|
+
uses: github/codeql-action/init@v3
|
|
31
|
+
with:
|
|
32
|
+
languages: ${{ matrix.language }}
|
|
33
|
+
|
|
34
|
+
- name: Autobuild
|
|
35
|
+
uses: github/codeql-action/autobuild@v3
|
|
36
|
+
|
|
37
|
+
- name: Perform CodeQL Analysis
|
|
38
|
+
uses: github/codeql-action/analyze@v3
|
|
39
|
+
with:
|
|
40
|
+
category: "/language:${{ matrix.language }}"
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
name: Compatibility Check
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, dev]
|
|
8
|
+
schedule:
|
|
9
|
+
# Run weekly to catch upstream changes even when fork is idle
|
|
10
|
+
- cron: "0 6 * * 1"
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
# Centralized version pins — adjust here to update all jobs
|
|
14
|
+
env:
|
|
15
|
+
UV_VERSION: "0.5.18"
|
|
16
|
+
PYTHON_VERSION: "3.12"
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
compat:
|
|
20
|
+
name: API Compatibility vs upstream InquirerPy
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
# Need full history for auto-commit step
|
|
27
|
+
fetch-depth: 0
|
|
28
|
+
token: ${{ secrets.GH_RELEASE_TOKEN }}
|
|
29
|
+
|
|
30
|
+
- name: Set up Python
|
|
31
|
+
uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
34
|
+
|
|
35
|
+
- name: Install uv
|
|
36
|
+
uses: astral-sh/setup-uv@v5
|
|
37
|
+
with:
|
|
38
|
+
version: ${{ env.UV_VERSION }}
|
|
39
|
+
enable-cache: true
|
|
40
|
+
cache-dependency-glob: "uv.lock"
|
|
41
|
+
|
|
42
|
+
- name: Install griffe
|
|
43
|
+
run: uv pip install --system "griffe>=1.0"
|
|
44
|
+
|
|
45
|
+
- name: Install fork package (editable)
|
|
46
|
+
run: uv pip install --system -e .
|
|
47
|
+
|
|
48
|
+
- name: Run compatibility check
|
|
49
|
+
id: compat
|
|
50
|
+
run: |
|
|
51
|
+
python scripts/compat_check.py --output docs/pages/compat_report.md
|
|
52
|
+
echo "report_exists=true" >> "$GITHUB_OUTPUT"
|
|
53
|
+
# Never fail CI — this is a report-only step
|
|
54
|
+
continue-on-error: true
|
|
55
|
+
|
|
56
|
+
- name: Upload compatibility report as artifact
|
|
57
|
+
uses: actions/upload-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: compatibility-report
|
|
60
|
+
path: docs/pages/compat_report.md
|
|
61
|
+
if-no-files-found: warn
|
|
62
|
+
|
|
63
|
+
- name: Commit updated report (main only, not on push to avoid race with CD)
|
|
64
|
+
if: >
|
|
65
|
+
github.ref == 'refs/heads/main' &&
|
|
66
|
+
github.event_name != 'pull_request' &&
|
|
67
|
+
github.event_name != 'push'
|
|
68
|
+
run: |
|
|
69
|
+
git config user.name "github-actions[bot]"
|
|
70
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
71
|
+
git add docs/pages/compat_report.md
|
|
72
|
+
git pull --rebase --autostash origin main
|
|
73
|
+
if git diff --cached --quiet; then
|
|
74
|
+
echo "No changes to compat_report.md — nothing to commit."
|
|
75
|
+
else
|
|
76
|
+
git commit -m "docs: update upstream compatibility report [skip ci]"
|
|
77
|
+
git push
|
|
78
|
+
fi
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py,cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
98
|
+
__pypackages__/
|
|
99
|
+
|
|
100
|
+
# Celery stuff
|
|
101
|
+
celerybeat-schedule
|
|
102
|
+
celerybeat.pid
|
|
103
|
+
|
|
104
|
+
# SageMath parsed files
|
|
105
|
+
*.sage.py
|
|
106
|
+
|
|
107
|
+
# Environments
|
|
108
|
+
.env
|
|
109
|
+
.venv
|
|
110
|
+
env/
|
|
111
|
+
venv/
|
|
112
|
+
ENV/
|
|
113
|
+
env.bak/
|
|
114
|
+
venv.bak/
|
|
115
|
+
|
|
116
|
+
# Spyder project settings
|
|
117
|
+
.spyderproject
|
|
118
|
+
.spyproject
|
|
119
|
+
|
|
120
|
+
# Rope project settings
|
|
121
|
+
.ropeproject
|
|
122
|
+
|
|
123
|
+
# mkdocs documentation
|
|
124
|
+
/site
|
|
125
|
+
|
|
126
|
+
# mypy
|
|
127
|
+
.mypy_cache/
|
|
128
|
+
.dmypy.json
|
|
129
|
+
dmypy.json
|
|
130
|
+
|
|
131
|
+
# Pyre type checker
|
|
132
|
+
.pyre/
|
|
133
|
+
|
|
134
|
+
# pytype static type analyzer
|
|
135
|
+
.pytype/
|
|
136
|
+
|
|
137
|
+
# Cython debug symbols
|
|
138
|
+
cython_debug/
|
|
139
|
+
sample.txt
|
|
140
|
+
|
|
141
|
+
.vscode
|
|
142
|
+
# Fork setup notes — contains credentials/tokens/account info — NEVER commit this
|
|
143
|
+
FORK_SETUP_NOTES.md
|
|
144
|
+
fork-setup-notes.md
|
|
145
|
+
.fork-notes/
|
|
146
|
+
*.secrets
|
|
147
|
+
FORK_LICENSE_NOTES.md
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
// https://github.com/DavidAnson/markdownlint-cli2
|
|
3
|
+
// Example configuration file for markdownlint-cli2
|
|
4
|
+
// https://github.com/DavidAnson/markdownlint-cli2/blob/main/test/markdownlint-cli2-jsonc-example/.markdownlint-cli2.jsonc
|
|
5
|
+
"config": {
|
|
6
|
+
"line-length": {
|
|
7
|
+
"code_blocks": false,
|
|
8
|
+
"headings": false,
|
|
9
|
+
"line_length": 3000,
|
|
10
|
+
"tables": false
|
|
11
|
+
},
|
|
12
|
+
"MD007": {
|
|
13
|
+
"indent": 2
|
|
14
|
+
},
|
|
15
|
+
"MD025": false,
|
|
16
|
+
"MD029": false,
|
|
17
|
+
"MD036": false,
|
|
18
|
+
"MD046": false,
|
|
19
|
+
"no-duplicate-heading": false,
|
|
20
|
+
"no-inline-html": false,
|
|
21
|
+
"no-space-in-code": false,
|
|
22
|
+
"ul-style": {
|
|
23
|
+
"style": "dash"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
// Ignore files referenced by .gitignore (only valid at root)
|
|
27
|
+
"gitignore": true,
|
|
28
|
+
// Define glob expressions to use (only valid at root)
|
|
29
|
+
"globs": [
|
|
30
|
+
"!*bout.md"
|
|
31
|
+
],
|
|
32
|
+
// Define glob expressions to ignore
|
|
33
|
+
"ignores": [
|
|
34
|
+
"ignore*.md"
|
|
35
|
+
],
|
|
36
|
+
// Disable banner message on stdout (only valid at root)
|
|
37
|
+
"noBanner": true,
|
|
38
|
+
// Enable inline config comments
|
|
39
|
+
"noInlineConfig": false,
|
|
40
|
+
// Disable progress on stdout (only valid at root)
|
|
41
|
+
"noProgress": true,
|
|
42
|
+
// Use a specific formatter (only valid at root)
|
|
43
|
+
"outputFormatters": [
|
|
44
|
+
[
|
|
45
|
+
"markdownlint-cli2-formatter-default"
|
|
46
|
+
]
|
|
47
|
+
],
|
|
48
|
+
// Show found files on stdout (only valid at root)
|
|
49
|
+
"showFound": true
|
|
50
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Python files
|
|
2
|
+
*.py
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.pyc
|
|
5
|
+
*.pyo
|
|
6
|
+
*.pyd
|
|
7
|
+
|
|
8
|
+
# Python build artifacts
|
|
9
|
+
build/
|
|
10
|
+
dist/
|
|
11
|
+
*.egg-info/
|
|
12
|
+
|
|
13
|
+
# Virtual environments
|
|
14
|
+
venv/
|
|
15
|
+
.venv/
|
|
16
|
+
env/
|
|
17
|
+
|
|
18
|
+
# Cache directories
|
|
19
|
+
.pytest_cache/
|
|
20
|
+
.coverage
|
|
21
|
+
.mypy_cache/
|
|
22
|
+
.ruff_cache/
|
|
23
|
+
|
|
24
|
+
# Keep Prettier focused on documentation and configs
|
|
25
|
+
**/*.py
|
|
26
|
+
!**/*.md
|
|
27
|
+
!**/*.json
|
|
28
|
+
!**/*.yaml
|
|
29
|
+
!**/*.yml
|
|
30
|
+
!*.md
|
|
31
|
+
!zsh_analysis/reports/**/*.md
|
|
32
|
+
|
|
33
|
+
##
|