From 3b3220b545867e280f946a1839a2d4955bebc135 Mon Sep 17 00:00:00 2001 From: Layla Bristol Date: Tue, 9 Apr 2019 13:11:03 -0700 Subject: [PATCH 1/5] Added properties created and expires to TableList library --- bigquery/tests/unit/test_table.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/bigquery/tests/unit/test_table.py b/bigquery/tests/unit/test_table.py index 77d80aff0925..91aed37872b3 100644 --- a/bigquery/tests/unit/test_table.py +++ b/bigquery/tests/unit/test_table.py @@ -1115,11 +1115,20 @@ def _get_target_class(): def _make_one(self, *args, **kw): return self._get_target_class()(*args, **kw) + def _setUpConstants(self): + import datetime + from google.cloud._helpers import UTC + + self.WHEN_TS = 1437767599.006 + self.WHEN = datetime.datetime.utcfromtimestamp(self.WHEN_TS).replace(tzinfo=UTC) + def test_ctor(self): + self._setUpConstants() project = "test-project" dataset_id = "test_dataset" table_id = "coffee_table" resource = { + "creationTime": self.WHEN_TS * 1000, "kind": "bigquery#table", "id": "{}:{}.{}".format(project, dataset_id, table_id), "tableReference": { @@ -1138,6 +1147,17 @@ def test_ctor(self): } table = self._make_one(resource) + + if "creationTime" in resource: + self.assertEqual(table.created, self.WHEN) + else: + self.assertIsNone(table.created) + + if "expirationTime" in resource: + self.assertEqual(table.expires, self.EXP_TIME) + else: + self.assertIsNone(table.expires) + self.assertEqual(table.project, project) self.assertEqual(table.dataset_id, dataset_id) self.assertEqual(table.table_id, table_id) @@ -1154,6 +1174,7 @@ def test_ctor(self): self.assertEqual(table.time_partitioning.field, "mycolumn") self.assertEqual(table.labels["some-stuff"], "this-is-a-label") self.assertIsNone(table.view_use_legacy_sql) + self.assertIsNone(table.expires) with warnings.catch_warnings(record=True) as warned: self.assertEqual(table.partitioning_type, "DAY") From db05b8fca3585221a2a2e51e6025f651ee3cb0a8 Mon Sep 17 00:00:00 2001 From: Layla Bristol Date: Tue, 9 Apr 2019 13:14:09 -0700 Subject: [PATCH 2/5] Added properties created and expires to TableList library --- bigquery/google/cloud/bigquery/table.py | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/bigquery/google/cloud/bigquery/table.py b/bigquery/google/cloud/bigquery/table.py index d7bfc1bb5dbe..5d9f5b17cf41 100644 --- a/bigquery/google/cloud/bigquery/table.py +++ b/bigquery/google/cloud/bigquery/table.py @@ -906,6 +906,42 @@ def __init__(self, resource): self._properties = resource + @property + def created(self): + """Union[datetime.datetime, None]: Datetime at which the table was + created (:data:`None` until set from the server). + """ + creation_time = self._properties.get("creationTime") + if creation_time is not None: + # creation_time will be in milliseconds. + return google.cloud._helpers._datetime_from_microseconds( + 1000.0 * float(creation_time) + ) + + @property + def expires(self): + """Union[datetime.datetime, None]: Datetime at which the table will be + deleted. + + Raises: + ValueError: For invalid value types. + """ + expiration_time = self._properties.get("expirationTime") + if expiration_time is not None: + # expiration_time will be in milliseconds. + return google.cloud._helpers._datetime_from_microseconds( + 1000.0 * float(expiration_time) + ) + + @expires.setter + def expires(self, value): + if not isinstance(value, datetime.datetime) and value is not None: + raise ValueError("Pass a datetime, or None") + value_ms = google.cloud._helpers._millis_from_datetime(value) + self._properties["tableReference"]["expirationTime"] = _helpers._str_or_none( + value_ms + ) + @property def project(self): """str: Project bound to the table.""" From 7618e9c6b782e4064500593d5a46cbe628e8c8b8 Mon Sep 17 00:00:00 2001 From: Layla Bristol Date: Tue, 9 Apr 2019 14:08:05 -0700 Subject: [PATCH 3/5] Removed unncessary lines and made changes based on feedback. --- bigquery/google/cloud/bigquery/table.py | 12 ------------ bigquery/tests/unit/test_table.py | 20 ++++++++------------ 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/bigquery/google/cloud/bigquery/table.py b/bigquery/google/cloud/bigquery/table.py index 5d9f5b17cf41..bf5fbc65b5a3 100644 --- a/bigquery/google/cloud/bigquery/table.py +++ b/bigquery/google/cloud/bigquery/table.py @@ -922,9 +922,6 @@ def created(self): def expires(self): """Union[datetime.datetime, None]: Datetime at which the table will be deleted. - - Raises: - ValueError: For invalid value types. """ expiration_time = self._properties.get("expirationTime") if expiration_time is not None: @@ -933,15 +930,6 @@ def expires(self): 1000.0 * float(expiration_time) ) - @expires.setter - def expires(self, value): - if not isinstance(value, datetime.datetime) and value is not None: - raise ValueError("Pass a datetime, or None") - value_ms = google.cloud._helpers._millis_from_datetime(value) - self._properties["tableReference"]["expirationTime"] = _helpers._str_or_none( - value_ms - ) - @property def project(self): """str: Project bound to the table.""" diff --git a/bigquery/tests/unit/test_table.py b/bigquery/tests/unit/test_table.py index 91aed37872b3..d4b659e17fd4 100644 --- a/bigquery/tests/unit/test_table.py +++ b/bigquery/tests/unit/test_table.py @@ -1119,16 +1119,20 @@ def _setUpConstants(self): import datetime from google.cloud._helpers import UTC - self.WHEN_TS = 1437767599.006 + self.WHEN_TS = 1437767599.125 self.WHEN = datetime.datetime.utcfromtimestamp(self.WHEN_TS).replace(tzinfo=UTC) + self.EXP_TIME = datetime.datetime(2015, 8, 1, 23, 59, 59, tzinfo=UTC) def test_ctor(self): + from google.cloud._helpers import _millis + self._setUpConstants() project = "test-project" dataset_id = "test_dataset" table_id = "coffee_table" resource = { "creationTime": self.WHEN_TS * 1000, + "expirationTime": _millis(self.EXP_TIME), "kind": "bigquery#table", "id": "{}:{}.{}".format(project, dataset_id, table_id), "tableReference": { @@ -1148,16 +1152,8 @@ def test_ctor(self): table = self._make_one(resource) - if "creationTime" in resource: - self.assertEqual(table.created, self.WHEN) - else: - self.assertIsNone(table.created) - - if "expirationTime" in resource: - self.assertEqual(table.expires, self.EXP_TIME) - else: - self.assertIsNone(table.expires) - + self.assertEqual(table.created, self.WHEN) + self.assertEqual(table.expires, self.EXP_TIME) self.assertEqual(table.project, project) self.assertEqual(table.dataset_id, dataset_id) self.assertEqual(table.table_id, table_id) @@ -1174,7 +1170,7 @@ def test_ctor(self): self.assertEqual(table.time_partitioning.field, "mycolumn") self.assertEqual(table.labels["some-stuff"], "this-is-a-label") self.assertIsNone(table.view_use_legacy_sql) - self.assertIsNone(table.expires) + # self.assertIsNone(table.expires) with warnings.catch_warnings(record=True) as warned: self.assertEqual(table.partitioning_type, "DAY") From 865d6934f4a010e9b255f2e84cf4fd57bc7816a6 Mon Sep 17 00:00:00 2001 From: Layla Bristol Date: Tue, 9 Apr 2019 14:17:21 -0700 Subject: [PATCH 4/5] Removed commented line, no longer using. --- bigquery/tests/unit/test_table.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bigquery/tests/unit/test_table.py b/bigquery/tests/unit/test_table.py index d4b659e17fd4..9f9f2f40746c 100644 --- a/bigquery/tests/unit/test_table.py +++ b/bigquery/tests/unit/test_table.py @@ -1170,7 +1170,6 @@ def test_ctor(self): self.assertEqual(table.time_partitioning.field, "mycolumn") self.assertEqual(table.labels["some-stuff"], "this-is-a-label") self.assertIsNone(table.view_use_legacy_sql) - # self.assertIsNone(table.expires) with warnings.catch_warnings(record=True) as warned: self.assertEqual(table.partitioning_type, "DAY") From 46d8d6f613988113a0f7f6c5cf7d92a7a9833ed9 Mon Sep 17 00:00:00 2001 From: Layla Bristol Date: Tue, 9 Apr 2019 22:35:58 -0700 Subject: [PATCH 5/5] Added assertions for none as requested. --- bigquery/tests/unit/test_table.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bigquery/tests/unit/test_table.py b/bigquery/tests/unit/test_table.py index 9f9f2f40746c..965dd5f0f195 100644 --- a/bigquery/tests/unit/test_table.py +++ b/bigquery/tests/unit/test_table.py @@ -1220,6 +1220,8 @@ def test_ctor_missing_properties(self): self.assertEqual(table.project, "testproject") self.assertEqual(table.dataset_id, "testdataset") self.assertEqual(table.table_id, "testtable") + self.assertIsNone(table.created) + self.assertIsNone(table.expires) self.assertIsNone(table.full_table_id) self.assertIsNone(table.friendly_name) self.assertIsNone(table.table_type)