mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
258: Added some experimental features for interactively prompting for values
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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((
|
||||
|
||||
Reference in New Issue
Block a user