Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-more-itertools for
openSUSE:Factory checked in at 2022-09-18 17:32:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-more-itertools (Old)
and /work/SRC/openSUSE:Factory/.python-more-itertools.new.2083 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-more-itertools"
Sun Sep 18 17:32:09 2022 rev:20 rq:1004179 version:8.14.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-more-itertools/python-more-itertools.changes
2022-06-17 21:22:54.550786266 +0200
+++
/work/SRC/openSUSE:Factory/.python-more-itertools.new.2083/python-more-itertools.changes
2022-09-18 17:32:12.625768784 +0200
@@ -1,0 +2,11 @@
+Fri Sep 16 18:26:20 UTC 2022 - Dirk M??ller <[email protected]>
+
+- update to 8.14.0:
+ * :func:`longest_common_prefix` (thanks to nanouasyn)
+ * :func:`iequals` (thanks to nanouasyn)
+ * `concurrent.futures.ThreadPoolExecutor` is now imported lazily in
:func:`callback_iter`.
+ * :func:`tail` is now optimized for iterables with a fixed length.
+ * Some documentation issues were fixed (thanks to pochmann and timgates42)
+ * This library is now marked for Python 3.10 compatibility in PyPI (thanks
to chayim)
+
+-------------------------------------------------------------------
Old:
----
more-itertools-8.13.0.tar.gz
New:
----
more-itertools-8.14.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-more-itertools.spec ++++++
--- /var/tmp/diff_new_pack.p73uP8/_old 2022-09-18 17:32:13.101770172 +0200
+++ /var/tmp/diff_new_pack.p73uP8/_new 2022-09-18 17:32:13.105770184 +0200
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python3-%{**}}
%define skip_python2 1
Name: python-more-itertools
-Version: 8.13.0
+Version: 8.14.0
Release: 0
Summary: More routines for operating on iterables, beyond itertools
License: MIT
++++++ more-itertools-8.13.0.tar.gz -> more-itertools-8.14.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/PKG-INFO
new/more-itertools-8.14.0/PKG-INFO
--- old/more-itertools-8.13.0/PKG-INFO 1970-01-01 01:00:00.000000000 +0100
+++ new/more-itertools-8.14.0/PKG-INFO 1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: more-itertools
-Version: 8.13.0
+Version: 8.14.0
Summary: More routines for operating on iterables, beyond itertools
Keywords:
itertools,iterator,iteration,filter,peek,peekable,collate,chunk,chunked
Author-email: Erik Rose <[email protected]>
@@ -15,6 +15,7 @@
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -36,6 +37,7 @@
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grouping | `chunked
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.chunked>`_,
|
| | `ichunked
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ichunked>`_,
|
+| | `chunked_even
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.chunked_even>`_,
|
| | `sliced
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sliced>`_,
|
| | `distribute
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distribute>`_,
|
| | `divide
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.divide>`_,
|
@@ -66,6 +68,7 @@
| Augmenting | `count_cycle
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.count_cycle>`_,
|
| | `intersperse
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.intersperse>`_,
|
| | `padded
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.padded>`_,
|
+| | `repeat_each
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeat_each>`_,
|
| | `mark_ends
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.mark_ends>`_,
|
| | `repeat_last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeat_last>`_,
|
| | `adjacent
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.adjacent>`_,
|
@@ -101,6 +104,7 @@
| | `minmax
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.minmax>`_,
|
| | `first_true
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first_true>`_,
|
| | `quantify
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.quantify>`_
|
+| | `iequals
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iequals>`_
|
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selecting | `islice_extended
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.islice_extended>`_,
|
| | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
@@ -123,6 +127,7 @@
| | `unique_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_justseen>`_,
|
| | `duplicates_everseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.duplicates_everseen>`_,
|
| | `duplicates_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.duplicates_justseen>`_
|
+| | `longest_common_prefix
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.longest_common_prefix>`_
|
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Combinatorics | `distinct_permutations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_permutations>`_,
|
| | `distinct_combinations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_combinations>`_,
|
@@ -158,6 +163,7 @@
| | `make_decorator
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.make_decorator>`_,
|
| | `SequenceView
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.SequenceView>`_,
|
| | `time_limited
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.time_limited>`_,
|
+| | `map_if
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_if>`_,
|
| | `consume
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consume>`_,
|
| | `tabulate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tabulate>`_,
|
| | `repeatfunc
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeatfunc>`_
|
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/README.rst
new/more-itertools-8.14.0/README.rst
--- old/more-itertools-8.13.0/README.rst 2022-05-06 16:02:27.359598400
+0200
+++ new/more-itertools-8.14.0/README.rst 2022-08-09 15:50:39.706522700
+0200
@@ -13,6 +13,7 @@
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grouping | `chunked
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.chunked>`_,
|
| | `ichunked
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ichunked>`_,
|
+| | `chunked_even
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.chunked_even>`_,
|
| | `sliced
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sliced>`_,
|
| | `distribute
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distribute>`_,
|
| | `divide
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.divide>`_,
|
@@ -43,6 +44,7 @@
| Augmenting | `count_cycle
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.count_cycle>`_,
|
| | `intersperse
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.intersperse>`_,
|
| | `padded
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.padded>`_,
|
+| | `repeat_each
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeat_each>`_,
|
| | `mark_ends
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.mark_ends>`_,
|
| | `repeat_last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeat_last>`_,
|
| | `adjacent
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.adjacent>`_,
|
@@ -78,6 +80,7 @@
| | `minmax
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.minmax>`_,
|
| | `first_true
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first_true>`_,
|
| | `quantify
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.quantify>`_
|
+| | `iequals
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iequals>`_
|
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selecting | `islice_extended
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.islice_extended>`_,
|
| | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
@@ -100,6 +103,7 @@
| | `unique_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_justseen>`_,
|
| | `duplicates_everseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.duplicates_everseen>`_,
|
| | `duplicates_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.duplicates_justseen>`_
|
+| | `longest_common_prefix
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.longest_common_prefix>`_
|
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Combinatorics | `distinct_permutations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_permutations>`_,
|
| | `distinct_combinations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_combinations>`_,
|
@@ -135,6 +139,7 @@
| | `make_decorator
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.make_decorator>`_,
|
| | `SequenceView
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.SequenceView>`_,
|
| | `time_limited
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.time_limited>`_,
|
+| | `map_if
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_if>`_,
|
| | `consume
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consume>`_,
|
| | `tabulate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tabulate>`_,
|
| | `repeatfunc
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeatfunc>`_
|
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/docs/api.rst
new/more-itertools-8.14.0/docs/api.rst
--- old/more-itertools-8.13.0/docs/api.rst 2022-05-06 16:02:27.365875500
+0200
+++ new/more-itertools-8.14.0/docs/api.rst 2022-08-09 15:43:59.871538400
+0200
@@ -153,6 +153,7 @@
.. function:: minmax(iterable, *[, key, default])
.. autofunction:: minmax(arg1, arg2, *args[, key])
:noindex:
+.. autofunction:: iequals
----
@@ -190,6 +191,7 @@
.. autofunction:: unique_in_window
.. autofunction:: duplicates_everseen
.. autofunction:: duplicates_justseen
+.. autofunction:: longest_common_prefix
----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/docs/versions.rst
new/more-itertools-8.14.0/docs/versions.rst
--- old/more-itertools-8.13.0/docs/versions.rst 2022-05-06 16:02:27.373623400
+0200
+++ new/more-itertools-8.14.0/docs/versions.rst 2022-08-09 15:49:41.910306700
+0200
@@ -5,6 +5,21 @@
.. automodule:: more_itertools
:noindex:
+8.14.0
+------
+
+* New functions
+ * :func:`longest_common_prefix` (thanks to nanouasyn)
+ * :func:`iequals` (thanks to nanouasyn)
+
+* Changes to existing functions
+ * `concurrent.futures.ThreadPoolExecutor` is now imported lazily in
:func:`callback_iter`.
+ * :func:`tail` is now optimized for iterables with a fixed length.
+
+* Other changes
+ * Some documentation issues were fixed (thanks to pochmann and timgates42)
+ * This library is now marked for Python 3.10 compatibility in PyPI (thanks
to chayim)
+
8.13.0
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/more_itertools/__init__.py
new/more-itertools-8.14.0/more_itertools/__init__.py
--- old/more-itertools-8.13.0/more_itertools/__init__.py 2022-05-06
16:02:27.380462600 +0200
+++ new/more-itertools-8.14.0/more_itertools/__init__.py 2022-08-09
15:53:46.644506700 +0200
@@ -3,4 +3,4 @@
from .more import * # noqa
from .recipes import * # noqa
-__version__ = '8.13.0'
+__version__ = '8.14.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/more_itertools/more.py
new/more-itertools-8.14.0/more_itertools/more.py
--- old/more-itertools-8.13.0/more_itertools/more.py 2022-04-18
16:12:48.588682000 +0200
+++ new/more-itertools-8.14.0/more_itertools/more.py 2022-08-09
15:43:59.877477000 +0200
@@ -2,7 +2,6 @@
from collections import Counter, defaultdict, deque, abc
from collections.abc import Sequence
-from concurrent.futures import ThreadPoolExecutor
from functools import partial, reduce, wraps
from heapq import merge, heapify, heapreplace, heappop
from itertools import (
@@ -36,6 +35,7 @@
powerset,
take,
unique_everseen,
+ all_equal,
)
__all__ = [
@@ -70,6 +70,7 @@
'first',
'groupby_transform',
'ichunked',
+ 'iequals',
'ilen',
'interleave',
'interleave_evenly',
@@ -80,6 +81,7 @@
'iterate',
'last',
'locate',
+ 'longest_common_prefix',
'lstrip',
'make_decorator',
'map_except',
@@ -2337,6 +2339,16 @@
return compress(count(), starmap(pred, it))
+def longest_common_prefix(iterables):
+ """Yield elements of the longest common prefix amongst given *iterables*.
+
+ >>> ''.join(longest_common_prefix(['abcd', 'abc', 'abf']))
+ 'ab'
+
+ """
+ return (c[0] for c in takewhile(all_equal, zip(*iterables)))
+
+
def lstrip(iterable, pred):
"""Yield the items from *iterable*, but strip any from the beginning
for which *pred* returns ``True``.
@@ -3345,6 +3357,26 @@
chunk.fill_cache()
+def iequals(*iterables):
+ """Return ``True`` if all given *iterables* are equal to each other,
+ which means that they contain the same elements in the same order.
+
+ The function is useful for comparing iterables of different data types
+ or iterables that do not support equality checks.
+
+ >>> iequals("abc", ['a', 'b', 'c'], ('a', 'b', 'c'), iter("abc"))
+ True
+
+ >>> iequals("abc", "acb")
+ False
+
+ Not to be confused with :func:`all_equals`, which checks whether all
+ elements of iterable are equal to each other.
+
+ """
+ return all(map(all_equal, zip_longest(*iterables, fillvalue=object())))
+
+
def distinct_combinations(iterable, r):
"""Yield the distinct combinations of *r* items taken from *iterable*.
@@ -3637,7 +3669,10 @@
self._aborted = False
self._future = None
self._wait_seconds = wait_seconds
- self._executor = ThreadPoolExecutor(max_workers=1)
+ # Lazily import concurrent.future
+ self._executor = __import__(
+ 'concurrent.futures'
+ ).futures.ThreadPoolExecutor(max_workers=1)
self._iterator = self._reader()
def __enter__(self):
@@ -3942,7 +3977,7 @@
n, _ = last(pool, default=(n, None))
- # Python versiosn below 3.8 don't have math.comb
+ # Python versions below 3.8 don't have math.comb
index = 1
for i, j in enumerate(reversed(indexes), start=1):
j = n - j
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/more_itertools/more.pyi
new/more-itertools-8.14.0/more_itertools/more.pyi
--- old/more-itertools-8.13.0/more_itertools/more.pyi 2021-11-04
17:55:44.189013200 +0100
+++ new/more-itertools-8.14.0/more_itertools/more.pyi 2022-08-09
15:43:59.881166500 +0200
@@ -662,3 +662,7 @@
*others: _T,
key: Callable[[_T], _SupportsLessThan]
) -> Tuple[_T, _T]: ...
+def longest_common_prefix(
+ iterables: Iterable[Iterable[_T]],
+) -> Iterator[_T]: ...
+def iequals(*iterables: Iterable[object]) -> bool: ...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/more_itertools/recipes.py
new/more-itertools-8.14.0/more_itertools/recipes.py
--- old/more-itertools-8.13.0/more_itertools/recipes.py 2022-04-29
16:09:30.642570000 +0200
+++ new/more-itertools-8.14.0/more_itertools/recipes.py 2022-08-09
15:43:59.884092800 +0200
@@ -11,6 +11,7 @@
import warnings
from collections import deque
+from collections.abc import Sized
from itertools import (
chain,
combinations,
@@ -106,7 +107,14 @@
['E', 'F', 'G']
"""
- return iter(deque(iterable, maxlen=n))
+ # If the given iterable has a length, then we can use islice to get its
+ # final elements. Note that if the iterable is not actually Iterable,
+ # either islice or deque will throw a TypeError. This is why we don't
+ # check if it is Iterable.
+ if isinstance(iterable, Sized):
+ yield from islice(iterable, max(0, len(iterable) - n), None)
+ else:
+ yield from iter(deque(iterable, maxlen=n))
def consume(iterator, n=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/pyproject.toml
new/more-itertools-8.14.0/pyproject.toml
--- old/more-itertools-8.13.0/pyproject.toml 2022-03-09 20:55:14.103891100
+0100
+++ new/more-itertools-8.14.0/pyproject.toml 2022-08-09 15:43:59.886106300
+0200
@@ -29,6 +29,7 @@
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/setup.cfg
new/more-itertools-8.14.0/setup.cfg
--- old/more-itertools-8.13.0/setup.cfg 2022-05-06 16:02:27.386688500 +0200
+++ new/more-itertools-8.14.0/setup.cfg 2022-08-09 15:53:46.644978300 +0200
@@ -1,5 +1,5 @@
[bumpversion]
-current_version = 8.13.0
+current_version = 8.14.0
commit = True
tag = False
files = more_itertools/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/tests/test_more.py
new/more-itertools-8.14.0/tests/test_more.py
--- old/more-itertools-8.13.0/tests/test_more.py 2022-03-09
20:55:14.107215200 +0100
+++ new/more-itertools-8.14.0/tests/test_more.py 2022-08-09
15:43:59.889434000 +0200
@@ -3218,8 +3218,8 @@
class IsliceExtendedTests(TestCase):
def test_all(self):
iterable = ['0', '1', '2', '3', '4', '5']
- indexes = list(range(-4, len(iterable) + 4)) + [None]
- steps = [1, 2, 3, 4, -1, -2, -3, 4]
+ indexes = [*range(-4, 10), None]
+ steps = [1, 2, 3, 4, -1, -2, -3, -4]
for slice_args in product(indexes, indexes, steps):
with self.subTest(slice_args=slice_args):
actual = list(mi.islice_extended(iterable, *slice_args))
@@ -5054,3 +5054,86 @@
def test_nested(self):
iterable = [[[1, 2], [1, 2]], [5, 6], [5, 6]]
self.assertEqual(list(mi.duplicates_justseen(iterable)), [[5, 6]])
+
+
+class LongestCommonPrefixTests(TestCase):
+ def test_basic(self):
+ iterables = [[1, 2], [1, 2, 3], [1, 2, 4]]
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [1, 2])
+
+ def test_iterators(self):
+ iterables = iter([iter([1, 2]), iter([1, 2, 3]), iter([1, 2, 4])])
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [1, 2])
+
+ def test_no_iterables(self):
+ iterables = []
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [])
+
+ def test_empty_iterables_only(self):
+ iterables = [[], [], []]
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [])
+
+ def test_includes_empty_iterables(self):
+ iterables = [[1, 2], [1, 2, 3], [1, 2, 4], []]
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [])
+
+ def test_non_hashable(self):
+ # See https://github.com/more-itertools/more-itertools/issues/603
+ iterables = [[[1], [2]], [[1], [2], [3]], [[1], [2], [4]]]
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [[1], [2]])
+
+ def test_prefix_contains_elements_of_the_first_iterable(self):
+ iterables = [[[1], [2]], [[1], [2], [3]], [[1], [2], [4]]]
+ prefix = list(mi.longest_common_prefix(iterables))
+ self.assertIs(prefix[0], iterables[0][0])
+ self.assertIs(prefix[1], iterables[0][1])
+ self.assertIsNot(prefix[0], iterables[1][0])
+ self.assertIsNot(prefix[1], iterables[1][1])
+ self.assertIsNot(prefix[0], iterables[2][0])
+ self.assertIsNot(prefix[1], iterables[2][1])
+
+ def test_infinite_iterables(self):
+ prefix = mi.longest_common_prefix([count(), count()])
+ self.assertEqual(next(prefix), 0)
+ self.assertEqual(next(prefix), 1)
+ self.assertEqual(next(prefix), 2)
+
+ def test_contains_infinite_iterables(self):
+ iterables = [[0, 1, 2], count()]
+ self.assertEqual(list(mi.longest_common_prefix(iterables)), [0, 1, 2])
+
+
+class IequalsTests(TestCase):
+ def test_basic(self):
+ self.assertTrue(mi.iequals("abc", iter("abc")))
+ self.assertTrue(mi.iequals(range(3), [0, 1, 2]))
+ self.assertFalse(mi.iequals("abc", [0, 1, 2]))
+
+ def test_no_iterables(self):
+ self.assertTrue(mi.iequals())
+
+ def test_one_iterable(self):
+ self.assertTrue(mi.iequals("abc"))
+
+ def test_more_than_two_iterable(self):
+ self.assertTrue(mi.iequals("abc", iter("abc"), ['a', 'b', 'c']))
+ self.assertFalse(mi.iequals("abc", iter("abc"), ['a', 'b', 'd']))
+
+ def test_order_matters(self):
+ self.assertFalse(mi.iequals("abc", "acb"))
+
+ def test_not_equal_lengths(self):
+ self.assertFalse(mi.iequals("abc", "ab"))
+ self.assertFalse(mi.iequals("abc", "bc"))
+ self.assertFalse(mi.iequals("aaa", "aaaa"))
+
+ def test_empty_iterables(self):
+ self.assertTrue(mi.iequals([], ""))
+
+ def test_none_is_not_a_sentinel(self):
+ # See https://stackoverflow.com/a/900444
+ self.assertFalse(mi.iequals([1, 2], [1, 2, None]))
+ self.assertFalse(mi.iequals([1, 2], [None, 1, 2]))
+
+ def test_not_identical_but_equal(self):
+ self.assertTrue([1, True], [1.0, complex(1, 0)])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.13.0/tests/test_recipes.py
new/more-itertools-8.14.0/tests/test_recipes.py
--- old/more-itertools-8.13.0/tests/test_recipes.py 2022-04-29
16:09:30.661166400 +0200
+++ new/more-itertools-8.14.0/tests/test_recipes.py 2022-08-09
15:43:59.891580000 +0200
@@ -59,21 +59,29 @@
class TailTests(TestCase):
"""Tests for ``tail()``"""
- def test_greater(self):
- """Length of iterable is greater than requested tail"""
- self.assertEqual(list(mi.tail(3, 'ABCDEFG')), ['E', 'F', 'G'])
-
- def test_equal(self):
- """Length of iterable is equal to the requested tail"""
- self.assertEqual(
- list(mi.tail(7, 'ABCDEFG')), ['A', 'B', 'C', 'D', 'E', 'F', 'G']
- )
-
- def test_less(self):
- """Length of iterable is less than requested tail"""
- self.assertEqual(
- list(mi.tail(8, 'ABCDEFG')), ['A', 'B', 'C', 'D', 'E', 'F', 'G']
- )
+ def test_iterator_greater(self):
+ """Length of iterator is greater than requested tail"""
+ self.assertEqual(list(mi.tail(3, iter('ABCDEFG'))), list('EFG'))
+
+ def test_iterator_equal(self):
+ """Length of iterator is equal to the requested tail"""
+ self.assertEqual(list(mi.tail(7, iter('ABCDEFG'))), list('ABCDEFG'))
+
+ def test_iterator_less(self):
+ """Length of iterator is less than requested tail"""
+ self.assertEqual(list(mi.tail(8, iter('ABCDEFG'))), list('ABCDEFG'))
+
+ def test_sized_greater(self):
+ """Length of sized iterable is greater than requested tail"""
+ self.assertEqual(list(mi.tail(3, 'ABCDEFG')), list('EFG'))
+
+ def test_sized_equal(self):
+ """Length of sized iterable is less than requested tail"""
+ self.assertEqual(list(mi.tail(7, 'ABCDEFG')), list('ABCDEFG'))
+
+ def test_sized_less(self):
+ """Length of sized iterable is less than requested tail"""
+ self.assertEqual(list(mi.tail(8, 'ABCDEFG')), list('ABCDEFG'))
class ConsumeTests(TestCase):