Mercurial > sqlpython
diff cmd2.py @ 25:c99853267a44
introducing parameters
author | devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil |
---|---|
date | Wed, 19 Dec 2007 15:37:45 -0500 |
parents | 7a89805a47b1 |
children | bb3fb24b6f5f |
line wrap: on
line diff
--- a/cmd2.py Wed Dec 19 15:09:24 2007 -0500 +++ b/cmd2.py Wed Dec 19 15:37:45 2007 -0500 @@ -4,6 +4,7 @@ Multi-line commands Case-insensitive commands Special-character shortcut commands +Load commands from file still to do: environment (maxrows, etc.) @@ -12,18 +13,6 @@ """ import cmd, re, os -class Statekeeper(object): - def __init__(self, obj, attribs): - self.obj = obj - self.attribs = attribs - self.save() - def save(self): - for attrib in self.attribs: - setattr(self, attrib, getattr(self.obj, attrib)) - def restore(self): - for attrib in self.attribs: - setattr(self.obj, attrib, getattr(self, attrib)) - class Cmd(cmd.Cmd): caseInsensitive = True multilineCommands = [] @@ -31,6 +20,19 @@ shortcuts = {'?': 'help', '!': 'shell', '@': 'load'} excludeFromHistory = '''run r list l history hi ed li eof'''.split() defaultExtension = 'txt' + settable = [] + terminators = r';\n' + def do_cmdenvironment(self, args): + self.stdout.write(""" + Commands are %(casesensitive)scase-sensitive. + Commands may be terminated with: %(terminators)s + Settable parameters: %(settable)s + """ % + { 'casesensitive': 'not ' if self.caseInsensitive else '', + 'terminators': ' '.join(self.terminators), + 'settable': ' '.join(self.settable) + }) + def __init__(self, *args, **kwargs): cmd.Cmd.__init__(self, *args, **kwargs) self.history = History() @@ -92,12 +94,16 @@ return True do_eof = do_EOF - statementEndPattern = re.compile(r'[\n;]\s*$') + statementEndPattern = re.compile(r'[%s]\s*$' % self.terminators) def statementHasEnded(self, lines): - """This version lets statements end with ; or with a blank line. - Override for your own needs.""" return bool(self.statementEndPattern.search(lines)) + def clean(self, s): + """cleans up a string""" + if self.caseInsensitive: + return s.strip().lower() + return s.strip() + def parseline(self, line): """Parse the line into a command name and a string containing the arguments. Returns a tuple containing (command, args, line). @@ -114,6 +120,50 @@ cmd, arg = line[:i], line[i:].strip() return cmd, arg, line + def showParam(self, param): + param = self.clean(param) + if param in self.settable: + val = getattr(self, param) + self.stdout.write('%s: %s\n' % (param, str(getattr(self, param)))) + + def do_show(self, arg): + 'Shows value of a parameter' + if arg.strip(): + self.showParam(arg) + else: + for param in self.settable: + self.showParam(param) + + def cast(self, current, new): + typ = type(current) + if typ == bool: + new = new.lower() + try: + if (new=='on') or (new[0] in ('y','t')): + return True + return False + except TypeError: + None + try: + return typ(new) + except: + print "Problem setting parameter (now %s) to %s; incorrect type?" % (current, new) + return current + + def do_set(self, arg): + 'Sets a parameter' + try: + paramName, val = arg.split(None, 1) + paramName = self.clean(paramName) + if paramName not in self.settable: + raise NotSettableError + currentVal = getattr(self, paramName) + val = self.cast(currentVal, val.strip(self.terminators)) + setattr(self, paramName, val) + self.stdout.write(paramName, ' - was: %s\nnow: %s\n' % (currentVal, val)) + except ValueError, AttributeError, NotSettableError: + self.do_show(arg) + def do_shell(self, arg): 'execute a command as if at the OS prompt.' os.system(arg) @@ -224,5 +274,17 @@ return (getme.lower() in hi.lowercase) return [itm for itm in self if isin(itm)] - +class NotSettableError(Exception): + None +class Statekeeper(object): + def __init__(self, obj, attribs): + self.obj = obj + self.attribs = attribs + self.save() + def save(self): + for attrib in self.attribs: + setattr(self, attrib, getattr(self.obj, attrib)) + def restore(self): + for attrib in self.attribs: + setattr(self.obj, attrib, getattr(self, attrib))