From 7978c6a9473abdc179aca08562b6b33a211c8c9e Mon Sep 17 00:00:00 2001 From: Ian Epperson Date: Wed, 22 Apr 2020 12:52:39 -0700 Subject: [PATCH 1/2] Add additional sqlalchemy_utils types Add most trivial string types from sqlalchemy_utils: UUIDType, EmailType, URLType, and IPAddressType --- graphene_sqlalchemy/converter.py | 22 +++++++++++++++------ graphene_sqlalchemy/tests/test_converter.py | 8 +++++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index f4b805e2..dcef7c24 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -16,10 +16,16 @@ from .registry import get_global_registry from .resolvers import get_attr_resolver, get_custom_resolver + +class DummyImport: + def __getattr__(self, name): + return object + + try: - from sqlalchemy_utils import ChoiceType, JSONType, ScalarListType, TSVectorType + import sqlalchemy_utils except ImportError: - ChoiceType = JSONType = ScalarListType = TSVectorType = object + sqlalchemy_utils = DummyImport() is_selectin_available = getattr(strategies, 'SelectInLoader', None) @@ -183,7 +189,11 @@ def convert_sqlalchemy_type(type, column, registry=None): @convert_sqlalchemy_type.register(postgresql.UUID) @convert_sqlalchemy_type.register(postgresql.INET) @convert_sqlalchemy_type.register(postgresql.CIDR) -@convert_sqlalchemy_type.register(TSVectorType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.TSVectorType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.UUIDType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.EmailType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.URLType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.IPAddressType) def convert_column_to_string(type, column, registry=None): return String @@ -218,7 +228,7 @@ def convert_enum_to_enum(type, column, registry=None): # TODO Make ChoiceType conversion consistent with other enums -@convert_sqlalchemy_type.register(ChoiceType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.ChoiceType) def convert_choice_to_enum(type, column, registry=None): name = "{}_{}".format(column.table.name, column.name).upper() if isinstance(type.choices, EnumMeta): @@ -229,7 +239,7 @@ def convert_choice_to_enum(type, column, registry=None): return Enum(name, type.choices) -@convert_sqlalchemy_type.register(ScalarListType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.ScalarListType) def convert_scalar_list_to_list(type, column, registry=None): return List(String) @@ -248,6 +258,6 @@ def convert_json_to_string(type, column, registry=None): return JSONString -@convert_sqlalchemy_type.register(JSONType) +@convert_sqlalchemy_type.register(sqlalchemy_utils.JSONType) def convert_json_type_to_string(type, column, registry=None): return JSONString diff --git a/graphene_sqlalchemy/tests/test_converter.py b/graphene_sqlalchemy/tests/test_converter.py index f0fc1802..d1f89a4d 100644 --- a/graphene_sqlalchemy/tests/test_converter.py +++ b/graphene_sqlalchemy/tests/test_converter.py @@ -13,7 +13,7 @@ from graphene.types.datetime import DateTime from graphene.types.json import JSONString -from ..converter import (convert_sqlalchemy_column, +from ..converter import (DummyImport, convert_sqlalchemy_column, convert_sqlalchemy_composite, convert_sqlalchemy_relationship) from ..fields import (UnsortedSQLAlchemyConnectionField, @@ -369,3 +369,9 @@ def __init__(self, col1, col2): Registry(), mock_resolver, ) + + +def test_dummy_import(): + """The dummy module returns 'object' for a query for any member""" + dummy_module = DummyImport() + assert dummy_module.foo == object From 143418e76abb1b17255ba7d6b3946abf6d90643a Mon Sep 17 00:00:00 2001 From: Ian Epperson Date: Fri, 14 Aug 2020 17:24:23 -0700 Subject: [PATCH 2/2] Add geoalchemy2 Geometry Column support --- graphene_sqlalchemy/converter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index dcef7c24..18842fb0 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -27,6 +27,11 @@ def __getattr__(self, name): except ImportError: sqlalchemy_utils = DummyImport() +try: + from geoalchemy2.elements import Geometry +except ImportError: + Geometry = object + is_selectin_available = getattr(strategies, 'SelectInLoader', None) @@ -194,6 +199,7 @@ def convert_sqlalchemy_type(type, column, registry=None): @convert_sqlalchemy_type.register(sqlalchemy_utils.EmailType) @convert_sqlalchemy_type.register(sqlalchemy_utils.URLType) @convert_sqlalchemy_type.register(sqlalchemy_utils.IPAddressType) +@convert_sqlalchemy_type.register(Geometry) def convert_column_to_string(type, column, registry=None): return String