Skip to content

antoniofrs/multicommand-args-parser

Repository files navigation

Multicommand arg parser for python

Structuring a multi-command argparse in Python can be difficult to write and read.

This library allows you to structure commands and subcommands with a recursive json file.

{
    "globalArgs": [ ],
    "commands": [
        {
            "id": "c1_id",
            "command": "command1",
            "help": "Select c1",
            "args": [ ],
            "subCommands": [
                {
                    "id": "sc1_id",
                    "command": "subcommand1",
                    "help": "select sc1",
                    "args": [ ]
                },
                {
                    "id": "sc2_id",
                    "command": "subcommand2",
                    "help": "Select c12",
                    "args": [ ]
                }
            ]
        },
        {
            "id": "command2",
            "command": "c2",
            "help": "Selected c2",
            "args": [ ]
        }
    ]
}

For example, in this json a list of commands is initialized as follows:

command id
c1 c1_id
c1 sc1 sc1_id
c1 sc2 sc2_id
c2 c2_id

Where id, which you can retrieve from args.command_id, will help you to get the command given in input by the user

Arguments

The args and globalArgs arrays contain a list of objects as follows:

{
    "short": "e",
    "long": "example-here",
    "action": "store",
    "help": "This is an example",
    "default": "default-value",
    "envVar": "EXAMPLE_ENV"
}

Where:

field description Optional Default
short Arg short name No
long Arg extended name No
action (e.g: store, store_true) Yes store
help Message to show with -h or --help Yes empty string
default default value Yes empty string
envVar Environment variable associated to the argument Yes no env var

default and envVar use the following logic:

default = arg.get("default", None)
default_value = os.getenv(arg["envVar"], default)
parser.add_argument( ..., default=default_value)

If the command line argument is passed the environment variable is ignored

⭐ You can find a complete json example in the template-args.json file

How to use

from multicommand_arg_parser import MulticommandArgParser


mcap = MulticommandArgParser("template-args.json")
parser = mcap.get_parser()
args = mcap.parse_args()

print("Selected command with id: ", args.command_id)
print("Args list: ", args)

mcap.print_help() # Print help on standard output
print(mcap.get_help()) # Print help wherever you want

Context holder

Once the MulticommandArgParser is initialized you can access passed arguments throw the ContextHolder:

from multicommand_arg_parser import MulticommandArgParser
from multicommand_context_holder import ContextHolder


MulticommandArgParser("template-args.json")

print("Command id form Context holder:", ContextHolder.get_command_id())
print("Namespace from Context holder:", ContextHolder.get_all_args())

About

Multicommand args parser for python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages