Package flumotion :: Package common :: Module enum
[hide private]

Source Code for Module flumotion.common.enum

  1  # -*- Mode: Python; test-case-name: flumotion.test.test_enum -*- 
  2  # vi:si:et:sw=4:sts=4:ts=4 
  3  # 
  4  # Flumotion - a streaming media server 
  5  # Copyright (C) 2004,2005,2006,2007 Fluendo, S.L. (www.fluendo.com). 
  6  # All rights reserved. 
  7   
  8  # This file may be distributed and/or modified under the terms of 
  9  # the GNU General Public License version 2 as published by 
 10  # the Free Software Foundation. 
 11  # This file is distributed without any warranty; without even the implied 
 12  # warranty of merchantability or fitness for a particular purpose. 
 13  # See "LICENSE.GPL" in the source distribution for more information. 
 14   
 15  # Licensees having purchased or holding a valid Flumotion Advanced 
 16  # Streaming Server license may use this file in accordance with the 
 17  # Flumotion Advanced Streaming Server Commercial License Agreement. 
 18  # See "LICENSE.Flumotion" in the source distribution for more information. 
 19   
 20  # Headers in this file shall remain intact. 
 21   
 22  """ 
 23  Enum class implementation 
 24  """ 
 25   
 26  from twisted.python.reflect import qual 
 27  from twisted.spread import jelly 
 28   
 29  _enumClassRegistry = {} 
 30   
31 -class EnumMetaClass(type):
32 # pychecker likes this attribute to be there since we use it in this class 33 __enums__ = {} 34
35 - def __len__(self):
36 return len(self.__enums__)
37
38 - def __getitem__(self, value):
39 try: 40 return self.__enums__[value] 41 except KeyError: 42 raise StopIteration
43
44 - def __setitem__(self, value, enum):
45 self.__enums__[value] = enum 46 setattr(self, enum.name, enum)
47 48
49 -class Enum(object, jelly.Jellyable):
50 51 __metaclass__ = EnumMetaClass
52 - def __init__(self, value, name, nick=None):
53 self.value = value 54 self.name = name 55 56 if nick == None: 57 nick = name 58 59 self.nick = nick 60 self._enumClassName = self.__class__.__name__
61
62 - def __repr__(self):
63 return '<enum %s of type %s>' % (self.name, 64 self.__class__.__name__)
65
66 - def get(klass, value):
67 return klass.__enums__[value]
68 get = classmethod(get) 69
70 - def set(klass, value, item):
71 klass[value] = item
72 set = classmethod(set) 73
74 - def jellyFor(self, jellier):
75 sxp = jellier.prepare(self) 76 sxp.extend([ 77 qual(Enum), 78 self._enumClassName, 79 self.value, self.name, self.nick]) 80 return jellier.preserve(self, sxp)
81 82
83 -class EnumClass(object):
84 - def __new__(klass, type_name, names=(), nicks=(), **extras):
85 if nicks: 86 if len(names) != len(nicks): 87 raise TypeError("nicks must have the same length as names") 88 else: 89 nicks = names 90 91 for extra in extras.values(): 92 if not isinstance(extra, tuple): 93 raise TypeError('extra must be a tuple, not %s' % type(extra)) 94 95 if len(extra) != len(names): 96 raise TypeError("extra items must have a length of %d" % 97 len(names)) 98 99 # we reset __enums__ to {} otherwise it retains the other registered 100 # ones 101 etype = EnumMetaClass(type_name, (Enum,), {'__enums__': {}}) 102 for value, name in enumerate(names): 103 enum = etype(value, name, nicks[value]) 104 for extra_key, extra_values in extras.items(): 105 assert not hasattr(enum, extra_key) 106 setattr(enum, extra_key, extra_values[value]) 107 etype[value] = enum 108 109 _enumClassRegistry[type_name] = etype 110 return etype
111 112 113 # Enum unjellyer should not be a new style class, 114 # otherwise Twsited 2.0.1 will not recognise it.
115 -class EnumUnjellyer(jelly.Unjellyable):
116
117 - def unjellyFor(self, unjellier, jellyList):
118 enumClassName, value, name, nick = jellyList[1:] 119 enumClass = _enumClassRegistry.get(enumClassName, None) 120 if enumClass: 121 # Retrieve the enum singleton 122 enum = enumClass.get(value) 123 assert enum.name == name, "Inconsistent Enum Name" 124 else: 125 # Create a generic Enum container 126 enum = Enum(value, name, nick) 127 enum._enumClassName = enumClassName 128 return enum
129 130 131 jelly.setUnjellyableForClass(qual(Enum), EnumUnjellyer) 132