diff --git a/graphene/contrib/sqlalchemy/converter.py b/graphene/contrib/sqlalchemy/converter.py index 242606d4..2599c193 100644 --- a/graphene/contrib/sqlalchemy/converter.py +++ b/graphene/contrib/sqlalchemy/converter.py @@ -1,20 +1,24 @@ +from graphql.type import GraphQLString from singledispatch import singledispatch from sqlalchemy import types -from sqlalchemy.orm import interfaces from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import interfaces from ...core.classtypes.enum import Enum -from ...core.types.scalars import ID, Boolean, Float, Int, String -from ...core.types.definitions import List from ...core.types.custom_scalars import JSONString +from ...core.types.definitions import List +from ...core.types.scalars import ID, Boolean, Float, Int, String from .fields import ConnectionOrListField, SQLAlchemyModelField try: - from sqlalchemy_utils.types.choice import ChoiceType + from sqlalchemy_utils import ChoiceType, ScalarListType except ImportError: class ChoiceType(object): pass + class ScalarListType(object): + pass + def convert_sqlalchemy_relationship(relationship): direction = relationship.direction @@ -78,6 +82,11 @@ def convert_column_to_enum(type, column): return Enum(name, type.choices, description=column.doc) +@convert_sqlalchemy_type.register(ScalarListType) +def convert_scalar_list_to_list(type, column): + return List(GraphQLString, description=column.doc) + + @convert_sqlalchemy_type.register(postgresql.ARRAY) def convert_postgres_array_to_list(type, column): graphene_type = convert_sqlalchemy_type(column.type.item_type, column) diff --git a/graphene/contrib/sqlalchemy/tests/test_converter.py b/graphene/contrib/sqlalchemy/tests/test_converter.py index 521911ee..8532328b 100644 --- a/graphene/contrib/sqlalchemy/tests/test_converter.py +++ b/graphene/contrib/sqlalchemy/tests/test_converter.py @@ -1,7 +1,7 @@ from py.test import raises from sqlalchemy import Column, Table, types from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy_utils.types.choice import ChoiceType +from sqlalchemy_utils import ChoiceType, ScalarListType from sqlalchemy.dialects import postgresql import graphene @@ -106,6 +106,10 @@ def test_should_choice_convert_enum(): assert graphene_type.__enum__.__members__['en'].value == 'English' +def test_should_scalar_list_convert_list(): + assert_column_conversion(ScalarListType(), graphene.List) + + def test_should_manytomany_convert_connectionorlist(): graphene_type = convert_sqlalchemy_relationship(Reporter.pets.property) assert isinstance(graphene_type, ConnectionOrListField)