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_parser(parser=None, special_options=Ellipsis)¶
- classmethod run(argv=None, strict=True)¶
Execute the modal CLI as the main script