Coder Social home page Coder Social logo

omnilib / aioitertools Goto Github PK

View Code? Open in Web Editor NEW
233.0 9.0 22.0 238 KB

itertools and builtins for AsyncIO and mixed iterables

Home Page: https://aioitertools.omnilib.dev

License: MIT License

Python 99.21% Makefile 0.79%
python python3 asyncio itertools hacktoberfest

aioitertools's People

Contributors

aiudirog avatar amyreese avatar bryanforbes avatar bugchecker avatar danielkza avatar dependabot[bot] avatar dimaqq avatar fried avatar kevinastone avatar leenr avatar mcdic avatar pyup-bot avatar qbx2 avatar thatch avatar ziima avatar zsol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aioitertools's Issues

Package description is wrong

Moved from python-poetry/poetry#2332

Looks like that comes from the package tarball itself aioitertools-0.6.0.tar.gz

Name: aioitertools
Version: 0.6.0
Summary: asyncio version of the standard multiprocessing module
Home-page: https://github.com/jreese/aioitertools
Author: John Reese
Author-email: [email protected]
License: MIT
Description: aioitertools

0.10.0: no test suite?

In source tree I see aioitertools/tests/ and despite that pytest is not able to find any units

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-aioitertools-0.10.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-aioitertools-0.10.0-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra
=========================================================================== test session starts ============================================================================
platform linux -- Python 3.8.13, pytest-7.1.2, pluggy-1.0.0
rootdir: /home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0
collected 0 items

========================================================================== no tests ran in 0.00s ===========================================================================

bug in zip_longest

current version is defined as following:

async def zip_longest(
    *itrs: AnyIterable[Any], fillvalue: Any = None
) -> AsyncIterator[Tuple[Any, ...]]:
    its: List[AsyncIterator[Any]] = [iter(itr) for itr in itrs]
    itr_count = len(its)

    while True:
        values = await asyncio.gather(
            *[it.__anext__() for it in its], return_exceptions=True
        )
        finished = 0
        for idx, value in builtins.enumerate(values):
            if isinstance(value, AnyStop):
                finished += 1
                values[idx] = fillvalue
            elif isinstance(value, BaseException):
                raise value
        if finished >= itr_count:
            break
        yield tuple(values)

This issue with this is that if the iterators end with different offsets, it will end up calling __anext__ on an iterator which has already yielded out of itself, which is very bad and yields errors about method returning AsyncStopIteration. I propose a fix like the following:

@async_generator
async def zip_longest(*itrs, fillvalue=None):
    its = [itr.__aiter__() for itr in itrs]
    its_running = [True] * len(itrs)

    async def get_fillvalue():
        return fillvalue

    while True:
        values = await asyncio.gather(
            *[it.__anext__() if its_running[idx] else get_fillvalue()
              for idx, it in enumerate(its)
              ],
            return_exceptions=True
        )
        for idx, value in enumerate(values):
            if isinstance(value, (StopIteration, StopAsyncIteration)):
                its_running[idx] = False
            elif isinstance(value, BaseException):
                raise value
        if not any(its_running):
            break
        await yield_(tuple(values))

this is python 3.5+ syntax

`builtins.next` missing optional `default` parameter.

Description

The non-async builtin next takes a default parameter (docs) that allows you to specify a return value if the iterator is exhausted.

Details

  • OS:
  • Python version:
  • aioitertools version:
  • Can you repro on master?
  • Can you repro in a clean virtualenv?

Platform independent encoding on setup.py

Description

Python open() use by default locale.getpreferredencoding() which leads to the problem of installing the package in an uncontrolled environment (build agent for example)

See: stackoverflow and open

Instead of using default encoding, should set the UTF-8 in setup.py

with open(file, encoding='utf8') as f:
    ...

min max missing?

Description

I was expecting min and max to be available since sum is also there

Would be great to have a concurrency-limited version of gather

I end up coming up with thousands of coros then wanting to gather them, but the default implementation will make all the connections first, then let some of them time out before finishing.

I'm looking for an API something like gather(*aws, limit=10) to avoid having to hand-batch them.

aioitertools.zip is doing strange things with exceptions

Description

What happens:

$ python3 -m venv aioitertools_zip_exception
$ cat aioitertools_zip_exception.py 
import asyncio
import platform
import sys

import aioitertools


async def gen():
    for i in range(10):
        if i == 9:
            assert False
        await asyncio.sleep(1)
        yield i


async def gen_pairs():
    for i in range(10):
        if i == 9:
            assert False
        await asyncio.sleep(1)
        yield i, "a"


async def main():
    print("platform version", platform.version())
    print("python version", sys.version)
    print("aioitertools version", aioitertools.__version__)

    print("the exception is getting swallowed:")
    async for (i, j) in aioitertools.zip(gen(), gen()):
        print(i, j)

    print("this attempts to unpack the exception:")
    async for (i, j), (k, l) in aioitertools.zip(gen_pairs(), gen_pairs()):
        print(i, j, k, l)


asyncio.run(main())
$ . ./aioitertools_zip_exception/bin/activate
(aioitertools_zip_exception) $ python3 -m pip install aioitertools
Collecting aioitertools
  Downloading aioitertools-0.11.0-py3-none-any.whl (23 kB)
Installing collected packages: aioitertools
Successfully installed aioitertools-0.11.0
(aioitertools_zip_exception) $ python3 aioitertools_zip_exception.py 
platform version Darwin Kernel Version 22.6.0: Wed Jul  5 22:22:05 PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000
python version 3.11.5 (main, Aug 24 2023, 15:09:45) [Clang 14.0.3 (clang-1403.0.22.14.1)]
aioitertools version 0.11.0
the exception is getting swallowed:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
 
this attempts to unpack the exception:
0 a 0 a
1 a 1 a
2 a 2 a
3 a 3 a
4 a 4 a
5 a 5 a
6 a 6 a
7 a 7 a
8 a 8 a
Traceback (most recent call last):
  File "/Users/Filip.Zyzniewski/aioitertools_zip_exception.py", line 38, in <module>
    asyncio.run(main())
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/[email protected]/3.11.5/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/Users/Filip.Zyzniewski/aioitertools_zip_exception.py", line 34, in main
    async for (i, j), (k, l) in aioitertools.zip(gen_pairs(), gen_pairs()):
              ^^^^^^
TypeError: cannot unpack non-iterable AssertionError object
(aioitertools_zip_exception) $ 

What I expected to happen: I expected the exception to percolate up the call stack and be raised at the top level.

Details

  • OS: Darwin Kernel Version 22.6.0: Wed Jul 5 22:22:05 PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6000
  • Python version: 3.11.5 (main, Aug 24 2023, 15:09:45) [Clang 14.0.3 (clang-1403.0.22.14.1)]
  • aioitertools version: 0.11.0
  • Can you repro on master? yes: https://gist.github.com/filip-zyzniewski/1bb9c2dbde5da1dfeea5154f6e8a81f7
  • Can you repro in a clean virtualenv? done above

0.10.0: sphinx warnings `reference target not found`

First of all currently it is not possible to use straight sphinx-build command to build documentation out of source tree

+ /usr/bin/sphinx-build -n -T -b man docs build/sphinx/man
Running Sphinx v4.5.0
making output directory... done
loading intersphinx inventory from https://docs.python.org/3/objects.inv...
building [mo]: targets for 0 po files that are out of date
building [man]: all manpages
updating environment: [new config] 4 added, 0 changed, 0 removed
reading sources... [100%] index
WARNING: autodoc: failed to import module 'builtins' from module 'aioitertools'; the following exception was raised:
No module named 'aioitertools'
WARNING: autodoc: failed to import module 'itertools' from module 'aioitertools'; the following exception was raised:
No module named 'aioitertools'
WARNING: autodoc: failed to import module 'more_itertools' from module 'aioitertools'; the following exception was raised:
No module named 'aioitertools'
WARNING: autodoc: failed to import module 'asyncio' from module 'aioitertools'; the following exception was raised:
No module named 'aioitertools'
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
writing... aioitertools.1 { api changelog contributing } done
build succeeded, 4 warnings.

This can be fixed by patch like below:

--- a/docs/conf.py~     2022-02-24 03:38:11.000000000 +0000
+++ b/docs/conf.py      2022-05-29 17:49:09.914443884 +0000
@@ -9,11 +9,10 @@
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))

+import os
+import sys
+sys.path.insert(0, os.path.abspath(".."))

 # -- Project information -----------------------------------------------------

This patch fixes what is in the comment and that can of fix is suggested in sphinx example copy.py https://www.sphinx-doc.org/en/master/usage/configuration.html#example-of-configuration-file

Than .. on building my packages I'm using sphinx-build command with -n switch which shows warmings about missing references. These are not critical issues.

Here is the output with warnings:

+ /usr/bin/sphinx-build -n -T -b man docs build/sphinx/man
Running Sphinx v4.5.0
making output directory... done
loading intersphinx inventory from https://docs.python.org/3/objects.inv...
building [mo]: targets for 0 po files that are out of date
building [man]: all manpages
updating environment: [new config] 4 added, 0 changed, 0 removed
reading sources... [100%] index
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:1: WARNING: Inline emphasis start-string without end-string.
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
writing... aioitertools.1 { api changelog contributing } /home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.next:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.list:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.list:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.list:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.set:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.set:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.set:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.enumerate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.enumerate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.enumerate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.map:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.map:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.map:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.map:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.map:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.max:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.helpers.Orderable
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.min:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.sum:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.sum:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.sum:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.sum:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T4
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T4
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T4
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T4
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T4
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T5
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T5
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T1
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T2
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T3
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T4
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/builtins.py:docstring of aioitertools.builtins.zip:: WARNING: py:class reference target not found: aioitertools.types.T5
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.accumulate:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.combinations:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.combinations:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.combinations:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.combinations_with_replacement:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.combinations_with_replacement:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.combinations_with_replacement:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.compress:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.compress:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.compress:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.count:: WARNING: py:class reference target not found: aioitertools.types.N
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.count:: WARNING: py:class reference target not found: aioitertools.types.N
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.count:: WARNING: py:class reference target not found: aioitertools.types.N
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.cycle:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.cycle:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.cycle:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.dropwhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.dropwhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.dropwhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.dropwhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.dropwhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.filterfalse:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.filterfalse:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.filterfalse:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.filterfalse:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.filterfalse:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.groupby:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.islice:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.islice:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.islice:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.islice:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.islice:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.islice:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.permutations:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.permutations:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.permutations:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.product:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.product:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.product:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.repeat:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.repeat:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.starmap:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.starmap:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.starmap:: WARNING: py:class reference target not found: aioitertools.types.R
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.takewhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.takewhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.takewhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.takewhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.takewhile:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.tee:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.tee:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/itertools.py:docstring of aioitertools.itertools.tee:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/more_itertools.py:docstring of aioitertools.more_itertools.take:: WARNING: py:class reference target not found: aioitertools.more_itertools.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/more_itertools.py:docstring of aioitertools.more_itertools.take:: WARNING: py:class reference target not found: aioitertools.more_itertools.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/more_itertools.py:docstring of aioitertools.more_itertools.take:: WARNING: py:class reference target not found: aioitertools.more_itertools.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/more_itertools.py:docstring of aioitertools.more_itertools.chunked:: WARNING: py:class reference target not found: aioitertools.more_itertools.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/more_itertools.py:docstring of aioitertools.more_itertools.chunked:: WARNING: py:class reference target not found: aioitertools.more_itertools.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/more_itertools.py:docstring of aioitertools.more_itertools.chunked:: WARNING: py:class reference target not found: aioitertools.more_itertools.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.as_completed:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.as_completed:: WARNING: py:class reference target not found: asyncio.events.AbstractEventLoop
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.as_completed:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.as_generated:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.as_generated:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather:: WARNING: py:class reference target not found: asyncio.events.AbstractEventLoop
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:: WARNING: py:class reference target not found: aioitertools.types.T
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:: WARNING: py:class reference target not found: asyncio.events.AbstractEventLoop
/home/tkloczko/rpmbuild/BUILD/aioitertools-0.10.0/aioitertools/asyncio.py:docstring of aioitertools.asyncio.gather_iter:: WARNING: py:class reference target not found: aioitertools.types.T
done
build succeeded, 181 warnings.

You can peak on fixes that kind of issues in other projects
latchset/jwcrypto#289
click-contrib/sphinx-click@abc31069
latchset/jwcrypto#289
RDFLib/rdflib-sqlalchemy#95

Not working with Python 3.10

Description

Python 3.10 removes the loop= argument from asyncio functions and breaks aioitertools. The issues can be demonstrated by the test suite:

$ pyenv install 3.10.0
$ pyenv global 3.10.0
$ ~/.pyenv/shims/python -m venv ~/tmp/venv-3.10
$ source ~/tmp/venv-3.10/bin/activate
$ python -m unittest -v aioitertools.tests
test_as_completed (aioitertools.tests.asyncio.AsyncioTest) ... /home/yen/tmp/aioitertools/aioitertools/tests/helpers.py:13: DeprecationWarning: There is no current event loop
  loop = asyncio.get_event_loop()
ERROR
test_as_completed_timeout (aioitertools.tests.asyncio.AsyncioTest) ... ERROR
test_gather_cancel (aioitertools.tests.asyncio.AsyncioTest) ... ERROR
test_gather_input_types (aioitertools.tests.asyncio.AsyncioTest) ... ERROR
test_gather_limited (aioitertools.tests.asyncio.AsyncioTest) ... ERROR
test_gather_limited_dupes (aioitertools.tests.asyncio.AsyncioTest) ... ERROR
test_gather_with_exceptions (aioitertools.tests.asyncio.AsyncioTest) ... ERROR
test_import (aioitertools.tests.asyncio.AsyncioTest) ... ok
test_all_async_generator (aioitertools.tests.builtins.BuiltinsTest) ... Task exception was never retrieved
future: <Task finished name='Task-17' coro=<AsyncioTest.test_gather_with_exceptions.<locals>.fn() done, defined at /home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py:115> exception=MyException(0.002)>
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 118, in fn
    raise MyException(arg)
aioitertools.tests.asyncio.AsyncioTest.test_gather_with_exceptions.<locals>.MyException: 0.002
ERROR
test_all_generator (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_all_list (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_all_range (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_any_async_generator (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_any_generator (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_any_list (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_any_range (aioitertools.tests.builtins.BuiltinsTest) ... ERROR
test_enumerate (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_enumerate_start (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_iter_async_generator (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_iter_iterable (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_iter_iterator (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_iter_list (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_iter_range (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_list (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_map_coroutine_generator (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_map_coroutine_list (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_map_function_async_generator (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_map_function_list (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_max_basic (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_max_default (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_max_key (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_min_basic (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_min_default (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_min_key (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_next_async_generator (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_next_default_async_iterable (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_next_default_iterable (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_next_iterable (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_next_list (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_next_range (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_set (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_sum_list_string (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_sum_range_default (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_zip_equal (aioitertools.tests.builtins.BuiltinsTest) ... ok
test_maybe_await (aioitertools.tests.helpers.HelpersTest) ... ok
test_maybe_await_async_def (aioitertools.tests.helpers.HelpersTest) ... ok
test_maybe_await_coroutine (aioitertools.tests.helpers.HelpersTest) ... /home/yen/tmp/aioitertools/aioitertools/tests/helpers.py:38: DeprecationWarning: "@coroutine" decorator is deprecated since Python 3.8, use "async def" instead
  def forty_two():
ok
test_maybe_await_partial (aioitertools.tests.helpers.HelpersTest) ... ok
test_accumulate_empty (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_accumulate_gen_coroutine (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_accumulate_gen_function (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_accumulate_range_coroutine (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_accumulate_range_default (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_accumulate_range_function (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_chain_from_iterable (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_chain_from_iterable_parameter_expansion_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_chain_list_gens (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_chain_lists (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_combinations (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_combinations_with_replacement (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_compress_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_compress_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_count_bare (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_count_negative (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_count_start (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_count_start_step (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_cycle_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_cycle_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_dropwhile_coroutine_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_dropwhile_coroutine_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_dropwhile_empty (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_dropwhile_function_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_dropwhile_function_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_filterfalse_coroutine_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_filterfalse_function_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_groupby_empty (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_groupby_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_groupby_gen_key (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_groupby_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_groupby_list_key (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_bad_range (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_gen_start_step (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_gen_start_stop (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_gen_start_stop_step (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_gen_stop (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_range_start_step (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_range_start_stop (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_range_start_stop_step (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_range_stop (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_islice_stop_zero (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_permutations_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_permutations_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_product_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_product_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_repeat (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_repeat_limit (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_starmap_coroutine_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_starmap_coroutine_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_starmap_function_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_starmap_function_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_takewhile_coroutine_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_takewhile_coroutine_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_takewhile_empty (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_takewhile_function_gen (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_takewhile_function_list (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_tee_gen_six (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_tee_gen_two (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_tee_list_six (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_tee_list_two (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_tee_propagate_exception (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_zip_longest_exception (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_zip_longest_fillvalue (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_zip_longest_range (aioitertools.tests.itertools.ItertoolsTest) ... ok
test_chunked (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok
test_chunked_empty (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok
test_take (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok
test_take_empty (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok
test_take_more_than_iterable (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok
test_take_negative (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok
test_take_zero (aioitertools.tests.more_itertools.MoreItertoolsTest) ... ok

======================================================================
ERROR: test_as_completed (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 29, in test_as_completed
    results = await ait.list(aio.as_completed(futures))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 163, in list
    return [item async for item in iter(itr)]
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 163, in <listcomp>
    return [item async for item in iter(itr)]
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 60, in as_completed
    await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_as_completed_timeout (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 44, in test_as_completed_timeout
    await ait.list(aio.as_completed(futures, timeout=0.5))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 163, in list
    return [item async for item in iter(itr)]
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 163, in <listcomp>
    return [item async for item in iter(itr)]
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 60, in as_completed
    await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_gather_cancel (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 157, in test_gather_cancel
    await task
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 146, in _gather
    await aio.gather(_fn())
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_gather_input_types (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 66, in test_gather_input_types
    result = await aio.gather(*fns)
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_gather_limited (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 83, in test_gather_limited
    result = await aio.gather(*[fn(i) for i in range(10)], limit=2)
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_gather_limited_dupes (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 102, in test_gather_limited_dupes
    result = await aio.gather(f, f, f, g, f, g, limit=2)
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_gather_with_exceptions (aioitertools.tests.asyncio.AsyncioTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/asyncio.py", line 122, in test_gather_with_exceptions
    await aio.gather(fn(0.002, fail=True), fn(0.001))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_all_async_generator (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 38, in test_all_async_generator
    self.assertTrue(await ait.all(ait.iter(srange1)))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 69, in all
    return builtins.all(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_all_generator (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 33, in test_all_generator
    self.assertTrue(await ait.all(x for x in srange1))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 69, in all
    return builtins.all(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_all_list (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 23, in test_all_list
    self.assertTrue(await ait.all([True, 1, "string"]))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 69, in all
    return builtins.all(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_all_range (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 28, in test_all_range
    self.assertTrue(await ait.all(srange1))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 69, in all
    return builtins.all(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_any_async_generator (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 62, in test_any_async_generator
    self.assertTrue(await ait.any(ait.iter(srange)))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 84, in any
    return builtins.any(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_any_generator (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 56, in test_any_generator
    self.assertTrue(await ait.any(x for x in srange))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 84, in any
    return builtins.any(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_any_list (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 45, in test_any_list
    self.assertTrue(await ait.any([False, 1, ""]))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 84, in any
    return builtins.any(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

======================================================================
ERROR: test_any_range (aioitertools.tests.builtins.BuiltinsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/yen/tmp/aioitertools/aioitertools/tests/helpers.py", line 14, in wrapped
    return loop.run_until_complete(fn(*args, **kwargs))
  File "/home/yen/.pyenv/versions/3.10.0/lib/python3.10/asyncio/base_events.py", line 641, in run_until_complete
    return future.result()
  File "/home/yen/tmp/aioitertools/aioitertools/tests/builtins.py", line 50, in test_any_range
    self.assertTrue(await ait.any(srange))
  File "/home/yen/tmp/aioitertools/aioitertools/builtins.py", line 84, in any
    return builtins.any(await ait_asyncio.gather_iter(itr))
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 163, in gather_iter
    return await gather(
  File "/home/yen/tmp/aioitertools/aioitertools/asyncio.py", line 126, in gather
    done, pending = await asyncio.wait(
TypeError: wait() got an unexpected keyword argument 'loop'

----------------------------------------------------------------------
Ran 120 tests in 0.035s

FAILED (errors=15)

If I also remove loop= arguments from aioitertools, tests are green.

diff --git a/aioitertools/asyncio.py b/aioitertools/asyncio.py
index 663c818..4bc800b 100644
--- a/aioitertools/asyncio.py
+++ b/aioitertools/asyncio.py
@@ -59,7 +59,6 @@ async def as_completed(
             Tuple[Set[Awaitable[T]], Set[Awaitable[T]]],
             await asyncio.wait(
                 pending,
-                loop=loop,
                 timeout=remaining,
                 return_when=asyncio.FIRST_COMPLETED,
             ),
@@ -124,7 +123,7 @@ async def gather(
         if pending:
             try:
                 done, pending = await asyncio.wait(
-                    pending, loop=loop, return_when=asyncio.FIRST_COMPLETED
+                    pending, return_when=asyncio.FIRST_COMPLETED
                 )
                 for x in done:
                     if return_exceptions and x.exception():
@@ -136,7 +135,7 @@ async def gather(
                 for x in pending:
                     x.cancel()
                 # we insure that all tasks are cancelled before we raise
-                await asyncio.gather(*pending, loop=loop, return_exceptions=True)
+                await asyncio.gather(*pending, return_exceptions=True)
                 raise
 
         if not pending and next_arg == len(args):
@@ -162,7 +161,6 @@ async def gather_iter(
     """
     return await gather(
         *[maybe_await(i) async for i in aiter(itr)],
-        loop=loop,
         return_exceptions=return_exceptions,
         limit=limit,
     )

I'm not sure if it's a good idea, though, as modified aioitertools functions still accept a loop= argument while silently ignores it.

Details

  • OS: Arch Linux
  • Python version: 3.10.0 installed from pyenv
  • aioitertools version: 0.8.0 and git-master (6594cf4)
  • Can you repro on master? yes
  • Can you repro in a clean virtualenv? yes

Allow slightly unbalanced consumption in tee

The implementation of aioitertools.itertools.tee currently has the caveat "all iterators are dependent on the first iterator." This caveat can cause periodic stalls in my pipeline where the consumers all consume at roughly the same speed, with small imbalances.

A small refactor of tee could remove this limitation if the producer was a separate scheduled task (instead of the first consumer). Would you be open to a pull request for a change along these lines?

Peeking into an iterator

Hypothetical code, but not very far from my use case:

from chardet.universaldetector import UniversalDetector

with peekerator(bytestream) as (peek, bytestream):
    detector = UniversalDetector()

    async for chunk in peek:
        detector.feed(chunk)
        if detector.done:
            break

    encoding = detector.close().get('encoding')
    async for line in iterdecode(bytestream, encoding):
        print(line)

With bytestream being something like starlette.requests.Request.stream(). And here's my implementation of peekerator, which I think would be a nice addition to aioitertools.

from collections import deque
from contextlib import contextmanager
from aioitertools.builtins import iter

@contextmanager
def peekerator(iterator):
    it = iter(iterator)
    cache = deque()

    async def peek():
        async for el in it:
            cache.append(el)
            yield el

    async def real():
        while True:
            if cache:
                yield cache.popleft()
            else:
                try:
                    yield await it.__anext__()
                except StopAsyncIteration:
                    return

    yield peek(),real()

The idea is based on more_itertools.peekable but with an peeking iterator instead of method and without the added overhead of implementing prepend and indexing.

If there's interest in adding this, I'd package it up with tests and documentation as a pull request. The name is, of course, up for discussion.

New release?

With the updates to typings, support for PEP-561, and the other improvements, do you think we need a new release?

zip should cancel unfinished awaitables on stop

Description

When using zip, the code uses gather on __anext__ of all iterables, until one of them stops. However, we do not cancel the gather, which means any running __anext__s will run until finished. It makes more sense to cancel them so when we return from zip there are no "garbage" tasks running in the background.

Details

  • OS: Linux (Ubuntu 20.04)
  • Python version: 3.9
  • aioitertools version: 0.8.0
  • Can you repro on master? Yes
  • Can you repro in a clean virtualenv? Yes

isinstance check order of iter method

iter is currently defined as such:

def iter(itr: AnyIterable[T]) -> AsyncIterator[T]:
    if isinstance(itr, AsyncIterator):
        return itr

    if isinstance(itr, AsyncIterable):
        return itr.__aiter__()

This causes an issue for classes defined as such:

class Foo:
    def __aiter__(self):
        return self.__anext__()

    @async_generator
    async def __anext__(self):
       ...

since it won't use the object returned by __aiter__() as both isinstance checks are true. I believe these two checks should be reversed with a comment why they are in the order they are.

RuntimeError: anext(): asynchronous generator is already running (Python 3.8)

Description

I try to use aioitertools.zip_longest in my code, but I get an error in Python 3.8:

RuntimeError: anext(): asynchronous generator is already running

Also the same code works fine in Python 3.6 and 3.7

Details

A minimal code example for reproducing:

import asyncio
import aioitertools

async def producer_gen(n: int = 10):
    async for data in aioitertools.zip_longest(range(n), range(n), fillvalue=None):
        yield data

async def worker(w, producer):
    async for n in producer:
        print(w, n)
        await asyncio.sleep(0.1)

async def main():
    producer = producer_gen()
    tasks = [asyncio.ensure_future(worker(w, producer)) for w in range(5)]
    await asyncio.gather(*tasks)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

Almost expected output:

0 (0, 0)
1 (1, 1)
2 (2, 2)
3 (3, 3)
4 (4, 4)
0 (5, 5)
2 (6, 6)
4 (7, 7)
1 (8, 8)
3 (9, 9)

Actual output:

0 (0, 0)
Traceback (most recent call last):
  File "C:/Users/Eugene/AppData/Roaming/JetBrains/PyCharm2020.1/scratches/scratch_67.py", line 20, in <module>
    loop.run_until_complete(main())
  File "C:\Programs\Python\Python38_x64\lib\asyncio\base_events.py", line 612, in run_until_complete
    return future.result()
  File "C:/Users/Eugene/AppData/Roaming/JetBrains/PyCharm2020.1/scratches/scratch_67.py", line 16, in main
    await asyncio.gather(*tasks)
  File "C:/Users/Eugene/AppData/Roaming/JetBrains/PyCharm2020.1/scratches/scratch_67.py", line 9, in worker
    async for n in producer:
RuntimeError: anext(): asynchronous generator is already running

If we do not use itertools.zip_longest the code works correclty:

async def producer_gen(n: int = 10):
    for i in range(n):
        yield i

...

async def main():
    producer = producer_gen()
    tasks = [asyncio.ensure_future(worker(w, producer)) for w in range(5)]
    await asyncio.gather(*tasks)
...

Output:

0 0
1 1
2 2
3 3
4 4
0 5
2 6
4 7
1 8
3 9
  • OS: Windows/Linux
  • Python version: 3.8.2
  • aioitertools version: 0.7.0
  • Can you repro on master? yes
  • Can you repro in a clean virtualenv? yes

Functions returning awaitables are not always handled properly

Several types of objects can be used in an await statement: coroutines, objects that implement __await__, tasks, and futures. The function itself does not always indicate if the return value is awaitable. The following demonstrates some of the problems with using asyncio.iscoroutinefunction():

import asyncio
from functools import partial

async def multiply(a, b):
    await asyncio.sleep(0.1)
    return a * b

multiply5 = partial(multiply, 5)
asyncio.iscoroutinefunction(multiply5)  # False

def can_be_awaited():
    class a:
        def __await__(self):
            yield 42
    return a()

asyncio.iscoroutinefunction(multiply5)  # False

def multiply_task(a, b):
    return asyncio.create_task(multiply(a, b))

asyncio.iscoroutinefunction(multiply_task)  # False

The more reliable way to handle coroutines is using inspect.isawaitable() on the return value of a function.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.