Skip to content

Commit

Permalink
Merge pull request #1459 from dhermes/timestamp-micros-to-pb-1288
Browse files Browse the repository at this point in the history
Upgrading timestamp_microseconds_value to timestamp_value.
  • Loading branch information
dhermes committed Feb 13, 2016
2 parents 2b6c9c0 + a6ad742 commit 74fdb65
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 24 deletions.
18 changes: 10 additions & 8 deletions gcloud/datastore/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@
from google.protobuf.internal.type_checkers import Int64ValueChecker
import six

from gcloud._helpers import _datetime_from_microseconds
from gcloud._helpers import _microseconds_from_datetime
from gcloud._helpers import _datetime_to_pb_timestamp
from gcloud._helpers import _has_field
from gcloud._helpers import _pb_timestamp_to_datetime
from gcloud.datastore._generated import entity_pb2 as _entity_pb2
from gcloud.datastore.entity import Entity
from gcloud.datastore.key import Key
Expand Down Expand Up @@ -307,8 +308,8 @@ def _pb_attr_value(val):
"""

if isinstance(val, datetime.datetime):
name = 'timestamp_microseconds'
value = _microseconds_from_datetime(val)
name = 'timestamp'
value = _datetime_to_pb_timestamp(val)
elif isinstance(val, Key):
name, value = 'key', val.to_protobuf()
elif isinstance(val, bool):
Expand Down Expand Up @@ -348,10 +349,9 @@ def _get_value_from_value_pb(value_pb):
:returns: The value provided by the Protobuf.
"""
result = None
# Simple field (int64)
if value_pb.HasField('timestamp_microseconds_value'):
microseconds = value_pb.timestamp_microseconds_value
result = _datetime_from_microseconds(microseconds)
# Message field (google.protobuf.Timestamp)
if value_pb.HasField('timestamp_value'):
result = _pb_timestamp_to_datetime(value_pb.timestamp_value)

elif value_pb.HasField('key_value'): # Message field (Key)
result = key_from_protobuf(value_pb.key_value)
Expand Down Expand Up @@ -405,6 +405,8 @@ def _set_protobuf_value(value_pb, val):
attr, val = _pb_attr_value(val)
if attr == 'key_value':
value_pb.key_value.CopyFrom(val)
elif attr == 'timestamp_value':
value_pb.timestamp_value.CopyFrom(val)
elif attr == 'entity_value':
entity_pb = entity_to_protobuf(val)
value_pb.entity_value.CopyFrom(entity_pb)
Expand Down
38 changes: 22 additions & 16 deletions gcloud/datastore/test_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,23 +408,25 @@ def test_datetime_naive(self):
import datetime
from gcloud._helpers import UTC

naive = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375) # No zone.
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
micros = 4375
naive = datetime.datetime(2014, 9, 16, 10, 19, 32, micros) # No zone.
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
name, value = self._callFUT(naive)
self.assertEqual(name, 'timestamp_microseconds_value')
self.assertEqual(value // 1000000, calendar.timegm(utc.timetuple()))
self.assertEqual(value % 1000000, 4375)
self.assertEqual(name, 'timestamp_value')
self.assertEqual(value.seconds, calendar.timegm(utc.timetuple()))
self.assertEqual(value.nanos, 1000 * micros)

def test_datetime_w_zone(self):
import calendar
import datetime
from gcloud._helpers import UTC

utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
micros = 4375
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
name, value = self._callFUT(utc)
self.assertEqual(name, 'timestamp_microseconds_value')
self.assertEqual(value // 1000000, calendar.timegm(utc.timetuple()))
self.assertEqual(value % 1000000, 4375)
self.assertEqual(name, 'timestamp_value')
self.assertEqual(value.seconds, calendar.timegm(utc.timetuple()))
self.assertEqual(value.nanos, 1000 * micros)

def test_key(self):
from gcloud.datastore.key import Key
Expand Down Expand Up @@ -517,10 +519,13 @@ def test_datetime(self):
import calendar
import datetime
from gcloud._helpers import UTC
from gcloud.datastore._generated import entity_pb2

utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
micros = (calendar.timegm(utc.timetuple()) * 1000000) + 4375
pb = self._makePB('timestamp_microseconds_value', micros)
micros = 4375
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
pb = entity_pb2.Value()
pb.timestamp_value.seconds = calendar.timegm(utc.timetuple())
pb.timestamp_value.nanos = 1000 * micros
self.assertEqual(self._callFUT(pb), utc)

def test_key(self):
Expand Down Expand Up @@ -605,11 +610,12 @@ def test_datetime(self):
from gcloud._helpers import UTC

pb = self._makePB()
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, 4375, UTC)
micros = 4375
utc = datetime.datetime(2014, 9, 16, 10, 19, 32, micros, UTC)
self._callFUT(pb, utc)
value = pb.timestamp_microseconds_value
self.assertEqual(value // 1000000, calendar.timegm(utc.timetuple()))
self.assertEqual(value % 1000000, 4375)
value = pb.timestamp_value
self.assertEqual(value.seconds, calendar.timegm(utc.timetuple()))
self.assertEqual(value.nanos, 1000 * micros)

def test_key(self):
from gcloud.datastore.key import Key
Expand Down

0 comments on commit 74fdb65

Please sign in to comment.