scriptconfig.modal module

class scriptconfig.modal.class_or_instancemethod[source]

Bases: classmethod

Allows a method to behave as a class or instance method [SO28237955].

References

SO28237955

https://stackoverflow.com/questions/28237955/same-name-for-classmethod-and-instancemethod

Example

>>> class X:
...     @class_or_instancemethod
...     def foo(self_or_cls):
...         if isinstance(self_or_cls, type):
...             return f"bound to the class"
...         else:
...             return f"bound to the instance"
>>> print(X.foo())
bound to the class
>>> print(X().foo())
bound to the instance
class scriptconfig.modal.MetaModalCLI(name, bases, namespace, *args, **kwargs)[source]

Bases: type

A metaclass to help minimize boilerplate when defining a ModalCLI

class scriptconfig.modal.ModalCLI(description='', sub_clis=None, version=None)[source]

Bases: object

Contains multiple scriptconfig.Config items with corresponding main functions.

CommandLine

xdoctest -m scriptconfig.modal ModalCLI

Example

>>> from scriptconfig.modal import *  # NOQA
>>> import scriptconfig as scfg
>>> self = ModalCLI(description='A modal CLI')
>>> #
>>> @self.register
>>> class Command1Config(scfg.Config):
>>>     __command__ = 'command1'
>>>     __default__ = {
>>>         'foo': 'spam'
>>>     }
>>>     @classmethod
>>>     def main(cls, cmdline=1, **kwargs):
>>>         config = cls(cmdline=cmdline, data=kwargs)
>>>         print('config1 = {}'.format(ub.urepr(dict(config), nl=1)))
>>> #
>>> @self.register
>>> class Command2Config(scfg.DataConfig):
>>>     __command__ = 'command2'
>>>     foo = 'eggs'
>>>     baz = 'biz'
>>>     @classmethod
>>>     def main(cls, cmdline=1, **kwargs):
>>>         config = cls.cli(cmdline=cmdline, data=kwargs)
>>>         print('config2 = {}'.format(ub.urepr(dict(config), nl=1)))
>>> #
>>> parser = self.argparse()
>>> parser.print_help()
...
A modal CLI
...
commands:
  {command1,command2}  specify a command to run
    command1           argparse CLI generated by scriptconfig...
    command2           argparse CLI generated by scriptconfig...
>>> self.run(argv=['command1'])
config1 = {
    'foo': 'spam',
}
>>> self.run(argv=['command2', '--baz=buz'])
config2 = {
    'foo': 'eggs',
    'baz': 'buz',
}

CommandLine

xdoctest -m scriptconfig.modal ModalCLI:1

Example

>>> # Declarative modal CLI (new in 0.7.9)
>>> import scriptconfig as scfg
>>> class MyModalCLI(scfg.ModalCLI):
>>>     #
>>>     class Command1(scfg.DataConfig):
>>>         __command__ = 'command1'
>>>         foo = scfg.Value('spam', help='spam spam spam spam')
>>>         @classmethod
>>>         def main(cls, cmdline=1, **kwargs):
>>>             config = cls.cli(cmdline=cmdline, data=kwargs)
>>>             print('config1 = {}'.format(ub.urepr(dict(config), nl=1)))
>>>     #
>>>     class Command2(scfg.DataConfig):
>>>         __command__ = 'command2'
>>>         foo = 'eggs'
>>>         baz = 'biz'
>>>         @classmethod
>>>         def main(cls, cmdline=1, **kwargs):
>>>             config = cls.cli(cmdline=cmdline, data=kwargs)
>>>             print('config2 = {}'.format(ub.urepr(dict(config), nl=1)))
>>> #
>>> MyModalCLI.main(argv=['command1'])
>>> MyModalCLI.main(argv=['command2', '--baz=buz'])

Example

>>> # Declarative modal CLI (new in 0.7.9)
>>> import scriptconfig as scfg
>>> class MyModalCLI(scfg.ModalCLI):
>>>     ...
>>> #
>>> @MyModalCLI.register
>>> class Command1(scfg.DataConfig):
>>>     __command__ = 'command1'
>>>     foo = scfg.Value('spam', help='spam spam spam spam')
>>>     @classmethod
>>>     def main(cls, cmdline=1, **kwargs):
>>>         config = cls.cli(cmdline=cmdline, data=kwargs)
>>>         print('config1 = {}'.format(ub.urepr(dict(config), nl=1)))
>>> #
>>> @MyModalCLI.register
>>> class Command2(scfg.DataConfig):
>>>     __command__ = 'command2'
>>>     foo = 'eggs'
>>>     baz = 'biz'
>>>     @classmethod
>>>     def main(cls, cmdline=1, **kwargs):
>>>         config = cls.cli(cmdline=cmdline, data=kwargs)
>>>         print('config2 = {}'.format(ub.urepr(dict(config), nl=1)))
>>> #
>>> MyModalCLI.main(argv=['command1'])
>>> MyModalCLI.main(argv=['command2', '--baz=buz'])
property sub_clis
classmethod register(cli_cls)[source]
Parameters

cli_cli (scriptconfig.Config) – A CLI-aware config object to register as a sub CLI

_build_subcmd_infos()[source]
argparse(parser=None, special_options=Ellipsis)[source]
build_parser(parser=None, special_options=Ellipsis)
classmethod main(argv=None, strict=True)[source]

Execute the modal CLI as the main script

classmethod run(argv=None, strict=True)

Execute the modal CLI as the main script