diff cmd2/flagReader.py @ 100:3de2a3eb765a

oops, renesting directory
author catherine@dellzilla
date Mon, 29 Sep 2008 12:48:29 -0400
parents flagReader.py@47af95ad83c7
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd2/flagReader.py	Mon Sep 29 12:48:29 2008 -0400
@@ -0,0 +1,90 @@
+"""Defines and parses UNIX-style flags to modify command arguments.
+
+Use of flagReader is DEPRECATED in favor of optparse from the
+Python standard library.  For backwards compatibility, flagReader
+has been re-implemented as a wrapper around optparse.
+
+print flagReader.FlagSet.parse.__doc__ for usage examples.
+"""
+
+import re, optparse, warnings
+warnings.warn("""flagReader has been deprecated.  Use optparse instead.""", DeprecationWarning)
+
+class Flag(object):
+    def __init__(self, name, abbrev=None, nargs=0):
+        """Flag(name, abbrev=None, nargs=0) : Defines a flag.
+        
+        name: the full name of the flag (double-dash form)
+        abbrev: the single-letter abbreviated form of the flag; defaults to 
+        nargs: number of arguments expected after the flag"""
+        
+        self.name = name
+        self.abbrev = abbrev or name[0]
+        self.fullabbrev = '-%s' % (self.abbrev)
+        self.fullname = '--%s' % (name)
+        self.nargs = nargs
+
+class FlagSet(object):
+    def __init__(self, flags):
+        if not issubclass(type(flags), list):
+            raise TypeError, 'Argument must be a list'
+        self.flags = flags
+        self.lookup = {}
+        for flag in self.flags:
+            self.lookup[flag.abbrev] = flag
+            self.lookup[flag.fullabbrev] = flag
+            self.lookup[flag.fullname] = flag
+        self.abbrevPattern = re.compile('^-([%s]+)$' % (''.join(f.abbrev for f in flags)))
+    def parse(self, arg):
+        """
+        Finds flags; returns {flag: (values, if any)} and the remaining argument.
+        
+        >>> f = FlagSet([Flag('foo'), Flag('bar'), Flag('gimmea', nargs=1)])
+        >>> f.parse('-fb')
+        ({'foo': [], 'bar': []}, '')
+        >>> f.parse('no flags')
+        ({}, 'no flags')
+        >>> f.parse('-f blah')
+        ({'foo': []}, 'blah')
+        >>> f.parse('--bar')
+        ({'bar': []}, '')
+        >>> f.parse('--bar -f')
+        ({'foo': [], 'bar': []}, '')
+        >>> f.parse('--notaflag')
+        ({}, '--notaflag')
+        >>> f.parse('')
+        ({}, '')
+        >>> f.parse('--gimmea bee -f and then some other     stuff')
+        ({'gimmea': ['bee'], 'foo': []}, 'and then some other stuff')
+        >>> f.parse('hidden -bar')
+        ({}, 'hidden -bar')
+        >>> f.parse('-g myarg -b')
+        ({'gimmea': ['myarg'], 'bar': []}, '')
+        """
+        parser = optparse.OptionParser()
+        for flag in self.flags:
+            if flag.nargs:
+                parser.add_option(flag.fullabbrev, flag.fullname, action="store",
+                                  type="string", dest=flag.name)
+            else:
+                parser.add_option(flag.fullabbrev, flag.fullname, action="store_true",
+                                  dest=flag.name)
+        try:
+            (options, args) = parser.parse_args(arg.split())
+        except SystemExit, e:
+            return {}, arg
+        
+        result = {}
+        for (k,v) in options.__dict__.items():
+            if v == True:
+                result[k] = []
+            elif v:
+                result[k] = [v]
+        return result, ' '.join(args)
+
+def _test():
+    import doctest
+    doctest.testmod()
+    
+if __name__ == '__main__':
+    _test()
\ No newline at end of file