Added support for sqlalchemy choice

This commit is contained in:
Syrus Akbary 2016-02-01 13:58:26 -08:00
parent 7aa7c5a7bf
commit b3693e3702
4 changed files with 34 additions and 2 deletions

View File

@ -23,7 +23,7 @@ before_install:
install: install:
- | - |
if [ "$TEST_TYPE" = build ]; then if [ "$TEST_TYPE" = build ]; then
pip install --download-cache $HOME/.cache/pip/ pytest pytest-cov coveralls six pytest-django django-filter pip install --download-cache $HOME/.cache/pip/ pytest pytest-cov coveralls six pytest-django django-filter sqlalchemy_utils
pip install --download-cache $HOME/.cache/pip/ -e .[django] pip install --download-cache $HOME/.cache/pip/ -e .[django]
pip install --download-cache $HOME/.cache/pip/ -e .[sqlalchemy] pip install --download-cache $HOME/.cache/pip/ -e .[sqlalchemy]
pip install django==$DJANGO_VERSION pip install django==$DJANGO_VERSION

View File

@ -2,7 +2,13 @@ from singledispatch import singledispatch
from sqlalchemy import types from sqlalchemy import types
from sqlalchemy.orm import interfaces from sqlalchemy.orm import interfaces
try:
from sqlalchemy_utils.types.choice import ChoiceType
except ImportError:
class ChoiceType(object):
pass
from ...core.classtypes.enum import Enum
from ...core.types.scalars import ID, Boolean, Float, Int, String from ...core.types.scalars import ID, Boolean, Float, Int, String
from .fields import ConnectionOrListField, SQLAlchemyModelField from .fields import ConnectionOrListField, SQLAlchemyModelField
@ -59,3 +65,9 @@ def convert_column_to_boolean(type, column):
@convert_sqlalchemy_type.register(types.Numeric) @convert_sqlalchemy_type.register(types.Numeric)
def convert_column_to_float(type, column): def convert_column_to_float(type, column):
return Float(description=column.doc) return Float(description=column.doc)
@convert_sqlalchemy_type.register(ChoiceType)
def convert_column_to_enum(type, column):
name = '{}_{}'.format(column.table.name, column.name).upper()
return Enum(name, type.choices, description=column.doc)

View File

@ -5,7 +5,9 @@ from graphene.contrib.sqlalchemy.converter import (convert_sqlalchemy_column,
convert_sqlalchemy_relationship) convert_sqlalchemy_relationship)
from graphene.contrib.sqlalchemy.fields import (ConnectionOrListField, from graphene.contrib.sqlalchemy.fields import (ConnectionOrListField,
SQLAlchemyModelField) SQLAlchemyModelField)
from sqlalchemy import Column, types from sqlalchemy import Table, Column, types
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_utils.types.choice import ChoiceType
from .models import Article, Pet, Reporter from .models import Article, Pet, Reporter
@ -85,6 +87,23 @@ def test_should_numeric_convert_float():
assert_column_conversion(types.Numeric(), graphene.Float) assert_column_conversion(types.Numeric(), graphene.Float)
def test_should_choice_convert_enum():
TYPES = [
(u'es', u'Spanish'),
(u'en', u'English')
]
column = Column(ChoiceType(TYPES), doc='Language', name='language')
Base = declarative_base()
Table('translatedmodel', Base.metadata, column)
graphene_type = convert_sqlalchemy_column(column)
assert issubclass(graphene_type, graphene.Enum)
assert graphene_type._meta.type_name == 'TRANSLATEDMODEL_LANGUAGE'
assert graphene_type._meta.description == 'Language'
assert graphene_type.__enum__.__members__['es'].value == 'Spanish'
assert graphene_type.__enum__.__members__['en'].value == 'English'
def test_should_manytomany_convert_connectionorlist(): def test_should_manytomany_convert_connectionorlist():
graphene_type = convert_sqlalchemy_relationship(Reporter.pets.property) graphene_type = convert_sqlalchemy_relationship(Reporter.pets.property)
assert isinstance(graphene_type, ConnectionOrListField) assert isinstance(graphene_type, ConnectionOrListField)

View File

@ -63,6 +63,7 @@ setup(
'pytest>=2.7.2', 'pytest>=2.7.2',
'pytest-django', 'pytest-django',
'sqlalchemy', 'sqlalchemy',
'sqlalchemy_utils',
'mock', 'mock',
], ],
extras_require={ extras_require={