Skip to content

Commit a702569

Browse files
erikwredeticosaxdavidcimTLDMainianepperson
authored
Native support for additional Type Converters (#353)
* Fields generated from Hybrid Properties & Type hints now support Unions (Union[ObjectType1,OT2] or ObjectType1 | OT2) * Support for Variant and types.JSON Columns * BREAKING: Date&Time now convert to their corresponding graphene scalars instead of String. * BREAKING: PG UUID & sqlalchemy_utils.UUIDType now convert to graphene.UUID instead of graphene.String * Change: Sort Enums & ChoiceType enums are now generated from Column.key instead of Column.name, see #330 Signed-off-by: Erik Wrede <[email protected]> Co-authored-by: Nicolas Delaby <[email protected]> Co-authored-by: davidcim <[email protected]> Co-authored-by: Viktor Pegy <[email protected]> Co-authored-by: Ian Epperson <[email protected]>
1 parent f16d434 commit a702569

File tree

10 files changed

+468
-131
lines changed

10 files changed

+468
-131
lines changed

graphene_sqlalchemy/converter.py

+139-65
Large diffs are not rendered by default.

graphene_sqlalchemy/enums.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ def sort_enum_for_object_type(
144144
column = orm_field.columns[0]
145145
if only_indexed and not (column.primary_key or column.index):
146146
continue
147-
asc_name = get_name(column.name, True)
147+
asc_name = get_name(column.key, True)
148148
asc_value = EnumValue(asc_name, column.asc())
149-
desc_name = get_name(column.name, False)
149+
desc_name = get_name(column.key, False)
150150
desc_value = EnumValue(desc_name, column.desc())
151151
if column.primary_key:
152152
default.append(asc_value)

graphene_sqlalchemy/registry.py

+29-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from collections import defaultdict
2+
from typing import List, Type
23

34
from sqlalchemy.types import Enum as SQLAlchemyEnumType
45

6+
import graphene
57
from graphene import Enum
68

79

@@ -13,12 +15,13 @@ def __init__(self):
1315
self._registry_composites = {}
1416
self._registry_enums = {}
1517
self._registry_sort_enums = {}
18+
self._registry_unions = {}
1619

1720
def register(self, obj_type):
18-
from .types import SQLAlchemyObjectType
1921

22+
from .types import SQLAlchemyObjectType
2023
if not isinstance(obj_type, type) or not issubclass(
21-
obj_type, SQLAlchemyObjectType
24+
obj_type, SQLAlchemyObjectType
2225
):
2326
raise TypeError(
2427
"Expected SQLAlchemyObjectType, but got: {!r}".format(obj_type)
@@ -37,7 +40,7 @@ def register_orm_field(self, obj_type, field_name, orm_field):
3740
from .types import SQLAlchemyObjectType
3841

3942
if not isinstance(obj_type, type) or not issubclass(
40-
obj_type, SQLAlchemyObjectType
43+
obj_type, SQLAlchemyObjectType
4144
):
4245
raise TypeError(
4346
"Expected SQLAlchemyObjectType, but got: {!r}".format(obj_type)
@@ -55,7 +58,7 @@ def register_composite_converter(self, composite, converter):
5558
def get_converter_for_composite(self, composite):
5659
return self._registry_composites.get(composite)
5760

58-
def register_enum(self, sa_enum, graphene_enum):
61+
def register_enum(self, sa_enum: SQLAlchemyEnumType, graphene_enum: Enum):
5962
if not isinstance(sa_enum, SQLAlchemyEnumType):
6063
raise TypeError(
6164
"Expected SQLAlchemyEnumType, but got: {!r}".format(sa_enum)
@@ -67,14 +70,14 @@ def register_enum(self, sa_enum, graphene_enum):
6770

6871
self._registry_enums[sa_enum] = graphene_enum
6972

70-
def get_graphene_enum_for_sa_enum(self, sa_enum):
73+
def get_graphene_enum_for_sa_enum(self, sa_enum: SQLAlchemyEnumType):
7174
return self._registry_enums.get(sa_enum)
7275

73-
def register_sort_enum(self, obj_type, sort_enum):
74-
from .types import SQLAlchemyObjectType
76+
def register_sort_enum(self, obj_type, sort_enum: Enum):
7577

78+
from .types import SQLAlchemyObjectType
7679
if not isinstance(obj_type, type) or not issubclass(
77-
obj_type, SQLAlchemyObjectType
80+
obj_type, SQLAlchemyObjectType
7881
):
7982
raise TypeError(
8083
"Expected SQLAlchemyObjectType, but got: {!r}".format(obj_type)
@@ -83,9 +86,26 @@ def register_sort_enum(self, obj_type, sort_enum):
8386
raise TypeError("Expected Graphene Enum, but got: {!r}".format(sort_enum))
8487
self._registry_sort_enums[obj_type] = sort_enum
8588

86-
def get_sort_enum_for_object_type(self, obj_type):
89+
def get_sort_enum_for_object_type(self, obj_type: graphene.ObjectType):
8790
return self._registry_sort_enums.get(obj_type)
8891

92+
def register_union_type(self, union: graphene.Union, obj_types: List[Type[graphene.ObjectType]]):
93+
if not isinstance(union, graphene.Union):
94+
raise TypeError(
95+
"Expected graphene.Union, but got: {!r}".format(union)
96+
)
97+
98+
for obj_type in obj_types:
99+
if not isinstance(obj_type, type(graphene.ObjectType)):
100+
raise TypeError(
101+
"Expected Graphene ObjectType, but got: {!r}".format(obj_type)
102+
)
103+
104+
self._registry_unions[frozenset(obj_types)] = union
105+
106+
def get_union_for_object_types(self, obj_types : List[Type[graphene.ObjectType]]):
107+
return self._registry_unions.get(frozenset(obj_types))
108+
89109

90110
registry = None
91111

graphene_sqlalchemy/tests/models.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from decimal import Decimal
66
from typing import List, Optional, Tuple
77

8-
from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, String, Table,
9-
func, select)
8+
from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, Numeric,
9+
String, Table, func, select)
1010
from sqlalchemy.ext.declarative import declarative_base
1111
from sqlalchemy.ext.hybrid import hybrid_property
1212
from sqlalchemy.orm import column_property, composite, mapper, relationship
@@ -228,3 +228,9 @@ def hybrid_prop_self_referential_list(self) -> List['ShoppingCart']:
228228
@hybrid_property
229229
def hybrid_prop_optional_self_referential(self) -> Optional['ShoppingCart']:
230230
return None
231+
232+
233+
class KeyedModel(Base):
234+
__tablename__ = "test330"
235+
id = Column(Integer(), primary_key=True)
236+
reporter_number = Column("% reporter_number", Numeric, key="reporter_number")

0 commit comments

Comments
 (0)