From 4ec7bd204690e1243beaaad7559264522aeea251 Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Wed, 20 Sep 2017 17:38:14 -0400 Subject: [PATCH] bigquery: add client.delete_dataset (#4012) * bigquery: add client.delete_dataset * support Dataset as well as DatasetReference * fix lint --- bigquery/google/cloud/bigquery/client.py | 18 ++++++++++++-- bigquery/google/cloud/bigquery/dataset.py | 29 ----------------------- bigquery/tests/system.py | 2 +- bigquery/tests/unit/test_client.py | 23 ++++++++++++++++++ bigquery/tests/unit/test_dataset.py | 29 ----------------------- 5 files changed, 40 insertions(+), 61 deletions(-) diff --git a/bigquery/google/cloud/bigquery/client.py b/bigquery/google/cloud/bigquery/client.py index 1f5620f66ca8..940b016645f3 100644 --- a/bigquery/google/cloud/bigquery/client.py +++ b/bigquery/google/cloud/bigquery/client.py @@ -243,8 +243,6 @@ def update_dataset(self, dataset, fields): :rtype: :class:`google.cloud.bigquery.dataset.Dataset` :returns: the modified ``Dataset`` instance - :raises: ValueError for fields that cannot be updated. - """ if dataset.project is None: dataset._project = self.project @@ -266,6 +264,22 @@ def update_dataset(self, dataset, fields): method='PATCH', path=path, data=partial, headers=headers) return Dataset.from_api_repr(api_response, self) + def delete_dataset(self, dataset): + """Delete a dataset. + + See + https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets/delete + + :type dataset: One of: + :class:`~google.cloud.bigquery.dataset.Dataset` + :class:`~google.cloud.bigquery.dataset.DatasetReference` + + :param dataset: the dataset to delete, or a reference to it. + """ + if not isinstance(dataset, (Dataset, DatasetReference)): + raise TypeError('dataset must be a Dataset or a DatasetReference') + self._connection.api_request(method='DELETE', path=dataset.path) + def _get_query_results(self, job_id, project=None, timeout_ms=None): """Get the query results object for a query job. diff --git a/bigquery/google/cloud/bigquery/dataset.py b/bigquery/google/cloud/bigquery/dataset.py index dabd0a129ec1..0d9198809595 100644 --- a/bigquery/google/cloud/bigquery/dataset.py +++ b/bigquery/google/cloud/bigquery/dataset.py @@ -394,21 +394,6 @@ def from_api_repr(cls, resource, client): dataset._set_properties(resource) return dataset - def _require_client(self, client): - """Check client or verify over-ride. - - :type client: :class:`~google.cloud.bigquery.client.Client` or - ``NoneType`` - :param client: the client to use. If not passed, falls back to the - ``client`` stored on the current dataset. - - :rtype: :class:`google.cloud.bigquery.client.Client` - :returns: The client passed in or the currently bound client. - """ - if client is None: - client = self._client - return client - @staticmethod def _parse_access_entries(access): """Parse a resource fragment into a set of access entries. @@ -488,20 +473,6 @@ def _build_resource(self): return resource - def delete(self, client=None): - """API call: delete the dataset via a DELETE request. - - See - https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets/delete - - :type client: :class:`~google.cloud.bigquery.client.Client` or - ``NoneType`` - :param client: the client to use. If not passed, falls back to the - ``client`` stored on the current dataset. - """ - client = self._require_client(client) - client._connection.api_request(method='DELETE', path=self.path) - def list_tables(self, max_results=None, page_token=None): """List tables for the project associated with this client. diff --git a/bigquery/tests/system.py b/bigquery/tests/system.py index 2ad3523df921..117e2bf3f60d 100644 --- a/bigquery/tests/system.py +++ b/bigquery/tests/system.py @@ -105,7 +105,7 @@ def _still_in_use(bad_request): if isinstance(doomed, Bucket): retry_409(doomed.delete)(force=True) elif isinstance(doomed, Dataset): - retry_in_use(doomed.delete)() + retry_in_use(Config.CLIENT.delete_dataset)(doomed) else: doomed.delete() diff --git a/bigquery/tests/unit/test_client.py b/bigquery/tests/unit/test_client.py index 173f059374da..ceb530d5a134 100644 --- a/bigquery/tests/unit/test_client.py +++ b/bigquery/tests/unit/test_client.py @@ -480,6 +480,29 @@ def test_update_dataset(self): req = conn._requested[1] self.assertEqual(req['headers']['If-Match'], 'etag') + def test_delete_dataset(self): + from google.cloud.bigquery.dataset import Dataset + + PROJECT = 'PROJECT' + DS_ID = 'DATASET_ID' + PATH = 'projects/%s/datasets/%s' % (PROJECT, DS_ID) + creds = _make_credentials() + client = self._make_one(project=PROJECT, credentials=creds) + conn = client._connection = _Connection({}, {}) + for arg in (client.dataset(DS_ID), Dataset(DS_ID, project=PROJECT)): + client.delete_dataset(arg) + req = conn._requested[0] + self.assertEqual(req['method'], 'DELETE') + self.assertEqual(req['path'], '/%s' % PATH) + + def test_delete_dataset_wrong_type(self): + PROJECT = 'PROJECT' + DS_ID = 'DATASET_ID' + creds = _make_credentials() + client = self._make_one(project=PROJECT, credentials=creds) + with self.assertRaises(TypeError): + client.delete_dataset(client.dataset(DS_ID).table("foo")) + def test_job_from_resource_unknown_type(self): PROJECT = 'PROJECT' creds = _make_credentials() diff --git a/bigquery/tests/unit/test_dataset.py b/bigquery/tests/unit/test_dataset.py index 28c6790b793a..ac863d5052d5 100644 --- a/bigquery/tests/unit/test_dataset.py +++ b/bigquery/tests/unit/test_dataset.py @@ -388,35 +388,6 @@ def test__parse_access_entries_w_extra_keys(self): with self.assertRaises(ValueError): dataset._parse_access_entries(ACCESS) - def test_delete_w_bound_client(self): - PATH = 'projects/%s/datasets/%s' % (self.PROJECT, self.DS_ID) - conn = _Connection({}) - client = _Client(project=self.PROJECT, connection=conn) - dataset = self._make_one(self.DS_ID, client=client) - - dataset.delete() - - self.assertEqual(len(conn._requested), 1) - req = conn._requested[0] - self.assertEqual(req['method'], 'DELETE') - self.assertEqual(req['path'], '/%s' % PATH) - - def test_delete_w_alternate_client(self): - PATH = 'projects/%s/datasets/%s' % (self.PROJECT, self.DS_ID) - conn1 = _Connection() - CLIENT1 = _Client(project=self.PROJECT, connection=conn1) - conn2 = _Connection({}) - CLIENT2 = _Client(project=self.PROJECT, connection=conn2) - dataset = self._make_one(self.DS_ID, client=CLIENT1) - - dataset.delete(client=CLIENT2) - - self.assertEqual(len(conn1._requested), 0) - self.assertEqual(len(conn2._requested), 1) - req = conn2._requested[0] - self.assertEqual(req['method'], 'DELETE') - self.assertEqual(req['path'], '/%s' % PATH) - def test_list_tables_empty(self): import six