Skip to content

Commit a55222e

Browse files
committed
Merge branch '0.4.0-cov' of github.com:graphql-python/graphene into 0.4.0-cov
2 parents 2fed5c7 + cf657b3 commit a55222e

File tree

10 files changed

+78
-75
lines changed

10 files changed

+78
-75
lines changed

graphene/contrib/django/converter.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
DjangoModelField)
66
from graphene.core.fields import (BooleanField, FloatField, IDField, IntField,
77
StringField)
8+
from graphene.core.types.scalars import Boolean, Float, ID, Int, String
89

910
try:
1011
UUIDField = models.UUIDField
@@ -28,12 +29,12 @@ def convert_django_field(field):
2829
@convert_django_field.register(models.URLField)
2930
@convert_django_field.register(UUIDField)
3031
def convert_field_to_string(field):
31-
return StringField(description=field.help_text)
32+
return String(description=field.help_text)
3233

3334

3435
@convert_django_field.register(models.AutoField)
3536
def convert_field_to_id(field):
36-
return IDField(description=field.help_text)
37+
return ID(description=field.help_text)
3738

3839

3940
@convert_django_field.register(models.PositiveIntegerField)
@@ -42,23 +43,23 @@ def convert_field_to_id(field):
4243
@convert_django_field.register(models.BigIntegerField)
4344
@convert_django_field.register(models.IntegerField)
4445
def convert_field_to_int(field):
45-
return IntField(description=field.help_text)
46+
return Int(description=field.help_text)
4647

4748

4849
@convert_django_field.register(models.BooleanField)
4950
def convert_field_to_boolean(field):
50-
return BooleanField(description=field.help_text, required=True)
51+
return Boolean(description=field.help_text, required=True)
5152

5253

5354
@convert_django_field.register(models.NullBooleanField)
5455
def convert_field_to_nullboolean(field):
55-
return BooleanField(description=field.help_text)
56+
return Boolean(description=field.help_text)
5657

5758

5859
@convert_django_field.register(models.DecimalField)
5960
@convert_django_field.register(models.FloatField)
6061
def convert_field_to_float(field):
61-
return FloatField(description=field.help_text)
62+
return Float(description=field.help_text)
6263

6364

6465
@convert_django_field.register(models.ManyToManyField)

graphene/contrib/django/fields.py

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,57 @@
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, LazyField, ListField
3+
from graphene.core.fields import Field, ListField
4+
from graphene.core.types.base import FieldType
45
from graphene.relay.utils import is_node
56

67

78
class DjangoConnectionField(relay.ConnectionField):
89

910
def wrap_resolved(self, value, instance, args, info):
1011
schema = info.schema.graphene_schema
11-
return lazy_map(value, self.get_object_type(schema))
12+
return lazy_map(value, self.type.get_object_type(schema))
1213

1314

1415
class LazyListField(ListField):
1516

16-
def resolve(self, instance, args, info):
17+
def resolver(self, instance, args, info):
1718
schema = info.schema.graphene_schema
18-
resolved = super(LazyListField, self).resolve(instance, args, info)
19+
resolved = super(LazyListField, self).resolver(instance, args, info)
1920
return lazy_map(resolved, self.get_object_type(schema))
2021

2122

22-
class ConnectionOrListField(LazyField):
23+
class ConnectionOrListField(Field):
2324

24-
def get_field(self, schema):
25-
model_field = self.field_type
25+
def internal_type(self, schema):
26+
model_field = self.type
2627
field_object_type = model_field.get_object_type(schema)
2728
if is_node(field_object_type):
2829
field = DjangoConnectionField(model_field)
2930
else:
3031
field = LazyListField(model_field)
3132
field.contribute_to_class(self.object_type, self.name)
32-
return field
33+
return field.internal_type(schema)
3334

3435

35-
class DjangoModelField(Field):
36+
class DjangoModelField(FieldType):
3637

3738
def __init__(self, model, *args, **kwargs):
38-
super(DjangoModelField, self).__init__(None, *args, **kwargs)
3939
self.model = model
40-
41-
def resolve(self, instance, args, info):
42-
resolved = super(DjangoModelField, self).resolve(instance, args, info)
43-
schema = info.schema.graphene_schema
44-
_type = self.get_object_type(schema)
45-
assert _type, ("Field %s cannot be retrieved as the "
46-
"ObjectType is not registered by the schema" % (
47-
self.attname
48-
))
49-
return _type(resolved)
40+
super(DjangoModelField, self).__init__(*args, **kwargs)
5041

5142
def internal_type(self, schema):
5243
_type = self.get_object_type(schema)
53-
if not _type and self.object_type._meta.only_fields:
44+
if not _type and self.parent._meta.only_fields:
5445
raise Exception(
5546
"Model %r is not accessible by the schema. "
5647
"You can either register the type manually "
5748
"using @schema.register. "
58-
"Or disable the field %s in %s" % (
49+
"Or disable the field in %s" % (
5950
self.model,
60-
self.attname,
61-
self.object_type
51+
self.parent,
6252
)
6353
)
64-
return schema.T(_type) or Field.SKIP
54+
return schema.T(_type)
6555

6656
def get_object_type(self, schema):
6757
return get_type_for_model(schema, self.model)

graphene/core/schema.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ def T(self, object_type):
4040
if object_type not in self._types:
4141
internal_type = object_type.internal_type(self)
4242
self._types[object_type] = internal_type
43-
name = getattr(internal_type, 'name', None)
44-
if name:
45-
self._types_names[name] = object_type
43+
is_objecttype = inspect.isclass(object_type) and issubclass(object_type, BaseObjectType)
44+
if is_objecttype:
45+
self.register(object_type)
4646
return self._types[object_type]
4747
else:
4848
return object_type
@@ -65,6 +65,10 @@ def schema(self):
6565
return GraphQLSchema(self, query=self.T(self.query), mutation=self.T(self.mutation))
6666

6767
def register(self, object_type):
68+
type_name = object_type._meta.type_name
69+
registered_object_type = self._types_names.get(type_name, None)
70+
if registered_object_type:
71+
assert registered_object_type == object_type, 'Type {} already registered with other object type'.format(type_name)
6872
self._types_names[object_type._meta.type_name] = object_type
6973
return object_type
7074

graphene/core/types/field.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ def __init__(self, type, description=None, args=None, name=None, resolver=None,
3131
if isinstance(type, six.string_types):
3232
type = LazyType(type)
3333
self.required = required
34-
if self.required:
35-
type = NonNull(type)
3634
self.type = type
3735
self.description = description
3836
args = OrderedDict(args or {}, **kwargs)
3937
self.arguments = ArgumentsGroup(*args_list, **args)
4038
self.object_type = None
41-
self.resolver = resolver
39+
self.resolver_fn = resolver
4240
self.default = default
4341

4442
def contribute_to_class(self, cls, attname):
@@ -54,11 +52,11 @@ def contribute_to_class(self, cls, attname):
5452

5553
@property
5654
def resolver(self):
57-
return self._resolver or self.get_resolver_fn()
55+
return self.resolver_fn or self.get_resolver_fn()
5856

5957
@resolver.setter
6058
def resolver(self, value):
61-
self._resolver = value
59+
self.resolver_fn = value
6260

6361
def get_resolver_fn(self):
6462
resolve_fn_name = 'resolve_%s' % self.attname
@@ -70,6 +68,8 @@ def default_getter(instance, args, info):
7068
return default_getter
7169

7270
def get_type(self, schema):
71+
if self.required:
72+
return NonNull(self.type)
7373
return self.type
7474

7575
def internal_type(self, schema):

graphene/relay/fields.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections import Iterable
22

33
from graphene.core.fields import Field, IDField
4-
from graphene.core.types.scalars import String, ID
4+
from graphene.core.types.scalars import String, ID, Int
55
from graphql.core.type import GraphQLArgument, GraphQLID, GraphQLNonNull
66
from graphql_relay.connection.arrayconnection import connection_from_list
77
from graphql_relay.node.node import from_global_id
@@ -14,8 +14,8 @@ def __init__(self, field_type, resolver=None, description='',
1414
super(ConnectionField, self).__init__(field_type, resolver=resolver,
1515
before=String(),
1616
after=String(),
17-
first=String(),
18-
last=String(),
17+
first=Int(),
18+
last=Int(),
1919
description=description, **kwargs)
2020
self.connection_type = connection_type
2121
self.edge_type = edge_type
@@ -24,17 +24,18 @@ def wrap_resolved(self, value, instance, args, info):
2424
return value
2525

2626

27-
def resolve(self, instance, args, info):
27+
def resolver(self, instance, args, info):
2828
from graphene.relay.types import PageInfo
2929
schema = info.schema.graphene_schema
3030

31-
resolved = super(ConnectionField, self).resolve(instance, args, info)
31+
resolved = super(ConnectionField, self).resolver(instance, args, info)
3232
if resolved:
3333
resolved = self.wrap_resolved(resolved, instance, args, info)
3434
assert isinstance(
3535
resolved, Iterable), 'Resolved value from the connection field have to be iterable'
3636

37-
node = self.get_object_type(schema)
37+
type = schema.T(self.type)
38+
node = schema.objecttype(type)
3839
connection_type = self.get_connection_type(node)
3940
edge_type = self.get_edge_type(node)
4041

@@ -81,20 +82,22 @@ def id_fetcher(self, global_id, info):
8182

8283
return object_type.get_node(_id)
8384

84-
def resolve(self, instance, args, info):
85+
def resolver(self, instance, args, info):
8586
global_id = args.get('id')
8687
return self.id_fetcher(global_id, info)
8788

8889

89-
class GlobalIDField(IDField):
90+
class GlobalIDField(Field):
9091
'''The ID of an object'''
91-
required = True
92+
def __init__(self, *args, **kwargs):
93+
super(GlobalIDField, self).__init__(ID(), *args, **kwargs)
94+
self.required = True
9295

9396
def contribute_to_class(self, cls, name):
9497
from graphene.relay.utils import is_node, is_node_type
9598
in_node = is_node(cls) or is_node_type(cls)
9699
assert in_node, 'GlobalIDField could only be inside a Node, but got %r' % cls
97100
super(GlobalIDField, self).contribute_to_class(cls, name)
98101

99-
def resolve(self, instance, args, info):
102+
def resolver(self, instance, args, info):
100103
return self.object_type.to_global_id(instance, args, info)

tests/relay/test_relayfields.py renamed to graphene/relay/tests/test_query.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class MyNode(relay.Node):
1515

1616
@classmethod
1717
def get_node(cls, id):
18-
return MyNode(name='mo')
18+
return MyNode(id=id, name='mo')
1919

2020

2121
class Query(graphene.ObjectType):
@@ -35,6 +35,7 @@ def test_nodefield_query():
3535
query = '''
3636
query RebelsShipsQuery {
3737
myNode(id:"TXlOb2RlOjE=") {
38+
id
3839
name
3940
},
4041
allMyNodes (customArg:"1") {
@@ -52,6 +53,7 @@ def test_nodefield_query():
5253
'''
5354
expected = {
5455
'myNode': {
56+
'id': 'TXlOb2RlOjE=',
5557
'name': 'mo'
5658
},
5759
'allMyNodes': {
File renamed without changes.

0 commit comments

Comments
 (0)