diff options
| author | catherine <catherine@dellzilla> | 2010-01-29 11:26:23 -0500 |
|---|---|---|
| committer | catherine <catherine@dellzilla> | 2010-01-29 11:26:23 -0500 |
| commit | 2bccecf375b23b67be85b71d9c9e3fc80507cd9c (patch) | |
| tree | 64d1200c673f7c69100566a6b44c761b49b5de1f | |
| parent | e1218c01f87aa43efcf1eb60377d491a546b98b4 (diff) | |
| download | cmd2-hg-2bccecf375b23b67be85b71d9c9e3fc80507cd9c.tar.gz | |
select polished
| -rwxr-xr-x | cmd2.py | 27 | ||||
| -rwxr-xr-x | example/example.py | 6 |
2 files changed, 23 insertions, 10 deletions
@@ -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 |
