Skip to content

Commit

Permalink
fix(openapi): set default on schema from FieldDefinition
Browse files Browse the repository at this point in the history
Consider the following:

```python
    def get_foo(foo_id: int = 10) -> None:
        ...
```
In such cases, no `KwargDefinition` is created since there is no
metadata provided via `Annotated`. The default is still parsed, and
set on the generated `FieldDefinition`, however the `SchemaCreator`
currently only considers defaults that are set on `KwargDefinition`.

So in such cases, we should fallback to the default set on the
`FieldDefinition` if there is a valid default value.
  • Loading branch information
guacs committed Mar 29, 2024
1 parent d2cb891 commit 8f64501
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 1 deletion.
3 changes: 3 additions & 0 deletions litestar/_openapi/schema_generation/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,9 @@ def process_schema_result(self, field: FieldDefinition, schema: Schema) -> Schem
if getattr(schema, schema_key, None) is None:
setattr(schema, schema_key, value)

if schema.default is None and field.default is not Empty:
schema.default = field.default

if not schema.examples and self.generate_examples:
from litestar._openapi.schema_generation.examples import create_examples_for_field

Expand Down
17 changes: 16 additions & 1 deletion tests/unit/test_openapi/test_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
from litestar.openapi.spec.example import Example
from litestar.openapi.spec.schema import Schema
from litestar.pagination import ClassicPagination, CursorPagination, OffsetPagination
from litestar.params import Parameter, ParameterKwarg
from litestar.params import KwargDefinition, Parameter, ParameterKwarg
from litestar.testing import create_test_client
from litestar.types.builtin_types import NoneType
from litestar.typing import FieldDefinition
Expand Down Expand Up @@ -555,3 +555,18 @@ class ModelB(base_type): # type: ignore[no-redef, misc]
Reference(ref="#/components/schemas/tests_unit_test_openapi_test_schema_test_type_union_with_none.ModelA"),
Reference("#/components/schemas/tests_unit_test_openapi_test_schema_test_type_union_with_none.ModelB"),
]


def test_default_only_on_field_definition() -> None:
field_definition = FieldDefinition.from_annotation(int, default=10)
assert field_definition.kwarg_definition is None

schema = get_schema_for_field_definition(field_definition)
assert schema.default == 10


def test_default_not_provided_for_kwarg_but_for_field() -> None:
field_definition = FieldDefinition.from_annotation(int, default=10, kwarg_definition=KwargDefinition())
schema = get_schema_for_field_definition(field_definition)

assert schema.default == 10

0 comments on commit 8f64501

Please sign in to comment.