mirror of
https://github.com/graphql-python/graphene.git
synced 2025-04-24 19:42:00 +03:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8290326308 | ||
|
4a274b8424 | ||
|
b3db1c0cb2 | ||
|
3ed7bf6362 | ||
|
ccae7364e5 | ||
|
cf97cbb1de |
|
@ -46,7 +46,7 @@ from .types import (
|
||||||
from .utils.module_loading import lazy_import
|
from .utils.module_loading import lazy_import
|
||||||
from .utils.resolve_only_args import resolve_only_args
|
from .utils.resolve_only_args import resolve_only_args
|
||||||
|
|
||||||
VERSION = (3, 4, 0, "final", 0)
|
VERSION = (3, 4, 3, "final", 0)
|
||||||
|
|
||||||
|
|
||||||
__version__ = get_version(VERSION)
|
__version__ = get_version(VERSION)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
from dateutil.parser import isoparse
|
||||||
|
|
||||||
from graphql.error import GraphQLError
|
from graphql.error import GraphQLError
|
||||||
from graphql.language import StringValueNode, print_ast
|
from graphql.language import StringValueNode, print_ast
|
||||||
|
|
||||||
|
@ -71,7 +73,7 @@ class DateTime(Scalar):
|
||||||
f"DateTime cannot represent non-string value: {repr(value)}"
|
f"DateTime cannot represent non-string value: {repr(value)}"
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
return datetime.datetime.fromisoformat(value)
|
return isoparse(value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise GraphQLError(f"DateTime cannot represent value: {repr(value)}")
|
raise GraphQLError(f"DateTime cannot represent value: {repr(value)}")
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,18 @@ def test_time_query_variable(sample_time):
|
||||||
assert result.data == {"time": isoformat}
|
assert result.data == {"time": isoformat}
|
||||||
|
|
||||||
|
|
||||||
|
def test_support_isoformat():
|
||||||
|
isoformat = "2011-11-04T00:05:23Z"
|
||||||
|
|
||||||
|
# test time variable provided as Python time
|
||||||
|
result = schema.execute(
|
||||||
|
"""query DateTime($time: DateTime){ datetime(in: $time) }""",
|
||||||
|
variables={"time": isoformat},
|
||||||
|
)
|
||||||
|
assert not result.errors
|
||||||
|
assert result.data == {"datetime": "2011-11-04T00:05:23+00:00"}
|
||||||
|
|
||||||
|
|
||||||
def test_bad_variables(sample_date, sample_datetime, sample_time):
|
def test_bad_variables(sample_date, sample_datetime, sample_time):
|
||||||
def _test_bad_variables(type_, input_):
|
def _test_bad_variables(type_, input_):
|
||||||
result = schema.execute(
|
result = schema.execute(
|
||||||
|
|
|
@ -36,6 +36,21 @@ def test_uuidstring_query_variable():
|
||||||
assert result.data == {"uuid": uuid_value}
|
assert result.data == {"uuid": uuid_value}
|
||||||
|
|
||||||
|
|
||||||
|
def test_uuidstring_invalid_argument():
|
||||||
|
uuid_value = {"not": "a string"}
|
||||||
|
|
||||||
|
result = schema.execute(
|
||||||
|
"""query Test($uuid: UUID){ uuid(input: $uuid) }""",
|
||||||
|
variables={"uuid": uuid_value},
|
||||||
|
)
|
||||||
|
assert result.errors
|
||||||
|
assert len(result.errors) == 1
|
||||||
|
assert (
|
||||||
|
result.errors[0].message
|
||||||
|
== "Variable '$uuid' got invalid value {'not': 'a string'}; UUID cannot represent value: {'not': 'a string'}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_uuidstring_optional_uuid_input():
|
def test_uuidstring_optional_uuid_input():
|
||||||
"""
|
"""
|
||||||
Test that we can provide a null value to an optional input
|
Test that we can provide a null value to an optional input
|
||||||
|
|
|
@ -51,12 +51,14 @@ class Union(UnmountedType, BaseType):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __init_subclass_with_meta__(cls, types=None, **options):
|
def __init_subclass_with_meta__(cls, types=None, _meta=None, **options):
|
||||||
assert (
|
assert (
|
||||||
isinstance(types, (list, tuple)) and len(types) > 0
|
isinstance(types, (list, tuple)) and len(types) > 0
|
||||||
), f"Must provide types for Union {cls.__name__}."
|
), f"Must provide types for Union {cls.__name__}."
|
||||||
|
|
||||||
_meta = UnionOptions(cls)
|
if not _meta:
|
||||||
|
_meta = UnionOptions(cls)
|
||||||
|
|
||||||
_meta.types = types
|
_meta.types = types
|
||||||
super(Union, cls).__init_subclass_with_meta__(_meta=_meta, **options)
|
super(Union, cls).__init_subclass_with_meta__(_meta=_meta, **options)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from uuid import UUID as _UUID
|
from uuid import UUID as _UUID
|
||||||
|
|
||||||
|
from graphql.error import GraphQLError
|
||||||
from graphql.language.ast import StringValueNode
|
from graphql.language.ast import StringValueNode
|
||||||
from graphql import Undefined
|
from graphql import Undefined
|
||||||
|
|
||||||
|
@ -28,4 +29,9 @@ class UUID(Scalar):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_value(value):
|
def parse_value(value):
|
||||||
return _UUID(value)
|
if isinstance(value, _UUID):
|
||||||
|
return value
|
||||||
|
try:
|
||||||
|
return _UUID(value)
|
||||||
|
except (ValueError, AttributeError):
|
||||||
|
raise GraphQLError(f"UUID cannot represent value: {repr(value)}")
|
||||||
|
|
7
setup.py
7
setup.py
|
@ -53,7 +53,11 @@ tests_require = [
|
||||||
"coveralls>=3.3,<5",
|
"coveralls>=3.3,<5",
|
||||||
]
|
]
|
||||||
|
|
||||||
dev_requires = ["ruff==0.5.0"] + tests_require
|
dev_requires = [
|
||||||
|
"ruff==0.5.0",
|
||||||
|
"types-python-dateutil>=2.8.1,<3",
|
||||||
|
"mypy>=1.10,<2",
|
||||||
|
] + tests_require
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="graphene",
|
name="graphene",
|
||||||
|
@ -83,6 +87,7 @@ setup(
|
||||||
install_requires=[
|
install_requires=[
|
||||||
"graphql-core>=3.1,<3.3",
|
"graphql-core>=3.1,<3.3",
|
||||||
"graphql-relay>=3.1,<3.3",
|
"graphql-relay>=3.1,<3.3",
|
||||||
|
"python-dateutil>=2.7.0,<3",
|
||||||
"typing-extensions>=4.7.1,<5",
|
"typing-extensions>=4.7.1,<5",
|
||||||
],
|
],
|
||||||
tests_require=tests_require,
|
tests_require=tests_require,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user