Giter Site home page Giter Site logo

Comments (6)

guacs avatar guacs commented on May 26, 2024

We use the APIs provided by dataclasses, msgspec, and pydantic to parse the details of a model such as the default. Both, msgspec and dataclasses, do not support specifying the field within the annotation but rather, you have to assign it whereas pydantic does (I think it does).

Also, I don't think Parameter is meant to be used for the request/response bodies. They're meant to be used to give extra details for parameters like query params, path params etc.

from litestar.

tuukkamustonen avatar tuukkamustonen commented on May 26, 2024

So how should I specify defaults and other OpenAPI data, then, for those cases? Quite puzzled at this point.

from litestar.

guacs avatar guacs commented on May 26, 2024

It seems I was mistaken since the default isn't being generated as part of the schema even when specifying the default value correctly.

from dataclasses import dataclass

from litestar import post
from litestar.app import Litestar
from litestar.openapi.spec import Schema


@dataclass
class DataclassBody:
    field4: str = "dummy"


@post("/2")
async def dataclass_handler(data: DataclassBody) -> None:
    ...


app = Litestar([dataclass_handler])


schema = app.openapi_schema.components.schemas["DataclassBody"]

assert schema.properties
schema = schema.properties["field4"]

assert isinstance(schema, Schema)
assert schema.default == "dummy" # This fails.

from litestar.

provinzkraut avatar provinzkraut commented on May 26, 2024

There's a few things going on here (some of which have also been discussed elsewhere I think):

@dataclass
class DataclassBody:
    field1: Annotated[str, Parameter(default="dummy")]  # default generated, but declared as required
    field3: str = Parameter(default="dummy")
    field4: str = "dummy"
    field5: str = dataclasses.field(default="dummy")
  • field1 is simply an invalid way of defining a default for a dataclass. You are essentially "lying" to Litestar by telling it "even though I have not defined a default for this field, I want you to say that it has a default value of "dummy"".
  • field3 is setting a default value for the field, but, according to dataclass semantics, the default value is Parameter(default="dummy"). Since this is neither an annotation, nor the default value you meant to specify, it's not surprising this isn't working
  • field4 and field5 should work, and it not working is a bug (and I think a regression, will have to check this out)
class MsgspecBody(Struct):
    field1: Annotated[str, Parameter(default="dummy")]  # default generated, but declared as required
    field2: Annotated[str, msgspec.field(default="dummy")]  # no default, marked as required
    field3: str = Parameter(default="dummy")
    field4: str = "dummy"
    field5: str = msgspec.field(default="dummy")
  • field1/field2/field3: Same as with the dataclass, this is not a valid way to define a default way for a msgspec.Struct
  • field4/field5: Also same as with the dataclass, this should work

It's important to keep in mind that while Litestar does allow to extend modelling capabilities of the chosen libraries, it does not alter them. You still have to adhere to the semantics and patterns these libraries use and produce a valid model for Litestar to use.

from litestar.

github-actions avatar github-actions commented on May 26, 2024

This issue has been closed in #3285. The change will be included in the upcoming patch release.

from litestar.

github-actions avatar github-actions commented on May 26, 2024

A fix for this issue has been released in v2.8.0

from litestar.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.