Skip to content

Commit

Permalink
Deque's maxlen property dropped on V1 validation (#6586)
Browse files Browse the repository at this point in the history
  • Loading branch information
maciekglowka committed Jul 11, 2023
1 parent 15c82d9 commit 2aaddf6
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
1 change: 1 addition & 0 deletions changes/6581-maciekglowka.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixes the `maxlen` property being dropped on `deque` validation. Happened only if the deque item has been typed. Changes the `_validate_sequence_like` func.
4 changes: 2 additions & 2 deletions pydantic/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,7 @@ def _validate_sequence_like( # noqa: C901 (ignore complexity)
elif self.shape == SHAPE_TUPLE_ELLIPSIS:
converted = tuple(result)
elif self.shape == SHAPE_DEQUE:
converted = deque(result)
converted = deque(result, maxlen=getattr(v, 'maxlen', None))
elif self.shape == SHAPE_SEQUENCE:
if isinstance(v, tuple):
converted = tuple(result)
Expand All @@ -952,7 +952,7 @@ def _validate_sequence_like( # noqa: C901 (ignore complexity)
elif isinstance(v, Generator):
converted = iter(result)
elif isinstance(v, deque):
converted = deque(result)
converted = deque(result, maxlen=getattr(v, 'maxlen', None))
return converted, None

def _validate_iterable(
Expand Down
19 changes: 19 additions & 0 deletions tests/test_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -3123,6 +3123,25 @@ class Model(BaseModel):
assert Model(v=value).v == result


def test_deque_maxlen():
class DequeTypedModel(BaseModel):
field: Deque[int] = deque(maxlen=10)

assert DequeTypedModel(field=deque(maxlen=25)).field.maxlen == 25
assert DequeTypedModel().field.maxlen == 10

class DequeUnTypedModel(BaseModel):
field: deque = deque(maxlen=10)

assert DequeUnTypedModel(field=deque(maxlen=25)).field.maxlen == 25
assert DequeTypedModel().field.maxlen == 10

class DeuqueNoDefaultModel(BaseModel):
field: deque

assert DeuqueNoDefaultModel(field=deque(maxlen=25)).field.maxlen == 25


@pytest.mark.parametrize(
'cls,value,errors',
(
Expand Down

0 comments on commit 2aaddf6

Please sign in to comment.