+++ /dev/null
-#! 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