# HG changeset patch # User catherine@dellzilla # Date 1265915908 18000 # Node ID b9f19255d4b72dff076f028d092955ec70d5c3f5 # Parent c58cd7e48db76dcd44bae940af4e8a194ea57f75 transcript test stuck in infinite loop? diff -r c58cd7e48db7 -r b9f19255d4b7 cmd2.py --- a/cmd2.py Thu Feb 11 13:07:05 2010 -0500 +++ b/cmd2.py Thu Feb 11 14:18:28 2010 -0500 @@ -271,52 +271,62 @@ exc.pstr = instring raise exc -class TextLineList(list): - '''A list that "wants" to consist of separate lines of text. - Splits multi-line strings and flattens nested lists to - achieve that. - Also omits blank lines, strips leading/trailing whitespace. +class StubbornDict(dict): + '''Dictionary that tolerates many input formats. + Create it with stubbornDict(arg) factory function. - >>> tll = TextLineList(['my', 'dog\\nhas', '', [' fleas', 'and\\nticks']]) - >>> tll - ['my', 'dog', 'has', 'fleas', 'and', 'ticks'] - >>> tll.append(['and', ['spiders', 'and']]) - >>> tll - ['my', 'dog', 'has', 'fleas', 'and', 'ticks', 'and', 'spiders', 'and'] - >>> tll += 'fish' - >>> tll - ['my', 'dog', 'has', 'fleas', 'and', 'ticks', 'and', 'spiders', 'and', 'fish'] - ''' - def flattened(self, texts): - result = [] - if isinstance(texts, basestring): - result.extend(texts.splitlines()) + >>> d = StubbornDict(large='gross', small='klein') + >>> sorted(d.items()) + [('large', 'gross'), ('small', 'klein')] + >>> d.append(['plain', ' plaid']) + >>> sorted(d.items()) + [('large', 'gross'), ('plaid', None), ('plain', None), ('small', 'klein')] + >>> d += ' girl Frauelein, Maedchen\\n\\n shoe schuh' + >>> sorted(d.items()) + [('girl', 'Frauelein, Maedchen'), ('large', 'gross'), ('plaid', None), ('plain', None), ('shoe', 'schuh'), ('small', 'klein')] + ''' + def update(self, arg): + dict.update(self, StubbornDict.to_dict(arg)) + append = update + def __iadd__(self, arg): + self.update(arg) + return self + + @classmethod + def to_dict(cls, arg): + 'Generates dictionary from string or list of strings' + if hasattr(arg, 'splitlines'): + arg = arg.splitlines() + if hasattr(arg, '__getslice__'): + result = {} + for a in arg: + a = a.strip() + if a: + key_val = a.split(None, 1) + key = key_val[0] + if len(key_val) > 1: + val = key_val[1] + else: + val = '' + result[key] = val else: - for text in texts: - result.extend(self.flattened(text)) - result = [r.strip() for r in result if r.strip()] - return result - def flatten(self): - list.__init__(self, self.flattened(self)) - def __init__(self, values): - list.__init__(self, values) - self.flatten() - def append(self, value): - list.append(self, value) - self.flatten() - def extend(self, values): - list.extend(self, values) - self.flatten() - def __setitem__(self, idx, value): - list.__setitem__(self, idx, value) - self.flatten() - def __iadd__(self, value): - if isinstance(value, basestring): - self.append(value) - else: - list.__iadd__(self, value) - self.flatten() - return self + result = arg + return result + +def stubbornDict(*arg, **kwarg): + ''' + >>> sorted(stubbornDict('cow a bovine\\nhorse an equine').items()) + [('cow', 'a bovine'), ('horse', 'an equine')] + >>> sorted(stubbornDict(['badger', 'porcupine a poky creature']).items()) + [('badger', None), ('porcupine', 'a poky creature')] + >>> sorted(stubbornDict(turtle='has shell', frog='jumpy').items()) + [('frog', 'jumpy'), ('turtle', 'has shell')] + ''' + result = {} + for a in arg: + result.update(StubbornDict.to_dict(a)) + result.update(kwarg) + return StubbornDict(result) def replace_with_file_contents(fname): if fname: @@ -383,7 +393,7 @@ feedback_to_output = False # Do include nonessentials in >, | output quiet = False # Do not suppress nonessential output debug = True - settable = TextLineList(''' + settable = stubbornDict(''' prompt colors Colorized output (*nix only) continuation_prompt @@ -472,12 +482,9 @@ self.shortcuts = sorted(self.shortcuts.items(), reverse=True) self.keywords = self.reserved_words + [fname[3:] for fname in dir(self) if fname.startswith('do_')] - import pdb; pdb.set_trace() def linelist(arg): result = [] - self.settable = (l.strip() for l in self.settable if l.strip()) - self.settable = dict(ljust(l.split(None,1), 2, '') for l in self.settable) self.doubleDashComment = pyparsing.NotAny(pyparsing.Or(options_defined)) + pyparsing.Literal('--') + pyparsing.restOfLine def do_shortcuts(self, args): diff -r c58cd7e48db7 -r b9f19255d4b7 example/exampleSession.txt --- a/example/exampleSession.txt Thu Feb 11 13:07:05 2010 -0500 +++ b/example/exampleSession.txt Thu Feb 11 14:18:28 2010 -0500 @@ -30,6 +30,7 @@ (Cmd) set abbrev: True case_insensitive: True +colors: True continuation_prompt: > debug: True default_file_name: command.txt @@ -52,27 +53,20 @@ (Cmd) hi -------------------------[1] help - -------------------------[2] help say - -------------------------[3] say goodnight, Gracie - -------------------------[4] say -ps --repeat=5 goodnight, Gracie - -------------------------[5] set - -------------------------[6] set maxrepeats 5 - -------------------------[7] say -ps --repeat=5 goodnight, Gracie (Cmd) run 4 say -ps --repeat=5 goodnight, Gracie - OODNIGHT, GRACIEGAY OODNIGHT, GRACIEGAY OODNIGHT, GRACIEGAY diff -r c58cd7e48db7 -r b9f19255d4b7 flatten_lines.py --- a/flatten_lines.py Thu Feb 11 13:07:05 2010 -0500 +++ b/flatten_lines.py Thu Feb 11 14:18:28 2010 -0500 @@ -1,12 +1,70 @@ import doctest -class TextLineList(list): +class StubbornDict(dict): + '''Dictionary that tolerates many input formats. + Create it with stubbornDict(arg) factory function. + + >>> d = StubbornDict(large='gross', small='klein') + >>> sorted(d.items()) + [('large', 'gross'), ('small', 'klein')] + >>> d.append(['plain', ' plaid']) + >>> sorted(d.items()) + [('large', 'gross'), ('plaid', None), ('plain', None), ('small', 'klein')] + >>> d += ' girl Frauelein, Maedchen\\n\\n shoe schuh' + >>> sorted(d.items()) + [('girl', 'Frauelein, Maedchen'), ('large', 'gross'), ('plaid', None), ('plain', None), ('shoe', 'schuh'), ('small', 'klein')] + ''' + def update(self, arg): + dict.update(self, StubbornDict.to_dict(arg)) + append = update + def __iadd__(self, arg): + self.update(arg) + return self + + @classmethod + def to_dict(cls, arg): + 'Generates dictionary from string or list of strings' + if hasattr(arg, 'splitlines'): + arg = arg.splitlines() + if hasattr(arg, '__getslice__'): + result = {} + for a in arg: + a = a.strip() + if a: + key_val = a.split(None, 1) + key = key_val[0] + if len(key_val) > 1: + val = key_val[1] + else: + val = None + result[key] = val + else: + result = arg + return result + +def stubbornDict(*arg, **kwarg): + ''' + >>> sorted(stubbornDict('cow a bovine\\nhorse an equine').items()) + [('cow', 'a bovine'), ('horse', 'an equine')] + >>> sorted(stubbornDict(['badger', 'porcupine a poky creature']).items()) + [('badger', None), ('porcupine', 'a poky creature')] + >>> sorted(stubbornDict(turtle='has shell', frog='jumpy').items()) + [('frog', 'jumpy'), ('turtle', 'has shell')] + ''' + result = {} + for a in arg: + result.update(StubbornDict.to_dict(a)) + result.update(kwarg) + return StubbornDict(result) + + +class Directory(list): '''A list that "wants" to consist of separate lines of text. Splits multi-line strings and flattens nested lists to achieve that. Also omits blank lines, strips leading/trailing whitespace. - >>> tll = TextLineList(['my', 'dog\\nhas', '', [' fleas', 'and\\nticks']]) + >>> tll = Directory(['my', 'dog\\nhas', '', [' fleas', 'and\\nticks']]) >>> tll ['my', 'dog', 'has', 'fleas', 'and', 'ticks'] >>> tll.append(['and', ['spiders', 'and']])