From b51ca31d9e91dadcae762daa8c0a0f4b15a424cb Mon Sep 17 00:00:00 2001 From: Thomas Rausch Date: Sat, 20 Jul 2024 21:34:22 +0200 Subject: [PATCH] fix pydantic return type serializer to support lists (#17) --- pyproject.toml | 2 +- rolo/dispatcher.py | 8 ++++++++ tests/test_pydantic.py | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4b39e91..2555ba2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "rolo" authors = [ { name = "LocalStack Contributors", email = "info@localstack.cloud" } ] -version = "0.6.0" +version = "0.6.1" description = "A Python framework for building HTTP-based server applications" dependencies = [ "requests>=2.20", diff --git a/rolo/dispatcher.py b/rolo/dispatcher.py index 96d85c1..7c58c3b 100644 --- a/rolo/dispatcher.py +++ b/rolo/dispatcher.py @@ -120,6 +120,14 @@ def _dispatch(request: Request, endpoint: Handler, args: RequestArguments) -> Re if isinstance(result, pydantic.BaseModel): result = result.model_dump() + if isinstance(result, (list, tuple)): + converted = [] + for element in result: + if isinstance(element, pydantic.BaseModel): + converted.append(element.model_dump()) + else: + converted.append(element) + result = converted else: result = endpoint(request, **args) diff --git a/tests/test_pydantic.py b/tests/test_pydantic.py index 7908000..7bfe333 100644 --- a/tests/test_pydantic.py +++ b/tests/test_pydantic.py @@ -82,6 +82,31 @@ def handler(_request: Request, item_id: int) -> MyItem: "is_offer": None, } + def test_response_list(self): + router = Router(dispatcher=handler_dispatcher()) + + def handler(_request: Request) -> list[MyItem]: + return [ + MyItem(name="rolo", price=420.69), + MyItem(name="twiks", price=1.23, is_offer=True), + ] + + router.add("/items", handler) + + request = Request("GET", "/items") + assert router.dispatch(request).get_json() == [ + { + "name": "rolo", + "price": 420.69, + "is_offer": None, + }, + { + "name": "twiks", + "price": 1.23, + "is_offer": True, + }, + ] + def test_request_arg_validation_error(self): router = Router(dispatcher=handler_dispatcher())