bpo-38659: [Enum] add _simple_enum decorator (GH-25285) · python/cpython@dbac8f4
@@ -8,7 +8,7 @@
88import threading
99from collections import OrderedDict
1010from enum import Enum, IntEnum, StrEnum, EnumType, Flag, IntFlag, unique, auto
11-from enum import STRICT, CONFORM, EJECT, KEEP
11+from enum import STRICT, CONFORM, EJECT, KEEP, _simple_enum, _test_simple_enum
1212from io import StringIO
1313from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL
1414from test import support
@@ -2511,10 +2511,13 @@ class Bizarre(Flag, boundary=KEEP):
25112511d = 6
25122512#
25132513self.assertRaisesRegex(ValueError, 'invalid value: 7', Iron, 7)
2514+#
25142515self.assertIs(Water(7), Water.ONE|Water.TWO)
25152516self.assertIs(Water(~9), Water.TWO)
2517+#
25162518self.assertEqual(Space(7), 7)
25172519self.assertTrue(type(Space(7)) is int)
2520+#
25182521self.assertEqual(list(Bizarre), [Bizarre.c])
25192522self.assertIs(Bizarre(3), Bizarre.b)
25202523self.assertIs(Bizarre(6), Bizarre.d)
@@ -3053,16 +3056,20 @@ class Space(IntFlag, boundary=EJECT):
30533056EIGHT = 8
30543057self.assertIs(Space._boundary_, EJECT)
30553058#
3059+#
30563060class Bizarre(IntFlag, boundary=KEEP):
30573061b = 3
30583062c = 4
30593063d = 6
30603064#
30613065self.assertRaisesRegex(ValueError, 'invalid value: 5', Iron, 5)
3066+#
30623067self.assertIs(Water(7), Water.ONE|Water.TWO)
30633068self.assertIs(Water(~9), Water.TWO)
3069+#
30643070self.assertEqual(Space(7), 7)
30653071self.assertTrue(type(Space(7)) is int)
3072+#
30663073self.assertEqual(list(Bizarre), [Bizarre.c])
30673074self.assertIs(Bizarre(3), Bizarre.b)
30683075self.assertIs(Bizarre(6), Bizarre.d)
@@ -3577,6 +3584,41 @@ def test_inspect_classify_class_attrs(self):
35773584if failed:
35783585self.fail("result does not equal expected, see print above")
357935863587+def test_test_simple_enum(self):
3588+@_simple_enum(Enum)
3589+class SimpleColor:
3590+RED = 1
3591+GREEN = 2
3592+BLUE = 3
3593+class CheckedColor(Enum):
3594+RED = 1
3595+GREEN = 2
3596+BLUE = 3
3597+self.assertTrue(_test_simple_enum(CheckedColor, SimpleColor) is None)
3598+SimpleColor.GREEN._value_ = 9
3599+self.assertRaisesRegex(
3600+TypeError, "enum mismatch",
3601+_test_simple_enum, CheckedColor, SimpleColor,
3602+ )
3603+class CheckedMissing(IntFlag, boundary=KEEP):
3604+SIXTY_FOUR = 64
3605+ONE_TWENTY_EIGHT = 128
3606+TWENTY_FORTY_EIGHT = 2048
3607+ALL = 2048 + 128 + 64 + 12
3608+CM = CheckedMissing
3609+self.assertEqual(list(CheckedMissing), [CM.SIXTY_FOUR, CM.ONE_TWENTY_EIGHT, CM.TWENTY_FORTY_EIGHT])
3610+#
3611+@_simple_enum(IntFlag, boundary=KEEP)
3612+class Missing:
3613+SIXTY_FOUR = 64
3614+ONE_TWENTY_EIGHT = 128
3615+TWENTY_FORTY_EIGHT = 2048
3616+ALL = 2048 + 128 + 64 + 12
3617+M = Missing
3618+self.assertEqual(list(CheckedMissing), [M.SIXTY_FOUR, M.ONE_TWENTY_EIGHT, M.TWENTY_FORTY_EIGHT])
3619+#
3620+_test_simple_enum(CheckedMissing, Missing)
3621+3580362235813623class MiscTestCase(unittest.TestCase):
35823624def test__all__(self):
@@ -3592,6 +3634,13 @@ def test__all__(self):
35923634CONVERT_TEST_NAME_E = 5
35933635CONVERT_TEST_NAME_F = 5
359436363637+CONVERT_STRING_TEST_NAME_D = 5
3638+CONVERT_STRING_TEST_NAME_C = 5
3639+CONVERT_STRING_TEST_NAME_B = 5
3640+CONVERT_STRING_TEST_NAME_A = 5 # This one should sort first.
3641+CONVERT_STRING_TEST_NAME_E = 5
3642+CONVERT_STRING_TEST_NAME_F = 5
3643+35953644class TestIntEnumConvert(unittest.TestCase):
35963645def test_convert_value_lookup_priority(self):
35973646test_type = enum.IntEnum._convert_(
@@ -3639,14 +3688,16 @@ def test_convert_raise(self):
36393688filter=lambda x: x.startswith('CONVERT_TEST_'))
3640368936413690def test_convert_repr_and_str(self):
3691+# reset global constants, as previous tests could have converted the
3692+# integer values to enums
36423693module = ('test.test_enum', '__main__')[__name__=='__main__']
36433694test_type = enum.IntEnum._convert_(
36443695'UnittestConvert',
36453696module,
3646-filter=lambda x: x.startswith('CONVERT_TEST_'))
3647-self.assertEqual(repr(test_type.CONVERT_TEST_NAME_A), '%s.CONVERT_TEST_NAME_A' % module)
3648-self.assertEqual(str(test_type.CONVERT_TEST_NAME_A), 'CONVERT_TEST_NAME_A')
3649-self.assertEqual(format(test_type.CONVERT_TEST_NAME_A), '5')
3697+filter=lambda x: x.startswith('CONVERT_STRING_TEST_'))
3698+self.assertEqual(repr(test_type.CONVERT_STRING_TEST_NAME_A), '%s.CONVERT_STRING_TEST_NAME_A' % module)
3699+self.assertEqual(str(test_type.CONVERT_STRING_TEST_NAME_A), 'CONVERT_STRING_TEST_NAME_A')
3700+self.assertEqual(format(test_type.CONVERT_STRING_TEST_NAME_A), '5')
3650370136513702# global names for StrEnum._convert_ test
36523703CONVERT_STR_TEST_2 = 'goodbye'