From 77ee7c8679e74c284e6fa2d444c8d179401bbe4b Mon Sep 17 00:00:00 2001 From: Patrick McLean Date: Fri, 22 Nov 2019 11:40:16 -0800 Subject: [PATCH] dev-python/requests-toolbelt: Version bump to 0.9.1 Copyright: Sony Interactive Entertainment Inc. Package-Manager: Portage-2.3.79, Repoman-2.3.18 Signed-off-by: Patrick McLean --- ...quests-toolbelt-0.9.1-tests-internet.patch | 28 ++++ .../requests-toolbelt-0.9.1-tests-py2.patch | 68 ++++++++++ .../files/requests-toolbelt-0.9.1-tests.patch | 128 ++++++++++++++++++ .../requests-toolbelt-0.9.1.ebuild | 23 ++-- 4 files changed, 236 insertions(+), 11 deletions(-) create mode 100644 dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-internet.patch create mode 100644 dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-py2.patch create mode 100644 dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests.patch diff --git a/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-internet.patch b/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-internet.patch new file mode 100644 index 000000000000..b3dc2603c117 --- /dev/null +++ b/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-internet.patch @@ -0,0 +1,28 @@ +diff --git a/tests/test_multipart_encoder.py b/tests/test_multipart_encoder.py +index 575f54c..73a880e 100644 +--- a/tests/test_multipart_encoder.py ++++ b/tests/test_multipart_encoder.py +@@ -94,6 +94,7 @@ class TestFileFromURLWrapper(unittest.TestCase): + s = requests.Session() + self.recorder = get_betamax(s) + ++ @unittest.skip("test requires internet access") + def test_read_file(self): + url = ('https://stxnext.com/static/img/logo.830ebe551641.svg') + with self.recorder.use_cassette( +@@ -110,6 +111,7 @@ class TestFileFromURLWrapper(unittest.TestCase): + assert chunk == b'ww.w3.org/' + assert self.instance.len == 5147 + ++ @unittest.skip("test requires internet access") + def test_no_content_length_header(self): + url = ( + 'https://api.github.com/repos/sigmavirus24/github3.py/releases/' +@@ -191,6 +193,7 @@ class TestMultipartEncoder(unittest.TestCase): + m = MultipartEncoder([('field', 'foo'), ('file', fd)]) + assert m.read() is not None + ++ @unittest.skip("test requires internet access") + def test_reads_file_from_url_wrapper(self): + s = requests.Session() + recorder = get_betamax(s) diff --git a/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-py2.patch b/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-py2.patch new file mode 100644 index 000000000000..6825c5f4ed4c --- /dev/null +++ b/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests-py2.patch @@ -0,0 +1,68 @@ +diff --git a/tests/threaded/test_pool.py b/tests/threaded/test_pool.py +index 3e54b3c..9583c7b 100644 +--- a/tests/threaded/test_pool.py ++++ b/tests/threaded/test_pool.py +@@ -5,6 +5,7 @@ except ImportError: + import Queue as queue + import unittest + ++import sys + import mock + import pytest + +@@ -60,6 +61,7 @@ class TestPool(unittest.TestCase): + assert session.called is True + session.assert_called_once_with() + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_from_exceptions_populates_a_queue(self): + """Ensure a Queue is properly populated from exceptions.""" + urls = ["https://httpbin.org/get?n={}".format(n) for n in range(5)] +@@ -77,6 +79,7 @@ class TestPool(unittest.TestCase): + for url in urls + ] + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_from_urls_constructs_get_requests(self): + """Ensure a Queue is properly populated from an iterable of urls.""" + urls = ["https://httpbin.org/get?n={}".format(n) for n in range(5)] +@@ -92,6 +95,7 @@ class TestPool(unittest.TestCase): + for url in urls + ] + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_from_urls_constructs_get_requests_with_kwargs(self): + """Ensure a Queue is properly populated from an iterable of urls.""" + def merge(*args): +@@ -130,6 +134,7 @@ class TestPool(unittest.TestCase): + for st in session_threads: + st.join.assert_called_once_with() + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_get_response_returns_thread_response(self): + """Ensure that a ThreadResponse is made when there's data.""" + queues = [] +@@ -149,6 +154,7 @@ class TestPool(unittest.TestCase): + assert isinstance(p.get_response(), pool.ThreadResponse) + assert len([q for q in queues if q.get_nowait.called]) == 1 + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_get_exception_returns_thread_exception(self): + """Ensure that a ThreadException is made when there's data.""" + queues = [] +@@ -168,6 +174,7 @@ class TestPool(unittest.TestCase): + assert isinstance(p.get_exception(), pool.ThreadException) + assert len([q for q in queues if q.get_nowait.called]) == 1 + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_get_response_returns_none_when_queue_is_empty(self): + """Ensure that None is returned when the response Queue is empty.""" + queues = [] +@@ -187,6 +194,7 @@ class TestPool(unittest.TestCase): + assert p.get_response() is None + assert len([q for q in queues if q.get_nowait.called]) == 1 + ++ @pytest.mark.skipif(sys.hexversion < 0x3000000, reason="broken on python2") + def test_get_exception_returns_none_when_queue_is_empty(self): + """Ensure that None is returned when the exception Queue is empty.""" + queues = [] diff --git a/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests.patch b/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests.patch new file mode 100644 index 000000000000..a2a8929b08d4 --- /dev/null +++ b/dev-python/requests-toolbelt/files/requests-toolbelt-0.9.1-tests.patch @@ -0,0 +1,128 @@ +From c4f918572751151eb3bfc7dfa94580b3e2867a9e Mon Sep 17 00:00:00 2001 +From: Jon Dufresne +Date: Sun, 3 Feb 2019 09:02:24 -0800 +Subject: [PATCH] Fix unhandled exceptions from threads during tests + +A queue.Queue() object was not always passed to SessionThread. In this +case, SessionThread._make_request() would raise an exception trying to +call methods on the expected object. Now, always pass a usable object to +SessionThread. + +Previously appeared as: + + Traceback (most recent call last): + File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner + self.run() + File "/usr/lib64/python3.7/threading.py", line 865, in run + self._target(*self._args, **self._kwargs) + File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request + kwargs = self._jobs.get_nowait() + AttributeError: 'NoneType' object has no attribute 'get_nowait' + + Exception in thread cd08fad6-d21d-41b0-921e-737a149b12be: + Traceback (most recent call last): + File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner + self.run() + File "/usr/lib64/python3.7/threading.py", line 865, in run + self._target(*self._args, **self._kwargs) + File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request + kwargs = self._jobs.get_nowait() + AttributeError: 'NoneType' object has no attribute 'get_nowait' + + Exception in thread 4fb72f0d-ba1c-4a78-97a2-4a7283ea01fe: + Traceback (most recent call last): + File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner + self.run() + File "/usr/lib64/python3.7/threading.py", line 865, in run + self._target(*self._args, **self._kwargs) + File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request + kwargs = self._jobs.get_nowait() + AttributeError: 'NoneType' object has no attribute 'get_nowait' + + Exception in thread 5f3711af-0c01-4821-9e25-8074bbbf769b: + Traceback (most recent call last): + File "/usr/lib64/python3.7/threading.py", line 917, in _bootstrap_inner + self.run() + File "/usr/lib64/python3.7/threading.py", line 865, in run + self._target(*self._args, **self._kwargs) + File "toolbelt/requests_toolbelt/threaded/thread.py", line 41, in _make_request + kwargs = self._jobs.get_nowait() + AttributeError: 'NoneType' object has no attribute 'get_nowait' +--- + tests/threaded/test_pool.py | 15 ++++++++++----- + tests/threaded/test_thread.py | 5 ++++- + 2 files changed, 14 insertions(+), 6 deletions(-) + +diff --git a/tests/threaded/test_pool.py b/tests/threaded/test_pool.py +index b0653bb..b949dd8 100644 +--- a/tests/threaded/test_pool.py ++++ b/tests/threaded/test_pool.py +@@ -26,32 +26,37 @@ def test_requires_positive_number_of_processes(self): + + def test_number_of_processes_can_be_arbitrary(self): + """Show that the number of processes can be set.""" +- p = pool.Pool(None, num_processes=100) ++ job_queue = queue.Queue() ++ p = pool.Pool(job_queue, num_processes=100) + assert p._processes == 100 + assert len(p._pool) == 100 + +- p = pool.Pool(None, num_processes=1) ++ job_queue = queue.Queue() ++ p = pool.Pool(job_queue, num_processes=1) + assert p._processes == 1 + assert len(p._pool) == 1 + + def test_initializer_is_called(self): + """Ensure that the initializer function is called.""" ++ job_queue = queue.Queue() + initializer = mock.MagicMock() +- pool.Pool(None, num_processes=1, initializer=initializer) ++ pool.Pool(job_queue, num_processes=1, initializer=initializer) + assert initializer.called is True + initializer.assert_called_once_with(mock.ANY) + + def test_auth_generator_is_called(self): + """Ensure that the auth_generator function is called.""" ++ job_queue = queue.Queue() + auth_generator = mock.MagicMock() +- pool.Pool(None, num_processes=1, auth_generator=auth_generator) ++ pool.Pool(job_queue, num_processes=1, auth_generator=auth_generator) + assert auth_generator.called is True + auth_generator.assert_called_once_with(mock.ANY) + + def test_session_is_called(self): + """Ensure that the session function is called.""" ++ job_queue = queue.Queue() + session = mock.MagicMock() +- pool.Pool(None, num_processes=1, session=session) ++ pool.Pool(job_queue, num_processes=1, session=session) + assert session.called is True + session.assert_called_once_with() + +diff --git a/tests/threaded/test_thread.py b/tests/threaded/test_thread.py +index bb92f7f..fd7e96b 100644 +--- a/tests/threaded/test_thread.py ++++ b/tests/threaded/test_thread.py +@@ -19,6 +19,8 @@ def _make_mocks(): + + def _initialize_a_session_thread(session=None, job_queue=None, + response_queue=None, exception_queue=None): ++ if job_queue is None: ++ job_queue = queue.Queue() + with mock.patch.object(threading, 'Thread') as Thread: + thread_instance = mock.MagicMock() + Thread.return_value = thread_instance +@@ -52,10 +54,11 @@ def test_thread_initialization(self): + + def test_is_alive_proxies_to_worker(self): + """Test that we proxy the is_alive method to the Thread.""" ++ job_queue = queue.Queue() + with mock.patch.object(threading, 'Thread') as Thread: + thread_instance = mock.MagicMock() + Thread.return_value = thread_instance +- st = thread.SessionThread(None, None, None, None) ++ st = thread.SessionThread(None, job_queue, None, None) + + st.is_alive() + thread_instance.is_alive.assert_called_once_with() diff --git a/dev-python/requests-toolbelt/requests-toolbelt-0.9.1.ebuild b/dev-python/requests-toolbelt/requests-toolbelt-0.9.1.ebuild index ed22f1180b01..d2eb47414a4f 100644 --- a/dev-python/requests-toolbelt/requests-toolbelt-0.9.1.ebuild +++ b/dev-python/requests-toolbelt/requests-toolbelt-0.9.1.ebuild @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 EAPI=7 -PYTHON_COMPAT=( python{2_7,3_5,3_6,3_7} ) +PYTHON_COMPAT=( python{2_7,3_{5,6,7}} pypy{,3} ) inherit distutils-r1 @@ -21,20 +21,21 @@ DEPEND="${RDEPEND} test? ( dev-python/betamax[${PYTHON_USEDEP}] dev-python/mock[${PYTHON_USEDEP}] - dev-python/pytest[${PYTHON_USEDEP}] )" DOCS=( AUTHORS.rst HISTORY.rst README.rst ) + PATCHES=( "${FILESDIR}/requests-toolbelt-0.8.0-test-tracebacks.patch" -) + "${FILESDIR}/requests-toolbelt-0.9.1-tests.patch" -# Known python2.7 test failures do to upstream -# not testing with newer requests versions -# bug: https://bugs.gentoo.org/635824 -# https://github.com/requests/toolbelt/issues/213 -RESTRICT=test + # disable python2.7 test failures with newer requests versions + # bug: https://bugs.gentoo.org/635824 + # https://github.com/requests/toolbelt/issues/213 + "${FILESDIR}/requests-toolbelt-0.9.1-tests-py2.patch" + + # disable tests that require internet access + "${FILESDIR}/requests-toolbelt-0.9.1-tests-internet.patch" +) -python_test() { - py.test -v || die "Tests failed with ${EPYTHON}" -} +distutils_enable_tests pytest -- 2.26.2