Added RangeField conversion and testing

This commit is contained in:
Syrus Akbary 2016-04-02 18:58:36 -07:00
parent 7f96500353
commit ca0d1a3d7a
4 changed files with 66 additions and 8 deletions

View File

@ -19,6 +19,6 @@ except:
try:
# Postgres fields are only available in Django 1.8+
from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField
from django.contrib.postgres.fields import ArrayField, HStoreField, JSONField, RangeField
except ImportError:
ArrayField, HStoreField, JSONField = (MissingType, ) * 3
ArrayField, HStoreField, JSONField, RangeField = (MissingType, ) * 4

View File

@ -1,9 +1,11 @@
from django.db import models
from ...core.classtypes.objecttype import ObjectType
from ...core.types.definitions import List
from ...core.types.field import Field
from ...core.types.scalars import ID, Boolean, Float, Int, String
from ...core.classtypes.enum import Enum
from .compat import RelatedObject, UUIDField, ArrayField, HStoreField, JSONField
from .compat import RelatedObject, UUIDField, ArrayField, HStoreField, JSONField, RangeField
from .utils import get_related_model, import_single_dispatch
singledispatch = import_single_dispatch()
@ -34,8 +36,6 @@ def convert_django_field(field):
@convert_django_field.register(models.GenericIPAddressField)
@convert_django_field.register(models.FileField)
@convert_django_field.register(UUIDField)
@convert_django_field.register(HStoreField)
@convert_django_field.register(JSONField)
def convert_field_to_string(field):
return String(description=field.help_text)
@ -95,6 +95,18 @@ def convert_field_to_djangomodel(field):
@convert_django_field.register(ArrayField)
def convert_field_to_list(field):
def convert_postgres_array_to_list(field):
base_type = convert_django_field(field.base_field)
return List(base_type, description=field.help_text)
@convert_django_field.register(HStoreField)
@convert_django_field.register(JSONField)
def convert_posgres_field_to_string(field):
return String(description=field.help_text)
@convert_django_field.register(RangeField)
def convert_posgres_range_to_string(field):
inner_type = convert_django_field(field.base_field)
return List(inner_type, description=field.help_text)

View File

@ -7,7 +7,7 @@ from ..converter import (
convert_django_field, convert_django_field_with_choices)
from ..fields import (ConnectionOrListField,
DjangoModelField)
from ..compat import MissingType, ArrayField, HStoreField, JSONField
from ..compat import MissingType, ArrayField, HStoreField, JSONField, RangeField
from .models import Article, Reporter
@ -175,3 +175,11 @@ def test_should_postgres_hstore_convert_string():
reason="JSONField should exist")
def test_should_postgres_json_convert_string():
assert_conversion(JSONField, graphene.String)
@pytest.mark.skipif(RangeField is MissingType,
reason="RangeField should exist")
def test_should_postgres_range_convert_list():
from django.contrib.postgres.fields import IntegerRangeField
field = assert_conversion(IntegerRangeField, graphene.List)
assert isinstance(field.type.of_type, graphene.Int)

View File

@ -1,9 +1,11 @@
import pytest
from py.test import raises
from django.db import models
import graphene
from graphene import relay
from graphene.contrib.django import DjangoNode, DjangoObjectType
from ..types import DjangoNode, DjangoObjectType
from ..compat import MissingType, ArrayField, HStoreField, JSONField, RangeField
from .models import Article, Reporter
@ -62,6 +64,42 @@ def test_should_query_well():
assert result.data == expected
@pytest.mark.skipif(RangeField is MissingType,
reason="RangeField should exist")
def test_should_query_ranges():
from django.contrib.postgres.fields import IntegerRangeField
class Event(models.Model):
ages = IntegerRangeField(help_text='Range desc')
class EventType(DjangoObjectType):
class Meta:
model = Event
class Query(graphene.ObjectType):
event = graphene.Field(EventType)
def resolve_event(self, *args, **kwargs):
return Event(ages=(0, 10))
schema = graphene.Schema(query=Query)
query = '''
query myQuery {
event {
ages
}
}
'''
expected = {
'event': {
'ages': [0, 10],
},
}
result = schema.execute(query)
assert not result.errors
assert result.data == expected
def test_should_node():
class ReporterNode(DjangoNode):