bpo-38659: [Enum] add _simple_enum decorator (GH-25285) · python/cpython@dbac8f4

@@ -8,7 +8,7 @@

88

import threading

99

from collections import OrderedDict

1010

from 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

1212

from io import StringIO

1313

from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL

1414

from test import support

@@ -2511,10 +2511,13 @@ class Bizarre(Flag, boundary=KEEP):

25112511

d = 6

25122512

#

25132513

self.assertRaisesRegex(ValueError, 'invalid value: 7', Iron, 7)

2514+

#

25142515

self.assertIs(Water(7), Water.ONE|Water.TWO)

25152516

self.assertIs(Water(~9), Water.TWO)

2517+

#

25162518

self.assertEqual(Space(7), 7)

25172519

self.assertTrue(type(Space(7)) is int)

2520+

#

25182521

self.assertEqual(list(Bizarre), [Bizarre.c])

25192522

self.assertIs(Bizarre(3), Bizarre.b)

25202523

self.assertIs(Bizarre(6), Bizarre.d)

@@ -3053,16 +3056,20 @@ class Space(IntFlag, boundary=EJECT):

30533056

EIGHT = 8

30543057

self.assertIs(Space._boundary_, EJECT)

30553058

#

3059+

#

30563060

class Bizarre(IntFlag, boundary=KEEP):

30573061

b = 3

30583062

c = 4

30593063

d = 6

30603064

#

30613065

self.assertRaisesRegex(ValueError, 'invalid value: 5', Iron, 5)

3066+

#

30623067

self.assertIs(Water(7), Water.ONE|Water.TWO)

30633068

self.assertIs(Water(~9), Water.TWO)

3069+

#

30643070

self.assertEqual(Space(7), 7)

30653071

self.assertTrue(type(Space(7)) is int)

3072+

#

30663073

self.assertEqual(list(Bizarre), [Bizarre.c])

30673074

self.assertIs(Bizarre(3), Bizarre.b)

30683075

self.assertIs(Bizarre(6), Bizarre.d)

@@ -3577,6 +3584,41 @@ def test_inspect_classify_class_attrs(self):

35773584

if failed:

35783585

self.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+3580362235813623

class MiscTestCase(unittest.TestCase):

35823624

def test__all__(self):

@@ -3592,6 +3634,13 @@ def test__all__(self):

35923634

CONVERT_TEST_NAME_E = 5

35933635

CONVERT_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+35953644

class TestIntEnumConvert(unittest.TestCase):

35963645

def test_convert_value_lookup_priority(self):

35973646

test_type = enum.IntEnum._convert_(

@@ -3639,14 +3688,16 @@ def test_convert_raise(self):

36393688

filter=lambda x: x.startswith('CONVERT_TEST_'))

3640368936413690

def test_convert_repr_and_str(self):

3691+

# reset global constants, as previous tests could have converted the

3692+

# integer values to enums

36423693

module = ('test.test_enum', '__main__')[__name__=='__main__']

36433694

test_type = enum.IntEnum._convert_(

36443695

'UnittestConvert',

36453696

module,

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

36523703

CONVERT_STR_TEST_2 = 'goodbye'