Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions fastapi_code_generator/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -644,22 +644,27 @@ def _has_non_object_discriminator_variant(self, obj: JsonSchemaObject) -> bool:
)

def _is_object_discriminator_variant(
self, schema: JsonSchemaObject, seen_refs: set[str] | None = None
self, schema: JsonSchemaObject | bool, seen_refs: set[str] | None = None
) -> bool:
if not isinstance(schema, JsonSchemaObject):
return False
schema_obj = schema
if seen_refs is None:
seen_refs = set()
if schema.ref:
if schema.ref in seen_refs:
if schema_obj.ref:
if schema_obj.ref in seen_refs:
return False
seen_refs.add(schema.ref)
schema = JsonSchemaObject.model_validate(self.get_ref_model(schema.ref))
if schema.is_object or schema.properties:
seen_refs.add(schema_obj.ref)
schema_obj = JsonSchemaObject.model_validate(
self.get_ref_model(schema_obj.ref)
)
if schema_obj.is_object or schema_obj.properties:
return True
if not schema.allOf:
if not schema_obj.allOf:
return False
return any(
self._is_object_discriminator_variant(member, seen_refs.copy())
for member in schema.allOf
for member in schema_obj.allOf
)

def _get_upload_file_type(
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ classifiers = [
dynamic = ["version"]
dependencies = [
"click>=8.1.8,<8.2",
"datamodel-code-generator[http]>=0.56.1,<0.57",
"datamodel-code-generator[http]>=0.59,<0.60",
Comment thread
koxudaxi marked this conversation as resolved.
"jinja2>=2.11.2,<4",
"pydantic>=2.12,<3",
"pysnooper>=0.4.1,<2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from __future__ import annotations

from datetime import date as date_aliased
from datetime import date
from typing import Optional

from fastapi import FastAPI
Expand All @@ -17,5 +17,5 @@


@app.get('/actions/', response_model=None)
def get_actions_(due: Optional[date_aliased] = None) -> None:
def get_actions_(due: Optional[date] = None) -> None:
pass
26 changes: 26 additions & 0 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,3 +314,29 @@ def test_get_field_extras_checks_one_of_and_any_of_variants() -> None:
},
{},
)


def test_get_field_extras_removes_discriminator_for_boolean_variant() -> None:
parser = OpenAPIParser(
"openapi: 3.0.0\ninfo: {title: Test, version: '1.0'}\npaths: {}\n"
)
assert_field_extras(
parser,
{
"oneOf": [
True,
{
"type": "object",
"properties": {
"kind": {
"type": "string",
},
},
},
],
"discriminator": {
"propertyName": "kind",
},
},
{},
)
8 changes: 4 additions & 4 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading