Intuitive CLI framework using argparse, rich, and pydantic
Project description
Treeparse
Tree-based CLI framework for one-shot human and LLM CLI transparency.
Overview
Treeparse is an intuitive CLI framework leveraging argparse, rich, and pydantic to create structured, testable command-line interfaces. It mirrors the tree-like help output of treeclick but uses argparse for parsing and pydantic for model-based definitions.
Key goals include speed, LLM transparency (JSON and rich tree help formats), ease of authoring (especially for AI-generated code), and advanced composability.
Key Features
- Object-Oriented Structure: Define CLI using Pydantic models:
cli,group,command,argument,option. - Rich Tree Help: Tree-structured help with branch pruning for subcommands, including higher levels.
- JSON Output:
--json/-jprovides syntax-highlighted JSON of the CLI structure for LLM parsing. - Parameter Validation: Automatic matching of callback params to CLI definitions (names, types).
- Folding: Collapse deep subgroups in help output with
group.fold = True(shows asgroup [...]). - Pluggability & Composition: Full CLIs can be nested and reused as subgroups; supports YAML config and color themes.
- Sorting:
sort_keyfor ordering elements in help outputs. - Type and Default Display: Optional
show_typesandshow_defaultsflags. - Nargs Support: Handles variable arguments/options (e.g.,
*,+for lists). - Boolean Handling: Supports bool types with string-to-bool conversion.
Advanced Features
Folding
Keep large CLIs readable by folding groups:
user_group = group(
name="user",
help="User management commands",
fold=True, # Shows as "user [...]" in help tree
commands=[greet_cmd, list_cmd],
)
Users can still explore the subtree with myapp user --help.
Pluggability & Composition
Treeparse is highly composable — embed entire CLIs as subgroups:
from treeparse import cli
from basic import app as basic_app
from demo import app as demo_app
super_app = cli(
name="supertool",
help="Combined CLI",
subgroups=[basic_app, demo_app], # Full CLIs reused!
)
See examples/basic_super.py for a live example.
Other pluggable features:
- Color Themes:
theme="github"(ormonokai,mononeon,monochrome,red_white_blue) - YAML Configuration:
yml_config=Path("config.yml")to override defaults - Shell Completions: Optional
shtabsupport via[completions]extra - Testing:
CliRunnerfor clean pytest integration
Developer Validation Demo
Run validation_error_demo.py to explore rich error messages for name mismatches, type mismatches, and invalid defaults.
Structure
cli: Root (also reusable as a sub-CLI)group: Nested containers with optionalfoldcommand/chain: Executable actionsargument&option: Parameters
Models are modularized; initialization in __init__.py handles forward references.
Usage Example
From examples/basic.py:
from treeparse import cli, command
def hello():
print("Hello, world!")
app = cli(
name="basic",
help="A basic CLI example.",
commands=[
command(
name="hello",
help="Print hello world.",
callback=hello,
)
],
)
def main():
app.run()
if __name__ == "__main__":
main()
Run: python examples/basic.py hello
Help Output
Tree-structured help prunes irrelevant branches while retaining context. Folding keeps deep hierarchies clean. Supports long help text wrapping.
LLM Transparency
- Rich Tree Format: Visual, human/LLM-readable tree.
- JSON Format: Structured, parseable output for LLMs.
Current Status
- Implemented: Model definitions, tree/JSON help, validation, nargs, bool support, folding, pluggability (composition, themes, YAML),
CliRunner. - Examples:
basic.py,demo.py(complex),list_demo.py,basic_super.py(composition),validation_error_demo.py,github_theme_demo.py,monokai_theme_demo.py. - Tests: Extensive pytest coverage (>99%) with dedicated runner tests and help-output snapshot tests.
- Tools: Ruff, pytest-cov.
Recent Improvements (v0.2.x)
- Correctness fixes: inherited options now included in default-vs-choices validation;
option(required=True, default=X)is caught at construction time; callback validation usesinspect.unwrap()so decorated functions are inspected correctly, and async callbacks are rejected with a clear error. - Enum type support:
arg_type=MyEnumautomatically populateschoicesfrom enum member names and converts input strings viaMyEnum[s]. - Help renderer extracted: The 440-line help renderer now lives in
treeparse.utils.help_rendereras an isolated, testable class.cli.pyis ~375 lines (down from ~950). - Parser caching:
build_parser()andget_max_depth()cache their results after the first call; do not mutate acliafter firstrun(). - YAML config scope fixed:
yml_configoverrides now apply to options on all subgroups and commands (not only root-level options); unrecognized config keys emitwarnings.warn. - New color themes:
github(GitHub dark palette — purple/blue/orange/red-pink) andmonokai(classic Sublime Text palette — green/cyan/purple/pink). Seeexamples/github_theme_demo.pyandexamples/monokai_theme_demo.py.
License
MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file treeparse-0.2.0.tar.gz.
File metadata
- Download URL: treeparse-0.2.0.tar.gz
- Upload date:
- Size: 1.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2fa970c55d97e4669df195c8f29298fb50ea309e597efa4bb649140d52dd9b1
|
|
| MD5 |
f19ac205607d63346dcd21b2574cc034
|
|
| BLAKE2b-256 |
cc65eaf954d0aa932609e550653e87e1c6af95b3e9a7e20555b824192e614fa5
|
Provenance
The following attestation bundles were made for treeparse-0.2.0.tar.gz:
Publisher:
publish.yml on wr1/treeparse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
treeparse-0.2.0.tar.gz -
Subject digest:
a2fa970c55d97e4669df195c8f29298fb50ea309e597efa4bb649140d52dd9b1 - Sigstore transparency entry: 1123082734
- Sigstore integration time:
-
Permalink:
wr1/treeparse@1d33d1534b041947a34dbeded26998225bfac849 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/wr1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1d33d1534b041947a34dbeded26998225bfac849 -
Trigger Event:
release
-
Statement type:
File details
Details for the file treeparse-0.2.0-py3-none-any.whl.
File metadata
- Download URL: treeparse-0.2.0-py3-none-any.whl
- Upload date:
- Size: 21.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3309b6f832937785cd41dbb427953720104a1a0ed2513654cb59a56771c15110
|
|
| MD5 |
87d82bf074d5a8517e921c7a7b022b14
|
|
| BLAKE2b-256 |
4fd92adcc2f58b7669ec011031e8b5f02cee88cc1355073c3eeaeac1d4934562
|
Provenance
The following attestation bundles were made for treeparse-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on wr1/treeparse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
treeparse-0.2.0-py3-none-any.whl -
Subject digest:
3309b6f832937785cd41dbb427953720104a1a0ed2513654cb59a56771c15110 - Sigstore transparency entry: 1123082754
- Sigstore integration time:
-
Permalink:
wr1/treeparse@1d33d1534b041947a34dbeded26998225bfac849 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/wr1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1d33d1534b041947a34dbeded26998225bfac849 -
Trigger Event:
release
-
Statement type: