1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """simple enum and implementation
19 """
20
21 from twisted.python.reflect import qual
22 from twisted.spread import jelly
23
24 __version__ = "$Rev$"
25 _enumClassRegistry = {}
26
27
44
45
46 -class Enum(object, jelly.Jellyable):
47
48 __metaclass__ = EnumMetaClass
49
50 - def __init__(self, value, name, nick=None):
51 self.value = value
52 self.name = name
53
54 if nick == None:
55 nick = name
56
57 self.nick = nick
58 self._enumClassName = self.__class__.__name__
59
61 return '<enum %s of type %s>' % (self.name,
62 self.__class__.__name__)
63
64 - def get(klass, value):
66 get = classmethod(get)
67
68 - def set(klass, value, item):
70 set = classmethod(set)
71
73 sxp = jellier.prepare(self)
74 sxp.extend([
75 qual(Enum),
76 self._enumClassName,
77 self.value, self.name, self.nick])
78 return jellier.preserve(self, sxp)
79
80
82
83 - def __new__(klass, type_name, names=(), nicks=(), **extras):
84 if nicks:
85 if len(names) != len(nicks):
86 raise TypeError("nicks must have the same length as names")
87 else:
88 nicks = names
89
90 for extra in extras.values():
91 if not isinstance(extra, (tuple, list)):
92 raise TypeError(
93 'extra must be a sequence, 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
100
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
114
115
116
118
120 enumClassName, value, name, nick = jellyList[1:]
121 enumClass = _enumClassRegistry.get(enumClassName, None)
122 if enumClass:
123
124 enum = enumClass.get(value)
125 assert enum.name == name, "Inconsistent Enum Name"
126 else:
127
128 enum = Enum(value, name, nick)
129 enum._enumClassName = enumClassName
130 return enum
131
132
133 jelly.setUnjellyableForClass(qual(Enum), EnumUnjellyer)
134