Add support for `deque` objects and children in `jsonable_encoder` (#9433)

Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
Carson Crane 2023-06-28 09:39:10 -07:00 committed by GitHub
parent d409c05d6f
commit 1f21b16e03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 2 deletions

View File

@ -1,5 +1,5 @@
import dataclasses import dataclasses
from collections import defaultdict from collections import defaultdict, deque
from enum import Enum from enum import Enum
from pathlib import PurePath from pathlib import PurePath
from types import GeneratorType from types import GeneratorType
@ -124,7 +124,7 @@ def jsonable_encoder(
) )
encoded_dict[encoded_key] = encoded_value encoded_dict[encoded_key] = encoded_value
return encoded_dict return encoded_dict
if isinstance(obj, (list, set, frozenset, GeneratorType, tuple)): if isinstance(obj, (list, set, frozenset, GeneratorType, tuple, deque)):
encoded_list = [] encoded_list = []
for item in obj: for item in obj:
encoded_list.append( encoded_list.append(

View File

@ -1,3 +1,4 @@
from collections import deque
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime, timezone from datetime import datetime, timezone
from enum import Enum from enum import Enum
@ -237,3 +238,12 @@ def test_encode_model_with_path(model_with_path):
def test_encode_root(): def test_encode_root():
model = ModelWithRoot(__root__="Foo") model = ModelWithRoot(__root__="Foo")
assert jsonable_encoder(model) == "Foo" assert jsonable_encoder(model) == "Foo"
def test_encode_deque_encodes_child_models():
class Model(BaseModel):
test: str
dq = deque([Model(test="test")])
assert jsonable_encoder(dq)[0]["test"] == "test"