prohibit deleting constants in Enum (already couldn't change them)
diff --git a/aenum/__init__.py b/aenum/__init__.py
index c04e0a0..b6b6bd6 100644
--- a/aenum/__init__.py
+++ b/aenum/__init__.py
@@ -36,7 +36,7 @@
if sqlite3 is None:
__all__.remove('SqliteEnum')
-version = 2, 0, 5
+version = 2, 0, 6, 1
try:
any
@@ -162,6 +162,13 @@
args, varargs, keywords, defaults = inspect.getargspec(method)
return varargs is not None and keywords is not None
+def _get_attr_from_chain(cls, attr):
+ sentinel = object()
+ for basecls in cls.mro():
+ obj = basecls.__dict__.get(attr, sentinel)
+ if obj is not sentinel:
+ return obj
+
################
# Constant stuff
@@ -1254,7 +1261,12 @@
# (see issue19025).
if attr in cls._member_map_:
raise AttributeError(
- "%s: cannot delete Enum member." % cls.__name__)
+ "%s: cannot delete Enum member %r." % (cls.__name__,
+ ))
+ if isinstance(_get_attr_from_chain(cls, attr), constant):
+ raise AttributeError(
+ "%s: cannot delete constant %r" % (cls.__name__, attr),
+ )
super(EnumMeta, cls).__delattr__(attr)
def __dir__(self):
@@ -1319,10 +1331,14 @@
"""
member_map = cls.__dict__.get('_member_map_', {})
if name in member_map:
- raise AttributeError('Cannot rebind %s.' % name)
+ raise AttributeError(
+ '%s: cannot rebind member %r.' % (cls.__name__, name),
+ )
cur_obj = cls.__dict__.get(name)
if isinstance(cur_obj, constant):
- raise AttributeError('Cannot rebind %r' % (cur_obj,))
+ raise AttributeError(
+ '%s: cannot rebind constant %r' % (cls.__name__, name),
+ )
super(EnumMeta, cls).__setattr__(name, value)
def _create_(cls, class_name, names=None, module=None, type=None, start=1):
diff --git a/aenum/test.py b/aenum/test.py
index ef95d7d..c441a42 100644
--- a/aenum/test.py
+++ b/aenum/test.py
@@ -2221,6 +2221,14 @@
elementD = 'd'
self.assertIs(enumA.enumB, enumA.__dict__['enumB'])
+ def test_constantness_in_enum(self):
+ class Universe(Enum):
+ PI = constant(3.141596)
+ G = constant(6.67300E-11)
+ self.assertEqual(Universe.PI, 3.141596)
+ self.assertRaisesRegex(AttributeError, 'cannot rebind constant', setattr, Universe, 'PI', 9)
+ self.assertRaisesRegex(AttributeError, 'cannot delete constant', delattr, Universe, 'PI')
+
if StdlibEnumMeta is not None:
def test_stdlib_inheritence(self):
self.assertTrue(isinstance(self.Season, StdlibEnumMeta))
diff --git a/setup.py b/setup.py
index fcfa67b..254e6c8 100644
--- a/setup.py
+++ b/setup.py
@@ -34,7 +34,7 @@
data = dict(
name='aenum',
- version='2.0.5',
+ version='2.0.6a1',
url='https://bitbucket.org/stoneleaf/aenum',
packages=['aenum'],
package_data={