Argparse generator from dataclass
Project description
Inspired by Simple Parsing, simplified and extended to build extensive, extendable command line interface without much code.
pip install argklass
Features
Automatic cli discovery and command plugin
# Folder structure project/cli/ ├── __init__.py <= empty ├── editor/ │ ├── __init__.py <= ParentCommand(editor) │ ├── cook.py <= Command(cook) │ ├── client.py <= Command(client) │ ├── game.py <= Command(game) │ └── open.py <= Command(open) └── uat/ ├── __init__.py <= ParentCommand(uat) ├── localize.py <= Command(localize) └── test.py <= Command(test) # editor/__init__.py from argklass.command import ParentCommand class Editor(ParentCommand): name = "editor" COMMANDS = Editor # cook.py from argklass.command import Command class Cook(Command): name = "cook" @staticmethod def execute(args) -> int: print("cook") COMMANDS = Cook # cli = CommandLineInterface(project.cli) cli.run() # or cli.run(["editor", "cook", "--help"]) # cli editor cook --help cli uat localize --help
- New Argument format
able to show the entire command line interface with all its subparsers
new format mirror dataclass syntax
editor Set of commands to launch the editors in different modes server Parameters added to the Map URL game docstring ... client docstring ... resavepackages docstring ... cook docstring ... ml Launch unreal engine with mladapter setup editor Other arguments open docstring ... localize docstring ... worldpartition Convert a UE4 map using world partition -h, --help Show help engine Set of commands to manage engine installation/source add docstring ... update Update the engine source code format docstring ... --profile: str docstring ... --file: str docstring ... --fail_on_error: bool = False docstring ... --col: int = 24 docstring ...
Compact argparse definition
def workdir(): d = os.getcwd() if os.access(d, os.W_OK): return d return None @dataclass class MyArguments: a : str # Positional b : int = 20 # My argument c : bool = False # My argument d : int = choice(0, 1, 2, 3, 4, default=1) # choices e : List[int] = argument(default=[0]) # list f : Optional[int] = None # Optional p : Tuple[int, int] = (1, 1) # help p g : Color = Color.RED # help g s : SubArgs = SubArgs # helps group cmd: Union[cmd1, cmd2] = subparsers(cmd1=cmd1, cmd2=cmd2) # Command subparser de : str = deduceable(workdir) parser = ArgumentParser() parser.add_arguments(MyArguments) args = parser.parse_args()
Save and load arguments from configuration files
parser = build_parser(commands) # load/save defaults before parsing save_defaults(parser, "config.hjson") apply_defaults(parser, "config.hjson") args = parser.parse_args(["editor", "editor"]) # load save arguments after parsing save_as_config(parser, args, "dump.hjson") apply_config(parser, args, "dump.hjson")
Lower level interface, that gives you back all of argparse power
@dataclass class SubArgs: aa: str = argument(default="123") @dataclass class cmd1: args: str = "str1" @dataclass class cmd2: args: str = "str2" @dataclass class MyArguments: a: str = argument(help="Positional") b: int = argument(default=20, help="My argument") c: bool = argument(action="store_true", help="My argument") d: int = argument(default=1, choices=[0, 1, 2, 3, 4], help="choices") e: List[int] = argument(default=[0], help="list") f: Optional[int] = argument(default=None, help="Optional") p: Tuple[int, int] = argument(default=(1, 1), help="help p") g: Color = argument(default=Color.RED, help="help g") s: SubArgs = group(default=SubArgs, help="helps group") cmd: Union[cmd1, cmd2] = subparsers(cmd1=cmd1, cmd2=cmd2) parser = ArgumentParser() parser.add_arguments(MyArguments) args = parser.parse_args()
Architecture
argklass works by building the argument parser as a tree, adding metadata to each nodes when necessary.
One of the core component is ArgumentParserIterator which traverse the parsing tree. Each features, such as argument grouping into dataclasses or saving/loading configuration, are implemented as a simple traversal.
This enable us to implement each feature independently from each other and make them optional.
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
File details
Details for the file argklass-1.4.4.tar.gz
.
File metadata
- Download URL: argklass-1.4.4.tar.gz
- Upload date:
- Size: 20.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.19
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2a41210f2d0bea280b7d5cde65bdadda7797c9ef1b6e2bf73089eb920c5203eb |
|
MD5 | 6f4ba49ca5ac9a0c5e66362b12d23e6b |
|
BLAKE2b-256 | a4a57ecdd392ee15f054797b58f1965e7b1a24543ad4d3bef9010f6e5fc627d7 |
File details
Details for the file argklass-1.4.4-py3-none-any.whl
.
File metadata
- Download URL: argklass-1.4.4-py3-none-any.whl
- Upload date:
- Size: 21.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.19
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5964d54d61daf61bede7a2f25947a75d121894aef95818b1556056193d07e39b |
|
MD5 | 87e6e4c5aae067a5a001d6be4f052de9 |
|
BLAKE2b-256 | e0560949f0ba02fad14f8d50adc5a39cbcb3a857a157c2567cd5739732adcd7c |