Skip to content

Commit b3693e3

Browse files
committed
Added support for sqlalchemy choice
1 parent 7aa7c5a commit b3693e3

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ before_install:
2323
install:
2424
- |
2525
if [ "$TEST_TYPE" = build ]; then
26-
pip install --download-cache $HOME/.cache/pip/ pytest pytest-cov coveralls six pytest-django django-filter
26+
pip install --download-cache $HOME/.cache/pip/ pytest pytest-cov coveralls six pytest-django django-filter sqlalchemy_utils
2727
pip install --download-cache $HOME/.cache/pip/ -e .[django]
2828
pip install --download-cache $HOME/.cache/pip/ -e .[sqlalchemy]
2929
pip install django==$DJANGO_VERSION

graphene/contrib/sqlalchemy/converter.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@
22

33
from sqlalchemy import types
44
from sqlalchemy.orm import interfaces
5+
try:
6+
from sqlalchemy_utils.types.choice import ChoiceType
7+
except ImportError:
8+
class ChoiceType(object):
9+
pass
510

11+
from ...core.classtypes.enum import Enum
612
from ...core.types.scalars import ID, Boolean, Float, Int, String
713
from .fields import ConnectionOrListField, SQLAlchemyModelField
814

@@ -59,3 +65,9 @@ def convert_column_to_boolean(type, column):
5965
@convert_sqlalchemy_type.register(types.Numeric)
6066
def convert_column_to_float(type, column):
6167
return Float(description=column.doc)
68+
69+
70+
@convert_sqlalchemy_type.register(ChoiceType)
71+
def convert_column_to_enum(type, column):
72+
name = '{}_{}'.format(column.table.name, column.name).upper()
73+
return Enum(name, type.choices, description=column.doc)

graphene/contrib/sqlalchemy/tests/test_converter.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
convert_sqlalchemy_relationship)
66
from graphene.contrib.sqlalchemy.fields import (ConnectionOrListField,
77
SQLAlchemyModelField)
8-
from sqlalchemy import Column, types
8+
from sqlalchemy import Table, Column, types
9+
from sqlalchemy.ext.declarative import declarative_base
10+
from sqlalchemy_utils.types.choice import ChoiceType
911

1012
from .models import Article, Pet, Reporter
1113

@@ -85,6 +87,23 @@ def test_should_numeric_convert_float():
8587
assert_column_conversion(types.Numeric(), graphene.Float)
8688

8789

90+
def test_should_choice_convert_enum():
91+
TYPES = [
92+
(u'es', u'Spanish'),
93+
(u'en', u'English')
94+
]
95+
column = Column(ChoiceType(TYPES), doc='Language', name='language')
96+
Base = declarative_base()
97+
98+
Table('translatedmodel', Base.metadata, column)
99+
graphene_type = convert_sqlalchemy_column(column)
100+
assert issubclass(graphene_type, graphene.Enum)
101+
assert graphene_type._meta.type_name == 'TRANSLATEDMODEL_LANGUAGE'
102+
assert graphene_type._meta.description == 'Language'
103+
assert graphene_type.__enum__.__members__['es'].value == 'Spanish'
104+
assert graphene_type.__enum__.__members__['en'].value == 'English'
105+
106+
88107
def test_should_manytomany_convert_connectionorlist():
89108
graphene_type = convert_sqlalchemy_relationship(Reporter.pets.property)
90109
assert isinstance(graphene_type, ConnectionOrListField)

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def run_tests(self):
6363
'pytest>=2.7.2',
6464
'pytest-django',
6565
'sqlalchemy',
66+
'sqlalchemy_utils',
6667
'mock',
6768
],
6869
extras_require={

0 commit comments

Comments
 (0)