diff options
author | Jason Gerard DeRose <jderose@redhat.com> | 2008-09-04 07:18:26 +0000 |
---|---|---|
committer | Jason Gerard DeRose <jderose@redhat.com> | 2008-09-04 07:18:26 +0000 |
commit | 71d36aa6a0b9627ae818d116c7240197a62cff74 (patch) | |
tree | c556490ba992ce753dd0a0d5a6a3d0e81b12f71d | |
parent | 01b73e6910cbadd1867256e71fb982209669a8da (diff) | |
download | freeipa-71d36aa6a0b9627ae818d116c7240197a62cff74.tar.gz freeipa-71d36aa6a0b9627ae818d116c7240197a62cff74.tar.xz freeipa-71d36aa6a0b9627ae818d116c7240197a62cff74.zip |
258: Added some experimental features for interactively prompting for values
-rw-r--r-- | ipalib/cli.py | 24 | ||||
-rw-r--r-- | ipalib/public.py | 16 |
2 files changed, 40 insertions, 0 deletions
diff --git a/ipalib/cli.py b/ipalib/cli.py index 3cecace7c..a495924ef 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -147,8 +147,32 @@ class CLI(object): def run_cmd(self, cmd, argv): (args, kw) = self.parse(cmd, argv) + self.run_interactive(cmd, args, kw) + + def run_interactive(self, cmd, args, kw): + for option in cmd.smart_option_order(): + if option.name not in kw: + default = option.get_default(**kw) + if default is None: + prompt = '%s: ' % option.name + else: + prompt = '%s [%s]: ' % (option.name, default) + error = None + while True: + if error is not None: + print '>>> %s: %s' % (option.name, error) + value = raw_input(prompt) + if default is not None and len(value) == 0: + value = default + if len(value) == 0: + error = 'Must supply a value' + else: + kw[option.name] = value + break cmd(*args, **kw) + + def parse(self, cmd, argv): parser = self.build_parser(cmd) (kwc, args) = parser.parse_args(argv, KWCollector()) diff --git a/ipalib/public.py b/ipalib/public.py index eb94ac52d..6220acc03 100644 --- a/ipalib/public.py +++ b/ipalib/public.py @@ -169,6 +169,10 @@ class Option(plugable.ReadOnly): return self.type.values return tuple() + def __call__(self, value, **kw): + pass + + class Command(plugable.Plugin): __public__ = frozenset(( @@ -178,6 +182,7 @@ class Command(plugable.Plugin): 'validate', 'execute', '__call__', + 'smart_option_order', 'Option', )) __Option = None @@ -257,6 +262,17 @@ class Command(plugable.Plugin): self.validate(**kw) self.execute(**kw) + def smart_option_order(self): + def get_key(option): + if option.required: + if option.default_from is None: + return 0 + return 1 + return 2 + for option in sorted(self.Option(), key=get_key): + yield option + + class Object(plugable.Plugin): __public__ = frozenset(( |