strictcli 0.18.0__tar.gz → 0.20.0__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.
- strictcli-0.20.0/.rlsbl/changes/.validated +1 -0
- strictcli-0.20.0/.rlsbl/changes/0.19.0.jsonl +2 -0
- strictcli-0.20.0/.rlsbl/changes/0.19.0.md +5 -0
- strictcli-0.20.0/.rlsbl/changes/0.20.0.jsonl +4 -0
- strictcli-0.20.0/.rlsbl/releases/v0.19.0.toml +0 -0
- strictcli-0.20.0/.rlsbl/releases/v0.20.0.toml +8 -0
- strictcli-0.20.0/.rlsbl/version +1 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/CHANGELOG.md +57 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/PKG-INFO +7 -7
- {strictcli-0.18.0 → strictcli-0.20.0}/README.md +6 -6
- {strictcli-0.18.0 → strictcli-0.20.0}/package-lock.json +2 -2
- {strictcli-0.18.0 → strictcli-0.20.0}/package.json +1 -1
- {strictcli-0.18.0 → strictcli-0.20.0}/pyproject.toml +1 -1
- {strictcli-0.18.0 → strictcli-0.20.0}/strictcli/__init__.py +139 -45
- strictcli-0.20.0/tests/test_command_tags.py +419 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_e2e.py +8 -8
- strictcli-0.18.0/tests/test_tags.py → strictcli-0.20.0/tests/test_flag_sets.py +22 -22
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_passthrough.py +5 -5
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_registration.py +4 -4
- {strictcli-0.18.0 → strictcli-0.20.0}/uv.lock +1 -1
- strictcli-0.18.0/.rlsbl/bases/.rlsbl/lint/go.toml +0 -17
- strictcli-0.18.0/.rlsbl/changes/.validated +0 -1
- strictcli-0.18.0/.rlsbl/lint/go.toml +0 -17
- strictcli-0.18.0/.rlsbl/version +0 -1
- {strictcli-0.18.0 → strictcli-0.20.0}/.claude/settings.json +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.github/workflows/ci.yml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.github/workflows/publish.yml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.gitignore +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.npmignore +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.claude/settings.json +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.github/workflows/ci.yml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.github/workflows/publish.yml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.gitignore +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.npmignore +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/hooks/post-release.sh +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/hooks/pre-checks.sh +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/hooks/pre-release.sh +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/lint/npm.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/lint/python.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/CHANGELOG.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/CLAUDE.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/LICENSE +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.10.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.10.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.11.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.11.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.12.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.12.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.13.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.13.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.14.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.14.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.17.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.17.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.18.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.18.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.5.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.5.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.2.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.2.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.3.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.3.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.4.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.4.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.5.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.5.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.6.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.6.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.7.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.7.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.0.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.0.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.1.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.1.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/unreleased.jsonl +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/config.json +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hashes.json +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hooks/post-release.sh +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hooks/pre-checks.sh +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hooks/pre-release.sh +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/lint/npm.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/lint/python.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/unreleased.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.10.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.11.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.12.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.13.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.15.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.15.1.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.16.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.16.1.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.17.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.18.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.8.5.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.8.6.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.8.7.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.9.0.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.9.1.toml +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/.strictcli/schema.json +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/CLAUDE.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/LICENSE +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/index.js +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/postinstall.js +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_arg_default.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_at_prefix.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_auto_version.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_command.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_discovery.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_public_api.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_runner.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_schema.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_types.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_choices.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_command_help_suggestion.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_config.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_config_file_path.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_config_set_bugs.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_deep_nesting.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_dependencies.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_deprecated.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_dump_schema.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_env.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_exit_codes.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_float_type.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_global_flags.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_help.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_int_type.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_mutex.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_nesting.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_parser.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_repeatable.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_tagdsl.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_toml_loading.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_unique.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_utilities.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_validate.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_variadic.py +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/todo/.defer/deferred.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/todo/.done/original-idea.md +0 -0
- {strictcli-0.18.0 → strictcli-0.20.0}/todo/.done/public-check-runner-api.md +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
019cae063cca2c44324d0c76260c72e72334b7c8
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"commits":["03d0cd60c4d207b568a19bf6916f58aacdac1450","5a1368de51cbe0abe465f21f3a38f78ba1746fef"],"user_facing":true,"description":"**Breaking.** Renamed `Tag` to `FlagSet` and `tags=` parameter to `flag_sets=` across all API surfaces.","type":"breaking"}
|
|
2
|
+
{"commits":["03782821de6b48073259aa3edb66b141ab70eb3b","232a6e47db207159abfdb81a5e1b93c1cfce82ea","fa29d925446a00a2bddec93cb949f91f13682704"],"user_facing":false}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"commits":["9e7e116531923a9db84c2f9e7fc6326a9bf01079","a68465be720ee0728e72a09f5ba6bd3d563a9600"],"user_facing":true,"description":"**Breaking.** Command dataclass is now `frozen=True` with `tuple` fields instead of `list`.","type":"breaking"}
|
|
2
|
+
{"commits":["c5009427ea363e04d8c0096a1ec0628547317866","7808c1c5b08272af346aa4d0e9d69ff3ccef8c78"],"user_facing":true,"description":"**New.** Command tags: string labels on commands and groups with group-to-command inheritance.","type":"feature"}
|
|
3
|
+
{"commits":["ef7a4711dbcf7c0a53a3666de4507aab7c1cf9e0"],"user_facing":true,"description":"**New.** Tag contracts: registration-time validation that tagged commands have required flags.","type":"feature"}
|
|
4
|
+
{"commits":["bc911b9134605042b454bc2192c3fe68ee6f92bf","ff5ff5aa65b216fec2788f942751f11a8ca8b243"],"user_facing":false}
|
|
File without changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Version bump type: patch, minor, or major
|
|
2
|
+
bump = "minor"
|
|
3
|
+
# Short description of this release (required)
|
|
4
|
+
description = "Frozen Command, command tags, tag contracts"
|
|
5
|
+
# Optional context explaining why these changes were made
|
|
6
|
+
context = "Breaking: Command dataclass is now frozen=True with tuple fields (was mutable list). New: command tags (string labels with group inheritance) and tag contracts (registration-time validation that tagged commands have required flags)."
|
|
7
|
+
include = ["pypi", "npm"]
|
|
8
|
+
exclude = []
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.69.2
|
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
## 0.20.0
|
|
6
|
+
|
|
7
|
+
Frozen Command, command tags, tag contracts
|
|
8
|
+
|
|
9
|
+
<details>
|
|
10
|
+
<summary>Context</summary>
|
|
11
|
+
|
|
12
|
+
Breaking: Command dataclass is now frozen=True with tuple fields (was mutable list). New: command tags (string labels with group inheritance) and tag contracts (registration-time validation that tagged commands have required flags).
|
|
13
|
+
|
|
14
|
+
</details>
|
|
15
|
+
|
|
16
|
+
### Breaking
|
|
17
|
+
|
|
18
|
+
- **Breaking.** Command dataclass is now `frozen=True` with `tuple` fields instead of `list`.
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
- **New.** Command tags: string labels on commands and groups with group-to-command inheritance.
|
|
23
|
+
- **New.** Tag contracts: registration-time validation that tagged commands have required flags.
|
|
24
|
+
|
|
25
|
+
## 0.19.0
|
|
26
|
+
|
|
27
|
+
### Breaking
|
|
28
|
+
|
|
29
|
+
- **Breaking.** Renamed `Tag` to `FlagSet` and `tags=` parameter to `flag_sets=` across all API surfaces.
|
|
30
|
+
|
|
5
31
|
## 0.18.0
|
|
6
32
|
|
|
7
33
|
Public API for running checks programmatically
|
|
@@ -19,6 +45,8 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
|
|
|
19
45
|
|
|
20
46
|
## 0.17.0
|
|
21
47
|
|
|
48
|
+
Repeatable flag default validation and help text display
|
|
49
|
+
|
|
22
50
|
### Breaking
|
|
23
51
|
|
|
24
52
|
- **Breaking.** Repeatable flag defaults are now validated at registration: must be a list, `default=[]` is rejected as redundant, and element types must match the flag type.
|
|
@@ -29,6 +57,8 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
|
|
|
29
57
|
|
|
30
58
|
## 0.16.1
|
|
31
59
|
|
|
60
|
+
Error message fixes and help text improvements
|
|
61
|
+
|
|
32
62
|
### Fixes
|
|
33
63
|
|
|
34
64
|
- **Fix.** `config set` mutex error messages now include the `config set:` prefix for consistency.
|
|
@@ -36,6 +66,15 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
|
|
|
36
66
|
|
|
37
67
|
## 0.16.0
|
|
38
68
|
|
|
69
|
+
unique and env_separator flag fields, config array coercion, config set repeatable support
|
|
70
|
+
|
|
71
|
+
<details>
|
|
72
|
+
<summary>Context</summary>
|
|
73
|
+
|
|
74
|
+
Breaking: config show now requires --plain or --json. New features: unique field enforces no duplicate values on repeatable flags, env_separator controls how env vars are split into arrays, config arrays are coerced to declared types, config set supports repeatable flags with --clear and --default.
|
|
75
|
+
|
|
76
|
+
</details>
|
|
77
|
+
|
|
39
78
|
### Breaking
|
|
40
79
|
|
|
41
80
|
- **Config show.** `config show` now requires explicit `--plain` or `--json` flag instead of defaulting to plain text.
|
|
@@ -55,6 +94,15 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
|
|
|
55
94
|
|
|
56
95
|
## 0.15.1
|
|
57
96
|
|
|
97
|
+
Config show bool parity and negative values in config set
|
|
98
|
+
|
|
99
|
+
<details>
|
|
100
|
+
<summary>Context</summary>
|
|
101
|
+
|
|
102
|
+
config show now outputs lowercase true/false matching Go. config set accepts negative numeric values.
|
|
103
|
+
|
|
104
|
+
</details>
|
|
105
|
+
|
|
58
106
|
### Breaking
|
|
59
107
|
|
|
60
108
|
- **Breaking.** Config set now accepts negative numeric values. Unknown single-dash tokens produce 'unexpected argument' instead of 'unknown flag'.
|
|
@@ -65,6 +113,15 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
|
|
|
65
113
|
|
|
66
114
|
## 0.15.0
|
|
67
115
|
|
|
116
|
+
Config set type coercion and key validation
|
|
117
|
+
|
|
118
|
+
<details>
|
|
119
|
+
<summary>Context</summary>
|
|
120
|
+
|
|
121
|
+
config set now validates keys against registered flags and coerces string values to the flag's declared type before writing. This is a breaking change: unknown keys are rejected.
|
|
122
|
+
|
|
123
|
+
</details>
|
|
124
|
+
|
|
68
125
|
### Breaking
|
|
69
126
|
|
|
70
127
|
- **Breaking.** `config set` now validates keys against registered flags and rejects unknown keys.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: strictcli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.0
|
|
4
4
|
Summary: A strict, zero-dependency CLI framework for Python
|
|
5
5
|
Project-URL: Homepage, https://github.com/smm-h/strictcli
|
|
6
6
|
Project-URL: Repository, https://github.com/smm-h/strictcli
|
|
@@ -222,12 +222,12 @@ Values resolve in this order: CLI argument > environment variable > default. If
|
|
|
222
222
|
|
|
223
223
|
Bool flags from env vars accept `1`, `true`, `yes` (case-insensitive) for `True` and `0`, `false`, `no` for `False`. Any other value is an error.
|
|
224
224
|
|
|
225
|
-
##
|
|
225
|
+
## FlagSets
|
|
226
226
|
|
|
227
|
-
|
|
227
|
+
FlagSets are reusable bundles of flags that can be applied to multiple commands:
|
|
228
228
|
|
|
229
229
|
```python
|
|
230
|
-
|
|
230
|
+
auth_flags = strictcli.FlagSet(
|
|
231
231
|
name="auth",
|
|
232
232
|
flags=[
|
|
233
233
|
strictcli.Flag(name="token", type=str, help="auth token", env="MYAPP_TOKEN", default=""),
|
|
@@ -235,16 +235,16 @@ auth_tag = strictcli.Tag(
|
|
|
235
235
|
],
|
|
236
236
|
)
|
|
237
237
|
|
|
238
|
-
@app.command("deploy", help="deploy the app",
|
|
238
|
+
@app.command("deploy", help="deploy the app", flag_sets=[auth_flags])
|
|
239
239
|
def deploy(token, insecure):
|
|
240
240
|
print(f"token={'set' if token else 'unset'}, insecure={insecure}")
|
|
241
241
|
|
|
242
|
-
@app.command("status", help="check status",
|
|
242
|
+
@app.command("status", help="check status", flag_sets=[auth_flags])
|
|
243
243
|
def status(token, insecure):
|
|
244
244
|
print(f"checking status")
|
|
245
245
|
```
|
|
246
246
|
|
|
247
|
-
Both commands now have `--token` and `--insecure` flags.
|
|
247
|
+
Both commands now have `--token` and `--insecure` flags. FlagSet flags appear in help output and are parsed like any other flag.
|
|
248
248
|
|
|
249
249
|
## Mutex Groups
|
|
250
250
|
|
|
@@ -204,12 +204,12 @@ Values resolve in this order: CLI argument > environment variable > default. If
|
|
|
204
204
|
|
|
205
205
|
Bool flags from env vars accept `1`, `true`, `yes` (case-insensitive) for `True` and `0`, `false`, `no` for `False`. Any other value is an error.
|
|
206
206
|
|
|
207
|
-
##
|
|
207
|
+
## FlagSets
|
|
208
208
|
|
|
209
|
-
|
|
209
|
+
FlagSets are reusable bundles of flags that can be applied to multiple commands:
|
|
210
210
|
|
|
211
211
|
```python
|
|
212
|
-
|
|
212
|
+
auth_flags = strictcli.FlagSet(
|
|
213
213
|
name="auth",
|
|
214
214
|
flags=[
|
|
215
215
|
strictcli.Flag(name="token", type=str, help="auth token", env="MYAPP_TOKEN", default=""),
|
|
@@ -217,16 +217,16 @@ auth_tag = strictcli.Tag(
|
|
|
217
217
|
],
|
|
218
218
|
)
|
|
219
219
|
|
|
220
|
-
@app.command("deploy", help="deploy the app",
|
|
220
|
+
@app.command("deploy", help="deploy the app", flag_sets=[auth_flags])
|
|
221
221
|
def deploy(token, insecure):
|
|
222
222
|
print(f"token={'set' if token else 'unset'}, insecure={insecure}")
|
|
223
223
|
|
|
224
|
-
@app.command("status", help="check status",
|
|
224
|
+
@app.command("status", help="check status", flag_sets=[auth_flags])
|
|
225
225
|
def status(token, insecure):
|
|
226
226
|
print(f"checking status")
|
|
227
227
|
```
|
|
228
228
|
|
|
229
|
-
Both commands now have `--token` and `--insecure` flags.
|
|
229
|
+
Both commands now have `--token` and `--insecure` flags. FlagSet flags appear in help output and are parsed like any other flag.
|
|
230
230
|
|
|
231
231
|
## Mutex Groups
|
|
232
232
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "strictcli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "strictcli",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.20.0",
|
|
10
10
|
"hasInstallScript": true,
|
|
11
11
|
"license": "MIT"
|
|
12
12
|
}
|