Skip to content

Commit dbef839

Browse files
committed
Merge remote-tracking branch 'dittos/master'
2 parents ad19f7b + 3aae23a commit dbef839

File tree

5 files changed

+718
-13
lines changed

5 files changed

+718
-13
lines changed

.travis.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ python:
44
- 2.7
55
- 3.3
66
- 3.4
7+
- 3.5
8+
- pypy
79
install:
8-
- pip install pytest pytest-cov coveralls flake8
10+
- pip install pytest-cov coveralls flake8
11+
- pip install pytest>=2.7.3 --upgrade
912
- pip install -e .
1013
script:
1114
- py.test --cov=graphql

graphql/core/validation/rules.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,12 @@ def collect_fragment_spread_nodes(self):
309309

310310

311311
class NoUndefinedVariables(ValidationRule):
312+
visit_spread_fragments = True
313+
312314
def __init__(self, context):
313315
self.operation = None
314-
self.visited_fragment_names = {}
315-
self.defined_variable_names = {}
316-
self.visit_spread_fragments = True
316+
self.visited_fragment_names = set()
317+
self.defined_variable_names = set()
317318
super(NoUndefinedVariables, self).__init__(context)
318319

319320
@staticmethod
@@ -328,22 +329,22 @@ def undefined_var_by_op_message(var_name, op_name):
328329

329330
def enter_OperationDefinition(self, node, *args):
330331
self.operation = node
331-
self.visited_fragment_names = {}
332-
self.defined_variable_names = {}
332+
self.visited_fragment_names = set()
333+
self.defined_variable_names = set()
333334

334335
def enter_VariableDefinition(self, node, *args):
335-
self.defined_variable_names[node.variable.name.value] = True
336+
self.defined_variable_names.add(node.variable.name.value)
336337

337338
def enter_Variable(self, variable, key, parent, path, ancestors):
338339
var_name = variable.name.value
339340
if var_name not in self.defined_variable_names:
340-
is_fragment = lambda node: isinstance(node, ast.FragmentDefinition)
341-
within_fragment = any(is_fragment(node) for node in ancestors)
341+
within_fragment = any(isinstance(node, ast.FragmentDefinition) for node in ancestors)
342342
if within_fragment and self.operation and self.operation.name:
343343
return GraphQLError(
344344
self.undefined_var_by_op_message(var_name, self.operation.name.value),
345345
[variable, self.operation]
346346
)
347+
347348
return GraphQLError(
348349
self.undefined_var_message(var_name),
349350
[variable]
@@ -352,7 +353,8 @@ def enter_Variable(self, variable, key, parent, path, ancestors):
352353
def enter_FragmentSpread(self, spread_ast, *args):
353354
if spread_ast.name.value in self.visited_fragment_names:
354355
return False
355-
self.visited_fragment_names[spread_ast.name.value] = True
356+
357+
self.visited_fragment_names.add(spread_ast.name.value)
356358

357359

358360
class NoUnusedVariables(ValidationRule):
@@ -511,7 +513,18 @@ def duplicate_arg_message(field):
511513

512514

513515
class ArgumentsOfCorrectType(ValidationRule):
514-
pass
516+
def enter_Argument(self, node, *args):
517+
arg_def = self.context.get_argument()
518+
if arg_def and not is_valid_literal_value(arg_def.type, node.value):
519+
return GraphQLError(
520+
self.bad_value_message(node.name.value, arg_def.type,
521+
print_ast(node.value)),
522+
[node.value]
523+
)
524+
525+
@staticmethod
526+
def bad_value_message(arg_name, type, value):
527+
return 'Argument "{}" expected type "{}" but got: {}.'.format(arg_name, type, value)
515528

516529

517530
class ProvidedNonNullArguments(ValidationRule):

setup.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,20 @@ def run_tests(self):
4040
'Intended Audience :: Developers',
4141
'Topic :: Software Development :: Libraries',
4242
'Programming Language :: Python :: 2',
43+
'Programming Language :: Python :: 2.7',
44+
'Programming Language :: Python :: 3',
45+
'Programming Language :: Python :: 3.3',
46+
'Programming Language :: Python :: 3.4',
47+
'Programming Language :: Python :: 3.5',
48+
'Programming Language :: Python :: Implementation :: PyPy',
4349
],
4450

4551
keywords='api graphql protocol rest',
4652

4753
packages=find_packages(exclude=['tests']),
4854

4955
install_requires=[],
50-
tests_require=['pytest>=2.7.2'],
56+
tests_require=['pytest>=2.7.3'],
5157

5258
cmdclass={'test': PyTest},
5359
)

0 commit comments

Comments
 (0)