Skip to content

Commit 7210c8c

Browse files
committed
Defend against missing 'creationTime'/'lastModifiedTime' from back-end.
See: #1023 (comment)
1 parent 22bc7cd commit 7210c8c

File tree

4 files changed

+68
-4
lines changed

4 files changed

+68
-4
lines changed

gcloud/bigquery/dataset.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,10 @@ def _set_properties(self, api_response):
212212
"""
213213
self._properties.clear()
214214
cleaned = api_response.copy()
215-
cleaned['creationTime'] = float(cleaned['creationTime'])
216-
cleaned['lastModifiedTime'] = float(cleaned['lastModifiedTime'])
215+
if 'creationTime' in cleaned:
216+
cleaned['creationTime'] = float(cleaned['creationTime'])
217+
if 'lastModifiedTime' in cleaned:
218+
cleaned['lastModifiedTime'] = float(cleaned['lastModifiedTime'])
217219
self._properties.update(cleaned)
218220

219221
def _build_resource(self):

gcloud/bigquery/table.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,10 @@ def _set_properties(self, api_response):
320320
"""
321321
self._properties.clear()
322322
cleaned = api_response.copy()
323-
cleaned['creationTime'] = float(cleaned['creationTime'])
324-
cleaned['lastModifiedTime'] = float(cleaned['lastModifiedTime'])
323+
if 'creationTime' in cleaned:
324+
cleaned['creationTime'] = float(cleaned['creationTime'])
325+
if 'lastModifiedTime' in cleaned:
326+
cleaned['lastModifiedTime'] = float(cleaned['lastModifiedTime'])
325327
if 'expirationTime' in cleaned:
326328
cleaned['expirationTime'] = float(cleaned['expirationTime'])
327329
self._properties.update(cleaned)

gcloud/bigquery/test_dataset.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,31 @@ def test_create_w_alternate_client(self):
179179
self.assertEqual(req['data'], SENT)
180180
self._verifyResourceProperties(dataset, RESOURCE)
181181

182+
def test_create_w_missing_output_properties(self):
183+
# In the wild, the resource returned from 'dataset.create' sometimes
184+
# lacks 'creationTime' / 'lastModifiedTime'
185+
PATH = 'projects/%s/datasets' % (self.PROJECT,)
186+
RESOURCE = self._makeResource()
187+
del RESOURCE['creationTime']
188+
del RESOURCE['lastModifiedTime']
189+
self.WHEN = None
190+
conn = _Connection(RESOURCE)
191+
CLIENT = _Client(project=self.PROJECT, connection=conn)
192+
dataset = self._makeOne(self.DS_NAME, client=CLIENT)
193+
194+
dataset.create()
195+
196+
self.assertEqual(len(conn._requested), 1)
197+
req = conn._requested[0]
198+
self.assertEqual(req['method'], 'POST')
199+
self.assertEqual(req['path'], '/%s' % PATH)
200+
SENT = {
201+
'datasetReference':
202+
{'projectId': self.PROJECT, 'datasetId': self.DS_NAME},
203+
}
204+
self.assertEqual(req['data'], SENT)
205+
self._verifyResourceProperties(dataset, RESOURCE)
206+
182207
def test_exists_miss_w_bound_client(self):
183208
PATH = 'projects/%s/datasets/%s' % (self.PROJECT, self.DS_NAME)
184209
conn = _Connection()

gcloud/bigquery/test_table.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,41 @@ def test_create_w_alternate_client(self):
454454
self.assertEqual(req['data'], SENT)
455455
self._verifyResourceProperties(table, RESOURCE)
456456

457+
def test_create_w_missing_output_properties(self):
458+
# In the wild, the resource returned from 'dataset.create' sometimes
459+
# lacks 'creationTime' / 'lastModifiedTime'
460+
from gcloud.bigquery.table import SchemaField
461+
PATH = 'projects/%s/datasets/%s/tables' % (self.PROJECT, self.DS_NAME)
462+
RESOURCE = self._makeResource()
463+
del RESOURCE['creationTime']
464+
del RESOURCE['lastModifiedTime']
465+
self.WHEN = None
466+
conn = _Connection(RESOURCE)
467+
client = _Client(project=self.PROJECT, connection=conn)
468+
dataset = _Dataset(client)
469+
full_name = SchemaField('full_name', 'STRING', mode='REQUIRED')
470+
age = SchemaField('age', 'INTEGER', mode='REQUIRED')
471+
table = self._makeOne(self.TABLE_NAME, dataset,
472+
schema=[full_name, age])
473+
474+
table.create()
475+
476+
self.assertEqual(len(conn._requested), 1)
477+
req = conn._requested[0]
478+
self.assertEqual(req['method'], 'POST')
479+
self.assertEqual(req['path'], '/%s' % PATH)
480+
SENT = {
481+
'tableReference': {
482+
'projectId': self.PROJECT,
483+
'datasetId': self.DS_NAME,
484+
'tableId': self.TABLE_NAME},
485+
'schema': {'fields': [
486+
{'name': 'full_name', 'type': 'STRING', 'mode': 'REQUIRED'},
487+
{'name': 'age', 'type': 'INTEGER', 'mode': 'REQUIRED'}]},
488+
}
489+
self.assertEqual(req['data'], SENT)
490+
self._verifyResourceProperties(table, RESOURCE)
491+
457492
def test_exists_miss_w_bound_client(self):
458493
PATH = 'projects/%s/datasets/%s/tables/%s' % (
459494
self.PROJECT, self.DS_NAME, self.TABLE_NAME)

0 commit comments

Comments
 (0)