X-Git-Url: https://code.delx.au/bg-scripts/blobdiff_plain/b90108b29cbac4325a1927069ef13ca475cd61eb..437cc3ef42a0038caa22c4676c4e25831697f258:/lib/Enum.py diff --git a/lib/Enum.py b/lib/Enum.py new file mode 100644 index 0000000..6bb2d3d --- /dev/null +++ b/lib/Enum.py @@ -0,0 +1,54 @@ +#! python +# Copyright 2007 Greg Darke +# 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