Skip to content

Commit c636d98

Browse files
senseysensorsgrekoverikwrede
authored
fix: Corrected enum metaclass to fix pickle.dumps() (#1495)
* Corrected enum metaclass to fix pickle.dumps() * considered case with colliding class names (try to distinguish by file name) * reverted simple solution back (without attempt to support duplicate Enum class names) --------- Co-authored-by: sgrekov <[email protected]> Co-authored-by: Erik Wrede <[email protected]>
1 parent 2da8e9d commit c636d98

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

graphene/tests/issues/test_881.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import pickle
2+
3+
from ...types.enum import Enum
4+
5+
6+
class PickleEnum(Enum):
7+
# is defined outside of test because pickle unable to dump class inside ot pytest function
8+
A = "a"
9+
B = 1
10+
11+
12+
def test_enums_pickling():
13+
a = PickleEnum.A
14+
pickled = pickle.dumps(a)
15+
restored = pickle.loads(pickled)
16+
assert type(a) is type(restored)
17+
assert a == restored
18+
assert a.value == restored.value
19+
assert a.name == restored.name
20+
21+
b = PickleEnum.B
22+
pickled = pickle.dumps(b)
23+
restored = pickle.loads(pickled)
24+
assert type(a) is type(restored)
25+
assert b == restored
26+
assert b.value == restored.value
27+
assert b.name == restored.name

graphene/types/enum.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ def __new__(cls, name_, bases, classdict, **options):
3131
# with the enum values.
3232
enum_members.pop("Meta", None)
3333
enum = PyEnum(cls.__name__, enum_members)
34-
return SubclassWithMeta_Meta.__new__(
34+
obj = SubclassWithMeta_Meta.__new__(
3535
cls, name_, bases, dict(classdict, __enum__=enum), **options
3636
)
37+
globals()[name_] = obj.__enum__
38+
return obj
3739

3840
def get(cls, value):
3941
return cls._meta.enum(value)

0 commit comments

Comments
 (0)