mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-22 17:46:57 +03:00
commit
2044d29edb
39
graphene/types/jsontype.py
Normal file
39
graphene/types/jsontype.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from graphql.language.ast import (BooleanValue, FloatValue, IntValue,
|
||||||
|
StringValue, ListValue, ObjectValue)
|
||||||
|
|
||||||
|
from graphene.types.scalars import MIN_INT, MAX_INT
|
||||||
|
from .scalars import Scalar
|
||||||
|
|
||||||
|
|
||||||
|
class JSON(Scalar):
|
||||||
|
"""
|
||||||
|
The `JSON` scalar type represents JSON values as specified by
|
||||||
|
[ECMA-404](http://www.ecma-international.org/
|
||||||
|
publications/files/ECMA-ST/ECMA-404.pdf).
|
||||||
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def identity(value):
|
||||||
|
return value
|
||||||
|
|
||||||
|
serialize = identity
|
||||||
|
parse_value = identity
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def parse_literal(ast):
|
||||||
|
if isinstance(ast, (StringValue, BooleanValue)):
|
||||||
|
return ast.value
|
||||||
|
elif isinstance(ast, IntValue):
|
||||||
|
num = int(ast.value)
|
||||||
|
if MIN_INT <= num <= MAX_INT:
|
||||||
|
return num
|
||||||
|
elif isinstance(ast, FloatValue):
|
||||||
|
return float(ast.value)
|
||||||
|
elif isinstance(ast, ListValue):
|
||||||
|
return [JSON.parse_literal(value) for value in ast.values]
|
||||||
|
elif isinstance(ast, ObjectValue):
|
||||||
|
return {field.name.value: JSON.parse_literal(field.value) for field in ast.fields}
|
||||||
|
else:
|
||||||
|
return None
|
96
graphene/types/tests/test_jsontype.py
Normal file
96
graphene/types/tests/test_jsontype.py
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
from ..jsontype import JSON
|
||||||
|
from ..objecttype import ObjectType
|
||||||
|
from ..schema import Schema
|
||||||
|
|
||||||
|
|
||||||
|
class Query(ObjectType):
|
||||||
|
json = JSON(input=JSON())
|
||||||
|
|
||||||
|
def resolve_json(self, args, context, info):
|
||||||
|
input = args.get('input')
|
||||||
|
return input
|
||||||
|
|
||||||
|
|
||||||
|
schema = Schema(query=Query)
|
||||||
|
|
||||||
|
|
||||||
|
def test_json_query_variable():
|
||||||
|
for json_value in [
|
||||||
|
1,
|
||||||
|
1.1,
|
||||||
|
True,
|
||||||
|
'str',
|
||||||
|
[1, 2, 3],
|
||||||
|
[1.1, 2.2, 3.3],
|
||||||
|
[True, False],
|
||||||
|
['str1', 'str2'],
|
||||||
|
{
|
||||||
|
'key_a': 'a',
|
||||||
|
'key_b': 'b'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'int': 1,
|
||||||
|
'float': 1.1,
|
||||||
|
'boolean': True,
|
||||||
|
'string': 'str',
|
||||||
|
'int_list': [1, 2, 3],
|
||||||
|
'float_list': [1.1, 2.2, 3.3],
|
||||||
|
'boolean_list': [True, False],
|
||||||
|
'string_list': ['str1', 'str2'],
|
||||||
|
'nested_dict': {
|
||||||
|
'key_a': 'a',
|
||||||
|
'key_b': 'b'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None
|
||||||
|
]:
|
||||||
|
result = schema.execute(
|
||||||
|
'''query Test($json: JSON){ json(input: $json) }''',
|
||||||
|
variable_values={'json': json_value}
|
||||||
|
)
|
||||||
|
assert not result.errors
|
||||||
|
assert result.data == {
|
||||||
|
'json': json_value
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_json_parse_literal_query():
|
||||||
|
result = schema.execute(
|
||||||
|
'''
|
||||||
|
query {
|
||||||
|
json(input: {
|
||||||
|
int: 1,
|
||||||
|
float: 1.1
|
||||||
|
boolean: true,
|
||||||
|
string: "str",
|
||||||
|
int_list: [1, 2, 3],
|
||||||
|
float_list: [1.1, 2.2, 3.3],
|
||||||
|
boolean_list: [true, false]
|
||||||
|
string_list: ["str1", "str2"],
|
||||||
|
nested_dict: {
|
||||||
|
key_a: "a",
|
||||||
|
key_b: "b"
|
||||||
|
},
|
||||||
|
empty_key: undefined
|
||||||
|
})
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
assert not result.errors
|
||||||
|
assert result.data == {
|
||||||
|
'json': {
|
||||||
|
'int': 1,
|
||||||
|
'float': 1.1,
|
||||||
|
'boolean': True,
|
||||||
|
'string': 'str',
|
||||||
|
'int_list': [1, 2, 3],
|
||||||
|
'float_list': [1.1, 2.2, 3.3],
|
||||||
|
'boolean_list': [True, False],
|
||||||
|
'string_list': ['str1', 'str2'],
|
||||||
|
'nested_dict': {
|
||||||
|
'key_a': 'a',
|
||||||
|
'key_b': 'b'
|
||||||
|
},
|
||||||
|
'empty_key': None
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user