From ca0d1a3d7af27d8077bc286552d7e36df3699ecc Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 2 Apr 2016 18:58:36 -0700 Subject: [PATCH] Added RangeField conversion and testing --- graphene/contrib/django/compat.py | 4 +- graphene/contrib/django/converter.py | 20 ++++++++-- .../contrib/django/tests/test_converter.py | 10 ++++- graphene/contrib/django/tests/test_query.py | 40 ++++++++++++++++++- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/graphene/contrib/django/compat.py b/graphene/contrib/django/compat.py index 306b46b3..4b1f55a6 100644 --- a/graphene/contrib/django/compat.py +++ b/graphene/contrib/django/compat.py @@ -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 diff --git a/graphene/contrib/django/converter.py b/graphene/contrib/django/converter.py index 6fd84e99..454edab3 100644 --- a/graphene/contrib/django/converter.py +++ b/graphene/contrib/django/converter.py @@ -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) diff --git a/graphene/contrib/django/tests/test_converter.py b/graphene/contrib/django/tests/test_converter.py index a22dfbae..8628ad12 100644 --- a/graphene/contrib/django/tests/test_converter.py +++ b/graphene/contrib/django/tests/test_converter.py @@ -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) diff --git a/graphene/contrib/django/tests/test_query.py b/graphene/contrib/django/tests/test_query.py index 460c8e22..85cdf103 100644 --- a/graphene/contrib/django/tests/test_query.py +++ b/graphene/contrib/django/tests/test_query.py @@ -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):