Skip to content

Commit 7073208

Browse files
committed
Django integration finished
1 parent a55222e commit 7073208

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+273
-188
lines changed

bin/autolinter

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/bin/bash
22

3-
autoflake ./ -r --remove-unused-variables --remove-all-unused-imports --in-place
3+
autoflake ./ -r --remove-unused-variables --remove-all-unused-imports --in-place
4+
autopep8 ./ -r --in-place
45
isort -rc .

examples/starwars_django/schema.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313

1414
class Ship(DjangoNode):
15+
1516
class Meta:
1617
model = ShipModel
1718

@@ -21,11 +22,13 @@ def get_node(cls, id):
2122

2223

2324
class Character(DjangoObjectType):
25+
2426
class Meta:
2527
model = CharacterModel
2628

2729

2830
class Faction(DjangoNode):
31+
2932
class Meta:
3033
model = FactionModel
3134

@@ -35,6 +38,7 @@ def get_node(cls, id):
3538

3639

3740
class IntroduceShip(relay.ClientIDMutation):
41+
3842
class Input:
3943
ship_name = graphene.StringField(required=True)
4044
faction_id = graphene.StringField(required=True)
@@ -48,7 +52,7 @@ def mutate_and_get_payload(cls, input, info):
4852
faction_id = input.get('faction_id')
4953
ship = create_ship(ship_name, faction_id)
5054
faction = get_faction(faction_id)
51-
return IntroduceShip(ship=ship, faction=faction)
55+
return IntroduceShip(ship=Ship(ship), faction=Faction(faction))
5256

5357

5458
class Query(graphene.ObjectType):

graphene/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
Mutation,
1515
BaseType,
1616
LazyType,
17-
OrderedType,
1817
Argument,
1918
Field,
2019
InputField,
@@ -28,7 +27,6 @@
2827
)
2928

3029
from graphene.core.fields import (
31-
Field,
3230
StringField,
3331
IntField,
3432
BooleanField,
@@ -42,7 +40,7 @@
4240
resolve_only_args
4341
)
4442

45-
__all__ = ['Enum', 'Argument', 'String', 'Int', 'ID', 'signals', 'Schema',
46-
'ObjectType', 'Interface', 'Mutation', 'Field', 'StringField',
43+
__all__ = ['Enum', 'Argument', 'String', 'Int', 'Boolean', 'Float', 'ID', 'List', 'NonNull', 'signals', 'Schema',
44+
'BaseType', 'LazyType', 'ObjectType', 'Interface', 'Mutation', 'Field', 'InputField', 'StringField',
4745
'IntField', 'BooleanField', 'IDField', 'ListField', 'NonNullField',
4846
'FloatField', 'resolve_only_args']

graphene/contrib/django/converter.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33

44
from graphene.contrib.django.fields import (ConnectionOrListField,
55
DjangoModelField)
6-
from graphene.core.fields import (BooleanField, FloatField, IDField, IntField,
7-
StringField)
8-
from graphene.core.types.scalars import Boolean, Float, ID, Int, String
6+
from graphene.core.types.scalars import ID, Boolean, Float, Int, String
97

108
try:
119
UUIDField = models.UUIDField

graphene/contrib/django/fields.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from graphene import relay
22
from graphene.contrib.django.utils import get_type_for_model, lazy_map
3-
from graphene.core.fields import Field, ListField
3+
from graphene.core.exceptions import SkipField
4+
from graphene.core.fields import Field
45
from graphene.core.types.base import FieldType
6+
from graphene.core.types.definitions import List
57
from graphene.relay.utils import is_node
68

79

@@ -12,7 +14,10 @@ def wrap_resolved(self, value, instance, args, info):
1214
return lazy_map(value, self.type.get_object_type(schema))
1315

1416

15-
class LazyListField(ListField):
17+
class LazyListField(Field):
18+
19+
def get_type(self, schema):
20+
return List(self.type)
1621

1722
def resolver(self, instance, args, info):
1823
schema = info.schema.graphene_schema
@@ -51,6 +56,8 @@ def internal_type(self, schema):
5156
self.parent,
5257
)
5358
)
59+
if not _type:
60+
raise SkipField()
5461
return schema.T(_type)
5562

5663
def get_object_type(self, schema):
File renamed without changes.

tests/contrib_django/test_converter.py renamed to graphene/contrib/django/tests/test_converter.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11

22
from django.db import models
33
from py.test import raises
4-
from pytest import raises
54

65
import graphene
76
from graphene.contrib.django.converter import convert_django_field
Lines changed: 24 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,21 @@
1-
21
from py.test import raises
3-
from pytest import raises
42

53
import graphene
64
from graphene import relay
75
from graphene.contrib.django import DjangoNode, DjangoObjectType
8-
from tests.utils import assert_equal_lists
96

107
from .models import Article, Reporter
118

129

13-
def test_should_raise_if_no_model():
14-
with raises(Exception) as excinfo:
15-
class Character1(DjangoObjectType):
16-
pass
17-
assert 'model in the Meta' in str(excinfo.value)
18-
19-
20-
def test_should_raise_if_model_is_invalid():
21-
with raises(Exception) as excinfo:
22-
class Character2(DjangoObjectType):
23-
24-
class Meta:
25-
model = 1
26-
assert 'not a Django model' in str(excinfo.value)
27-
28-
29-
def test_should_raise_if_model_is_invalid():
30-
with raises(Exception) as excinfo:
31-
class ReporterTypeError(DjangoObjectType):
10+
def test_should_query_only_fields():
11+
with raises(Exception):
12+
class ReporterType(DjangoObjectType):
3213

3314
class Meta:
3415
model = Reporter
3516
only_fields = ('articles', )
3617

37-
schema = graphene.Schema(query=ReporterTypeError)
18+
schema = graphene.Schema(query=ReporterType)
3819
query = '''
3920
query ReporterQuery {
4021
articles
@@ -44,24 +25,13 @@ class Meta:
4425
assert not result.errors
4526

4627

47-
def test_should_map_fields_correctly():
48-
class ReporterType2(DjangoObjectType):
49-
50-
class Meta:
51-
model = Reporter
52-
assert_equal_lists(
53-
ReporterType2._meta.fields_map.keys(),
54-
['articles', 'first_name', 'last_name', 'email', 'pets', 'id']
55-
)
56-
57-
58-
def test_should_map_fields():
28+
def test_should_query_well():
5929
class ReporterType(DjangoObjectType):
6030

6131
class Meta:
6232
model = Reporter
6333

64-
class Query2(graphene.ObjectType):
34+
class Query(graphene.ObjectType):
6535
reporter = graphene.Field(ReporterType)
6636

6737
def resolve_reporter(self, *args, **kwargs):
@@ -83,53 +53,41 @@ def resolve_reporter(self, *args, **kwargs):
8353
'email': ''
8454
}
8555
}
86-
Schema = graphene.Schema(query=Query2)
87-
result = Schema.execute(query)
56+
schema = graphene.Schema(query=Query)
57+
result = schema.execute(query)
8858
assert not result.errors
8959
assert result.data == expected
9060

9161

92-
def test_should_map_only_few_fields():
93-
class Reporter2(DjangoObjectType):
94-
95-
class Meta:
96-
model = Reporter
97-
only_fields = ('id', 'email')
98-
assert_equal_lists(
99-
Reporter2._meta.fields_map.keys(),
100-
['id', 'email']
101-
)
102-
103-
10462
def test_should_node():
105-
class ReporterNodeType(DjangoNode):
63+
class ReporterNode(DjangoNode):
10664

10765
class Meta:
10866
model = Reporter
10967

11068
@classmethod
11169
def get_node(cls, id):
112-
return ReporterNodeType(Reporter(id=2, first_name='Cookie Monster'))
70+
return ReporterNode(Reporter(id=2, first_name='Cookie Monster'))
11371

11472
def resolve_articles(self, *args, **kwargs):
115-
return [ArticleNodeType(Article(headline='Hi!'))]
73+
return [ArticleNode(Article(headline='Hi!'))]
11674

117-
class ArticleNodeType(DjangoNode):
75+
class ArticleNode(DjangoNode):
11876

11977
class Meta:
12078
model = Article
12179

12280
@classmethod
12381
def get_node(cls, id):
124-
return ArticleNodeType(Article(id=1, headline='Article node'))
82+
return ArticleNode(Article(id=1, headline='Article node'))
12583

126-
class Query1(graphene.ObjectType):
84+
class Query(graphene.ObjectType):
12785
node = relay.NodeField()
128-
reporter = graphene.Field(ReporterNodeType)
129-
article = graphene.Field(ArticleNodeType)
86+
reporter = graphene.Field(ReporterNode)
87+
article = graphene.Field(ArticleNode)
13088

13189
def resolve_reporter(self, *args, **kwargs):
132-
return ReporterNodeType(Reporter(id=1, first_name='ABA', last_name='X'))
90+
return ReporterNode(Reporter(id=1, first_name='ABA', last_name='X'))
13391

13492
query = '''
13593
query ReporterQuery {
@@ -146,20 +104,20 @@ def resolve_reporter(self, *args, **kwargs):
146104
lastName,
147105
email
148106
}
149-
myArticle: node(id:"QXJ0aWNsZU5vZGVUeXBlOjE=") {
107+
myArticle: node(id:"QXJ0aWNsZU5vZGU6MQ==") {
150108
id
151-
... on ReporterNodeType {
109+
... on ReporterNode {
152110
firstName
153111
}
154-
... on ArticleNodeType {
112+
... on ArticleNode {
155113
headline
156114
}
157115
}
158116
}
159117
'''
160118
expected = {
161119
'reporter': {
162-
'id': 'UmVwb3J0ZXJOb2RlVHlwZTox',
120+
'id': 'UmVwb3J0ZXJOb2RlOjE=',
163121
'firstName': 'ABA',
164122
'lastName': 'X',
165123
'email': '',
@@ -172,11 +130,11 @@ def resolve_reporter(self, *args, **kwargs):
172130
},
173131
},
174132
'myArticle': {
175-
'id': 'QXJ0aWNsZU5vZGVUeXBlOjE=',
133+
'id': 'QXJ0aWNsZU5vZGU6MQ==',
176134
'headline': 'Article node'
177135
}
178136
}
179-
Schema = graphene.Schema(query=Query1)
180-
result = Schema.execute(query)
137+
schema = graphene.Schema(query=Query)
138+
result = schema.execute(query)
181139
assert not result.errors
182140
assert result.data == expected

0 commit comments

Comments
 (0)