# HG changeset patch # User catherine@dellzilla # Date 1264782383 18000 # Node ID 9d91406ca3a72f36e3e5a6377c8ca307f97c8069 # Parent 1941e54cb7764bd2ce996ee4ee7f24296296b0a9 select polished diff -r 1941e54cb776 -r 9d91406ca3a7 cmd2.py --- a/cmd2.py Fri Jan 29 10:32:40 2010 -0500 +++ b/cmd2.py Fri Jan 29 11:26:23 2010 -0500 @@ -13,6 +13,7 @@ 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 @@ 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 -r 1941e54cb776 -r 9d91406ca3a7 example/example.py --- a/example/example.py Fri Jan 29 10:32:40 2010 -0500 +++ b/example/example.py Fri Jan 29 11:26:23 2010 -0500 @@ -25,11 +25,7 @@ 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