Skip to content

Commit e1506fa

Browse files
committed
fix!: api consistency between HTTP and Gapic layers (#375)
1 parent 6fa1773 commit e1506fa

File tree

9 files changed

+691
-343
lines changed

9 files changed

+691
-343
lines changed

google/cloud/logging_v2/_gapic.py

Lines changed: 72 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ def list_entries(
4949
*,
5050
filter_=None,
5151
order_by=None,
52+
max_results=None,
5253
page_size=None,
5354
page_token=None,
5455
):
55-
"""Return a page of log entry resources.
56+
"""Return a generator of log entry resources.
5657
5758
Args:
5859
resource_names (Sequence[str]): Names of one or more parent resources
@@ -69,14 +70,16 @@ def list_entries(
6970
https://cloud.google.com/logging/docs/view/advanced_filters
7071
order_by (str) One of :data:`~logging_v2.ASCENDING`
7172
or :data:`~logging_v2.DESCENDING`.
72-
page_size (int): maximum number of entries to return, If not passed,
73-
defaults to a value set by the API.
74-
page_token (str): opaque marker for the next "page" of entries. If not
75-
passed, the API will return the first page of
76-
entries.
77-
73+
max_results (Optional[int]):
74+
Optional. The maximum number of entries to return.
75+
Non-positive values are treated as 0. If None, uses API defaults.
76+
page_size (int): number of entries to fetch in each API call. Although
77+
requests are paged internally, logs are returned by the generator
78+
one at a time. If not passed, defaults to a value set by the API.
79+
page_token (str): opaque marker for the starting "page" of entries. If not
80+
passed, the API will return the first page of entries.
7881
Returns:
79-
Iterator[~logging_v2.LogEntry]
82+
Generator[~logging_v2.LogEntry]
8083
"""
8184
# full resource names are expected by the API
8285
resource_names = resource_names
@@ -89,19 +92,27 @@ def list_entries(
8992
)
9093

9194
response = self._gapic_api.list_log_entries(request=request)
92-
page_iter = iter(response)
95+
log_iter = iter(response)
9396

9497
# We attach a mutable loggers dictionary so that as Logger
9598
# objects are created by entry_from_resource, they can be
9699
# re-used by other log entries from the same logger.
97100
loggers = {}
98101

99-
def log_entries_pager(page_iter):
100-
for page in page_iter:
101-
log_entry_dict = _parse_log_entry(LogEntryPB.pb(page))
102+
if max_results is not None and max_results < 0:
103+
raise ValueError("max_results must be positive")
104+
105+
# create generator
106+
def log_entries_pager(log_iter):
107+
i = 0
108+
for entry in log_iter:
109+
if max_results is not None and i >= max_results:
110+
break
111+
log_entry_dict = _parse_log_entry(LogEntryPB.pb(entry))
102112
yield entry_from_resource(log_entry_dict, self._client, loggers=loggers)
113+
i += 1
103114

104-
return log_entries_pager(page_iter)
115+
return log_entries_pager(log_iter)
105116

106117
def write_entries(
107118
self,
@@ -175,7 +186,7 @@ def __init__(self, gapic_api, client):
175186
self._gapic_api = gapic_api
176187
self._client = client
177188

178-
def list_sinks(self, parent, *, page_size=0, page_token=None):
189+
def list_sinks(self, parent, *, max_results=None, page_size=None, page_token=None):
179190
"""List sinks for the parent resource.
180191
181192
Args:
@@ -187,27 +198,37 @@ def list_sinks(self, parent, *, page_size=0, page_token=None):
187198
"organizations/[ORGANIZATION_ID]"
188199
"billingAccounts/[BILLING_ACCOUNT_ID]"
189200
"folders/[FOLDER_ID]".
190-
page_size (Optional[int]): Maximum number of sinks to return, If not passed,
191-
defaults to a value set by the API.
192-
page_token (Optional[str]): Opaque marker for the next "page" of sinks. If not
193-
passed, the API will return the first page of
194-
sinks.
201+
max_results (Optional[int]):
202+
Optional. The maximum number of entries to return.
203+
Non-positive values are treated as 0. If None, uses API defaults.
204+
page_size (int): number of entries to fetch in each API call. Although
205+
requests are paged internally, logs are returned by the generator
206+
one at a time. If not passed, defaults to a value set by the API.
207+
page_token (str): opaque marker for the starting "page" of entries. If not
208+
passed, the API will return the first page of entries.
195209
196210
Returns:
197-
Iterator[~logging_v2.Sink]
211+
Generator[~logging_v2.Sink]
198212
"""
199213
request = ListSinksRequest(
200214
parent=parent, page_size=page_size, page_token=page_token
201215
)
202216
response = self._gapic_api.list_sinks(request)
203-
page_iter = iter(response)
217+
sink_iter = iter(response)
218+
219+
if max_results is not None and max_results < 0:
220+
raise ValueError("max_results must be positive")
204221

205-
def sinks_pager(page_iter):
206-
for page in page_iter:
222+
def sinks_pager(sink_iter):
223+
i = 0
224+
for entry in sink_iter:
225+
if max_results is not None and i >= max_results:
226+
break
207227
# Convert the GAPIC sink type into the handwritten `Sink` type
208-
yield Sink.from_api_repr(LogSink.to_dict(page), client=self._client)
228+
yield Sink.from_api_repr(LogSink.to_dict(entry), client=self._client)
229+
i += 1
209230

210-
return sinks_pager(page_iter)
231+
return sinks_pager(sink_iter)
211232

212233
def sink_create(
213234
self, parent, sink_name, filter_, destination, *, unique_writer_identity=False
@@ -347,33 +368,47 @@ def __init__(self, gapic_api, client):
347368
self._gapic_api = gapic_api
348369
self._client = client
349370

350-
def list_metrics(self, project, *, page_size=0, page_token=None):
371+
def list_metrics(
372+
self, project, *, max_results=None, page_size=None, page_token=None
373+
):
351374
"""List metrics for the project associated with this client.
352375
353376
Args:
354377
project (str): ID of the project whose metrics are to be listed.
355-
page_size (int): Maximum number of metrics to return, If not passed,
356-
defaults to a value set by the API.
357-
page_token (str): Opaque marker for the next "page" of metrics. If not
358-
passed, the API will return the first page of
359-
sinks.
378+
max_results (Optional[int]):
379+
Optional. The maximum number of entries to return.
380+
Non-positive values are treated as 0. If None, uses API defaults.
381+
page_size (int): number of entries to fetch in each API call. Although
382+
requests are paged internally, logs are returned by the generator
383+
one at a time. If not passed, defaults to a value set by the API.
384+
page_token (str): opaque marker for the starting "page" of entries. If not
385+
passed, the API will return the first page of entries.
360386
361387
Returns:
362-
Iterable[logging_v2.Metric]: Iterable of metrics.
388+
Generator[logging_v2.Metric]
363389
"""
364390
path = f"projects/{project}"
365391
request = ListLogMetricsRequest(
366392
parent=path, page_size=page_size, page_token=page_token,
367393
)
368394
response = self._gapic_api.list_log_metrics(request=request)
369-
page_iter = iter(response)
395+
metric_iter = iter(response)
396+
397+
if max_results is not None and max_results < 0:
398+
raise ValueError("max_results must be positive")
370399

371-
def metrics_pager(page_iter):
372-
for page in page_iter:
400+
def metrics_pager(metric_iter):
401+
i = 0
402+
for entry in metric_iter:
403+
if max_results is not None and i >= max_results:
404+
break
373405
# Convert GAPIC metrics type into handwritten `Metric` type
374-
yield Metric.from_api_repr(LogMetric.to_dict(page), client=self._client)
406+
yield Metric.from_api_repr(
407+
LogMetric.to_dict(entry), client=self._client
408+
)
409+
i += 1
375410

376-
return metrics_pager(page_iter)
411+
return metrics_pager(metric_iter)
377412

378413
def metric_create(self, project, metric_name, filter_, description):
379414
"""Create a metric resource.

google/cloud/logging_v2/_http.py

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def list_entries(
7474
*,
7575
filter_=None,
7676
order_by=None,
77+
max_results=None,
7778
page_size=None,
7879
page_token=None,
7980
):
@@ -94,14 +95,16 @@ def list_entries(
9495
https://cloud.google.com/logging/docs/view/advanced_filters
9596
order_by (str) One of :data:`~logging_v2.ASCENDING`
9697
or :data:`~logging_v2.DESCENDING`.
97-
page_size (int): maximum number of entries to return, If not passed,
98-
defaults to a value set by the API.
99-
page_token (str): opaque marker for the next "page" of entries. If not
100-
passed, the API will return the first page of
101-
entries.
102-
98+
max_results (Optional[int]):
99+
Optional. The maximum number of entries to return.
100+
Non-positive values are treated as 0. If None, uses API defaults.
101+
page_size (int): number of entries to fetch in each API call. Although
102+
requests are paged internally, logs are returned by the generator
103+
one at a time. If not passed, defaults to a value set by the API.
104+
page_token (str): opaque marker for the starting "page" of entries. If not
105+
passed, the API will return the first page of entries.
103106
Returns:
104-
Iterator[~logging_v2.LogEntry]
107+
Generator[~logging_v2.LogEntry]
105108
"""
106109
extra_params = {"resourceNames": resource_names}
107110

@@ -131,7 +134,8 @@ def list_entries(
131134
)
132135
# This method uses POST to make a read-only request.
133136
iterator._HTTP_METHOD = "POST"
134-
return iterator
137+
138+
return _entries_pager(iterator, max_results)
135139

136140
def write_entries(
137141
self,
@@ -219,7 +223,7 @@ def __init__(self, client):
219223
self._client = client
220224
self.api_request = client._connection.api_request
221225

222-
def list_sinks(self, parent, *, page_size=None, page_token=None):
226+
def list_sinks(self, parent, *, max_results=None, page_size=None, page_token=None):
223227
"""List sinks for the parent resource.
224228
225229
See
@@ -234,22 +238,25 @@ def list_sinks(self, parent, *, page_size=None, page_token=None):
234238
"organizations/[ORGANIZATION_ID]"
235239
"billingAccounts/[BILLING_ACCOUNT_ID]"
236240
"folders/[FOLDER_ID]".
237-
page_size (Optional[int]): Maximum number of sinks to return, If not passed,
238-
defaults to a value set by the API.
239-
page_token (Optional[str]): Opaque marker for the next "page" of sinks. If not
240-
passed, the API will return the first page of
241-
sinks.
241+
max_results (Optional[int]):
242+
Optional. The maximum number of entries to return.
243+
Non-positive values are treated as 0. If None, uses API defaults.
244+
page_size (int): number of entries to fetch in each API call. Although
245+
requests are paged internally, logs are returned by the generator
246+
one at a time. If not passed, defaults to a value set by the API.
247+
page_token (str): opaque marker for the starting "page" of entries. If not
248+
passed, the API will return the first page of entries.
242249
243250
Returns:
244-
Iterator[~logging_v2.Sink]
251+
Generator[~logging_v2.Sink]
245252
"""
246253
extra_params = {}
247254

248255
if page_size is not None:
249256
extra_params["pageSize"] = page_size
250257

251258
path = f"/{parent}/sinks"
252-
return page_iterator.HTTPIterator(
259+
iterator = page_iterator.HTTPIterator(
253260
client=self._client,
254261
api_request=self._client._connection.api_request,
255262
path=path,
@@ -259,6 +266,8 @@ def list_sinks(self, parent, *, page_size=None, page_token=None):
259266
extra_params=extra_params,
260267
)
261268

269+
return _entries_pager(iterator, max_results)
270+
262271
def sink_create(
263272
self, parent, sink_name, filter_, destination, *, unique_writer_identity=False
264273
):
@@ -373,32 +382,35 @@ def __init__(self, client):
373382
self._client = client
374383
self.api_request = client._connection.api_request
375384

376-
def list_metrics(self, project, *, page_size=None, page_token=None):
385+
def list_metrics(
386+
self, project, *, max_results=None, page_size=None, page_token=None
387+
):
377388
"""List metrics for the project associated with this client.
378389
379390
See
380391
https://cloud.google.com/logging/docs/reference/v2/rest/v2/projects.metrics/list
381392
382393
Args:
383-
page_size (Optional[int]): The maximum number of sinks in each
384-
page of results from this request. Non-positive values are ignored. Defaults to a
385-
sensible value set by the API.
386-
page_token (Optional[str]): If present, return the next batch of sinks, using the
387-
value, which must correspond to the ``nextPageToken`` value
388-
returned in the previous response. Deprecated: use the ``pages``
389-
property ofthe returned iterator instead of manually passing the
390-
token.
394+
max_results (Optional[int]):
395+
Optional. The maximum number of entries to return.
396+
Non-positive values are treated as 0. If None, uses API defaults.
397+
page_size (int): number of entries to fetch in each API call. Although
398+
requests are paged internally, logs are returned by the generator
399+
one at a time. If not passed, defaults to a value set by the API.
400+
page_token (str): opaque marker for the starting "page" of entries. If not
401+
passed, the API will return the first page of entries.
391402
392403
Returns:
393-
Iterator[google.cloud.logging_v2.metric.Metric]
404+
Generator[logging_v2.Metric]
405+
394406
"""
395407
extra_params = {}
396408

397409
if page_size is not None:
398410
extra_params["pageSize"] = page_size
399411

400412
path = f"/projects/{project}/metrics"
401-
return page_iterator.HTTPIterator(
413+
iterator = page_iterator.HTTPIterator(
402414
client=self._client,
403415
api_request=self._client._connection.api_request,
404416
path=path,
@@ -407,6 +419,7 @@ def list_metrics(self, project, *, page_size=None, page_token=None):
407419
page_token=page_token,
408420
extra_params=extra_params,
409421
)
422+
return _entries_pager(iterator, max_results)
410423

411424
def metric_create(self, project, metric_name, filter_, description):
412425
"""Create a metric resource.
@@ -469,6 +482,18 @@ def metric_delete(self, project, metric_name):
469482
self.api_request(method="DELETE", path=target)
470483

471484

485+
def _entries_pager(page_iter, max_results=None):
486+
if max_results is not None and max_results < 0:
487+
raise ValueError("max_results must be positive")
488+
489+
i = 0
490+
for page in page_iter:
491+
if max_results is not None and i >= max_results:
492+
break
493+
yield page
494+
i += 1
495+
496+
472497
def _item_to_entry(iterator, resource, loggers):
473498
"""Convert a log entry resource to the native object.
474499

0 commit comments

Comments
 (0)