Skip to content

Commit 74fdb65

Browse files
committed
Merge pull request #1459 from dhermes/timestamp-micros-to-pb-1288
Upgrading timestamp_microseconds_value to timestamp_value.
2 parents 2b6c9c0 + a6ad742 commit 74fdb65

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

gcloud/datastore/helpers.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
from google.protobuf.internal.type_checkers import Int64ValueChecker
2323
import six
2424

25-
from gcloud._helpers import _datetime_from_microseconds
26-
from gcloud._helpers import _microseconds_from_datetime
25+
from gcloud._helpers import _datetime_to_pb_timestamp
26+
from gcloud._helpers import _has_field
27+
from gcloud._helpers import _pb_timestamp_to_datetime
2728
from gcloud.datastore._generated import entity_pb2 as _entity_pb2
2829
from gcloud.datastore.entity import Entity
2930
from gcloud.datastore.key import Key
@@ -307,8 +308,8 @@ def _pb_attr_value(val):
307308
"""
308309

309310
if isinstance(val, datetime.datetime):
310-
name = 'timestamp_microseconds'
311-
value = _microseconds_from_datetime(val)
311+
name = 'timestamp'
312+
value = _datetime_to_pb_timestamp(val)
312313
elif isinstance(val, Key):
313314
name, value = 'key', val.to_protobuf()
314315
elif isinstance(val, bool):
@@ -348,10 +349,9 @@ def _get_value_from_value_pb(value_pb):
348349
:returns: The value provided by the Protobuf.
349350
"""
350351
result = None
351-
# Simple field (int64)
352-
if value_pb.HasField('timestamp_microseconds_value'):
353-
microseconds = value_pb.timestamp_microseconds_value
354-
result = _datetime_from_microseconds(microseconds)
352+
# Message field (google.protobuf.Timestamp)
353+
if value_pb.HasField('timestamp_value'):
354+
result = _pb_timestamp_to_datetime(value_pb.timestamp_value)
355355

356356
elif value_pb.HasField('key_value'): # Message field (Key)
357357
result = key_from_protobuf(value_pb.key_value)
@@ -405,6 +405,8 @@ def _set_protobuf_value(value_pb, val):
405405
attr, val = _pb_attr_value(val)
406406
if attr == 'key_value':
407407
value_pb.key_value.CopyFrom(val)
408+
elif attr == 'timestamp_value':
409+
value_pb.timestamp_value.CopyFrom(val)
408410
elif attr == 'entity_value':
409411
entity_pb = entity_to_protobuf(val)
410412
value_pb.entity_value.CopyFrom(entity_pb)

gcloud/datastore/test_helpers.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -408,23 +408,25 @@ def test_datetime_naive(self):
408408
import datetime
409409
from gcloud._helpers import UTC
410410

411-
naive = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375) # No zone.
412-
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
411+
micros = 4375
412+
naive = datetime.datetime(2014, 9, 16, 10, 19, 32, micros) # No zone.
413+
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
413414
name, value = self._callFUT(naive)
414-
self.assertEqual(name, 'timestamp_microseconds_value')
415-
self.assertEqual(value // 1000000, calendar.timegm(utc.timetuple()))
416-
self.assertEqual(value % 1000000, 4375)
415+
self.assertEqual(name, 'timestamp_value')
416+
self.assertEqual(value.seconds, calendar.timegm(utc.timetuple()))
417+
self.assertEqual(value.nanos, 1000 * micros)
417418

418419
def test_datetime_w_zone(self):
419420
import calendar
420421
import datetime
421422
from gcloud._helpers import UTC
422423

423-
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
424+
micros = 4375
425+
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
424426
name, value = self._callFUT(utc)
425-
self.assertEqual(name, 'timestamp_microseconds_value')
426-
self.assertEqual(value // 1000000, calendar.timegm(utc.timetuple()))
427-
self.assertEqual(value % 1000000, 4375)
427+
self.assertEqual(name, 'timestamp_value')
428+
self.assertEqual(value.seconds, calendar.timegm(utc.timetuple()))
429+
self.assertEqual(value.nanos, 1000 * micros)
428430

429431
def test_key(self):
430432
from gcloud.datastore.key import Key
@@ -517,10 +519,13 @@ def test_datetime(self):
517519
import calendar
518520
import datetime
519521
from gcloud._helpers import UTC
522+
from gcloud.datastore._generated import entity_pb2
520523

521-
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
522-
micros = (calendar.timegm(utc.timetuple()) * 1000000) + 4375
523-
pb = self._makePB('timestamp_microseconds_value', micros)
524+
micros = 4375
525+
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
526+
pb = entity_pb2.Value()
527+
pb.timestamp_value.seconds = calendar.timegm(utc.timetuple())
528+
pb.timestamp_value.nanos = 1000 * micros
524529
self.assertEqual(self._callFUT(pb), utc)
525530

526531
def test_key(self):
@@ -605,11 +610,12 @@ def test_datetime(self):
605610
from gcloud._helpers import UTC
606611

607612
pb = self._makePB()
608-
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
613+
micros = 4375
614+
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
609615
self._callFUT(pb, utc)
610-
value = pb.timestamp_microseconds_value
611-
self.assertEqual(value // 1000000, calendar.timegm(utc.timetuple()))
612-
self.assertEqual(value % 1000000, 4375)
616+
value = pb.timestamp_value
617+
self.assertEqual(value.seconds, calendar.timegm(utc.timetuple()))
618+
self.assertEqual(value.nanos, 1000 * micros)
613619

614620
def test_key(self):
615621
from gcloud.datastore.key import Key

0 commit comments

Comments
 (0)