Skip to content

Commit

Permalink
✨ Add support in jsonable_encoder for include and exclude with data…
Browse files Browse the repository at this point in the history
…classes (#4923)

Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
  • Loading branch information
DCsunset and tiangolo committed Sep 8, 2022
1 parent 895789b commit 3ec498a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
6 changes: 5 additions & 1 deletion fastapi/encoders.py
Expand Up @@ -74,8 +74,12 @@ def jsonable_encoder(
obj_dict = dataclasses.asdict(obj)
return jsonable_encoder(
obj_dict,
exclude_none=exclude_none,
include=include,
exclude=exclude,
by_alias=by_alias,
exclude_unset=exclude_unset,
exclude_defaults=exclude_defaults,
exclude_none=exclude_none,
custom_encoder=custom_encoder,
sqlalchemy_safe=sqlalchemy_safe,
)
Expand Down
16 changes: 16 additions & 0 deletions tests/test_jsonable_encoder.py
@@ -1,3 +1,4 @@
from dataclasses import dataclass
from datetime import datetime, timezone
from enum import Enum
from pathlib import PurePath, PurePosixPath, PureWindowsPath
Expand All @@ -19,6 +20,12 @@ def __init__(self, owner: Person, name: str):
self.name = name


@dataclass
class Item:
name: str
count: int


class DictablePerson(Person):
def __iter__(self):
return ((k, v) for k, v in self.__dict__.items())
Expand Down Expand Up @@ -131,6 +138,15 @@ def test_encode_dictable():
}


def test_encode_dataclass():
item = Item(name="foo", count=100)
assert jsonable_encoder(item) == {"name": "foo", "count": 100}
assert jsonable_encoder(item, include={"name"}) == {"name": "foo"}
assert jsonable_encoder(item, exclude={"count"}) == {"name": "foo"}
assert jsonable_encoder(item, include={}) == {}
assert jsonable_encoder(item, exclude={}) == {"name": "foo", "count": 100}


def test_encode_unsupported():
unserializable = Unserializable()
with pytest.raises(ValueError):
Expand Down

0 comments on commit 3ec498a

Please sign in to comment.