Skip to content

Commit 409460f

Browse files
Graphene Core 3> : Passed 93 Tests
1 parent 2409659 commit 409460f

File tree

6 files changed

+63
-38
lines changed

6 files changed

+63
-38
lines changed

graphene_mongo/advanced_types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def resolve_data(self, info):
3030
v = getattr(self.instance, self.key)
3131
data = v.read()
3232
if data is not None:
33-
return base64.b64encode(data)
33+
return base64.b64encode(data).decode("utf-8")
3434
return None
3535

3636

graphene_mongo/fields.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from graphene import Context
1010
from graphene.types.utils import get_type
1111
from graphene.utils.str_converters import to_snake_case
12-
from graphql import ResolveInfo
12+
from graphql import GraphQLResolveInfo
1313
from mongoengine.base import get_document
1414
from promise import Promise
1515
from graphql_relay import from_global_id
@@ -168,7 +168,7 @@ def filter_args(self):
168168
}
169169
filter_type = advanced_filter_types.get(each, filter_type)
170170
filter_args[field + "__" + each] = graphene.Argument(
171-
type=filter_type
171+
type_=filter_type
172172
)
173173
return filter_args
174174

@@ -278,6 +278,9 @@ def get_queryset(self, model, info, required_fields=list(), skip=None, limit=Non
278278

279279
def default_resolver(self, _root, info, required_fields=list(), **args):
280280
args = args or {}
281+
for key, value in dict(args).items():
282+
if value is None:
283+
del args[key]
281284
if _root is not None:
282285
field_name = to_snake_case(info.field_name)
283286
if not hasattr(_root, "_fields_ordered"):
@@ -301,9 +304,13 @@ def default_resolver(self, _root, info, required_fields=list(), **args):
301304
limit = None
302305
reverse = False
303306
first = args.pop("first", None)
304-
after = cursor_to_offset(args.pop("after", None))
307+
after = args.pop("after", None)
308+
if after:
309+
after = cursor_to_offset(after)
305310
last = args.pop("last", None)
306-
before = cursor_to_offset(args.pop("before", None))
311+
before = args.pop("before", None)
312+
if before:
313+
before = cursor_to_offset(before)
307314
if callable(getattr(self.model, "objects", None)):
308315
if "pk__in" in args and args["pk__in"]:
309316
count = len(args["pk__in"])
@@ -318,21 +325,21 @@ def default_resolver(self, _root, info, required_fields=list(), **args):
318325
args["pk__in"] = args["pk__in"][skip:]
319326
iterables = self.get_queryset(self.model, info, required_fields, **args)
320327
list_length = len(iterables)
321-
if isinstance(info, ResolveInfo):
322-
if not info.context:
323-
info.context = Context()
324-
info.context.queryset = self.get_queryset(self.model, info, required_fields, **args)
328+
# if isinstance(info, GraphQLResolveInfo):
329+
# if not info.context:
330+
# info.context = Context()
331+
# info.context.queryset = self.get_queryset(self.model, info, required_fields, **args)
325332
elif _root is None or args:
326333
count = self.get_queryset(self.model, info, required_fields, **args).count()
327334
if count != 0:
328335
skip, limit, reverse = find_skip_and_limit(first=first, after=after, last=last, before=before,
329336
count=count)
330337
iterables = self.get_queryset(self.model, info, required_fields, skip, limit, reverse, **args)
331338
list_length = len(iterables)
332-
if isinstance(info, ResolveInfo):
333-
if not info.context:
334-
info.context = Context()
335-
info.context.queryset = self.get_queryset(self.model, info, required_fields, **args)
339+
# if isinstance(info, GraphQLResolveInfo):
340+
# if not info.context:
341+
# info.context = Context()
342+
# info.context.queryset = self.get_queryset(self.model, info, required_fields, **args)
336343

337344
elif _root is not None:
338345
field_name = to_snake_case(info.field_name)
@@ -381,10 +388,10 @@ def chained_resolver(self, resolver, is_partial, root, info, **args):
381388
for arg_name, arg in args.copy().items():
382389
if arg_name not in self.model._fields_ordered + tuple(self.filter_args.keys()):
383390
args_copy.pop(arg_name)
384-
if isinstance(info, ResolveInfo):
385-
if not info.context:
386-
info.context = Context()
387-
info.context.queryset = self.get_queryset(self.model, info, required_fields, **args_copy)
391+
# if isinstance(info, GraphQLResolveInfo):
392+
# if not info.context:
393+
# info.context = Context()
394+
# info.context.queryset = self.get_queryset(self.model, info, required_fields, **args_copy)
388395
# XXX: Filter nested args
389396
resolved = resolver(root, info, **args)
390397
if resolved is not None:
@@ -415,6 +422,8 @@ def chained_resolver(self, resolver, is_partial, root, info, **args):
415422
args_copy[arg_name + operation.replace('$', '__')] = arg[operation]
416423
del args_copy[arg_name]
417424
return self.default_resolver(root, info, required_fields, **args_copy)
425+
elif isinstance(resolved, Promise):
426+
return resolved.value
418427
else:
419428
return resolved
420429
return self.default_resolver(root, info, required_fields, **args)

graphene_mongo/tests/test_inputs.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ def mutate(self, info, article):
2121
return CreateArticle(article=article)
2222

2323
class Query(graphene.ObjectType):
24-
2524
node = Node.Field()
2625

2726
class Mutation(graphene.ObjectType):
28-
2927
create_article = CreateArticle.Field()
3028

3129
query = """
@@ -57,7 +55,8 @@ class Arguments:
5755
def mutate(self, info, id, editor):
5856
editor_to_update = Editor.objects.get(id=id)
5957
for key, value in editor.items():
60-
setattr(editor_to_update, key, value)
58+
if value:
59+
setattr(editor_to_update, key, value)
6160
editor_to_update.save()
6261
return UpdateEditor(editor=editor_to_update)
6362

graphene_mongo/tests/test_query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def resolve_editors(self, *args, **kwargs):
5555
"chunkSize": 261120,
5656
"length": 46928,
5757
"md5": "f3c657fd472fdc4bc2ca9056a1ae6106",
58-
"data": str(data),
58+
"data": data.decode("utf-8"),
5959
},
6060
},
6161
"editors": [

graphene_mongo/tests/test_relay_query.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class Query(graphene.ObjectType):
173173
"avatar": {
174174
"contentType": "image/jpeg",
175175
"length": 46928,
176-
"data": str(data),
176+
"data": data.decode("utf-8"),
177177
},
178178
}
179179
},
@@ -489,7 +489,6 @@ class Query(graphene.ObjectType):
489489

490490
def test_should_first_n(fixtures):
491491
class Query(graphene.ObjectType):
492-
493492
editors = MongoengineConnectionField(nodes.EditorNode)
494493

495494
query = """
@@ -533,7 +532,6 @@ class Query(graphene.ObjectType):
533532

534533
def test_should_after(fixtures):
535534
class Query(graphene.ObjectType):
536-
537535
players = MongoengineConnectionField(nodes.PlayerNode)
538536

539537
query = """
@@ -566,7 +564,6 @@ class Query(graphene.ObjectType):
566564

567565
def test_should_before(fixtures):
568566
class Query(graphene.ObjectType):
569-
570567
players = MongoengineConnectionField(nodes.PlayerNode)
571568

572569
query = """
@@ -632,7 +629,6 @@ class Query(graphene.ObjectType):
632629

633630
def test_should_self_reference(fixtures):
634631
class Query(graphene.ObjectType):
635-
636632
players = MongoengineConnectionField(nodes.PlayerNode)
637633

638634
query = """
@@ -767,7 +763,6 @@ class Query(graphene.ObjectType):
767763

768764
def test_should_query_with_embedded_document(fixtures):
769765
class Query(graphene.ObjectType):
770-
771766
professors = MongoengineConnectionField(nodes.ProfessorVectorNode)
772767

773768
query = """
@@ -1026,7 +1021,6 @@ class Query(graphene.ObjectType):
10261021

10271022

10281023
def test_should_filter_mongoengine_queryset_by_id_and_other_fields(fixtures):
1029-
10301024
class Query(graphene.ObjectType):
10311025
players = MongoengineConnectionField(nodes.PlayerNode)
10321026

graphene_mongo/utils.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import mongoengine
77
from graphene import Node
88
from graphene.utils.trim_docstring import trim_docstring
9-
from graphql.utils.ast_to_dict import ast_to_dict
9+
# from graphql.utils.ast_to_dict import ast_to_dict
10+
from graphql import FieldNode
1011
from graphql_relay.connection.arrayconnection import offset_to_cursor
1112

1213

@@ -126,19 +127,23 @@ def collect_query_fields(node, fragments):
126127
"""
127128

128129
field = {}
129-
130-
if node.get('selection_set'):
131-
for leaf in node['selection_set']['selections']:
132-
if leaf['kind'] == 'Field':
130+
selection_set = None
131+
if type(node) == dict:
132+
selection_set = node.get('selection_set')
133+
else:
134+
selection_set = node.selection_set
135+
if selection_set:
136+
for leaf in selection_set.selections:
137+
if leaf.kind == 'field':
133138
field.update({
134-
leaf['name']['value']: collect_query_fields(leaf, fragments)
139+
leaf.name.value: collect_query_fields(leaf, fragments)
135140
})
136-
elif leaf['kind'] == 'FragmentSpread':
141+
elif leaf.kind == 'FragmentSpread':
137142
field.update(collect_query_fields(fragments[leaf['name']['value']],
138143
fragments))
139-
elif leaf['kind'] == 'InlineFragment':
144+
elif leaf.kind == 'InlineFragment':
140145
field.update({
141-
leaf["type_condition"]["name"]['value']: collect_query_fields(leaf, fragments)
146+
leaf["type_condition"].name.value: collect_query_fields(leaf, fragments)
142147
})
143148
pass
144149

@@ -156,7 +161,7 @@ def get_query_fields(info):
156161
"""
157162

158163
fragments = {}
159-
node = ast_to_dict(info.field_asts[0])
164+
node = ast_to_dict(info.field_nodes[0])
160165

161166
for name, value in info.fragments.items():
162167
fragments[name] = ast_to_dict(value)
@@ -167,6 +172,24 @@ def get_query_fields(info):
167172
return query
168173

169174

175+
def ast_to_dict(node, include_loc=False):
176+
if isinstance(node, FieldNode):
177+
d = {"kind": node.__class__.__name__}
178+
if hasattr(node, "keys"):
179+
for field in node.keys:
180+
d[field] = ast_to_dict(getattr(node, field), include_loc)
181+
182+
if include_loc and hasattr(node, "loc") and node.loc:
183+
d["loc"] = {"start": node.loc.start, "end": node.loc.end}
184+
185+
return d
186+
187+
elif isinstance(node, list):
188+
return [ast_to_dict(item, include_loc) for item in node]
189+
190+
return node
191+
192+
170193
def find_skip_and_limit(first, last, after, before, count):
171194
reverse = False
172195
skip = 0

0 commit comments

Comments
 (0)