Skip to content

Commit 9a6acfa

Browse files
authored
Fix variable nanosecond timestamp update_time from response (googleapis#4819)
1 parent a2b64a8 commit 9a6acfa

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

runtimeconfig/google/cloud/runtimeconfig/variable.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@
3636
"""
3737

3838
import base64
39+
import datetime
3940

40-
from google.cloud._helpers import _rfc3339_to_datetime
41+
import pytz
42+
43+
from google.api_core import datetime_helpers
4144
from google.cloud.exceptions import NotFound
4245
from google.cloud.runtimeconfig._helpers import variable_name_from_full_name
4346

@@ -151,13 +154,28 @@ def update_time(self):
151154
See
152155
https://cloud.google.com/deployment-manager/runtime-configurator/reference/rest/v1beta1/projects.configs.variables
153156
154-
:rtype: :class:`datetime.datetime` or ``NoneType``
155-
:returns: Datetime object parsed from RFC3339 valid timestamp, or
156-
``None`` if the property is not set locally.
157+
Returns:
158+
:class:`~api_core.datetime_helpers.DatetimeWithNanoseconds`,
159+
:class:`datetime.datetime` or ``NoneType``:
160+
Datetime object parsed from RFC3339 valid timestamp, or
161+
``None`` if the property is not set locally.
162+
163+
Raises:
164+
ValueError: if value is not a valid RFC3339 timestamp
157165
"""
158166
value = self._properties.get('updateTime')
159167
if value is not None:
160-
value = _rfc3339_to_datetime(value)
168+
try:
169+
value = datetime.datetime.strptime(
170+
value, datetime_helpers._RFC3339_MICROS)
171+
except ValueError:
172+
DatetimeNS = datetime_helpers.DatetimeWithNanoseconds
173+
value = DatetimeNS.from_rfc3339(value)
174+
naive = (
175+
value.tzinfo is None
176+
or value.tzinfo.utcoffset(value) is None)
177+
if naive:
178+
value = pytz.utc.localize(value)
161179
return value
162180

163181
def _require_client(self, client):

runtimeconfig/tests/unit/test_config.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,14 @@ def test_variable(self):
145145
self.assertEqual(len(conn._requested), 0)
146146

147147
def test_get_variable_w_bound_client(self):
148-
from google.cloud._helpers import _rfc3339_to_datetime
148+
from google.api_core import datetime_helpers
149149

150150
VARIABLE_NAME = 'my-variable/abcd'
151151
VARIABLE_PATH = '%s/variables/%s' % (self.CONFIG_PATH, VARIABLE_NAME)
152152
RESOURCE = {
153153
'name': VARIABLE_PATH,
154154
'value': 'bXktdmFyaWFibGUtdmFsdWU=', # base64 my-variable-value
155-
'updateTime': '2016-04-14T21:21:54.5000Z',
155+
'updateTime': '2016-04-14T21:21:54.123456789Z',
156156
'state': 'VARIABLE_STATE_UNSPECIFIED',
157157
}
158158
conn = _Connection(RESOURCE)
@@ -163,9 +163,10 @@ def test_get_variable_w_bound_client(self):
163163

164164
self.assertEqual(variable.name, VARIABLE_NAME)
165165
self.assertEqual(variable.full_name, VARIABLE_PATH)
166+
DatetimeWithNanoseconds = datetime_helpers.DatetimeWithNanoseconds
166167
self.assertEqual(
167168
variable.update_time,
168-
_rfc3339_to_datetime(RESOURCE['updateTime']))
169+
DatetimeWithNanoseconds.from_rfc3339(RESOURCE['updateTime']))
169170
self.assertEqual(variable.state, RESOURCE['state'])
170171

171172
self.assertEqual(len(conn._requested), 1)

0 commit comments

Comments
 (0)