Skip to content

Releases: dymmond/esmerald

Version 3.6.2

09 Jan 13:08
b292478
Compare
Choose a tag to compare

Added

  • name parameter to StaticFiles config allowing to reverse lookup internally.
  • Support for Python 3.13
  • Support for redirect_slashes in the Include.
  • status_code to ResponseContainer to be parameter detectable.

Changed

  • Cleanup Response.
  • Move transform method to lilya but provide speedup in a mixin.
  • Esmerald Response behaves like make_response in lilya with a plain Response.
  • Special handle None (nothing is returned) in Response. It shouldn't map to null so not all handlers have to return a value.

Fixed

  • data and payload special kwargs are now allowed when a not-bodyless method is available for the handler. They default to None.
  • bytes won't be encoded as json when returned from a handler. This would unexpectly lead to a base64 encoding.
  • SessionConfig has a unneccessarily heavily restricted secret_key parameter.
  • Gracefully handle situations where cookies are None in get_cookies.
  • Fix validation of parameters requiring a body.

Version 3.6.1

18 Dec 23:34
3.6.1
0640b39
Compare
Choose a tag to compare

Added

  • Allow passing extensions as string.

Changed

  • Change media_type parameter of Response from MediaType.JSON to None to match the default of the underlying lilya Response.

Fixed

  • OpenAPI responses.
  • Enum definitions.

Version 3.6.0

11 Dec 16:08
efa0772
Compare
Choose a tag to compare

Added

  • New Security section with all the explanations how to use the internals of Esmerald.
  • Added new Security object used for security dependencies using Esmerald esmerald.security package.

Changed

  • Updates from python-jose to PyJWT as dependency contrib library.
  • Remove OpenAPI security as they where redundant and not 100% compliant with OpenAPI security.
  • Allow the new Lilya StaticFiles allowing to provide multiple directories with fallthrough behaviour.
  • Deprecate support for Mako.
  • Internal code organisation and cleaning.

Fixed

  • Fix cli detection of wrapped esmerald instances or different ASGI servers.
  • Allow passing multiple StaticFilesConfig configurations in a tuple.
  • Allow passing multiple directories to StaticFiles by removing the stringification in StaticFilesConfig so a fallthrough behavior can be established.
    Note: this requires a newer lilya version.

Version 3.5.1

26 Nov 15:41
b1d77a4
Compare
Choose a tag to compare

Changed

  • Use assigned encoders at requests for json_encoder.
  • Allow overwriting the LILYA_ENCODER_TYPES for different encoder sets or tests.
  • Use more orjson for encoding requests.

Version 3.5.0

09 Nov 17:48
1eb4eb8
Compare
Choose a tag to compare

Added

  • Allow passing HTTP/WebSocket handlers directly to routes. They are automatically wrapped in Gateways-
  • Allow passing HTTP/WebSocket handlers directly to routes as alternative to defining a Gateway/WebsocketGateway.

Changed

  • Esmerald is now under the License BSD-3. This aims to protect the maintainers and contributors and
    the license will be now the final.
  • Pluggables can now receive plain Extensions and Extension classes.
  • Rename of Pluggables to Extensions:
    • Breaking: The pluggables attribute and parameter are now renamed to extensions. The old name is still available but deprecated.
    • Breaking: The add_pluggable method is now renamed to add_extension. The old name is still available but deprecated.
    • The documentation will refer now to extensions with Pluggable as a setup wrapper.

Fixed

  • Directive runserver now allows the use of ASGI middlewares.
  • Remove the dependency of an app being an esmerald instance for runserver.
  • Check the environment variables instead of settings variable for esmerald settings in the runserver.

Version 3.4.4

21 Oct 22:19
ad91e77
Compare
Choose a tag to compare

Added

  • Support for Taskfile when generating a project via directive.
  • Add taskfile for development mode.

Changed

  • Internal JSONResponse is now natively supporting ORJSON.

Version 3.4.3

10 Oct 06:30
72f950e
Compare
Choose a tag to compare

Changed

  • PydanticEncoder now tries mode json first as default.
  • Stop ignoring warnings in the tests.
  • Stop shadowing the BaseDirective help from Lilya.
  • Asyncz settings for empty tasks.
  • Update the docs for the templates.

Version 3.4.2

30 Sep 09:43
7de9017
Compare
Choose a tag to compare

Changed

  • OpenAPI for inheritance models using pydantic or any type of encoders.
  • Stop supporting Python 3.8.
  • Changed internal schema location in the helpers.

Version 3.4.1

13 Sep 13:47
abca93e
Compare
Choose a tag to compare

3.4.1

Changed

  • OpenAPI now if no description is provided from the handlers, it will read directly from
    the docstrings.
  • Internal code cleaning and organisation.

Fixed

  • OpenAPI query parameters were not rendering properly for optional dict or list types. This
    was due to the internal evaluation of the None field which is now skipping for OpenAPI purposes.

Example

Now it is possible to do something like this:

from typing import Dict, List, Union, Optional

from esmerald import Gateway, JSONResponse, Query, get


@get("/item")
async def check_item(q: Union[List[str], None]) -> JSONResponse:
    return JSONResponse({"value": q})


@get("/another-item")
async def check_item(q: Optional[Dict[str, str]]) -> JSONResponse:
    return JSONResponse({"value": q})

Version 3.4.0

07 Sep 13:49
681e169
Compare
Choose a tag to compare

Added

  • New ways of providing the request data allowing to pass a more complex body
    using also the encoders. The complex body is explained
    and how to achieve this result.

!!! Warning
This is an additional functionality to the existing one and it does not represent any replacement. Be sure
you read the documentation and if you understand it.

Example

As per some examples of the documentation:

from pydantic import BaseModel, EmailStr

from esmerald import Esmerald, Gateway, post


class User(BaseModel):
    name: str
    email: EmailStr


class Address(BaseModel):
    street_name: str
    post_code: str


@post("/create")
async def create_user(user: User, address: Address) -> None:
    """
    Creates a user in the system and does not return anything.
    Default status_code: 201
    """


app = Esmerald(routes=[Gateway(handler=create_user)])

You can expect to send a payload like this:

{
    "user": {
        "name": "John",
        "email": "[email protected]",
    },
    "address": {
        "street_name": "123 Queens Park",
        "post_code": "90241"
    }
}

More details can and must be read in the request data section.

Changed

  • Overriding the status_code in any response is now possible directly by specifying the intended response and ignoring
    the default from the handler.

Example

@get()
def create(name: Union[str, None]) -> Response:
    if name is None:
        return Response("Ok")
    if name == "something":
        return Response("Ok", status_code=status.HTTP_401_UNAUTHORIZED)
    if name == "something-else":
        return Response("Ok", status_code=status.HTTP_300_MULTIPLE_CHOICES)

If none of the conditions are met, then it will always default to the status_code of the handler which in the get case,
its 200.

Fixed

  • Internal parsing of the encoders for OpenAPI representation and removed unused code (deprecated).