Skip to content

Commit 111ce66

Browse files
committed
Using calendar.timegm instead of time.mktime.
Note that time.mktime says: "Convert a time tuple in local time to seconds since the Epoch." while calendar.timegm says: "handy function to calculate Unix timestamp from GMT." This is why tests were failing with local timezones seeming to matter (because they did with time.mktime). Also changed import of datetime in datastore._helpers to make namespace/class confusion clear. I noticed this when looking for other uses of calendar.timegm in the codebase.
1 parent d874979 commit 111ce66

3 files changed

Lines changed: 8 additions & 8 deletions

File tree

gcloud/datastore/_helpers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
These functions are *not* part of the API.
44
"""
55
import calendar
6-
from datetime import datetime, timedelta
6+
import datetime
77

88
from google.protobuf.internal.type_checkers import Int64ValueChecker
99
import pytz
@@ -43,7 +43,7 @@ def _get_protobuf_attribute_and_value(val):
4343
:returns: A tuple of the attribute name and proper value type.
4444
"""
4545

46-
if isinstance(val, datetime):
46+
if isinstance(val, datetime.datetime):
4747
name = 'timestamp_microseconds'
4848
# If the datetime is naive (no timezone), consider that it was
4949
# intended to be UTC and replace the tzinfo to that effect.
@@ -91,8 +91,8 @@ def _get_value_from_protobuf(pb):
9191
result = None
9292
if pb.value.HasField('timestamp_microseconds_value'):
9393
microseconds = pb.value.timestamp_microseconds_value
94-
naive = (datetime.utcfromtimestamp(0) +
95-
timedelta(microseconds=microseconds))
94+
naive = (datetime.datetime.utcfromtimestamp(0) +
95+
datetime.timedelta(microseconds=microseconds))
9696
result = naive.replace(tzinfo=pytz.utc)
9797

9898
elif pb.value.HasField('key_value'):

gcloud/storage/connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""Needs module docstring."""
22

33
import base64
4+
import calendar
45
import datetime
56
import json
6-
import time
77
import urllib
88

99
from Crypto.Hash import SHA256
@@ -460,7 +460,7 @@ def _get_expiration_seconds(expiration):
460460
expiration = expiration.replace(tzinfo=pytz.utc)
461461

462462
# Turn the datetime into a timestamp (seconds, not microseconds).
463-
expiration = int(time.mktime(expiration.timetuple()))
463+
expiration = int(calendar.timegm(expiration.timetuple()))
464464

465465
if not isinstance(expiration, (int, long)):
466466
raise TypeError('Expected an integer timestamp, datetime, or '

gcloud/storage/test_connection.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ def test__get_expiration_seconds(self):
513513

514514
CALL_FUT = self._getTargetClass()._get_expiration_seconds
515515

516-
expiration_as_seconds = 1092902400
516+
expiration_as_seconds = 1092873600
517517
expiration_no_tz = datetime.datetime(2004, 8, 19, 0, 0, 0, 0)
518518

519519
expiration_int = expiration_as_seconds
@@ -577,7 +577,7 @@ def test__get_expiration_seconds_w_timedelta(self):
577577
# occurs again with the patched datetime.
578578
CALL_FUT = self._getTargetClass()._get_expiration_seconds
579579

580-
expiration_as_seconds = 1092902400
580+
expiration_as_seconds = 1092873600
581581
expiration_as_delta = datetime.timedelta(0)
582582
self.assertEqual(expiration_as_seconds,
583583
CALL_FUT(expiration_as_delta))

0 commit comments

Comments
 (0)