Esmerald

Latest version: v3.5.0

Safety actively analyzes 681812 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 18

3.5.0

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.

3.4.4

Added

- Support for [Taskfile](https://taskfile.dev) when generating a project via directive.
- Add taskfile for development mode.

Changed

- Internal JSONResponse is now natively supporting ORJSON.

3.4.3

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.

3.4.2

Changed

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

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:

python
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})

3.4.0

Added

- New ways of providing the [request data](https://esmerald.dev/extras/request-data) allowing to pass a more complex body
using also the [encoders](https://esmerald.dev/encoders). The [complex body](https://esmerald.dev/extras/request-data#complex-request-data) 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](https://esmerald.dev/extras/request-data) and if you understand it.

Example

As per some examples of the documentation:

python
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:

json
{
"user": {
"name": "John",
"email": "john.doeexample.com",
},
"address": {
"street_name": "123 Queens Park",
"post_code": "90241"
}
}


More details can and must be read in the [request data](https://esmerald.dev/extras/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

python
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)*.

Page 1 of 18

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.