summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2008-09-04 07:18:26 +0000
committerJason Gerard DeRose <jderose@redhat.com>2008-09-04 07:18:26 +0000
commit71d36aa6a0b9627ae818d116c7240197a62cff74 (patch)
treec556490ba992ce753dd0a0d5a6a3d0e81b12f71d
parent01b73e6910cbadd1867256e71fb982209669a8da (diff)
downloadfreeipa-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.py24
-rw-r--r--ipalib/public.py16
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((