summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcatherine <catherine@dellzilla>2010-01-29 11:26:23 -0500
committercatherine <catherine@dellzilla>2010-01-29 11:26:23 -0500
commit2bccecf375b23b67be85b71d9c9e3fc80507cd9c (patch)
tree64d1200c673f7c69100566a6b44c761b49b5de1f
parente1218c01f87aa43efcf1eb60377d491a546b98b4 (diff)
downloadcmd2-hg-2bccecf375b23b67be85b71d9c9e3fc80507cd9c.tar.gz
select polished
-rwxr-xr-xcmd2.py27
-rwxr-xr-xexample/example.py6
2 files changed, 23 insertions, 10 deletions
diff --git a/cmd2.py b/cmd2.py
index 82c5629..6f0f460 100755
--- a/cmd2.py
+++ b/cmd2.py
@@ -13,6 +13,7 @@ Optional _onchange_{paramname} called when environment parameter changes
Parsing commands with `optparse` options (flags)
Redirection to file with >, >>; input from file with <
Easy transcript-based testing of applications (see example/example.py)
+Bash-style ``select`` available
Note that redirection with > and | will only work if `self.stdout.write()`
is used in place of `print`. The standard library's `cmd` module is
@@ -836,16 +837,32 @@ class Cmd(cmd.Cmd):
def select(self, options, prompt='Your choice? '):
'''Presents a numbered menu to the user. Modelled after
- the bash shell's SELECT. Returns the item chosen.'''
+ the bash shell's SELECT. Returns the item chosen.
+
+ Argument ``options`` can be:
+ a single string -> will be split into one-word options
+ a list of strings -> will be offered as options
+ a list of tuples -> interpreted as (value, text), so
+ that the return value can differ from
+ the text advertised to the user '''
if isinstance(options, basestring):
- options = options.split()
- for (idx, opt) in enumerate(options):
- self.poutput(' %2d. %s\n' % (idx+1, opt))
+ options = zip(options.split(), options.split())
+ fulloptions = []
+ for opt in options:
+ if isinstance(opt, basestring):
+ fulloptions.append((opt, opt))
+ else:
+ try:
+ fulloptions.append((opt[0], opt[1]))
+ except IndexError:
+ fulloptions.append((opt[0], opt[0]))
+ for (idx, (value, text)) in enumerate(fulloptions):
+ self.poutput(' %2d. %s\n' % (idx+1, text))
while True:
response = raw_input(prompt)
try:
response = int(response)
- result = options[response - 1]
+ result = fulloptions[response - 1][0]
break
except ValueError:
pass # loop and ask again
diff --git a/example/example.py b/example/example.py
index d1d6650..0c99580 100755
--- a/example/example.py
+++ b/example/example.py
@@ -25,11 +25,7 @@ class CmdLineApp(Cmd):
self.stdout.write(arg)
self.stdout.write('\n')
# self.stdout.write is better than "print", because Cmd can be
- # initialized with a non-standard output destination
- def do_sel(self, arg):
- opts = arg.split()
- result = self.select(opts)
- self.poutput('yay for %s' % result)
+ # initialized with a non-standard output destination
do_say = do_speak # now "say" is a synonym for "speak"
do_orate = do_speak # another synonym, but this one takes multi-line input