From c5f4ad8fddd1849a4229b0126c4c022bccb90128 Mon Sep 17 00:00:00 2001 From: Ryan Yuan Date: Fri, 23 Jul 2021 02:47:08 +1000 Subject: [PATCH] feat: add 'page_size' parameter to 'Bucket.list_blobs, list_buckets (#520) --- google/cloud/storage/client.py | 14 ++++++++++++++ tests/unit/test_client.py | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/google/cloud/storage/client.py b/google/cloud/storage/client.py index 18bd7c9cb..7d787a731 100644 --- a/google/cloud/storage/client.py +++ b/google/cloud/storage/client.py @@ -384,6 +384,7 @@ def _list_resource( max_results=None, extra_params=None, page_start=page_iterator._do_nothing_page_start, + page_size=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): @@ -399,6 +400,7 @@ def _list_resource( max_results=max_results, extra_params=extra_params, page_start=page_start, + page_size=page_size, ) def _patch_resource( @@ -1134,6 +1136,7 @@ def list_blobs( versions=None, projection="noAcl", fields=None, + page_size=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): @@ -1200,6 +1203,10 @@ def list_blobs( ``'items(name,contentLanguage),nextPageToken'``. See: https://cloud.google.com/storage/docs/json_api/v1/parameters#fields + page_size (int): + (Optional) Maximum number of blobs to return in each page. + Defaults to a value set by the API. + timeout (Optional[Union[float, Tuple[float, float]]]): The amount of time, in seconds, to wait for the server response. @@ -1269,6 +1276,7 @@ def list_blobs( max_results=max_results, extra_params=extra_params, page_start=_blobs_page_start, + page_size=page_size, timeout=timeout, retry=retry, ) @@ -1284,6 +1292,7 @@ def list_buckets( projection="noAcl", fields=None, project=None, + page_size=None, timeout=_DEFAULT_TIMEOUT, retry=DEFAULT_RETRY, ): @@ -1330,6 +1339,10 @@ def list_buckets( :param project: (Optional) The project whose buckets are to be listed. If not passed, uses the project set on the client. + :type page_size: int + :param page_size: (Optional) Maximum number of buckets to return in each page. + Defaults to a value set by the API. + :type timeout: float or tuple :param timeout: (Optional) The amount of time, in seconds, to wait @@ -1367,6 +1380,7 @@ def list_buckets( page_token=page_token, max_results=max_results, extra_params=extra_params, + page_size=page_size, timeout=timeout, retry=retry, ) diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index cc5c96bbc..4998c54f4 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -1589,6 +1589,7 @@ def test_list_blobs_w_defaults_w_bucket_obj(self): expected_max_results = None expected_extra_params = {"projection": "noAcl"} expected_page_start = _blobs_page_start + expected_page_size = None client._list_resource.assert_called_once_with( expected_path, expected_item_to_value, @@ -1596,6 +1597,7 @@ def test_list_blobs_w_defaults_w_bucket_obj(self): max_results=expected_max_results, extra_params=expected_extra_params, page_start=expected_page_start, + page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, ) @@ -1616,6 +1618,7 @@ def test_list_blobs_w_explicit_w_user_project(self): include_trailing_delimiter = True versions = True projection = "full" + page_size = 2 fields = "items/contentLanguage,nextPageToken" credentials = _make_credentials() client = self._make_one(project=project, credentials=credentials) @@ -1641,6 +1644,7 @@ def test_list_blobs_w_explicit_w_user_project(self): versions=versions, projection=projection, fields=fields, + page_size=page_size, timeout=timeout, retry=retry, ) @@ -1665,6 +1669,7 @@ def test_list_blobs_w_explicit_w_user_project(self): "userProject": user_project, } expected_page_start = _blobs_page_start + expected_page_size = 2 client._list_resource.assert_called_once_with( expected_path, expected_item_to_value, @@ -1672,6 +1677,7 @@ def test_list_blobs_w_explicit_w_user_project(self): max_results=expected_max_results, extra_params=expected_extra_params, page_start=expected_page_start, + page_size=expected_page_size, timeout=timeout, retry=retry, ) @@ -1699,6 +1705,7 @@ def test_list_buckets_w_defaults(self): expected_item_to_value = _item_to_bucket expected_page_token = None expected_max_results = None + expected_page_size = None expected_extra_params = { "project": project, "projection": "noAcl", @@ -1709,6 +1716,7 @@ def test_list_buckets_w_defaults(self): page_token=expected_page_token, max_results=expected_max_results, extra_params=expected_extra_params, + page_size=expected_page_size, timeout=self._get_default_timeout(), retry=DEFAULT_RETRY, ) @@ -1726,6 +1734,7 @@ def test_list_buckets_w_explicit(self): credentials = _make_credentials() client = self._make_one(project=project, credentials=credentials) client._list_resource = mock.Mock(spec=[]) + page_size = 2 timeout = 42 retry = mock.Mock(spec=[]) @@ -1736,6 +1745,7 @@ def test_list_buckets_w_explicit(self): prefix=prefix, projection=projection, fields=fields, + page_size=page_size, timeout=timeout, retry=retry, ) @@ -1752,12 +1762,14 @@ def test_list_buckets_w_explicit(self): "projection": projection, "fields": fields, } + expected_page_size = 2 client._list_resource.assert_called_once_with( expected_path, expected_item_to_value, page_token=expected_page_token, max_results=expected_max_results, extra_params=expected_extra_params, + page_size=expected_page_size, timeout=timeout, retry=retry, )