diff --git a/graphene/types/datetime.py b/graphene/types/datetime.py index 7bfd9bd2..d8388f8d 100644 --- a/graphene/types/datetime.py +++ b/graphene/types/datetime.py @@ -1,5 +1,7 @@ import datetime +from dateutil.parser import isoparse + from graphql.error import GraphQLError from graphql.language import StringValueNode, print_ast @@ -71,7 +73,7 @@ class DateTime(Scalar): f"DateTime cannot represent non-string value: {repr(value)}" ) try: - return datetime.datetime.fromisoformat(value) + return isoparse(value) except ValueError: raise GraphQLError(f"DateTime cannot represent value: {repr(value)}") diff --git a/graphene/types/tests/test_datetime.py b/graphene/types/tests/test_datetime.py index 12927617..bc992af5 100644 --- a/graphene/types/tests/test_datetime.py +++ b/graphene/types/tests/test_datetime.py @@ -227,6 +227,18 @@ def test_time_query_variable(sample_time): 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(type_, input_): result = schema.execute( diff --git a/setup.py b/setup.py index 33ceba50..61c99ea4 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,11 @@ tests_require = [ "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( name="graphene", @@ -83,6 +87,7 @@ setup( install_requires=[ "graphql-core>=3.1,<3.3", "graphql-relay>=3.1,<3.3", + "python-dateutil>=2.7.0,<3", "typing-extensions>=4.7.1,<5", ], tests_require=tests_require, diff --git a/tox.ini b/tox.ini index 52a7e552..a4a6b37e 100644 --- a/tox.ini +++ b/tox.ini @@ -20,7 +20,7 @@ commands = [testenv:mypy] basepython = python3.10 deps = - mypy>=1.10,<2 + .[dev] commands = mypy graphene