summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2013-10-07 00:19:54 (GMT)
committerEthan Furman <ethan@stoneleaf.us>2013-10-07 00:19:54 (GMT)
commit648f860c227187d01f00934e2e9453b32241bdaf (patch)
treeab61715c93a51bf30082a4704ad234d73da22677
parentab5a58d82732d94314160407112d8c609b7ad86b (diff)
downloadcpython-648f860c227187d01f00934e2e9453b32241bdaf.zip
cpython-648f860c227187d01f00934e2e9453b32241bdaf.tar.gz
cpython-648f860c227187d01f00934e2e9453b32241bdaf.tar.bz2
Close #19156: add tests and fix for Enum helper edge cases. Patch from CliffM.
-rw-r--r--Lib/enum.py6
-rw-r--r--Lib/test/test_enum.py29
2 files changed, 33 insertions, 2 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index 921d00c..7ca8503 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -17,14 +17,16 @@ def _is_dunder(name):
"""Returns True if a __dunder__ name, False otherwise."""
return (name[:2] == name[-2:] == '__' and
name[2:3] != '_' and
- name[-3:-2] != '_')
+ name[-3:-2] != '_' and
+ len(name) > 4)
def _is_sunder(name):
"""Returns True if a _sunder_ name, False otherwise."""
return (name[0] == name[-1] == '_' and
name[1:2] != '_' and
- name[-2:-1] != '_')
+ name[-2:-1] != '_' and
+ len(name) > 2)
def _make_class_unpicklable(cls):
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index d59c5e3..3d962f9 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -58,6 +58,35 @@ try:
except Exception:
pass
+
+class TestHelpers(unittest.TestCase):
+ # _is_descriptor, _is_sunder, _is_dunder
+
+ def test_is_descriptor(self):
+ class foo:
+ pass
+ for attr in ('__get__','__set__','__delete__'):
+ obj = foo()
+ self.assertFalse(enum._is_descriptor(obj))
+ setattr(obj, attr, 1)
+ self.assertTrue(enum._is_descriptor(obj))
+
+ def test_is_sunder(self):
+ for s in ('_a_', '_aa_'):
+ self.assertTrue(enum._is_sunder(s))
+
+ for s in ('a', 'a_', '_a', '__a', 'a__', '__a__', '_a__', '__a_', '_',
+ '__', '___', '____', '_____',):
+ self.assertFalse(enum._is_sunder(s))
+
+ def test_is_dunder(self):
+ for s in ('__a__', '__aa__'):
+ self.assertTrue(enum._is_dunder(s))
+ for s in ('a', 'a_', '_a', '__a', 'a__', '_a_', '_a__', '__a_', '_',
+ '__', '___', '____', '_____',):
+ self.assertFalse(enum._is_dunder(s))
+
+
class TestEnum(unittest.TestCase):
def setUp(self):
class Season(Enum):