Skip to content

Commit 33c6fdf

Browse files
committed
Added graphql-core min version to requirements
1 parent a480a39 commit 33c6fdf

File tree

3 files changed

+33
-25
lines changed

3 files changed

+33
-25
lines changed

graphene_django/tests/test_views.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,11 @@ def test_handles_field_errors_caught_by_graphql(client):
448448
assert response.status_code == 200
449449
assert response_json(response) == {
450450
'data': None,
451-
'errors': [{'locations': [{'column': 2, 'line': 1}], 'message': 'Throws!'}]
451+
'errors': [{
452+
'locations': [{'column': 2, 'line': 1}],
453+
'path': ['thrower'],
454+
'message': 'Throws!',
455+
}]
452456
}
453457

454458

@@ -457,7 +461,7 @@ def test_handles_syntax_errors_caught_by_graphql(client):
457461
assert response.status_code == 400
458462
assert response_json(response) == {
459463
'errors': [{'locations': [{'column': 1, 'line': 1}],
460-
'message': 'Syntax Error GraphQL request (1:1) '
464+
'message': 'Syntax Error GraphQL (1:1) '
461465
'Unexpected Name "syntaxerror"\n\n1: syntaxerror\n ^\n'}]
462466
}
463467

graphene_django/views.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from django.views.generic import View
1111
from django.views.decorators.csrf import ensure_csrf_cookie
1212

13-
from graphql import Source, execute, parse, validate
13+
from graphql import get_default_backend
1414
from graphql.error import format_error as format_graphql_error
1515
from graphql.error import GraphQLError
1616
from graphql.execution import ExecutionResult
@@ -59,16 +59,20 @@ class GraphQLView(View):
5959
schema = None
6060
graphiql = False
6161
executor = None
62+
backend = None
6263
middleware = None
6364
root_value = None
6465
pretty = False
6566
batch = False
6667

6768
def __init__(self, schema=None, executor=None, middleware=None, root_value=None, graphiql=False, pretty=False,
68-
batch=False):
69+
batch=False, backend=None):
6970
if not schema:
7071
schema = graphene_settings.SCHEMA
7172

73+
if backend is None:
74+
backend = get_default_backend()
75+
7276
if middleware is None:
7377
middleware = graphene_settings.MIDDLEWARE
7478

@@ -80,6 +84,7 @@ def __init__(self, schema=None, executor=None, middleware=None, root_value=None,
8084
self.pretty = self.pretty or pretty
8185
self.graphiql = self.graphiql or graphiql
8286
self.batch = self.batch or batch
87+
self.backend = backend
8388

8489
assert isinstance(
8590
self.schema, GraphQLSchema), 'A Schema is required to be provided to GraphQLView.'
@@ -96,6 +101,9 @@ def get_middleware(self, request):
96101
def get_context(self, request):
97102
return request
98103

104+
def get_backend(self, request):
105+
return self.backend
106+
99107
@method_decorator(ensure_csrf_cookie)
100108
def dispatch(self, request, *args, **kwargs):
101109
try:
@@ -225,49 +233,44 @@ def parse_body(self, request):
225233

226234
return {}
227235

228-
def execute(self, *args, **kwargs):
229-
return execute(self.schema, *args, **kwargs)
230-
231236
def execute_graphql_request(self, request, data, query, variables, operation_name, show_graphiql=False):
232237
if not query:
233238
if show_graphiql:
234239
return None
235240
raise HttpError(HttpResponseBadRequest(
236241
'Must provide query string.'))
237242

238-
source = Source(query, name='GraphQL request')
239-
240243
try:
241-
document_ast = parse(source)
242-
validation_errors = validate(self.schema, document_ast)
243-
if validation_errors:
244-
return ExecutionResult(
245-
errors=validation_errors,
246-
invalid=True,
247-
)
244+
backend = self.get_backend(request)
245+
document = backend.document_from_string(self.schema, query)
248246
except Exception as e:
249247
return ExecutionResult(errors=[e], invalid=True)
250248

251249
if request.method.lower() == 'get':
252-
operation_ast = get_operation_ast(document_ast, operation_name)
253-
if operation_ast and operation_ast.operation != 'query':
250+
operation_type = document.get_operation_type(operation_name)
251+
if operation_type and operation_type != 'query':
254252
if show_graphiql:
255253
return None
256254

257255
raise HttpError(HttpResponseNotAllowed(
258256
['POST'], 'Can only perform a {} operation from a POST request.'.format(
259-
operation_ast.operation)
257+
operation_type)
260258
))
261259

262260
try:
263-
return self.execute(
264-
document_ast,
265-
root_value=self.get_root_value(request),
266-
variable_values=variables,
261+
extra_options = {}
262+
if self.executor:
263+
# We only include it optionally since
264+
# executor is not a valid argument in all backends
265+
extra_options['executor'] = self.executor
266+
267+
return document.execute(
268+
root=self.get_root_value(request),
269+
variables=variables,
267270
operation_name=operation_name,
268-
context_value=self.get_context(request),
271+
context=self.get_context(request),
269272
middleware=self.get_middleware(request),
270-
executor=self.executor,
273+
**extra_options
271274
)
272275
except Exception as e:
273276
return ExecutionResult(errors=[e], invalid=True)

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
install_requires=[
6060
'six>=1.10.0',
6161
'graphene>=2.0.1,<3',
62+
'graphql-core>=2.1rc0',
6263
django_version,
6364
'iso8601',
6465
'singledispatch>=3.4.0.3',

0 commit comments

Comments
 (0)