Skip to content

Commit 9d8af8a

Browse files
committed
allow set & frozenset as input to tuple and list
1 parent 57adf5c commit 9d8af8a

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

src/input/input_python.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,10 @@ impl<'a> Input<'a> for PyAny {
375375
Ok(list.into())
376376
} else if let Ok(tuple) = self.downcast::<PyTuple>() {
377377
Ok(tuple.into())
378+
} else if let Ok(set) = self.downcast::<PySet>() {
379+
Ok(set.into())
380+
} else if let Ok(frozen_set) = self.downcast::<PyFrozenSet>() {
381+
Ok(frozen_set.into())
378382
} else if let Some(collection) = extract_dict_iter!(self) {
379383
Ok(collection)
380384
} else if (allow_any_iter && self.iter().is_ok()) || self.downcast::<PyIterator>().is_ok() || is_deque(self) {
@@ -397,6 +401,10 @@ impl<'a> Input<'a> for PyAny {
397401
Ok(tuple.into())
398402
} else if let Ok(list) = self.downcast::<PyList>() {
399403
Ok(list.into())
404+
} else if let Ok(set) = self.downcast::<PySet>() {
405+
Ok(set.into())
406+
} else if let Ok(frozen_set) = self.downcast::<PyFrozenSet>() {
407+
Ok(frozen_set.into())
400408
} else if let Some(collection) = extract_dict_iter!(self) {
401409
Ok(collection)
402410
} else if self.downcast::<PyIterator>().is_ok() || is_deque(self) {

src/validators/tuple.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ impl Validator for TuplePositionalValidator {
213213
let mut iter = collection.iter();
214214
iter!(iter)
215215
}
216+
GenericCollection::Set(collection) => {
217+
let mut iter = collection.iter();
218+
iter!(iter)
219+
}
220+
GenericCollection::FrozenSet(collection) => {
221+
let mut iter = collection.iter();
222+
iter!(iter)
223+
}
216224
GenericCollection::PyAny(collection) => {
217225
let vec: Vec<&PyAny> = collection.iter()?.collect::<PyResult<_>>()?;
218226
let mut iter = vec.into_iter();
@@ -222,7 +230,6 @@ impl Validator for TuplePositionalValidator {
222230
let mut iter = collection.iter();
223231
iter!(iter)
224232
}
225-
_ => unreachable!(),
226233
}
227234
if errors.is_empty() {
228235
Ok(PyTuple::new(py, &output).into_py(py))

tests/validators/test_list.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Any, Dict
55

66
import pytest
7-
from dirty_equals import HasRepr, IsInstance, IsStr
7+
from dirty_equals import HasRepr, IsInstance, IsList, IsStr
88

99
from pydantic_core import SchemaValidator, ValidationError
1010

@@ -52,9 +52,9 @@ def gen_ints():
5252
([1, 2, '3'], [1, 2, 3]),
5353
((1, 2, '3'), [1, 2, 3]),
5454
(deque((1, 2, '3')), [1, 2, 3]),
55-
({1, 2, '3'}, Err('Input should be a valid list [type=list_type,')),
55+
({1, 2, '3'}, IsList(1, 2, 3, check_order=False)),
5656
(gen_ints(), [1, 2, 3]),
57-
(frozenset({1, 2, '3'}), Err('Input should be a valid list [type=list_type,')),
57+
(frozenset({1, 2, '3'}), IsList(1, 2, 3, check_order=False)),
5858
({1: 10, 2: 20, '3': '30'}.keys(), [1, 2, 3]),
5959
({1: 10, 2: 20, '3': '30'}.values(), [10, 20, 30]),
6060
({1: 10, 2: 20, '3': '30'}, Err('Input should be a valid list [type=list_type,')),
@@ -91,11 +91,11 @@ def test_list_json():
9191
[
9292
([], []),
9393
([1, '2', b'3'], [1, '2', b'3']),
94-
(frozenset([1, '2', b'3']), Err('Input should be a valid list [type=list_type,')),
94+
(frozenset([1, '2', b'3']), IsList(1, '2', b'3', check_order=False)),
9595
((), []),
9696
((1, '2', b'3'), [1, '2', b'3']),
9797
(deque([1, '2', b'3']), [1, '2', b'3']),
98-
({1, '2', b'3'}, Err('Input should be a valid list [type=list_type,')),
98+
({1, '2', b'3'}, IsList(1, '2', b'3', check_order=False)),
9999
],
100100
)
101101
def test_list_any(input_value, expected):

tests/validators/test_tuple.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import Any, Dict, Type
44

55
import pytest
6-
from dirty_equals import IsNonNegative
6+
from dirty_equals import IsNonNegative, IsTuple
77

88
from pydantic_core import SchemaValidator, ValidationError
99

@@ -144,8 +144,8 @@ def test_tuple_var_len_kwargs(kwargs: Dict[str, Any], input_value, expected):
144144
({1: 10, 2: 20, '3': '30'}.keys(), (1, 2, 3)),
145145
({1: 10, 2: 20, '3': '30'}.values(), (10, 20, 30)),
146146
({1: 10, 2: 20, '3': '30'}, Err('Input should be a valid tuple [type=tuple_type,')),
147-
({1, 2, '3'}, Err('Input should be a valid tuple [type=tuple_type,')),
148-
(frozenset([1, 2, '3']), Err('Input should be a valid tuple [type=tuple_type,')),
147+
({1, 2, '3'}, IsTuple(1, 2, 3, check_order=False)),
148+
(frozenset([1, 2, '3']), IsTuple(1, 2, 3, check_order=False)),
149149
],
150150
ids=repr,
151151
)

0 commit comments

Comments
 (0)