From dddb20a0f45b515ff11bd25cf14a9aafa81083c6 Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Tue, 22 Nov 2016 18:04:22 -0500 Subject: [PATCH 1/4] added time type --- docs/types/scalars.rst | 3 ++- graphene/types/datetime.py | 32 +++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/types/scalars.rst b/docs/types/scalars.rst index a75c70e4..7a825d36 100644 --- a/docs/types/scalars.rst +++ b/docs/types/scalars.rst @@ -9,9 +9,10 @@ Graphene defines the following base Scalar Types: - ``graphene.Boolean`` - ``graphene.ID`` -Graphene also provides custom scalars for Dates and JSON: +Graphene also provides custom scalars for Dates, Times, and JSON: - ``graphene.types.datetime.DateTime`` +- ``graphene.types.datetime.Time`` - ``graphene.types.json.JSONString`` diff --git a/graphene/types/datetime.py b/graphene/types/datetime.py index 3dfbbb97..17987836 100644 --- a/graphene/types/datetime.py +++ b/graphene/types/datetime.py @@ -29,11 +29,37 @@ class DateTime(Scalar): ) return dt.isoformat() - @staticmethod - def parse_literal(node): + @classmethod + def parse_literal(cls, node): if isinstance(node, ast.StringValue): - return iso8601.parse_date(node.value) + return cls.parse_value(node.value) @staticmethod def parse_value(value): return iso8601.parse_date(value) + + +class Time(Scalar): + ''' + The `Time` scalar type represents a Time value as + specified by + [iso8601](https://en.wikipedia.org/wiki/ISO_8601). + ''' + epoch_date = '1970-01-01' + + @staticmethod + def serialize(time): + assert isinstance(time, datetime.time), ( + 'Received not compatible time "{}"'.format(repr(time)) + ) + return time.isoformat() + + @classmethod + def parse_literal(cls, node): + if isinstance(node, ast.StringValue): + return cls.parse_value(node.value) + + @classmethod + def parse_value(cls, value): + dt = iso8601.parse_date('{}T{}'.format(cls.epocj_time, value)) + return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo) From f089c78b997e2a588775360af2e12944b573cdd8 Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Tue, 22 Nov 2016 18:08:48 -0500 Subject: [PATCH 2/4] added time type --- graphene/types/datetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene/types/datetime.py b/graphene/types/datetime.py index 17987836..53043744 100644 --- a/graphene/types/datetime.py +++ b/graphene/types/datetime.py @@ -61,5 +61,5 @@ class Time(Scalar): @classmethod def parse_value(cls, value): - dt = iso8601.parse_date('{}T{}'.format(cls.epocj_time, value)) + dt = iso8601.parse_date('{}T{}'.format(cls.epoch_time, value)) return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo) From 48b422e2890e02801a6b3a993f28a0b696da797c Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Wed, 23 Nov 2016 11:12:28 -0500 Subject: [PATCH 3/4] add time query test --- graphene/types/tests/test_datetime.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/graphene/types/tests/test_datetime.py b/graphene/types/tests/test_datetime.py index f55cd8c6..05dca4a5 100644 --- a/graphene/types/tests/test_datetime.py +++ b/graphene/types/tests/test_datetime.py @@ -1,18 +1,22 @@ import datetime import pytz -from ..datetime import DateTime +from ..datetime import DateTime, Time from ..objecttype import ObjectType from ..schema import Schema class Query(ObjectType): datetime = DateTime(_in=DateTime(name='in')) + time = Time(_at=Time(name='at')) def resolve_datetime(self, args, context, info): _in = args.get('in') return _in + def resolve_time(self, args, context, info): + return args.get('at') + schema = Schema(query=Query) @@ -27,6 +31,17 @@ def test_datetime_query(): } +def test_time_query(): + now = datetime.datetime.now().replace(tzinfo=pytz.utc) + time = datetime.time(now.hour, now.minute, now.second, now.microsecond, now.tzinfo) + isoformat = time.isoformat() + + result = schema.execute('''{ time(at: "%s") }'''%isoformat) + assert not result.errors + assert result.data == { + 'time': isoformat + } + def test_datetime_query_variable(): now = datetime.datetime.now().replace(tzinfo=pytz.utc) isoformat = now.isoformat() From ad83a7e07694a48bb5ee8cbfe2b953150620fa31 Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Wed, 23 Nov 2016 11:14:49 -0500 Subject: [PATCH 4/4] add time query test --- graphene/types/datetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphene/types/datetime.py b/graphene/types/datetime.py index 53043744..0a0e3343 100644 --- a/graphene/types/datetime.py +++ b/graphene/types/datetime.py @@ -61,5 +61,5 @@ class Time(Scalar): @classmethod def parse_value(cls, value): - dt = iso8601.parse_date('{}T{}'.format(cls.epoch_time, value)) + dt = iso8601.parse_date('{}T{}'.format(cls.epoch_date, value)) return datetime.time(dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)