Skip to content

dudadornelles/bigcli

Repository files navigation

bigcli

image

image

Documentation Status

Updates

A python framework to write large CLIs. The concept is to automagically derive CLI commands and args based on the object graph of a callable class that implements a CLI command (command name is derived from the class name). It uses argparse to create the CLI parser and pinject as the Dependency_Injection engine. You implement a class - e.g.: DoSomething- and that generates the name of a subcommand - e.g: do-something. Then, based on the dependencies of class DoSomething, we will derive the arguments, e.g.: if DoSomething depends on Dependency, which in turn declares __args__ = [bigcli.arg('--option', required=False, help='help')] (add_argument method from argparse), then command do-something will have a '--option' argument.

In theory, the auto-generation of arguments should enables and encourage the reuse of internal components for rapid development of consistent and testable rich CLIs, especially those that operate platforms.

Minimal example: -------

#!/usr/bin/env python
import bigcli


class Dependency(object):
    __args__ = [
        bigcli.arg('--option') #  short for ``lambda p: p.add_argument('--option')``
    ]

    def __init__(self, args):
        self.option = args.option


class Command(object):
    __parent__ = 'sub-command'
    __depends_on__ = [Dependency]

    def __init__(self, dependency):
        self.dependency = dependency

    def __call__(self):
        print "dependency option: {}".format(self.dependency.option)


if __name__ == "__main__":
    bigcli.BigCli(commands=[Command]).execute()


# $ ./example.py sub-command command --option value
# > dependency option: value

Features (see tests for example) --------

  • Auto generates parsers and commands using the __depends_on__ and __args__ attributes.
  • Supports adding single subcommand using the __parent__ = 'subcommand' attribute.

Known Issues:

  • Only supports python 2.7 because pinject only supports python 2.7.
  • Class names should have more than a single letter (pinject know issue, not documented anywhere AFAIK).

Credits

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A small library to build big CLIs.

Resources

License

Stars

Watchers

Forks

Packages

No packages published