Skip to content

Commit 737e288

Browse files
author
Joshua Cannon
committed
Rebase graphql-python#165 and resolve conflicts
1 parent 53f107e commit 737e288

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

graphene_sqlalchemy/converter.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,25 @@ def convert_column_to_float(type, column, registry=None):
147147
@convert_sqlalchemy_type.register(types.Enum)
148148
def convert_enum_to_enum(type, column, registry=None):
149149
enum_class = getattr(type, 'enum_class', None)
150-
if enum_class: # Check if an enum.Enum type is used
151-
graphene_type = Enum.from_enum(enum_class)
152-
else: # Nope, just a list of string options
153-
items = zip(type.enums, type.enums)
154-
graphene_type = Enum(type.name, items)
155-
return graphene_type(
150+
if enum_class:
151+
enum_name = type.enum_class.__name__
152+
else:
153+
enum_name = type.name
154+
155+
enum_type = None
156+
if registry is not None:
157+
enum_type = registry.get_type_for_enum(enum_name)
158+
if enum_type is None:
159+
enum_class = getattr(type, 'enum_class', None)
160+
if enum_class: # Check if an enum.Enum type is used
161+
enum_type = Enum.from_enum(enum_class)
162+
else: # Nope, just a list of string options
163+
items = zip(type.enums, type.enums)
164+
enum_type = Enum(enum_name, items)
165+
if registry is not None:
166+
registry.register_type_for_enum(enum_name, enum_type)
167+
168+
return enum_type(
156169
description=get_column_doc(column),
157170
required=not (is_column_nullable(column)),
158171
)
@@ -162,11 +175,23 @@ def convert_enum_to_enum(type, column, registry=None):
162175
def convert_column_to_enum(type_, column, registry=None):
163176
is_enum = isinstance(type_.choices, type)
164177
if is_enum:
165-
graphene_type = Enum.from_enum(type_.choices)
178+
enum_name = type_.choices.__name__
166179
else:
167-
name = "{}_{}".format(column.table.name, column.name).upper()
168-
graphene_type = Enum(name, type_.choices)
169-
return graphene_type(
180+
enum_name = "{}_{}".format(column.table.name, column.name).upper()
181+
182+
enum_type = None
183+
if registry is not None:
184+
enum_type = registry.get_type_for_enum(enum_name)
185+
186+
if enum_type is None:
187+
if is_enum:
188+
enum_type = Enum.from_enum(type_.choices)
189+
else:
190+
enum_type = Enum(enum_name, type_.choices)
191+
if registry is not None:
192+
registry.register_type_for_enum(enum_name, enum_type)
193+
194+
return enum_type(
170195
description=get_column_doc(column),
171196
required=not (is_column_nullable(column)),
172197
)

graphene_sqlalchemy/registry.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ def __init__(self):
33
self._registry = {}
44
self._registry_models = {}
55
self._registry_composites = {}
6+
self._registry_enums = {}
67

78
def register(self, cls):
89
from .types import SQLAlchemyObjectType
@@ -11,7 +12,9 @@ def register(self, cls):
1112
"Only classes of type SQLAlchemyObjectType can be registered, "
1213
'received "{}"'
1314
).format(cls.__name__)
14-
assert cls._meta.registry == self, "Registry for a Model have to match."
15+
assert (
16+
cls._meta.registry == self
17+
), "Registry for a Model have to match."
1518
# assert self.get_type_for_model(cls._meta.model) in [None, cls], (
1619
# 'SQLAlchemy model "{}" already associated with '
1720
# 'another type "{}".'
@@ -27,6 +30,12 @@ def register_composite_converter(self, composite, converter):
2730
def get_converter_for_composite(self, composite):
2831
return self._registry_composites.get(composite)
2932

33+
def register_type_for_enum(self, enum_type_name, graphene_enum):
34+
self._registry_enums[enum_type_name] = graphene_enum
35+
36+
def get_type_for_enum(self, enum_type_name):
37+
return self._registry_enums.get(enum_type_name)
38+
3039

3140
registry = None
3241

graphene_sqlalchemy/tests/models.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,15 @@ class Editor(Base):
2828
name = Column(String(100))
2929

3030

31+
PetKindEnum = Enum("cat", "dog", name="pet_kind")
32+
33+
3134
class Pet(Base):
3235
__tablename__ = "pets"
3336
id = Column(Integer(), primary_key=True)
3437
name = Column(String(30))
35-
pet_kind = Column(Enum("cat", "dog", name="pet_kind"), nullable=False)
38+
pet_kind = Column(PetKindEnum, nullable=False)
39+
pet_kind_again = Column(PetKindEnum)
3640
hair_kind = Column(Enum(Hairkind, name="hair_kind"), nullable=False)
3741
reporter_id = Column(Integer(), ForeignKey("reporters.id"))
3842

0 commit comments

Comments
 (0)