]> code.delx.au - bg-scripts/blobdiff - lib/Enum.py
Initial import
[bg-scripts] / lib / Enum.py
diff --git a/lib/Enum.py b/lib/Enum.py
new file mode 100644 (file)
index 0000000..6bb2d3d
--- /dev/null
@@ -0,0 +1,54 @@
+#! python
+# Copyright 2007 Greg Darke <gdar9540@usyd.edu.au>
+# Licensed for distribution under the GPL version 2, check COPYING for details
+# An enum like interface
+
+"""
+An enum like interface
+"""
+
+__all__ = ('enum', )
+
+import itertools
+
+def enum(*args):
+       return EnumContainer(*args)
+
+class EnumElement(object):
+       __slots__ = ('enumName', 'enumContainer')
+       def __init__(self, enumName, enumContainer):
+               self.enumName = enumName
+               self.enumContainer = enumContainer
+       def __repr__(self):
+               return '%s(%s)' % (self.__class__.__name__, self.enumName)
+       def __str__(self):
+               return self.enumName
+       def __eq__(self, other):
+               if not isinstance(other, self.__class__): return NotImplemented
+               return other is self
+       def __hash__(self):
+               return hash(self.enumName) ^ hash(self.enumContainer)
+
+class EnumContainer(object):
+       def __init__(self, *enums):
+               self.enumList = tuple( EnumElement(enumName, self) for enumName in enums)
+               for enumName, enumElement in itertools.izip(enums, self.enumList):
+                       setattr(self, enumName, enumElement)
+
+       def __contains__(self, enum):
+               return enum in self.enumList
+
+       def __repr__(self):
+               return '%s(%s)' % (self.__class__.__name__, ', '.join(self.enumList))
+
+       def explode(self):
+               """Places contents of this enum into the callers global namespace"""
+               import inspect
+               frameObject, _, _, _, _ = inspect.stack[1] # The stackframe of who called us
+               global_dict = frameObject.f_globals
+               del frameObject
+               for enum in self.enumList:
+                       if str(enum) in global_dict:
+                               raise ValueError, '%s is already in your global dict' % enum
+               for enum in self.enumList:
+                       global_dict[str(enum)] = enum