Bump tenacity from 9.0.0 to 9.1.2
Bumps tenacity from 9.0.0 to 9.1.2.
Release notes
Sourced from tenacity's releases.
9.1.2
Full Changelog: https://github.com/jd/tenacity/compare/9.1.1...9.1.2
9.1.1
What's Changed
- Test with Python 3.13 by
@edgarrmondragonin jd/tenacity#480- ci: remove Python 3.8 support by
@jdin jd/tenacity#515- fix: return "Self" from "BaseRetrying.copy" by
@ThirVondukrin jd/tenacity#518- ci: upload on PyPI using trusted publishing by
@jdin jd/tenacity#520- Add re.Pattern to allowed match types by
@robertschweizerin jd/tenacity#497New Contributors
@Young-Lordmade their first contribution in jd/tenacity#491@edgarrmondragonmade their first contribution in jd/tenacity#480@ThirVondukrmade their first contribution in jd/tenacity#518@robertschweizermade their first contribution in jd/tenacity#497Full Changelog: https://github.com/jd/tenacity/compare/9.0.0...9.1.0
Commits
62787c3ci: fix build2b173a1ci: fix typoa44271ffix: Add re.Pattern to allowed match types (#497)b4dfa3fchore(deps): bump actions/setup-python in the github-actions group (#522)f9a879cci: upload on PyPI using trusted publishing (#520)bfbf173fix: return "Self" from "BaseRetrying.copy" (#518)212c47cci: update ubuntu image (#516)3e2c181ci: remove Python 3.8 support (#515)3203359Test with Python 3.13 (#480)72db274chore(deps): bump actions/setup-python in the github-actions group (#513)- Additional commits viewable in compare view
You can trigger a rebase of this PR by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Note Automatic rebases have been disabled on this pull request as it has been open for over 30 days.
CodSpeed Performance Report
Merging #10688 will not alter performance
Comparing dependabot/pip/3.12/tenacity-9.1.2 (b45553d) with 3.12 (8541a7c)
Summary
✅ 50 untouched benchmarks
:x: 1 Tests Failed:
| Tests completed | Failed | Passed | Skipped |
|---|---|---|---|
| 3458 | 1 | 3457 | 46 |
View the top 1 failed test(s) by shortest run time
tests.test_client_functional test_read_timeout_closes_connection[pyloop]Stack Traces | 1.01s run time
self = <ClientResponse(http://127.0.0.1:35257/) [None None]> None connection = Connection<ConnectionKey(host='127.0.0.1', port=35257, is_ssl=False, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=None)> #x1B[0m#x1B[94masync#x1B[39;49;00m #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mstart#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m, connection: #x1B[33m"#x1B[39;49;00m#x1B[33mConnection#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m) -> #x1B[33m"#x1B[39;49;00m#x1B[33mClientResponse#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m #x1B[90m #x1B[39;49;00m#x1B[33m"""Start response processing."""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._closed = #x1B[94mFalse#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._protocol = connection.protocol#x1B[90m#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._connection = connection#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m #x1B[94mwith#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._timer:#x1B[90m#x1B[39;49;00m #x1B[94mwhile#x1B[39;49;00m #x1B[94mTrue#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m #x1B[90m# read response#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m protocol = #x1B[96mself#x1B[39;49;00m._protocol#x1B[90m#x1B[39;49;00m > message, payload = #x1B[94mawait#x1B[39;49;00m protocol.read() #x1B[90m# type: ignore[union-attr]#x1B[39;49;00m#x1B[90m#x1B[39;49;00m connection = Connection<ConnectionKey(host='127.0.0.1', port=35257, is_ssl=False, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=None)> protocol = <aiohttp.client_proto.ResponseHandler object at 0x0000000020554448> self = <ClientResponse(http://127.0.0.1:35257/) [None None]> None #x1B[1m#x1B[31maiohttp/client_reqrep.py#x1B[0m:1059: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ #x1B[1m#x1B[31maiohttp/streams.py#x1B[0m:672: in read #x1B[0m#x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._waiter#x1B[90m#x1B[39;49;00m self = <aiohttp.client_proto.ResponseHandler object at 0x0000000020554448> #x1B[1m#x1B[.../hostedtoolcache/PyPy/3.9.19........./x64/lib/pypy3.9/asyncio/futures.py#x1B[0m:284: in __await__ #x1B[0m#x1B[94myield#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m #x1B[90m# This tells Task to wait for completion.#x1B[39;49;00m#x1B[90m#x1B[39;49;00m self = <Future cancelled> #x1B[1m#x1B[.../hostedtoolcache/PyPy/3.9.19........./x64/lib/pypy3.9/asyncio/tasks.py#x1B[0m:328: in __wakeup #x1B[0mfuture.result()#x1B[90m#x1B[39;49;00m future = <Future cancelled> self = None _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Future cancelled> #x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mresult#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m #x1B[90m #x1B[39;49;00m#x1B[33m"""Return the result this future represents.#x1B[39;49;00m #x1B[33m#x1B[39;49;00m #x1B[33m If the future has been cancelled, raises CancelledError. If the#x1B[39;49;00m #x1B[33m future's result isn't yet available, raises InvalidStateError. If#x1B[39;49;00m #x1B[33m the future is done and has an exception set, this exception is raised.#x1B[39;49;00m #x1B[33m """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._state == _CANCELLED:#x1B[90m#x1B[39;49;00m exc = #x1B[96mself#x1B[39;49;00m._make_cancelled_error()#x1B[90m#x1B[39;49;00m > #x1B[94mraise#x1B[39;49;00m exc#x1B[90m#x1B[39;49;00m #x1B[1m#x1B[31mE asyncio.exceptions.CancelledError#x1B[0m exc = CancelledError() self = <Future cancelled> #x1B[1m#x1B[.../hostedtoolcache/PyPy/3.9.19........./x64/lib/pypy3.9/asyncio/futures.py#x1B[0m:196: CancelledError #x1B[33mThe above exception was the direct cause of the following exception:#x1B[0m aiohttp_client = <function aiohttp_client.<locals>.go at 0x000000001f68ae80> #x1B[0m#x1B[94masync#x1B[39;49;00m #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_read_timeout_closes_connection#x1B[39;49;00m(aiohttp_client: AiohttpClient) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m request_count = #x1B[94m0#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m #x1B[94masync#x1B[39;49;00m #x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mhandler#x1B[39;49;00m(request):#x1B[90m#x1B[39;49;00m #x1B[94mnonlocal#x1B[39;49;00m request_count#x1B[90m#x1B[39;49;00m request_count += #x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94mif#x1B[39;49;00m request_count < #x1B[94m3#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m #x1B[94mawait#x1B[39;49;00m asyncio.sleep(#x1B[94m0.5#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m #x1B[94mreturn#x1B[39;49;00m web.Response(body=#x1B[33mf#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[33mrequest:#x1B[39;49;00m#x1B[33m{#x1B[39;49;00mrequest_count#x1B[33m}#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m app = web.Application()#x1B[90m#x1B[39;49;00m app.add_routes([web.get(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, handler)])#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m timeout = aiohttp.ClientTimeout(total=#x1B[94m0.1#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m client: TestClient = #x1B[94mawait#x1B[39;49;00m aiohttp_client(app, timeout=timeout)#x1B[90m#x1B[39;49;00m #x1B[94mwith#x1B[39;49;00m pytest.raises(asyncio.TimeoutError):#x1B[90m#x1B[39;49;00m #x1B[94mawait#x1B[39;49;00m client.get(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m #x1B[90m# Make sure its really closed#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94massert#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m client.session.connector._conns#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m #x1B[94mwith#x1B[39;49;00m pytest.raises(asyncio.TimeoutError):#x1B[90m#x1B[39;49;00m #x1B[94mawait#x1B[39;49;00m client.get(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m #x1B[90m# Make sure its really closed#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94massert#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m client.session.connector._conns#x1B[90m#x1B[39;49;00m > result = #x1B[94mawait#x1B[39;49;00m client.get(#x1B[33m"#x1B[39;49;00m#x1B[33m/#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m aiohttp_client = <function aiohttp_client.<locals>.go at 0x000000001f68ae80> app = <Application 0x1e254e90> client = <aiohttp.test_utils.TestClient object at 0x000000001e472e90> handler = <function test_read_timeout_closes_connection.<locals>.handler at 0x000000001f6a5100> request_count = 2 timeout = ClientTimeout(total=0.1, connect=None, sock_read=None, sock_connect=None, ceil_threshold=5) #x1B[1m#x1B[31mtests/test_client_functional.py#x1B[0m:3855: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ #x1B[1m#x1B[31maiohttp/test_utils.py#x1B[0m:357: in _request #x1B[0mresp = #x1B[94mawait#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._session.request(method, #x1B[96mself#x1B[39;49;00m.make_url(path), **kwargs)#x1B[90m#x1B[39;49;00m kwargs = {} method = 'GET' path = '/' self = <aiohttp.test_utils.TestClient object at 0x000000001e472e90> #x1B[1m#x1B[31maiohttp/client.py#x1B[0m:731: in _request #x1B[0m#x1B[94mawait#x1B[39;49;00m resp.start(conn)#x1B[90m#x1B[39;49;00m all_cookies = <SimpleCookie: > allow_redirects = True auth = None auth_from_url = None auto_decompress = True chunked = None compress = None conn = Connection<ConnectionKey(host='127.0.0.1', port=35257, is_ssl=False, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=None)> cookies = None data = None expect100 = False fingerprint = None handle = None headers = <CIMultiDict()> history = [] json = None max_field_size = 8190 max_line_size = 8190 max_redirects = 10 method = 'GET' params = {} proxy = None proxy_ = None proxy_auth = None proxy_headers = None raise_for_status = None read_bufsize = 65536 read_until_eof = True real_timeout = ClientTimeout(total=0.1, connect=None, sock_read=None, sock_connect=None, ceil_threshold=5) redirects = 0 req = <aiohttp.client_reqrep.ClientRequest object at 0x0000000020554d40> resp = <ClientResponse(http://127.0.0.1:35257/) [None None]> None retry_persistent_connection = False self = <aiohttp.client.ClientSession object at 0x000000001f025ef8> server_hostname = None skip_auto_headers = None skip_headers = None ssl = True ssl_context = None str_or_url = URL('http://127.0.0.1:35257/') timeout = <_SENTINEL.sentinel: 1> timer = <aiohttp.helpers.TimerContext object at 0x0000000020554d08> tm = <aiohttp.helpers.TimeoutHandle object at 0x0000000020554cd0> trace_request_ctx = None traces = [] url = URL('http://127.0.0.1:35257/') verify_ssl = None version = HttpVersion(major=1, minor=1) #x1B[1m#x1B[31maiohttp/client_reqrep.py#x1B[0m:1074: in start #x1B[0m#x1B[96mself#x1B[39;49;00m._continue = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m connection = Connection<ConnectionKey(host='127.0.0.1', port=35257, is_ssl=False, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=None)> protocol = <aiohttp.client_proto.ResponseHandler object at 0x0000000020554448> self = <ClientResponse(http://127.0.0.1:35257/) [None None]> None _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <aiohttp.helpers.TimerContext object at 0x0000000020554d08> exc_type = <class 'asyncio.exceptions.CancelledError'> exc_val = CancelledError(), exc_tb = <traceback object at 0x000000001bff35b0> #x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92m__exit__#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m exc_type: Optional[Type[#x1B[96mBaseException#x1B[39;49;00m]],#x1B[90m#x1B[39;49;00m exc_val: Optional[#x1B[96mBaseException#x1B[39;49;00m],#x1B[90m#x1B[39;49;00m exc_tb: Optional[TracebackType],#x1B[90m#x1B[39;49;00m ) -> Optional[#x1B[96mbool#x1B[39;49;00m]:#x1B[90m#x1B[39;49;00m enter_task: Optional[asyncio.Task[Any]] = #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._tasks:#x1B[90m#x1B[39;49;00m enter_task = #x1B[96mself#x1B[39;49;00m._tasks.pop()#x1B[90m#x1B[39;49;00m #x1B[90m#x1B[39;49;00m #x1B[94mif#x1B[39;49;00m exc_type #x1B[95mis#x1B[39;49;00m asyncio.CancelledError #x1B[95mand#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._cancelled:#x1B[90m#x1B[39;49;00m #x1B[94massert#x1B[39;49;00m enter_task #x1B[95mis#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[90m# The timeout was hit, and the task was cancelled#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[90m# so we need to uncancel the last task that entered the context manager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[90m# since the cancellation should not leak out of the context manager#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94mif#x1B[39;49;00m sys.version_info >= (#x1B[94m3#x1B[39;49;00m, #x1B[94m11#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m #x1B[90m# If the task was already cancelling don't raise#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[90m# asyncio.TimeoutError and instead return None#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[90m# to allow the cancellation to propagate#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[94mif#x1B[39;49;00m enter_task.uncancel() > #x1B[96mself#x1B[39;49;00m._cancelling:#x1B[90m#x1B[39;49;00m #x1B[94mreturn#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m#x1B[90m#x1B[39;49;00m > #x1B[94mraise#x1B[39;49;00m asyncio.TimeoutError #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mexc_val#x1B[39;49;00m#x1B[90m#x1B[39;49;00m #x1B[1m#x1B[31mE asyncio.exceptions.TimeoutError#x1B[0m enter_task = <Task finished name='Task-1' coro=<test_read_timeout_closes_connection() done, defined at .../aiohttp/tests/test_client_functional.py:3829> exception=TimeoutError()> exc_tb = <traceback object at 0x000000001bff35b0> exc_type = <class 'asyncio.exceptions.CancelledError'> exc_val = CancelledError() self = <aiohttp.helpers.TimerContext object at 0x0000000020554d08> #x1B[1m#x1B[31maiohttp/helpers.py#x1B[0m:685: TimeoutError
To view more test analytics, go to the Test Analytics Dashboard 📋 Got 3 mins? Take this short survey to help us improve Test Analytics.
@dependabot recreate
@dependabot recreate
I wonder if we really need cherry-picker in our requirements files... It's not going to be used anywhere in the CI, so it certainly seems pointless pinning it and getting Dependabot to update it.
#11654
OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.
If you change your mind, just re-open this PR and I'll resolve any conflicts on it.