Hello community, here is the log from the commit of package python-tenacity for openSUSE:Factory checked in at 2020-06-30 21:58:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-tenacity (Old) and /work/SRC/openSUSE:Factory/.python-tenacity.new.3060 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-tenacity" Tue Jun 30 21:58:06 2020 rev:13 rq:817787 version:6.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-tenacity/python-tenacity.changes 2020-04-21 13:07:14.844403040 +0200 +++ /work/SRC/openSUSE:Factory/.python-tenacity.new.3060/python-tenacity.changes 2020-06-30 21:59:03.443240236 +0200 @@ -1,0 +2,10 @@ +Tue Jun 30 00:36:12 UTC 2020 - Steve Kowalik <steven.kowa...@suse.com> + +- Update to 6.2.0: + * before_sleep_log: Add an exc_info option to include exception tracebacks + * docs: fix duplicate function names (#226) + * AsyncRetrying can use an async iterator (#222) + * Add minimal type definitions for @retry decorator (#221) +- Add typguard to BuildRequires + +------------------------------------------------------------------- Old: ---- tenacity-6.1.0.tar.gz New: ---- tenacity-6.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-tenacity.spec ++++++ --- /var/tmp/diff_new_pack.pgEl2g/_old 2020-06-30 21:59:04.583243764 +0200 +++ /var/tmp/diff_new_pack.pgEl2g/_new 2020-06-30 21:59:04.583243764 +0200 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %bcond_without python2 Name: python-tenacity -Version: 6.1.0 +Version: 6.2.0 Release: 0 Summary: Python module for retrying code until it succeeeds License: Apache-2.0 @@ -31,6 +31,7 @@ BuildRequires: %{python_module setuptools} BuildRequires: %{python_module six >= 1.9.0} BuildRequires: %{python_module tornado} +BuildRequires: %{python_module typeguard} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-six >= 1.9.0 ++++++ tenacity-6.1.0.tar.gz -> tenacity-6.2.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/.mergify.yml new/tenacity-6.2.0/.mergify.yml --- old/tenacity-6.1.0/.mergify.yml 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/.mergify.yml 2020-04-30 12:01:22.000000000 +0200 @@ -12,7 +12,21 @@ actions: merge: strict: "smart" - method: merge + method: squash + - name: automatic merge for jd + conditions: + - author=jd + - "status-success=ci/circleci: pep8" + - "status-success=ci/circleci: py27" + - "status-success=ci/circleci: py35" + - "status-success=ci/circleci: py36" + - "status-success=ci/circleci: py37" + - "status-success=ci/circleci: py38" + - label!=work-in-progress + actions: + merge: + strict: "smart" + method: squash - name: dismiss reviews conditions: [] actions: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/PKG-INFO new/tenacity-6.2.0/PKG-INFO --- old/tenacity-6.1.0/PKG-INFO 2020-02-26 11:39:48.327270300 +0100 +++ new/tenacity-6.2.0/PKG-INFO 2020-04-30 12:01:33.701704300 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tenacity -Version: 6.1.0 +Version: 6.2.0 Summary: Retry code until it succeeds Home-page: https://github.com/jd/tenacity Author: Julien Danjou diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/README.rst new/tenacity-6.2.0/README.rst --- old/tenacity-6.1.0/README.rst 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/README.rst 2020-04-30 12:01:22.000000000 +0200 @@ -484,7 +484,7 @@ varying parameter sets and none of those provided full state. The old way is deprecated, but kept for backward compatibility. - .. function:: my_stop(previous_attempt_number, delay_since_first_attempt) + .. function:: my_deprecated_stop(previous_attempt_number, delay_since_first_attempt) *deprecated* @@ -495,7 +495,7 @@ :type delay_since_first_attempt: float :rtype: bool - .. function:: my_wait(previous_attempt_number, delay_since_first_attempt [, last_result]) + .. function:: my_deprecated_wait(previous_attempt_number, delay_since_first_attempt [, last_result]) *deprecated* @@ -509,7 +509,7 @@ :return: number of seconds to wait before next retry :rtype: float - .. function:: my_retry(attempt) + .. function:: my_deprecated_retry(attempt) *deprecated* @@ -517,14 +517,14 @@ :return: whether or not retrying should continue :rtype: bool - .. function:: my_before(func, trial_number) + .. function:: my_deprecated_before(func, trial_number) *deprecated* :param callable func: function whose outcome is to be retried :param int trial_number: the number of current attempt - .. function:: my_after(func, trial_number, trial_time_taken) + .. function:: my_deprecated_after(func, trial_number, trial_time_taken) *deprecated* @@ -533,7 +533,7 @@ :param float trial_time_taken: interval in seconds between the beginning of first attempt and current time - .. function:: my_before_sleep(func, sleep, last_result) + .. function:: my_deprecated_before_sleep(func, sleep, last_result) *deprecated* @@ -620,6 +620,20 @@ You can configure every details of retry policy by configuring the Retrying object. +With async code you can use AsyncRetrying. + +.. testcode:: + + from tenacity import AsyncRetrying, RetryError, stop_after_attempt + + async def function(): + try: + async for attempt in AsyncRetrying(stop=stop_after_attempt(3)): + with attempt: + raise Exception('My code is failing!') + except RetryError: + pass + Async and retry ~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/doc/source/index.rst new/tenacity-6.2.0/doc/source/index.rst --- old/tenacity-6.1.0/doc/source/index.rst 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/doc/source/index.rst 2020-04-30 12:01:22.000000000 +0200 @@ -484,7 +484,7 @@ varying parameter sets and none of those provided full state. The old way is deprecated, but kept for backward compatibility. - .. function:: my_stop(previous_attempt_number, delay_since_first_attempt) + .. function:: my_deprecated_stop(previous_attempt_number, delay_since_first_attempt) *deprecated* @@ -495,7 +495,7 @@ :type delay_since_first_attempt: float :rtype: bool - .. function:: my_wait(previous_attempt_number, delay_since_first_attempt [, last_result]) + .. function:: my_deprecated_wait(previous_attempt_number, delay_since_first_attempt [, last_result]) *deprecated* @@ -509,7 +509,7 @@ :return: number of seconds to wait before next retry :rtype: float - .. function:: my_retry(attempt) + .. function:: my_deprecated_retry(attempt) *deprecated* @@ -517,14 +517,14 @@ :return: whether or not retrying should continue :rtype: bool - .. function:: my_before(func, trial_number) + .. function:: my_deprecated_before(func, trial_number) *deprecated* :param callable func: function whose outcome is to be retried :param int trial_number: the number of current attempt - .. function:: my_after(func, trial_number, trial_time_taken) + .. function:: my_deprecated_after(func, trial_number, trial_time_taken) *deprecated* @@ -533,7 +533,7 @@ :param float trial_time_taken: interval in seconds between the beginning of first attempt and current time - .. function:: my_before_sleep(func, sleep, last_result) + .. function:: my_deprecated_before_sleep(func, sleep, last_result) *deprecated* @@ -620,6 +620,20 @@ You can configure every details of retry policy by configuring the Retrying object. +With async code you can use AsyncRetrying. + +.. testcode:: + + from tenacity import AsyncRetrying, RetryError, stop_after_attempt + + async def function(): + try: + async for attempt in AsyncRetrying(stop=stop_after_attempt(3)): + with attempt: + raise Exception('My code is failing!') + except RetryError: + pass + Async and retry ~~~~~~~~~~~~~~~ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/releasenotes/notes/before_sleep_log-improvements-d8149274dfb37d7c.yaml new/tenacity-6.2.0/releasenotes/notes/before_sleep_log-improvements-d8149274dfb37d7c.yaml --- old/tenacity-6.1.0/releasenotes/notes/before_sleep_log-improvements-d8149274dfb37d7c.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/tenacity-6.2.0/releasenotes/notes/before_sleep_log-improvements-d8149274dfb37d7c.yaml 2020-04-30 12:01:22.000000000 +0200 @@ -0,0 +1,3 @@ +--- +features: + - Add an ``exc_info`` option to the ``before_sleep_log()`` strategy. \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/setup.cfg new/tenacity-6.2.0/setup.cfg --- old/tenacity-6.1.0/setup.cfg 2020-02-26 11:39:48.327270300 +0100 +++ new/tenacity-6.2.0/setup.cfg 2020-04-30 12:01:33.701704300 +0200 @@ -25,8 +25,12 @@ six>=1.9.0 futures>=3.0;python_version=='2.7' monotonic>=0.6;python_version=='2.7' + typing>=3.7.4.1;python_version=='2.7' packages = tenacity +[options.package_data] +tenacity = py.typed + [options.extras_require] doc = reno diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity/__init__.py new/tenacity-6.2.0/tenacity/__init__.py --- old/tenacity-6.1.0/tenacity/__init__.py 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tenacity/__init__.py 2020-04-30 12:01:22.000000000 +0200 @@ -29,6 +29,7 @@ import sys import threading +import typing as t from concurrent import futures import six @@ -85,7 +86,24 @@ from .before_sleep import before_sleep_nothing # noqa -def retry(*dargs, **dkw): +WrappedFn = t.TypeVar("WrappedFn", bound=t.Callable) + + +@t.overload +def retry(fn): + # type: (WrappedFn) -> WrappedFn + """Type signature for @retry as a raw decorator.""" + pass + + +@t.overload +def retry(*dargs, **dkw): # noqa + # type: (...) -> t.Callable[[WrappedFn], WrappedFn] + """Type signature for the @retry() decorator constructor.""" + pass + + +def retry(*dargs, **dkw): # noqa """Wrap a function with a new `Retrying` object. :param dargs: positional arguments passed to Retrying object diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity/_asyncio.py new/tenacity-6.2.0/tenacity/_asyncio.py --- old/tenacity-6.1.0/tenacity/_asyncio.py 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tenacity/_asyncio.py 2020-04-30 12:01:22.000000000 +0200 @@ -19,6 +19,7 @@ import sys from asyncio import sleep +from tenacity import AttemptManager from tenacity import BaseRetrying from tenacity import DoAttempt from tenacity import DoSleep @@ -52,3 +53,21 @@ await self.sleep(do) else: return do + + def __aiter__(self): + self.begin(None) + self._retry_state = RetryCallState(self, fn=None, args=(), kwargs={}) + return self + + async def __anext__(self): + while True: + do = self.iter(retry_state=self._retry_state) + if do is None: + raise StopAsyncIteration + elif isinstance(do, DoAttempt): + return AttemptManager(retry_state=self._retry_state) + elif isinstance(do, DoSleep): + self._retry_state.prepare_for_next_attempt() + await self.sleep(do) + else: + return do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity/before_sleep.py new/tenacity-6.2.0/tenacity/before_sleep.py --- old/tenacity-6.1.0/tenacity/before_sleep.py 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tenacity/before_sleep.py 2020-04-30 12:01:22.000000000 +0200 @@ -15,23 +15,32 @@ # limitations under the License. from tenacity import _utils +from tenacity.compat import get_exc_info_from_future def before_sleep_nothing(retry_state): """Before call strategy that does nothing.""" -def before_sleep_log(logger, log_level): +def before_sleep_log(logger, log_level, exc_info=False): """Before call strategy that logs to some logger the attempt.""" def log_it(retry_state): if retry_state.outcome.failed: - verb, value = 'raised', retry_state.outcome.exception() + ex = retry_state.outcome.exception() + verb, value = 'raised', '%s: %s' % (type(ex).__name__, ex) + + if exc_info: + local_exc_info = get_exc_info_from_future(retry_state.outcome) + else: + local_exc_info = False else: verb, value = 'returned', retry_state.outcome.result() + local_exc_info = False # exc_info does not apply when no exception logger.log(log_level, "Retrying %s in %s seconds as it %s %s.", _utils.get_callback_name(retry_state.fn), getattr(retry_state.next_action, 'sleep'), - verb, value) + verb, value, + exc_info=local_exc_info) return log_it diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity/compat.py new/tenacity-6.2.0/tenacity/compat.py --- old/tenacity-6.1.0/tenacity/compat.py 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tenacity/compat.py 2020-04-30 12:01:22.000000000 +0200 @@ -299,3 +299,24 @@ 'retry_error_callback', fn, stacklevel=4) return fn(retry_state.outcome) return wrapped_retry_error_callback + + +def get_exc_info_from_future(future): + """ + Get an exc_info value from a Future. + + Given a a Future instance, retrieve an exc_info value suitable for passing + in as the exc_info parameter to logging.Logger.log() and related methods. + + On Python 2, this will be a (type, value, traceback) triple. + On Python 3, this will be an exception instance (with embedded traceback). + + If there was no exception, None is returned on both versions of Python. + """ + if six.PY3: + return future.exception() + else: + ex, tb = future.exception_info() + if ex is None: + return None + return type(ex), ex, tb diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity/tests/test_asyncio.py new/tenacity-6.2.0/tenacity/tests/test_asyncio.py --- old/tenacity-6.1.0/tenacity/tests/test_asyncio.py 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tenacity/tests/test_asyncio.py 2020-04-30 12:01:22.000000000 +0200 @@ -21,7 +21,8 @@ from tenacity import RetryError from tenacity import _asyncio as tasyncio from tenacity import retry, stop_after_attempt -from tenacity.tests.test_tenacity import NoIOErrorAfterCount +from tenacity.tests.test_tenacity import NoIOErrorAfterCount, current_time_ms +from tenacity.wait import wait_fixed def asynctest(callable_): @@ -91,5 +92,51 @@ assert list(attempt_nos2) == [1, 2, 3] -if __name__ == '__main__': +class TestContextManager(unittest.TestCase): + @asynctest + async def test_do_max_attempts(self): + attempts = 0 + retrying = tasyncio.AsyncRetrying(stop=stop_after_attempt(3)) + try: + async for attempt in retrying: + with attempt: + attempts += 1 + raise Exception + except RetryError: + pass + + assert attempts == 3 + + @asynctest + async def test_reraise(self): + class CustomError(Exception): + pass + + try: + async for attempt in tasyncio.AsyncRetrying( + stop=stop_after_attempt(1), reraise=True + ): + with attempt: + raise CustomError() + except CustomError: + pass + else: + raise Exception + + @asynctest + async def test_sleeps(self): + start = current_time_ms() + try: + async for attempt in tasyncio.AsyncRetrying( + stop=stop_after_attempt(1), wait=wait_fixed(1) + ): + with attempt: + raise Exception() + except RetryError: + pass + t = current_time_ms() - start + self.assertLess(t, 1.1) + + +if __name__ == "__main__": unittest.main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity/tests/test_tenacity.py new/tenacity-6.2.0/tenacity/tests/test_tenacity.py --- old/tenacity-6.1.0/tenacity/tests/test_tenacity.py 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tenacity/tests/test_tenacity.py 2020-04-30 12:01:22.000000000 +0200 @@ -14,7 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. import logging +import os +import re +import sys import time +import typing import unittest import warnings from contextlib import contextmanager @@ -1155,12 +1159,42 @@ finally: logger.removeHandler(handler) - etalon_re = r'Retrying .* in 0\.01 seconds as it raised .*\.' + etalon_re = (r"^Retrying .* in 0\.01 seconds as it raised " + r"(IO|OS)Error: Hi there, I'm an IOError\.$") self.assertEqual(len(handler.records), 2) - self.assertRegexpMatches(handler.records[0].getMessage(), etalon_re) - self.assertRegexpMatches(handler.records[1].getMessage(), etalon_re) + fmt = logging.Formatter().format + self.assertRegexpMatches(fmt(handler.records[0]), etalon_re) + self.assertRegexpMatches(fmt(handler.records[1]), etalon_re) - def test_before_sleep_log_returns(self): + def test_before_sleep_log_raises_with_exc_info(self): + thing = NoIOErrorAfterCount(2) + logger = logging.getLogger(self.id()) + logger.propagate = False + logger.setLevel(logging.INFO) + handler = CapturingHandler() + logger.addHandler(handler) + try: + _before_sleep = tenacity.before_sleep_log(logger, + logging.INFO, + exc_info=True) + retrying = Retrying(wait=tenacity.wait_fixed(0.01), + stop=tenacity.stop_after_attempt(3), + before_sleep=_before_sleep) + retrying.call(thing.go) + finally: + logger.removeHandler(handler) + + etalon_re = re.compile(r"^Retrying .* in 0\.01 seconds as it raised " + r"(IO|OS)Error: Hi there, I'm an IOError\.{0}" + r"Traceback \(most recent call last\):{0}" + r".*$".format(os.linesep), + flags=re.MULTILINE) + self.assertEqual(len(handler.records), 2) + fmt = logging.Formatter().format + self.assertRegexpMatches(fmt(handler.records[0]), etalon_re) + self.assertRegexpMatches(fmt(handler.records[1]), etalon_re) + + def test_before_sleep_log_returns(self, exc_info=False): thing = NoneReturnUntilAfterCount(2) logger = logging.getLogger(self.id()) logger.propagate = False @@ -1168,7 +1202,9 @@ handler = CapturingHandler() logger.addHandler(handler) try: - _before_sleep = tenacity.before_sleep_log(logger, logging.INFO) + _before_sleep = tenacity.before_sleep_log(logger, + logging.INFO, + exc_info=exc_info) _retry = tenacity.retry_if_result(lambda result: result is None) retrying = Retrying(wait=tenacity.wait_fixed(0.01), stop=tenacity.stop_after_attempt(3), @@ -1177,10 +1213,14 @@ finally: logger.removeHandler(handler) + etalon_re = r'^Retrying .* in 0\.01 seconds as it returned None\.$' self.assertEqual(len(handler.records), 2) - etalon_re = r'Retrying .* in 0\.01 seconds as it returned None' - self.assertRegexpMatches(handler.records[0].getMessage(), etalon_re) - self.assertRegexpMatches(handler.records[1].getMessage(), etalon_re) + fmt = logging.Formatter().format + self.assertRegexpMatches(fmt(handler.records[0]), etalon_re) + self.assertRegexpMatches(fmt(handler.records[1]), etalon_re) + + def test_before_sleep_log_returns_with_exc_info(self): + self.test_before_sleep_log_returns(exc_info=True) class TestReraiseExceptions(unittest.TestCase): @@ -1391,6 +1431,42 @@ self.assertEqual(expected.last_attempt, actual.last_attempt) +class TestRetryTyping(unittest.TestCase): + + @pytest.mark.skipif( + sys.version_info < (3, 0), + reason="typeguard not supported for python 2" + ) + def test_retry_type_annotations(self): + """The decorator should maintain types of decorated functions.""" + # Just in case this is run with unit-test, return early for py2 + if sys.version_info < (3, 0): + return + + # Function-level import because we can't install this for python 2. + from typeguard import check_type + + def num_to_str(number): + # type: (int) -> str + return str(number) + + # equivalent to a raw @retry decoration + with_raw = retry(num_to_str) + with_raw_result = with_raw(1) + + # equivalent to a @retry(...) decoration + with_constructor = retry()(num_to_str) + with_constructor_result = with_raw(1) + + # These raise TypeError exceptions if they fail + check_type("with_raw", with_raw, typing.Callable[[int], str]) + check_type("with_raw_result", with_raw_result, str) + check_type( + "with_constructor", with_constructor, typing.Callable[[int], str] + ) + check_type("with_constructor_result", with_constructor_result, str) + + @contextmanager def reports_deprecation_warning(): __tracebackhide__ = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity.egg-info/PKG-INFO new/tenacity-6.2.0/tenacity.egg-info/PKG-INFO --- old/tenacity-6.1.0/tenacity.egg-info/PKG-INFO 2020-02-26 11:39:48.000000000 +0100 +++ new/tenacity-6.2.0/tenacity.egg-info/PKG-INFO 2020-04-30 12:01:33.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tenacity -Version: 6.1.0 +Version: 6.2.0 Summary: Retry code until it succeeds Home-page: https://github.com/jd/tenacity Author: Julien Danjou diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity.egg-info/SOURCES.txt new/tenacity-6.2.0/tenacity.egg-info/SOURCES.txt --- old/tenacity-6.1.0/tenacity.egg-info/SOURCES.txt 2020-02-26 11:39:48.000000000 +0100 +++ new/tenacity-6.2.0/tenacity.egg-info/SOURCES.txt 2020-04-30 12:01:33.000000000 +0200 @@ -13,6 +13,7 @@ doc/source/conf.py doc/source/index.rst releasenotes/notes/add-reno-d1ab5710f272650a.yaml +releasenotes/notes/before_sleep_log-improvements-d8149274dfb37d7c.yaml tenacity/__init__.py tenacity/_asyncio.py tenacity/_utils.py @@ -21,6 +22,7 @@ tenacity/before_sleep.py tenacity/compat.py tenacity/nap.py +tenacity/py.typed tenacity/retry.py tenacity/stop.py tenacity/tornadoweb.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tenacity.egg-info/requires.txt new/tenacity-6.2.0/tenacity.egg-info/requires.txt --- old/tenacity-6.1.0/tenacity.egg-info/requires.txt 2020-02-26 11:39:48.000000000 +0100 +++ new/tenacity-6.2.0/tenacity.egg-info/requires.txt 2020-04-30 12:01:33.000000000 +0200 @@ -3,6 +3,7 @@ [:python_version == "2.7"] futures>=3.0 monotonic>=0.6 +typing>=3.7.4.1 [doc] reno diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tenacity-6.1.0/tox.ini new/tenacity-6.2.0/tox.ini --- old/tenacity-6.1.0/tox.ini 2020-02-26 11:39:39.000000000 +0100 +++ new/tenacity-6.2.0/tox.ini 2020-04-30 12:01:22.000000000 +0200 @@ -7,6 +7,7 @@ deps = .[doc] pytest + typeguard;python_version>='3.0' commands = py{27,py}: pytest --ignore='tenacity/tests/test_asyncio.py' {posargs} py3{5,6,7,8}: pytest {posargs}