Skip to content

Commit f957094

Browse files
therveci.datadog-api-spec
andauthored
Add typing to API arguments (#1076)
* Add typing information * Rebase * Passs datetimes not strings * Rebase * Handle 3.7 * pre-commit fixes * Use extension everywhere Co-authored-by: ci.datadog-api-spec <[email protected]>
1 parent 4bb1cf5 commit f957094

File tree

99 files changed

+3267
-428
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+3267
-428
lines changed

.generator/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def unique(request):
187187
TIME_FORMATTER = {
188188
"now": "datetime.now()",
189189
"timestamp": "{sret}.timestamp()",
190-
"isoformat": '{sret}.isoformat(timespec="seconds")',
190+
"isoformat": "{sret}",
191191
"units": {
192192
"s": "({sret} + relativedelta(seconds={num}))",
193193
"m": "({sret} + relativedelta(minutes={num}))",

.generator/src/generator/openapi.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,19 @@ def get_type_for_items(schema):
113113
return name
114114

115115

116-
def get_type_for_parameter(parameter):
116+
def get_type_for_parameter(parameter, typing=False):
117117
"""Return Python type name for the parameter."""
118118
if "content" in parameter:
119119
assert "in" not in parameter
120120
for content in parameter["content"].values():
121-
return type_to_python(content["schema"])
122-
return type_to_python(parameter.get("schema"))
121+
data = type_to_python(content["schema"])
122+
if typing:
123+
data = data.replace("[", "List[")
124+
return data
125+
data = type_to_python(parameter.get("schema"))
126+
if typing:
127+
data = data.replace("[", "List[")
128+
return data
123129

124130

125131
def get_enum_type(schema):

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

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

4+
from typing import Any, Dict, List, Union
35

46
from {{ package }}.api_client import ApiClient, Endpoint as _Endpoint
57
from {{ package }}.model_utils import (
@@ -9,6 +11,8 @@ from {{ package }}.model_utils import (
911
get_attribute_from_path,
1012
file_type,
1113
none_type,
14+
UnsetType,
15+
unset,
1216
)
1317
{%- for model in get_api_models(operations) %}
1418
from {{ package }}.{{ version }}.model.{{ model|safe_snake_case }} import {{ model }}
@@ -134,7 +138,8 @@ class {{ classname }}:
134138
{% endfor %}
135139

136140
{%- for path, method, operation in operations|sort(attribute="2.operationId") %}
137-
def {{ operation.operationId|safe_snake_case }}(self, {% for name, parameter in operation|parameters if parameter.required %}{{name|attribute_name}}, {% endfor %}**kwargs):
141+
{%- set returnType = operation|return_type %}
142+
def {{ operation.operationId|safe_snake_case }}(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 %}) -> {% if returnType %}{{ returnType.replace("[", "List[") }}{% else %}None{% endif %}:
138143
"""{{ operation.summary|indent(8) }}.
139144
{% if operation.description %}
140145
{{ operation.description|docstring|indent(8) }}
@@ -153,8 +158,14 @@ class {{ classname }}:
153158
{%- set returnType = operation|return_type %}
154159
:rtype: {% if returnType %}{{ returnType }}{% else %}None{% endif %}
155160
"""
156-
{%- for name, parameter in operation|parameters if parameter.required %}
161+
kwargs: Dict[str, Any] = {}
162+
{%- for name, parameter in operation|parameters %}
163+
{%- if not parameter.required %}
164+
if {{ name|attribute_name }} is not unset:
165+
kwargs["{{ name|attribute_name }}"] = {{ name|attribute_name }}
166+
{%- else %}
157167
kwargs["{{ name|attribute_name }}"] = {{ name|attribute_name }}
168+
{%- endif %}
158169
{% endfor %}
159170
return self._{{ operation.operationId|safe_snake_case }}_endpoint.call_with_http_info(**kwargs)
160171
{%- if operation["x-pagination"] %}

.generator/src/generator/templates/model_utils.j2

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{% include "api_info.j2" %}
22

33
from datetime import date, datetime
4+
import enum
45
import inspect
56
import io
67
import os
@@ -9,6 +10,7 @@ import re
910
import tempfile
1011
from types import MappingProxyType
1112
from typing import Collection, Mapping, Union
13+
from typing_extensions import Final
1214

1315
from dateutil.parser import parse
1416

@@ -24,6 +26,12 @@ file_type = io.IOBase
2426
empty_dict = MappingProxyType({}) # type: ignore
2527

2628

29+
class UnsetType(enum.Enum):
30+
unset = 0
31+
32+
unset: Final = UnsetType.unset
33+
34+
2735
def convert_js_args_to_python_args(fn):
2836
from functools import wraps
2937

examples/v1/logs/ListLogs_235998668.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
query="host:Test*",
1616
sort=LogsSort("asc"),
1717
time=LogsListRequestTime(
18-
_from=(datetime.now() + relativedelta(hours=-1)).isoformat(timespec="seconds"),
18+
_from=(datetime.now() + relativedelta(hours=-1)),
1919
timezone="Europe/Paris",
20-
to=datetime.now().isoformat(timespec="seconds"),
20+
to=datetime.now(),
2121
),
2222
)
2323

examples/v1/usage-metering/GetHourlyUsageAttribution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
with ApiClient(configuration) as api_client:
1414
api_instance = UsageMeteringApi(api_client)
1515
response = api_instance.get_hourly_usage_attribution(
16-
start_hr=(datetime.now() + relativedelta(days=-3)).isoformat(timespec="seconds"),
16+
start_hr=(datetime.now() + relativedelta(days=-3)),
1717
usage_type=HourlyUsageAttributionUsageType("infra_host_usage"),
1818
)
1919

examples/v1/usage-metering/GetIncidentManagement.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
with ApiClient(configuration) as api_client:
1212
api_instance = UsageMeteringApi(api_client)
1313
response = api_instance.get_incident_management(
14-
start_hr=(datetime.now() + relativedelta(days=-5)).isoformat(timespec="seconds"),
15-
end_hr=(datetime.now() + relativedelta(days=-3)).isoformat(timespec="seconds"),
14+
start_hr=(datetime.now() + relativedelta(days=-5)),
15+
end_hr=(datetime.now() + relativedelta(days=-3)),
1616
)
1717

1818
print(response)

examples/v1/usage-metering/GetIngestedSpans.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
with ApiClient(configuration) as api_client:
1212
api_instance = UsageMeteringApi(api_client)
1313
response = api_instance.get_ingested_spans(
14-
start_hr=(datetime.now() + relativedelta(days=-5)).isoformat(timespec="seconds"),
15-
end_hr=(datetime.now() + relativedelta(days=-3)).isoformat(timespec="seconds"),
14+
start_hr=(datetime.now() + relativedelta(days=-5)),
15+
end_hr=(datetime.now() + relativedelta(days=-3)),
1616
)
1717

1818
print(response)

examples/v1/usage-metering/GetMonthlyUsageAttribution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
with ApiClient(configuration) as api_client:
1616
api_instance = UsageMeteringApi(api_client)
1717
response = api_instance.get_monthly_usage_attribution(
18-
start_month=(datetime.now() + relativedelta(days=-3)).isoformat(timespec="seconds"),
18+
start_month=(datetime.now() + relativedelta(days=-3)),
1919
fields=MonthlyUsageAttributionSupportedMetrics("infra_host_usage"),
2020
)
2121

examples/v1/usage-metering/GetMonthlyUsageAttribution_3849653599.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
with ApiClient(configuration) as api_client:
2121
api_instance = UsageMeteringApi(api_client)
2222
response = api_instance.get_monthly_usage_attribution(
23-
start_month=(datetime.now() + relativedelta(days=-3)).isoformat(timespec="seconds"),
23+
start_month=(datetime.now() + relativedelta(days=-3)),
2424
fields=MonthlyUsageAttributionSupportedMetrics("infra_host_usage"),
2525
next_record_id=MONTHLY_USAGE_ATTRIBUTION_METADATA_PAGINATION_NEXT_RECORD_ID,
2626
)

0 commit comments

Comments
 (0)