Skip to content

Commit b1a7e8e

Browse files
therveci.datadog-api-spec
andauthored
Add type annotations to models (#1200)
* Add type annotations to models This adds explicit parameters for optional paramaters and annotations for all of them, making sure oneOf are included. This also fixes oneOf handling in API body parameters. * Remove positional arguments * Remove the args * Don't use oneOf object * Push nullable everywhere * pre-commit fixes * Fix oneOf parameter import * Black Co-authored-by: ci.datadog-api-spec <[email protected]>
1 parent c073b0b commit b1a7e8e

File tree

1,374 files changed

+21092
-3248
lines changed

Some content is hidden

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

1,374 files changed

+21092
-3248
lines changed

.generator/src/generator/cli.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ def cli(specs, output):
4242
env.globals["package"] = PACKAGE_NAME
4343
env.globals["get_name"] = formatter.get_name
4444
env.globals["get_type_for_attribute"] = openapi.get_type_for_attribute
45+
env.globals["get_typing_for_attribute"] = openapi.get_typing_for_attribute
4546
env.globals["get_types_for_attribute"] = openapi.get_types_for_attribute
4647
env.globals["get_type_for_parameter"] = openapi.get_type_for_parameter
4748
env.globals["get_references_for_model"] = openapi.get_references_for_model
49+
env.globals["get_oneof_references_for_model"] = openapi.get_oneof_references_for_model
4850
env.globals["get_oneof_parameters"] = openapi.get_oneof_parameters
4951
env.globals["get_type_for_items"] = openapi.get_type_for_items
5052
env.globals["get_api_models"] = openapi.get_api_models

.generator/src/generator/formatter.py

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
PRIMITIVE_TYPES = ["string", "number", "boolean", "integer"]
1616

1717
EDGE_CASES = {}
18-
replacement_file = (
19-
pathlib.Path(__file__).parent
20-
/ "replacement.json"
21-
)
18+
replacement_file = pathlib.Path(__file__).parent / "replacement.json"
2219
if replacement_file.exists():
2320
with replacement_file.open() as f:
2421
EDGE_CASES.update(json.load(f))
@@ -96,7 +93,12 @@ def header(self, text, level, raw=None):
9693

9794

9895
def docstring(text):
99-
return m2r2.convert(text.replace("\\n", "\\\\n"), renderer=CustomRenderer())[1:-1].replace("\\ ", " ").replace("\\`", "\\\\`").replace("\n\n\n", "\n\n")
96+
return (
97+
m2r2.convert(text.replace("\\n", "\\\\n"), renderer=CustomRenderer())[1:-1]
98+
.replace("\\ ", " ")
99+
.replace("\\`", "\\\\`")
100+
.replace("\n\n\n", "\n\n")
101+
)
100102

101103

102104
def _merge_imports(a, b):
@@ -111,10 +113,7 @@ def format_parameters(kwargs, spec, version, replace_values=None):
111113
imports = defaultdict(set)
112114

113115
parameters_spec = {p["name"]: p for p in spec.get("parameters", [])}
114-
if (
115-
"requestBody" in spec
116-
and "multipart/form-data" in spec["requestBody"]["content"]
117-
):
116+
if "requestBody" in spec and "multipart/form-data" in spec["requestBody"]["content"]:
118117
parent = spec["requestBody"]["content"]["multipart/form-data"]["schema"]
119118
for name, schema in parent["properties"].items():
120119
parameters_spec[name] = {
@@ -153,9 +152,7 @@ def get_name_and_imports(schema, version=None, imports=None):
153152
name = schema.__reference__["$ref"].split("/")[-1]
154153
if "oneOf" not in schema:
155154
# do not include parent of oneOf schema
156-
imports[
157-
MODEL_IMPORT_TPL.format(version=version, name=safe_snake_case(name))
158-
].add(name)
155+
imports[MODEL_IMPORT_TPL.format(version=version, name=safe_snake_case(name))].add(name)
159156

160157
return name, imports
161158

@@ -176,10 +173,10 @@ def format_data_with_schema(
176173
imports = imports or defaultdict(set)
177174
if schema.get("type") not in {"string", "integer", "boolean"} or schema.get("enum"):
178175
name, imports = get_name_and_imports(schema, version, imports)
176+
if schema.get("oneOf"):
177+
name = None
179178
if name:
180-
imports[
181-
MODEL_IMPORT_TPL.format(version=version, name=safe_snake_case(name))
182-
].add(name)
179+
imports[MODEL_IMPORT_TPL.format(version=version, name=safe_snake_case(name))].add(name)
183180

184181
if "enum" in schema and data not in schema["enum"]:
185182
raise ValueError(f"{data} is not valid enum value {schema['enum']}")
@@ -321,15 +318,9 @@ def format_data_with_schema_dict(
321318
imports = _merge_imports(imports, extra_imports)
322319

323320
if not name and "oneOf" not in schema:
324-
if (
325-
default_name
326-
and not schema.get("additionalProperties")
327-
and schema.get("properties")
328-
):
321+
if default_name and not schema.get("additionalProperties") and schema.get("properties"):
329322
name = default_name
330-
imports[
331-
MODEL_IMPORT_TPL.format(version=version, name=safe_snake_case(name))
332-
].add(name)
323+
imports[MODEL_IMPORT_TPL.format(version=version, name=safe_snake_case(name))].add(name)
333324
else:
334325
name = "dict"
335326
warnings.warn(f"Unnamed schema {schema} for {data}")
@@ -360,7 +351,7 @@ def format_data_with_schema_dict(
360351
warnings.warn(f"[{matched}] {data} is not valid for schema {name}")
361352

362353
if not parameters and data:
363-
parameters = ", ".join(f"{k}=\"{v}\"" for k, v in data.items())
354+
parameters = ", ".join(f'{k}="{v}"' for k, v in data.items())
364355

365356
if name:
366357
return f"{name}({parameters})", imports

0 commit comments

Comments
 (0)