Skip to content

Commit a7b3e86

Browse files
authored
Add typing information to pagination methods (#1078)
Fill up for the typing arguments as we did for regular APIs.
1 parent f957094 commit a7b3e86

File tree

8 files changed

+259
-47
lines changed

8 files changed

+259
-47
lines changed

.generator/src/generator/openapi.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,11 @@ def get_api_models(operations):
383383
if name and name not in seen:
384384
seen.add(name)
385385
yield name
386+
if "x-pagination" in operation:
387+
name = get_type_at_path(operation, operation["x-pagination"]["resultsPath"])
388+
if name and name not in seen:
389+
seen.add(name)
390+
yield name
386391

387392

388393
def parameters(operation):

.generator/src/generator/templates/api.j2

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{% include "api_info.j2" %}
22
from __future__ import annotations
33

4+
import collections
45
from typing import Any, Dict, List, Union
56

67
from {{ package }}.api_client import ApiClient, Endpoint as _Endpoint
@@ -171,7 +172,7 @@ class {{ classname }}:
171172
{%- if operation["x-pagination"] %}
172173
{%- set pagination = operation["x-pagination"] %}
173174

174-
def {{ operation.operationId|safe_snake_case }}_with_pagination(self, {% for name, parameter in operation|parameters if parameter.required %}{{name|attribute_name}}, {% endfor %}**kwargs):
175+
def {{ operation.operationId|safe_snake_case }}_with_pagination(self, {% for name, parameter in operation|parameters if parameter.required %}{{name|attribute_name}}: {{ get_type_for_parameter(parameter, typing=True) }}, {% endfor %}{% for name, parameter in operation|parameters if not parameter.required %}{% if loop.first %}*, {% endif %}{{name|attribute_name}}: Union[{{ get_type_for_parameter(parameter, typing=True) }}, UnsetType]=unset, {% endfor %}) -> collections.abc.Iterable[{{ get_type_at_path(operation, pagination.resultsPath) }}]:
175176
"""{{ operation.summary|indent(8) }}.
176177

177178
Provide a paginated version of :meth:`{{ operation.operationId|safe_snake_case }}`, returning all items.
@@ -190,20 +191,26 @@ class {{ classname }}:
190191
:return: A generator of paginated results.
191192
:rtype: collections.abc.Iterable[{{ get_type_at_path(operation, pagination.resultsPath) }}]
192193
"""
193-
{%- for name, parameter in operation|parameters if parameter.required %}
194+
kwargs: Dict[str, Any] = {}
195+
{%- for name, parameter in operation|parameters %}
196+
{%- if not parameter.required %}
197+
if {{ name|attribute_name }} is not unset:
198+
kwargs["{{ name|attribute_name }}"] = {{ name|attribute_name }}
199+
{%- else %}
194200
kwargs["{{ name|attribute_name }}"] = {{ name|attribute_name }}
201+
{%- endif %}
195202
{% endfor %}
196-
page_size = get_attribute_from_path(kwargs, "{{ pagination.limitParam|attribute_path }}", {{ get_default(operation, pagination.limitParam) }})
203+
local_page_size = get_attribute_from_path(kwargs, "{{ pagination.limitParam|attribute_path }}", {{ get_default(operation, pagination.limitParam) }})
197204
endpoint = self._{{ operation.operationId|safe_snake_case }}_endpoint
198-
set_attribute_from_path(kwargs, "{{ pagination.limitParam|attribute_path }}", page_size, endpoint.params_map)
205+
set_attribute_from_path(kwargs, "{{ pagination.limitParam|attribute_path }}", local_page_size, endpoint.params_map)
199206
while True:
200207
response = endpoint.call_with_http_info(**kwargs)
201208
for item in get_attribute_from_path(response, "{{ pagination.resultsPath|attribute_path }}"):
202209
yield item
203-
if len(get_attribute_from_path(response, "{{ pagination.resultsPath|attribute_path }}")) < page_size:
210+
if len(get_attribute_from_path(response, "{{ pagination.resultsPath|attribute_path }}")) < local_page_size:
204211
break
205212
{%- if pagination.pageOffsetParam %}
206-
set_attribute_from_path(kwargs, "{{ pagination.pageOffsetParam|attribute_path }}", get_attribute_from_path(kwargs, "{{ pagination.pageOffsetParam|attribute_path }}", 0) + page_size, endpoint.params_map)
213+
set_attribute_from_path(kwargs, "{{ pagination.pageOffsetParam|attribute_path }}", get_attribute_from_path(kwargs, "{{ pagination.pageOffsetParam|attribute_path }}", 0) + local_page_size, endpoint.params_map)
207214
{%- endif %}
208215
{%- if pagination.cursorParam %}
209216
set_attribute_from_path(kwargs, "{{ pagination.cursorParam|attribute_path }}", get_attribute_from_path(response, "{{ pagination.cursorPath }}"), endpoint.params_map)

src/datadog_api_client/v2/api/audit_api.py

Lines changed: 46 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/datadog_api_client/v2/api/incidents_api.py

Lines changed: 23 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/datadog_api_client/v2/api/logs_api.py

Lines changed: 50 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)