changeset c68efc32f275 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=c68efc32f275
description:
Support not sized iterable in grouped_slice
issue11575
review431301003
diffstat:
trytond/tests/test_tools.py | 25 +++++++++++++++++++++----
trytond/tools/misc.py | 3 +++
2 files changed, 24 insertions(+), 4 deletions(-)
diffs (62 lines):
diff -r acaa8d722fa1 -r c68efc32f275 trytond/tests/test_tools.py
--- a/trytond/tests/test_tools.py Mon Jul 18 00:23:38 2022 +0200
+++ b/trytond/tests/test_tools.py Mon Jul 18 00:25:45 2022 +0200
@@ -11,10 +11,10 @@
import sql.operators
from trytond.tools import (
- decimal_, escape_wildcard, file_open, firstline, is_full_text,
- is_instance_method, lstrip_wildcard, reduce_domain, reduce_ids,
- remove_forbidden_chars, rstrip_wildcard, slugify, sortable_values,
- strip_wildcard, unescape_wildcard)
+ decimal_, escape_wildcard, file_open, firstline, grouped_slice,
+ is_full_text, is_instance_method, lstrip_wildcard, reduce_domain,
+ reduce_ids, remove_forbidden_chars, rstrip_wildcard, slugify,
+ sortable_values, strip_wildcard, unescape_wildcard)
from trytond.tools.domain_inversion import (
concat, domain_inversion, eval_domain, extract_reference_models,
localize_domain, merge, parse, prepare_reference_domain, simplify,
@@ -100,6 +100,23 @@
self.assertEqual(reduce_domain(i), j,
'%s -> %s != %s' % (i, reduce_domain(i), j))
+ def test_grouped_slice(self):
+ "Test grouped slice"
+ for (values, count, result) in [
+ (list(range(10)), 5, [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]),
+ (list(range(5)), 5, [[0, 1, 2, 3, 4]]),
+ (list(range(5)), 2, [[0, 1], [2, 3], [4]]),
+ ]:
+ with self.subTest(values=values, count=count):
+ self.assertEqual(
+ list(map(list, grouped_slice(values, count))), result)
+
+ def test_grouped_slice_generator(self):
+ "Test grouped slice"
+ self.assertEqual(
+ list(map(list, grouped_slice((x for x in range(10)), 5))),
+ [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
+
def test_is_instance_method(self):
'Test is_instance_method'
diff -r acaa8d722fa1 -r c68efc32f275 trytond/tools/misc.py
--- a/trytond/tools/misc.py Mon Jul 18 00:23:38 2022 +0200
+++ b/trytond/tools/misc.py Mon Jul 18 00:25:45 2022 +0200
@@ -13,6 +13,7 @@
import unicodedata
import warnings
from array import array
+from collections.abc import Sized
from functools import wraps
from itertools import islice
@@ -182,6 +183,8 @@
if count is None:
count = Transaction().database.IN_MAX
count = max(1, count)
+ if not isinstance(records, Sized):
+ records = list(records)
for i in range(0, len(records), count):
yield islice(records, i, i + count)