Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-python-jenkins for openSUSE:Factory checked in at 2025-07-28 14:58:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-python-jenkins (Old) and /work/SRC/openSUSE:Factory/.python-python-jenkins.new.13279 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-python-jenkins" Mon Jul 28 14:58:29 2025 rev:15 rq:1295994 version:1.8.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-python-jenkins/python-python-jenkins.changes 2023-07-25 11:52:31.589952479 +0200 +++ /work/SRC/openSUSE:Factory/.python-python-jenkins.new.13279/python-python-jenkins.changes 2025-07-28 14:58:35.659388404 +0200 @@ -1,0 +2,18 @@ +Mon Jul 28 04:08:10 UTC 2025 - Steve Kowalik <steven.kowa...@suse.com> + +- Update to 1.8.2: + * Fix compatibility with setuptools >= 66 + * get_build_artifact_as_bytes to support non-json files + * Handle 'all' view name when requested 'All' + * WrappedSession: Fix URL to requests issue 3829 + * support urllib3 newer DEFAULT_TIMEOUT + * Use multiprocess to avoid pickle errors in tox on macos +- Dropped patch use-parts-of-legacy-version.patch: + * Merged upstream. +- Refreshed patch python-python-jenkins-no-mock.patch: + * It was submitted upstream. +- Add patch remove-six.patch: + * Remove usage of six. +- Remove pin against urllib3. + +------------------------------------------------------------------- Old: ---- python-jenkins-1.8.0.tar.gz use-parts-of-legacy-version.patch New: ---- python-jenkins-1.8.2.tar.gz remove-six.patch ----------(Old B)---------- Old: * Use multiprocess to avoid pickle errors in tox on macos - Dropped patch use-parts-of-legacy-version.patch: * Merged upstream. ----------(Old E)---------- ----------(New B)---------- New: * It was submitted upstream. - Add patch remove-six.patch: * Remove usage of six. ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-python-jenkins.spec ++++++ --- /var/tmp/diff_new_pack.H9LJtY/_old 2025-07-28 14:58:36.339416731 +0200 +++ /var/tmp/diff_new_pack.H9LJtY/_new 2025-07-28 14:58:36.343416899 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-python-jenkins # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2025 SUSE LLC # Copyright (c) 2014 Thomas Bechtold <thomasbecht...@jpberlin.de> # # All modifications and additions to the file contributed by third parties @@ -18,25 +18,24 @@ Name: python-python-jenkins -Version: 1.8.0 +Version: 1.8.2 Release: 0 Summary: Python bindings for the remote Jenkins API License: BSD-3-Clause URL: https://opendev.org/jjb/python-jenkins Source: https://files.pythonhosted.org/packages/source/p/python-jenkins/python-jenkins-%{version}.tar.gz -# https://bugs.launchpad.net/python-jenkins/+bug/1971524 +# PATCH-FIX-UPSTREAM Based on https://review.opendev.org/c/jjb/python-jenkins/+/953273 Patch0: python-python-jenkins-no-mock.patch -# PATCH-FIX-OPENSUSE Upstream are arguing about version parsing, use the -# underlying parts of LegacyVersion from packaging pre-removal -Patch1: use-parts-of-legacy-version.patch +# PATCH-FIX-UPSTREAM Based on https://opendev.org/jjb/python-jenkins/commit/63b657fe23c3b33903061a17b88787886be3c6dd +Patch1: remove-six.patch BuildRequires: %{python_module cmd2} BuildRequires: %{python_module multi_key_dict} +BuildRequires: %{python_module multiprocess} BuildRequires: %{python_module pbr >= 0.8.2} BuildRequires: %{python_module pip} -BuildRequires: %{python_module requests-mock >= 1.4} +BuildRequires: %{python_module requests-mock >= 1.11} BuildRequires: %{python_module requests} BuildRequires: %{python_module testscenarios} -BuildRequires: %{python_module urllib3 < 2} BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: openssl-devel @@ -46,8 +45,6 @@ Requires: python-multi_key_dict Requires: python-pbr Requires: python-requests -Requires: python-six >= 1.3.0 -Requires: python-urllib3 < 2 Provides: python-jenkins = %{version} Obsoletes: python-jenkins < %{version} BuildArch: noarch @@ -79,5 +76,5 @@ %license COPYING %doc README.rst %{python_sitelib}/jenkins -%{python_sitelib}/python_jenkins-%{version}*-info +%{python_sitelib}/python_jenkins-%{version}.dist-info ++++++ python-jenkins-1.8.0.tar.gz -> python-jenkins-1.8.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/.zuul.yaml new/python-jenkins-1.8.2/.zuul.yaml --- old/python-jenkins-1.8.0/.zuul.yaml 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/.zuul.yaml 2023-11-09 11:19:17.000000000 +0100 @@ -2,25 +2,59 @@ - job: name: jjb-tox-cross-jenkins-job-builder description: Tests compatibility with master branch of jenkins-job-builder - parent: tox-py27 + parent: tox-py311 + nodeset: ubuntu-jammy required-projects: - jjb/python-jenkins - jjb/jenkins-job-builder voting: true - project: - templates: - - build-openstack-docs-pti - - openstack-cover-jobs - - openstack-python35-jobs - - openstack-python36-jobs check: jobs: - - openstack-tox-linters - - openstack-tox-py27 + # Only in check: + - tox-cover: + nodeset: ubuntu-xenial + # Jobs common to gate pipeline + - tox-linters + - opendev-tox-docs: + nodeset: ubuntu-xenial + - tox-py27: + nodeset: ubuntu-xenial + - tox-py35: + nodeset: ubuntu-xenial + - tox-py36: + nodeset: ubuntu-bionic + - tox-py37: + nodeset: ubuntu-bionic + - tox-py38: + nodeset: ubuntu-focal + - tox-py39: + nodeset: ubuntu-focal + - tox-py310: + nodeset: ubuntu-jammy + - tox-py311: + nodeset: ubuntu-jammy - jjb-tox-cross-jenkins-job-builder gate: jobs: - - openstack-tox-linters - - openstack-tox-py27 + - tox-linters + - opendev-tox-docs: + nodeset: ubuntu-xenial + - tox-py27: + nodeset: ubuntu-xenial + - tox-py35: + nodeset: ubuntu-xenial + - tox-py36: + nodeset: ubuntu-bionic + - tox-py37: + nodeset: ubuntu-bionic + - tox-py38: + nodeset: ubuntu-focal + - tox-py39: + nodeset: ubuntu-focal + - tox-py310: + nodeset: ubuntu-jammy + - tox-py311: + nodeset: ubuntu-jammy - jjb-tox-cross-jenkins-job-builder diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/AUTHORS new/python-jenkins-1.8.2/AUTHORS --- old/python-jenkins-1.8.0/AUTHORS 2023-03-24 15:51:12.000000000 +0100 +++ new/python-jenkins-1.8.2/AUTHORS 2023-11-09 11:19:41.000000000 +0100 @@ -15,6 +15,7 @@ Brandon Leonard <brandon.leon...@rackspace.com> Chris St. Pierre <cstpi...@cisco.com> Christian Berendt <bere...@b1-systems.de> +Christoph Erhardt <ce+ubuntu...@sicherha.de> Clark Boylan <clark.boy...@gmail.com> Darragh Bailey <daragh.bai...@gmail.com> Darragh Bailey <dbai...@hp.com> @@ -44,8 +45,10 @@ K Jonathan Harker <jhar...@suse.com> Kazuhiro Suzuki <ksauzz...@gmail.com> Ken Conley k...@willowgarage.com <> +Ken Dreyer <kdre...@redhat.com> Ken Dreyer <ktdre...@ktdreyer.com> Ken Rumer <kenru...@gmail.com> +Kenyon Ralph <quic_kra...@quicinc.com> Kevin L. Mitchell <kevin.mitch...@rackspace.com> Kevin McDermott <ke...@canonical.com> Khai Do <zaro0...@gmail.com> @@ -70,6 +73,7 @@ Thanh Ha <zxi...@linux.com> Tomas Janousek <tomas.janou...@gooddata.com> Vieri <15050873...@163.com> +Vsevolod Fedorov <vsevolod.fedo...@gmail.com> ZhangHongtao <zhanghongtao0...@126.com> grahamlyons <gra...@grahamlyons.com> huang.zhiping <huang.zhip...@99cloud.net> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/ChangeLog new/python-jenkins-1.8.2/ChangeLog --- old/python-jenkins-1.8.0/ChangeLog 2023-03-24 15:51:12.000000000 +0100 +++ new/python-jenkins-1.8.2/ChangeLog 2023-11-09 11:19:41.000000000 +0100 @@ -1,6 +1,22 @@ CHANGES ======= +1.8.2 +----- + +* Fix compatibility with setuptools >= 66 +* get\_build\_artifact\_as\_bytes to support non-json files + +1.8.1 +----- + +* STORY 2010790: Handle 'all' view name when requested 'All' +* WrappedSession: Fix URL to requests issue 3829 +* CI: add support to python 37 to 311 +* support urllib3 newer DEFAULT\_TIMEOUT +* Use multiprocess to avoid pickle errors in tox on macos +* CI: move out of OpenStack Zuul templates + 1.8.0 ----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/PKG-INFO new/python-jenkins-1.8.2/PKG-INFO --- old/python-jenkins-1.8.0/PKG-INFO 2023-03-24 15:51:12.177868000 +0100 +++ new/python-jenkins-1.8.2/PKG-INFO 2023-11-09 11:19:42.099474000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: python-jenkins -Version: 1.8.0 +Version: 1.8.2 Summary: Python bindings for the remote Jenkins API Home-page: https://opendev.org/jjb/python-jenkins Author: Ken Conley diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/jenkins/__init__.py new/python-jenkins-1.8.2/jenkins/__init__.py --- old/python-jenkins-1.8.0/jenkins/__init__.py 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/jenkins/__init__.py 2023-11-09 11:19:17.000000000 +0100 @@ -58,6 +58,7 @@ import multi_key_dict import requests import requests.exceptions as req_exc +import urllib3.util.timeout from requests.packages.urllib3.exceptions import InsecureRequestWarning from six.moves.http_client import BadStatusLine from six.moves.urllib.error import URLError @@ -91,6 +92,7 @@ LAUNCHER_JNLP = 'hudson.slaves.JNLPLauncher' LAUNCHER_WINDOWS_SERVICE = 'hudson.os.windows.ManagedWindowsServiceLauncher' DEFAULT_HEADERS = {'Content-Type': 'text/xml; charset=utf-8'} +DEFAULT_TIMEOUT = getattr(urllib3.util.timeout, '_DEFAULT_TIMEOUT', socket._GLOBAL_DEFAULT_TIMEOUT) # REST Endpoints INFO = 'api/json' @@ -280,7 +282,7 @@ class WrappedSession(requests.Session): """A wrapper for requests.Session to override 'verify' property, ignoring REQUESTS_CA_BUNDLE environment variable. - This is a workaround for https://github.com/kennethreitz/requests/issues/3829 (will be fixed in requests 3.0.0) + This is a workaround for https://github.com/psf/requests/issues/3829 (will be fixed in requests 3.0.0) """ def merge_environment_settings(self, url, proxies, stream, verify, *args, @@ -300,7 +302,7 @@ _timeout_warning_issued = False def __init__(self, url, username=None, password=None, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT): + timeout=DEFAULT_TIMEOUT): '''Create handle to Jenkins instance. All methods will raise :class:`JenkinsException` on failure. @@ -542,13 +544,13 @@ # when accessing .text property return response - def _request(self, req): + def _request(self, req, stream=None): r = self._session.prepare_request(req) # requests.Session.send() does not honor env settings by design # see https://github.com/requests/requests/issues/2807 _settings = self._session.merge_environment_settings( - r.url, {}, None, self._session.verify, None) + r.url, {}, stream, self._session.verify, None) _settings['timeout'] = self.timeout return self._session.send(r, **_settings) @@ -559,7 +561,14 @@ ''' return self.jenkins_request(req, add_crumb, resolve_auth).text - def jenkins_request(self, req, add_crumb=True, resolve_auth=True): + def jenkins_open_stream(self, req, add_crumb=True, resolve_auth=True): + '''Return the HTTP response body from a ``requests.Request``. + + :returns: ``stream`` + ''' + return self.jenkins_request(req, add_crumb, resolve_auth, True) + + def jenkins_request(self, req, add_crumb=True, resolve_auth=True, stream=None): '''Utility routine for opening an HTTP request to a Jenkins server. :param req: A ``requests.Request`` to submit. @@ -567,6 +576,7 @@ before submitting. Defaults to ``True``. :param resolve_auth: If True, maybe add authentication. Defaults to ``True``. + :param stream: If True, return a stream :returns: A ``requests.Response`` object. ''' try: @@ -576,7 +586,7 @@ self.maybe_add_crumb(req) return self._response_handler( - self._request(req)) + self._request(req, stream)) except req_exc.HTTPError as e: # Jenkins's funky authentication means its nigh impossible to @@ -740,6 +750,27 @@ # This can happen if the artifact is not found return None + def get_build_artifact_as_bytes(self, name, number, artifact): + """Get artifacts from job + + :param name: Job name, ``str`` + :param number: Build number, ``str`` (also accepts ``int``) + :param artifact: Artifact relative path, ``str`` + :returns: artifact to download, ``bytes`` + """ + folder_url, short_name = self._get_job_folder(name) + + try: + with self.jenkins_open_stream(requests.Request( + 'GET', self._build_url(BUILD_ARTIFACT, locals()))) as response: + if response.encoding is None: + return response.raw.read() + else: + return response.text.encode(response.encoding) + raise JenkinsException('job[%s] number[%s] does not exist' % (name, number)) + except requests.exceptions.HTTPError: + raise JenkinsException('job[%s] number[%s] does not exist' % (name, number)) + def get_build_stages(self, name, number): """Get stages info from job @@ -1796,6 +1827,8 @@ return None else: actual = json.loads(response)['name'] + if actual == 'all': + actual = 'All' if actual != short_name: raise JenkinsException( 'Jenkins returned an unexpected view name %s ' @@ -2247,7 +2280,7 @@ raise ValueError("Timeout must be >= 0 not %d" % timeout) if (not self._timeout_warning_issued and - self.timeout != socket._GLOBAL_DEFAULT_TIMEOUT and + self.timeout != DEFAULT_TIMEOUT and timeout < self.timeout): warnings.warn("Requested timeout to wait for jenkins to resume " "normal operations is less than configured " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/jenkins/plugins.py new/python-jenkins-1.8.2/jenkins/plugins.py --- old/python-jenkins-1.8.0/jenkins/plugins.py 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/jenkins/plugins.py 2023-11-09 11:19:17.000000000 +0100 @@ -42,8 +42,6 @@ import operator import re -import pkg_resources - class Plugin(dict): '''Dictionary object containing plugin metadata.''' @@ -76,15 +74,13 @@ '''Parse plugin version and store it for comparison.''' self._version = version - self.parsed_version = pkg_resources.parse_version( - self.__convert_version(version)) + self._key = _legacy_cmpkey(self.__convert_version(version)) def __convert_version(self, version): return self._VERSION_RE.sub(r'\g<1>.preview', str(version)) def __compare(self, op, version): - return op(self.parsed_version, pkg_resources.parse_version( - self.__convert_version(version))) + return op(self._key, PluginVersion(version)._key) def __le__(self, version): return self.__compare(operator.le, version) @@ -109,3 +105,92 @@ def __repr__(self): return str(self._version) + + +############################################################################### +""" +The Python world has migrated to the versioning scheme defined in PEP 440, but +the versioning of Jenkins plugins is less strict than that. The code below was +salvaged from the implementation of the `LegacyVersion` class, which used to be +part of the `packaging` library prior to version 22.0. + +It is licensed as follows. + +Copyright (c) Donald Stufft and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) + +_legacy_version_replacement_map = { + "pre": "c", + "preview": "c", + "-": "final-", + "rc": "c", + "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + + return epoch, tuple(parts) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/python_jenkins.egg-info/PKG-INFO new/python-jenkins-1.8.2/python_jenkins.egg-info/PKG-INFO --- old/python-jenkins-1.8.0/python_jenkins.egg-info/PKG-INFO 2023-03-24 15:51:12.000000000 +0100 +++ new/python-jenkins-1.8.2/python_jenkins.egg-info/PKG-INFO 2023-11-09 11:19:41.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: python-jenkins -Version: 1.8.0 +Version: 1.8.2 Summary: Python bindings for the remote Jenkins API Home-page: https://opendev.org/jjb/python-jenkins Author: Ken Conley diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/python_jenkins.egg-info/pbr.json new/python-jenkins-1.8.2/python_jenkins.egg-info/pbr.json --- old/python-jenkins-1.8.0/python_jenkins.egg-info/pbr.json 2023-03-24 15:51:12.000000000 +0100 +++ new/python-jenkins-1.8.2/python_jenkins.egg-info/pbr.json 2023-11-09 11:19:41.000000000 +0100 @@ -1 +1 @@ -{"git_version": "70dc3e4", "is_release": true} \ No newline at end of file +{"git_version": "876a2a9", "is_release": true} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/python_jenkins.egg-info/requires.txt new/python-jenkins-1.8.2/python_jenkins.egg-info/requires.txt --- old/python-jenkins-1.8.0/python_jenkins.egg-info/requires.txt 2023-03-24 15:51:12.000000000 +0100 +++ new/python-jenkins-1.8.2/python_jenkins.egg-info/requires.txt 2023-11-09 11:19:41.000000000 +0100 @@ -1,5 +1,4 @@ multi_key_dict pbr>=0.8.2 requests -setuptools<66 six>=1.3.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/requirements.txt new/python-jenkins-1.8.2/requirements.txt --- old/python-jenkins-1.8.0/requirements.txt 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/requirements.txt 2023-11-09 11:19:17.000000000 +0100 @@ -1,5 +1,3 @@ -# Setuptools removed support for PEP 440 non-conforming versions -setuptools<66 six>=1.3.0 pbr>=0.8.2 multi_key_dict diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/test-requirements.txt new/python-jenkins-1.8.2/test-requirements.txt --- old/python-jenkins-1.8.0/test-requirements.txt 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/test-requirements.txt 2023-11-09 11:19:17.000000000 +0100 @@ -4,7 +4,7 @@ mock unittest2 python-subunit -requests-mock>=1.4.0 +requests-mock>=1.11.0 requests-kerberos<=0.12.0;python_version<'3.6' requests-kerberos;python_version>='3.6' sphinx>=1.6.0,<2.0.0;python_version=='2.7' # BSD @@ -13,3 +13,4 @@ testscenarios testtools pre-commit +multiprocess diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/tests/helper.py new/python-jenkins-1.8.2/tests/helper.py --- old/python-jenkins-1.8.0/tests/helper.py 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/tests/helper.py 2023-11-09 11:19:17.000000000 +0100 @@ -1,7 +1,7 @@ import functools import json -from multiprocessing import Process -from multiprocessing import Queue +from multiprocess import Process +from multiprocess import Queue import traceback from mock import Mock diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/tests/test_build.py new/python-jenkins-1.8.2/tests/test_build.py --- old/python-jenkins-1.8.0/tests/test_build.py 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/tests/test_build.py 2023-11-09 11:19:17.000000000 +0100 @@ -1,7 +1,7 @@ import json import collections -from mock import patch +from mock import patch, Mock import jenkins from tests.base import JenkinsTestBase @@ -810,6 +810,114 @@ self.assertEqual( str(context_manager.exception), 'Error in request. Possibly authentication failed [401]: Not Authorised') + + +class JenkinsBuildArtifactAsBytesUrlTest(JenkinsTestBase): + + def streamMock(self, encoding=None, text=None, binary=None): + streamMock = Mock() + streamMock.__exit__ = Mock() + streamMock.__enter__ = Mock() + if encoding is None and text is None and binary is None: + streamMock.__enter__.return_value = None + return streamMock + streamMock.__enter__.return_value = Mock() + streamMock.__enter__.return_value.encoding = encoding + streamMock.__enter__.return_value.text = text + streamMock.__enter__.return_value.raw = Mock() + streamMock.__enter__.return_value.raw.read = Mock() + streamMock.__enter__.return_value.raw.read.return_value = binary + return streamMock + + @patch.object(jenkins.Jenkins, 'jenkins_open_stream') + def test_simple_ascii_artifact(self, jenkins_mock): + jenkins_mock.return_value = self.streamMock('utf-8', 'ascii') + ret = self.j.get_build_artifact_as_bytes(u'Test Job', number='52', artifact="filename") + self.assertEqual(ret, b'ascii') + self.assertEqual( + jenkins_mock.call_args[0][0].url, + self.make_url('job/Test%20Job/52/artifact/filename')) + self._check_requests(jenkins_mock.call_args_list) + + @patch.object(jenkins.Jenkins, 'jenkins_open_stream') + def test_simple_binary_artifact(self, jenkins_mock): + jenkins_mock.return_value = self.streamMock(binary=b'\0\1\2') + ret = self.j.get_build_artifact_as_bytes(u'Test Job', number='52', artifact="filename") + self.assertEqual(ret, b'\0\1\2') + self.assertEqual( + jenkins_mock.call_args[0][0].url, + self.make_url('job/Test%20Job/52/artifact/filename')) + self._check_requests(jenkins_mock.call_args_list) + + @patch.object(jenkins.Jenkins, 'jenkins_open_stream') + def test_in_folder(self, jenkins_mock): + jenkins_mock.return_value = self.streamMock('utf-8', 'ascii') + ret = self.j.get_build_artifact_as_bytes(u'a Folder/Test Job', number='52', artifact="file name") + self.assertEqual(ret, b'ascii') + self.assertEqual( + jenkins_mock.call_args[0][0].url, + self.make_url('job/a%20Folder/job/Test%20Job/52/artifact/file%20name')) + self._check_requests(jenkins_mock.call_args_list) + + @patch.object(jenkins.Jenkins, 'jenkins_open_stream') + def test_matrix(self, jenkins_mock): + jenkins_mock.return_value = self.streamMock('utf-8', 'ascii') + ret = self.j.get_build_artifact_as_bytes(u'a Folder/Test Job', number='52/index=matrix', + artifact="file name") + self.assertEqual(ret, b'ascii') + self.assertEqual( + jenkins_mock.call_args[0][0].url, + self.make_url('job/a%20Folder/job/Test%20Job/52/index=matrix/artifact/file%20name')) + self._check_requests(jenkins_mock.call_args_list) + + @patch('jenkins.requests.Session.send', autospec=True) + def test_404_item_not_found(self, session_send_mock): + session_send_mock.side_effect = iter([ + build_response_mock(404, reason="Not Found"), # crumb + build_response_mock(404, reason="Not Found"), # request + ]) + with self.assertRaises(jenkins.JenkinsException) as context_manager: + self.j.get_build_artifact_as_bytes(u'TestJob', number='52', artifact="filename") + self.assertEqual( + str(context_manager.exception), + 'Requested item could not be found') + + @patch.object(jenkins.Jenkins, 'jenkins_open_stream') + def test_open_return_none(self, jenkins_mock): + jenkins_mock.return_value = self.streamMock() + + with self.assertRaises(jenkins.JenkinsException) as context_manager: + self.j.get_build_artifact_as_bytes(u'TestJob', number='52', artifact="filename") + self.assertEqual( + str(context_manager.exception), + 'job[TestJob] number[52] does not exist') + self._check_requests(jenkins_mock.call_args_list) + + @patch('jenkins.requests.Session.send', autospec=True) + def test_raise_HTTPError(self, session_send_mock): + session_send_mock.side_effect = iter([ + build_response_mock(401, reason="Not Authorised"), # crumb + build_response_mock(401, reason="Not Authorised"), # request + ]) + + with self.assertRaises(jenkins.JenkinsException) as context_manager: + self.j.get_build_artifact_as_bytes(u'TestJob', number='52', artifact="filename") + self.assertEqual( + str(context_manager.exception), + 'Error in request. Possibly authentication failed [401]: Not Authorised') + + @patch('jenkins.requests.Session.send', autospec=True) + def test_in_folder_raise_HTTPError(self, session_send_mock): + session_send_mock.side_effect = iter([ + build_response_mock(401, reason="Not Authorised"), # crumb + build_response_mock(401, reason="Not Authorised"), # request + ]) + + with self.assertRaises(jenkins.JenkinsException) as context_manager: + self.j.get_build_artifact_as_bytes(u'a Folder/TestJob', number='52', artifact="filename") + self.assertEqual( + str(context_manager.exception), + 'Error in request. Possibly authentication failed [401]: Not Authorised') class JenkinsBuildStagesUrlTest(JenkinsTestBase): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/tests/test_jenkins.py new/python-jenkins-1.8.2/tests/test_jenkins.py --- old/python-jenkins-1.8.0/tests/test_jenkins.py 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/tests/test_jenkins.py 2023-11-09 11:19:17.000000000 +0100 @@ -1,5 +1,4 @@ import json -import socket from mock import patch import six @@ -68,7 +67,7 @@ def test_default_timeout(self): j = jenkins.Jenkins('{0}'.format(self.base_url)) - self.assertEqual(j.timeout, socket._GLOBAL_DEFAULT_TIMEOUT) + self.assertEqual(j.timeout, jenkins.DEFAULT_TIMEOUT) def test_custom_timeout(self): j = jenkins.Jenkins('{0}'.format(self.base_url), timeout=300) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-jenkins-1.8.0/tox.ini new/python-jenkins-1.8.2/tox.ini --- old/python-jenkins-1.8.0/tox.ini 2023-03-24 15:50:48.000000000 +0100 +++ new/python-jenkins-1.8.2/tox.ini 2023-11-09 11:19:17.000000000 +0100 @@ -1,7 +1,7 @@ [tox] minversion = 2.0 skipsdist = True -envlist = py{34,27,35,36}, linters +envlist = py{34,27,35,36,37,38,39,310,311}, linters [testenv] setenv = ++++++ python-python-jenkins-no-mock.patch ++++++ --- /var/tmp/diff_new_pack.H9LJtY/_old 2025-07-28 14:58:36.491423063 +0200 +++ /var/tmp/diff_new_pack.H9LJtY/_new 2025-07-28 14:58:36.495423230 +0200 @@ -1,92 +1,62 @@ +From c37936698341e1bbbec2b9b62dfc64ddc51f3dfd Mon Sep 17 00:00:00 2001 +From: Steve Kowalik <ste...@wedontsleep.org> +Date: Wed, 25 Jun 2025 16:02:31 +1000 +Subject: [PATCH] Stop using external mock module + +Now that support for Python 2 has been dropped, we can switch to the +built-in unittest.mock module and drop one more external test +dependency. + +Change-Id: Ie6e3b2c4047d00509053769fd5b49a1e4464e951 --- - test-requirements.txt | 2 -- - tests/base.py | 7 ++----- - tests/helper.py | 2 +- - tests/jobs/test_assert.py | 2 +- - tests/jobs/test_build.py | 2 +- - tests/jobs/test_config.py | 2 +- - tests/jobs/test_copy.py | 2 +- - tests/jobs/test_count.py | 2 +- - tests/jobs/test_create.py | 2 +- - tests/jobs/test_debug.py | 2 +- - tests/jobs/test_delete.py | 2 +- - tests/jobs/test_disable.py | 2 +- - tests/jobs/test_enable.py | 2 +- - tests/jobs/test_get.py | 2 +- - tests/jobs/test_getall.py | 2 +- - tests/jobs/test_info.py | 2 +- - tests/jobs/test_name.py | 2 +- - tests/jobs/test_reconfig.py | 2 +- - tests/jobs/test_rename.py | 2 +- - tests/jobs/test_set_next_build_number.py | 2 +- - tests/test_build.py | 2 +- - tests/test_check_jenkinsfile_syntax.py | 2 +- - tests/test_credential.py | 2 +- - tests/test_info.py | 2 +- - tests/test_jenkins.py | 2 +- - tests/test_job_folder.py | 2 +- - tests/test_node.py | 2 +- - tests/test_plugins.py | 2 +- - tests/test_promotion.py | 2 +- - tests/test_queue.py | 2 +- - tests/test_quiet_down.py | 2 +- - tests/test_script.py | 2 +- - tests/test_version.py | 2 +- - tests/test_view.py | 2 +- - tests/test_whoami.py | 2 +- - 35 files changed, 35 insertions(+), 40 deletions(-) + test-requirements.txt | 1 - + tests/jobs/test_assert.py | 2 +- + tests/jobs/test_config.py | 2 +- + tests/jobs/test_copy.py | 2 +- + tests/jobs/test_count.py | 2 +- + tests/jobs/test_create.py | 2 +- + tests/jobs/test_debug.py | 2 +- + tests/jobs/test_delete.py | 2 +- + tests/jobs/test_disable.py | 2 +- + tests/jobs/test_enable.py | 2 +- + tests/jobs/test_get.py | 2 +- + tests/jobs/test_getall.py | 2 +- + tests/jobs/test_info.py | 2 +- + tests/jobs/test_name.py | 2 +- + tests/jobs/test_reconfig.py | 2 +- + tests/jobs/test_rename.py | 2 +- + tests/jobs/test_set_next_build_number.py | 2 +- + tests/test_build.py | 2 +- + tests/test_check_jenkinsfile_syntax.py | 2 +- + tests/test_credential.py | 2 +- + tests/test_info.py | 2 +- + tests/test_job_folder.py | 2 +- + tests/test_node.py | 2 +- + tests/test_plugins.py | 2 +- + tests/test_queue.py | 2 +- + tests/test_quiet_down.py | 2 +- + tests/test_script.py | 2 +- + tests/test_version.py | 2 +- + tests/test_view.py | 2 +- + tests/test_whoami.py | 2 +- + 30 files changed, 29 insertions(+), 30 deletions(-) -Index: python-jenkins-1.8.0/test-requirements.txt +Index: python-jenkins-1.8.2/test-requirements.txt =================================================================== ---- python-jenkins-1.8.0.orig/test-requirements.txt -+++ python-jenkins-1.8.0/test-requirements.txt -@@ -1,8 +1,6 @@ +--- python-jenkins-1.8.2.orig/test-requirements.txt ++++ python-jenkins-1.8.2/test-requirements.txt +@@ -1,7 +1,6 @@ cmd2!=0.8.3,<0.9.0;python_version<'3.0' # MIT cmd2!=0.8.3;python_version>='3.0' # MIT coverage>=3.6 -mock --unittest2 + unittest2 python-subunit - requests-mock>=1.4.0 - requests-kerberos<=0.12.0;python_version<'3.6' -Index: python-jenkins-1.8.0/tests/base.py -=================================================================== ---- python-jenkins-1.8.0.orig/tests/base.py -+++ python-jenkins-1.8.0/tests/base.py -@@ -1,14 +1,11 @@ - import sys - --import mock -+from unittest import mock -+import unittest - from testscenarios import TestWithScenarios - - import jenkins - --if sys.version_info < (2, 7): -- import unittest2 as unittest --else: -- import unittest - - - class JenkinsTestBase(TestWithScenarios, unittest.TestCase): -Index: python-jenkins-1.8.0/tests/helper.py + requests-mock>=1.11.0 +Index: python-jenkins-1.8.2/tests/jobs/test_assert.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/helper.py -+++ python-jenkins-1.8.0/tests/helper.py -@@ -4,7 +4,7 @@ from multiprocessing import Process - from multiprocessing import Queue - import traceback - --from mock import Mock -+from unittest.mock import Mock - import requests - from six.moves import socketserver - -Index: python-jenkins-1.8.0/tests/jobs/test_assert.py -=================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_assert.py -+++ python-jenkins-1.8.0/tests/jobs/test_assert.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_assert.py ++++ python-jenkins-1.8.2/tests/jobs/test_assert.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -94,31 +64,20 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_build.py -=================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_build.py -+++ python-jenkins-1.8.0/tests/jobs/test_build.py -@@ -1,5 +1,5 @@ - # -*- coding: utf-8 -*- --from mock import patch -+from unittest.mock import patch - - import jenkins - from six.moves.urllib.parse import quote -Index: python-jenkins-1.8.0/tests/jobs/test_config.py +Index: python-jenkins-1.8.2/tests/jobs/test_config.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_config.py -+++ python-jenkins-1.8.0/tests/jobs/test_config.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_config.py ++++ python-jenkins-1.8.2/tests/jobs/test_config.py @@ -1,4 +1,4 @@ -from mock import patch +from unittest.mock import patch import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_copy.py +Index: python-jenkins-1.8.2/tests/jobs/test_copy.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_copy.py -+++ python-jenkins-1.8.0/tests/jobs/test_copy.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_copy.py ++++ python-jenkins-1.8.2/tests/jobs/test_copy.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -126,10 +85,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_count.py +Index: python-jenkins-1.8.2/tests/jobs/test_count.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_count.py -+++ python-jenkins-1.8.0/tests/jobs/test_count.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_count.py ++++ python-jenkins-1.8.2/tests/jobs/test_count.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -137,10 +96,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_create.py +Index: python-jenkins-1.8.2/tests/jobs/test_create.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_create.py -+++ python-jenkins-1.8.0/tests/jobs/test_create.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_create.py ++++ python-jenkins-1.8.2/tests/jobs/test_create.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -148,10 +107,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_debug.py +Index: python-jenkins-1.8.2/tests/jobs/test_debug.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_debug.py -+++ python-jenkins-1.8.0/tests/jobs/test_debug.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_debug.py ++++ python-jenkins-1.8.2/tests/jobs/test_debug.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -159,10 +118,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_delete.py +Index: python-jenkins-1.8.2/tests/jobs/test_delete.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_delete.py -+++ python-jenkins-1.8.0/tests/jobs/test_delete.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_delete.py ++++ python-jenkins-1.8.2/tests/jobs/test_delete.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -170,10 +129,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_disable.py +Index: python-jenkins-1.8.2/tests/jobs/test_disable.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_disable.py -+++ python-jenkins-1.8.0/tests/jobs/test_disable.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_disable.py ++++ python-jenkins-1.8.2/tests/jobs/test_disable.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -181,10 +140,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_enable.py +Index: python-jenkins-1.8.2/tests/jobs/test_enable.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_enable.py -+++ python-jenkins-1.8.0/tests/jobs/test_enable.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_enable.py ++++ python-jenkins-1.8.2/tests/jobs/test_enable.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -192,10 +151,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_get.py +Index: python-jenkins-1.8.2/tests/jobs/test_get.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_get.py -+++ python-jenkins-1.8.0/tests/jobs/test_get.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_get.py ++++ python-jenkins-1.8.2/tests/jobs/test_get.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -203,10 +162,10 @@ import jenkins from tests.helper import build_response_mock -Index: python-jenkins-1.8.0/tests/jobs/test_getall.py +Index: python-jenkins-1.8.2/tests/jobs/test_getall.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_getall.py -+++ python-jenkins-1.8.0/tests/jobs/test_getall.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_getall.py ++++ python-jenkins-1.8.2/tests/jobs/test_getall.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -214,10 +173,10 @@ import jenkins from tests.jobs.base import JenkinsGetJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_info.py +Index: python-jenkins-1.8.2/tests/jobs/test_info.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_info.py -+++ python-jenkins-1.8.0/tests/jobs/test_info.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_info.py ++++ python-jenkins-1.8.2/tests/jobs/test_info.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -225,10 +184,10 @@ import jenkins from tests.helper import build_response_mock -Index: python-jenkins-1.8.0/tests/jobs/test_name.py +Index: python-jenkins-1.8.2/tests/jobs/test_name.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_name.py -+++ python-jenkins-1.8.0/tests/jobs/test_name.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_name.py ++++ python-jenkins-1.8.2/tests/jobs/test_name.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -236,10 +195,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_reconfig.py +Index: python-jenkins-1.8.2/tests/jobs/test_reconfig.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_reconfig.py -+++ python-jenkins-1.8.0/tests/jobs/test_reconfig.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_reconfig.py ++++ python-jenkins-1.8.2/tests/jobs/test_reconfig.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -247,10 +206,10 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_rename.py +Index: python-jenkins-1.8.2/tests/jobs/test_rename.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_rename.py -+++ python-jenkins-1.8.0/tests/jobs/test_rename.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_rename.py ++++ python-jenkins-1.8.2/tests/jobs/test_rename.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -258,43 +217,43 @@ import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/jobs/test_set_next_build_number.py +Index: python-jenkins-1.8.2/tests/jobs/test_set_next_build_number.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/jobs/test_set_next_build_number.py -+++ python-jenkins-1.8.0/tests/jobs/test_set_next_build_number.py +--- python-jenkins-1.8.2.orig/tests/jobs/test_set_next_build_number.py ++++ python-jenkins-1.8.2/tests/jobs/test_set_next_build_number.py @@ -1,4 +1,4 @@ -from mock import patch +from unittest.mock import patch import jenkins from tests.jobs.base import JenkinsJobsTestBase -Index: python-jenkins-1.8.0/tests/test_build.py +Index: python-jenkins-1.8.2/tests/test_build.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_build.py -+++ python-jenkins-1.8.0/tests/test_build.py +--- python-jenkins-1.8.2.orig/tests/test_build.py ++++ python-jenkins-1.8.2/tests/test_build.py @@ -1,7 +1,7 @@ import json import collections --from mock import patch -+from unittest.mock import patch +-from mock import patch, Mock ++from unittest.mock import patch, Mock import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_check_jenkinsfile_syntax.py +Index: python-jenkins-1.8.2/tests/test_check_jenkinsfile_syntax.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_check_jenkinsfile_syntax.py -+++ python-jenkins-1.8.0/tests/test_check_jenkinsfile_syntax.py +--- python-jenkins-1.8.2.orig/tests/test_check_jenkinsfile_syntax.py ++++ python-jenkins-1.8.2/tests/test_check_jenkinsfile_syntax.py @@ -1,4 +1,4 @@ -from mock import patch +from unittest.mock import patch from tests.base import JenkinsTestBase from tests.helper import build_response_mock -Index: python-jenkins-1.8.0/tests/test_credential.py +Index: python-jenkins-1.8.2/tests/test_credential.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_credential.py -+++ python-jenkins-1.8.0/tests/test_credential.py +--- python-jenkins-1.8.2.orig/tests/test_credential.py ++++ python-jenkins-1.8.2/tests/test_credential.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -302,10 +261,10 @@ import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_info.py +Index: python-jenkins-1.8.2/tests/test_info.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_info.py -+++ python-jenkins-1.8.0/tests/test_info.py +--- python-jenkins-1.8.2.orig/tests/test_info.py ++++ python-jenkins-1.8.2/tests/test_info.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -313,33 +272,20 @@ import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_jenkins.py -=================================================================== ---- python-jenkins-1.8.0.orig/tests/test_jenkins.py -+++ python-jenkins-1.8.0/tests/test_jenkins.py -@@ -1,7 +1,7 @@ - import json - import socket - --from mock import patch -+from unittest.mock import patch - import six - - from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_job_folder.py +Index: python-jenkins-1.8.2/tests/test_job_folder.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_job_folder.py -+++ python-jenkins-1.8.0/tests/test_job_folder.py +--- python-jenkins-1.8.2.orig/tests/test_job_folder.py ++++ python-jenkins-1.8.2/tests/test_job_folder.py @@ -1,4 +1,4 @@ -from mock import patch +from unittest.mock import patch import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_node.py +Index: python-jenkins-1.8.2/tests/test_node.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_node.py -+++ python-jenkins-1.8.0/tests/test_node.py +--- python-jenkins-1.8.2.orig/tests/test_node.py ++++ python-jenkins-1.8.2/tests/test_node.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -347,10 +293,10 @@ import jenkins import requests_mock -Index: python-jenkins-1.8.0/tests/test_plugins.py +Index: python-jenkins-1.8.2/tests/test_plugins.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_plugins.py -+++ python-jenkins-1.8.0/tests/test_plugins.py +--- python-jenkins-1.8.2.orig/tests/test_plugins.py ++++ python-jenkins-1.8.2/tests/test_plugins.py @@ -32,7 +32,7 @@ @@ -360,21 +306,10 @@ from testscenarios.scenarios import multiply_scenarios import jenkins -Index: python-jenkins-1.8.0/tests/test_promotion.py -=================================================================== ---- python-jenkins-1.8.0.orig/tests/test_promotion.py -+++ python-jenkins-1.8.0/tests/test_promotion.py -@@ -1,5 +1,5 @@ - import json --from mock import patch -+from unittest.mock import patch - - import jenkins - from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_queue.py +Index: python-jenkins-1.8.2/tests/test_queue.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_queue.py -+++ python-jenkins-1.8.0/tests/test_queue.py +--- python-jenkins-1.8.2.orig/tests/test_queue.py ++++ python-jenkins-1.8.2/tests/test_queue.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -382,10 +317,10 @@ import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_quiet_down.py +Index: python-jenkins-1.8.2/tests/test_quiet_down.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_quiet_down.py -+++ python-jenkins-1.8.0/tests/test_quiet_down.py +--- python-jenkins-1.8.2.orig/tests/test_quiet_down.py ++++ python-jenkins-1.8.2/tests/test_quiet_down.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -393,30 +328,30 @@ import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_script.py +Index: python-jenkins-1.8.2/tests/test_script.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_script.py -+++ python-jenkins-1.8.0/tests/test_script.py +--- python-jenkins-1.8.2.orig/tests/test_script.py ++++ python-jenkins-1.8.2/tests/test_script.py @@ -1,4 +1,4 @@ -from mock import patch +from unittest.mock import patch import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_version.py +Index: python-jenkins-1.8.2/tests/test_version.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_version.py -+++ python-jenkins-1.8.0/tests/test_version.py +--- python-jenkins-1.8.2.orig/tests/test_version.py ++++ python-jenkins-1.8.2/tests/test_version.py @@ -1,4 +1,4 @@ -from mock import patch +from unittest.mock import patch import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_view.py +Index: python-jenkins-1.8.2/tests/test_view.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_view.py -+++ python-jenkins-1.8.0/tests/test_view.py +--- python-jenkins-1.8.2.orig/tests/test_view.py ++++ python-jenkins-1.8.2/tests/test_view.py @@ -1,5 +1,5 @@ import json -from mock import patch @@ -424,10 +359,10 @@ import jenkins from tests.base import JenkinsTestBase -Index: python-jenkins-1.8.0/tests/test_whoami.py +Index: python-jenkins-1.8.2/tests/test_whoami.py =================================================================== ---- python-jenkins-1.8.0.orig/tests/test_whoami.py -+++ python-jenkins-1.8.0/tests/test_whoami.py +--- python-jenkins-1.8.2.orig/tests/test_whoami.py ++++ python-jenkins-1.8.2/tests/test_whoami.py @@ -1,5 +1,5 @@ import json -from mock import patch ++++++ remove-six.patch ++++++ >From 63b657fe23c3b33903061a17b88787886be3c6dd Mon Sep 17 00:00:00 2001 From: Alexandre Detiste <alexandre.deti...@gmail.com> Date: Sat, 11 Jan 2025 14:55:46 +0100 Subject: [PATCH] remove Python2 & six Change-Id: I4b64b01d607446a7aa8cbe2070b97717ed6267b5 --- jenkins/__init__.py | 6 +++--- requirements.txt | 1 - setup.cfg | 8 +++++--- test-requirements.txt | 1 - tests/base.py | 9 ++------- tests/helper.py | 4 ++-- tests/jobs/test_build.py | 4 ++-- tests/test_jenkins.py | 11 +++++------ tests/test_jenkins_sockets.py | 3 ++- tests/test_promotion.py | 5 ++--- 10 files changed, 23 insertions(+), 29 deletions(-) Index: python-jenkins-1.8.2/jenkins/__init__.py =================================================================== --- python-jenkins-1.8.2.orig/jenkins/__init__.py +++ python-jenkins-1.8.2/jenkins/__init__.py @@ -59,9 +59,9 @@ import requests import requests.exceptions as req_exc import urllib3.util.timeout from requests.packages.urllib3.exceptions import InsecureRequestWarning -from six.moves.http_client import BadStatusLine -from six.moves.urllib.error import URLError -from six.moves.urllib.parse import quote, urlencode, urljoin, urlparse +from http.client import BadStatusLine +from urllib.error import URLError +from urllib.parse import quote, urlencode, urljoin, urlparse import xml.etree.ElementTree as ET from jenkins import plugins Index: python-jenkins-1.8.2/requirements.txt =================================================================== --- python-jenkins-1.8.2.orig/requirements.txt +++ python-jenkins-1.8.2/requirements.txt @@ -1,4 +1,3 @@ -six>=1.3.0 pbr>=0.8.2 multi_key_dict requests Index: python-jenkins-1.8.2/setup.cfg =================================================================== --- python-jenkins-1.8.2.orig/setup.cfg +++ python-jenkins-1.8.2/setup.cfg @@ -19,12 +19,14 @@ classifier = License :: OSI Approved :: BSD License Operating System :: OS Independent Programming Language :: Python - Programming Language :: Python :: 2 - Programming Language :: Python :: 2.7 Programming Language :: Python :: 3 - Programming Language :: Python :: 3.4 Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 [files] packages = Index: python-jenkins-1.8.2/test-requirements.txt =================================================================== --- python-jenkins-1.8.2.orig/test-requirements.txt +++ python-jenkins-1.8.2/test-requirements.txt @@ -1,7 +1,6 @@ cmd2!=0.8.3,<0.9.0;python_version<'3.0' # MIT cmd2!=0.8.3;python_version>='3.0' # MIT coverage>=3.6 -unittest2 python-subunit requests-mock>=1.11.0 requests-kerberos<=0.12.0;python_version<'3.6' Index: python-jenkins-1.8.2/tests/base.py =================================================================== --- python-jenkins-1.8.2.orig/tests/base.py +++ python-jenkins-1.8.2/tests/base.py @@ -1,15 +1,10 @@ -import sys +import unittest +from unittest import mock -import mock from testscenarios import TestWithScenarios import jenkins -if sys.version_info < (2, 7): - import unittest2 as unittest -else: - import unittest - class JenkinsTestBase(TestWithScenarios, unittest.TestCase): Index: python-jenkins-1.8.2/tests/helper.py =================================================================== --- python-jenkins-1.8.2.orig/tests/helper.py +++ python-jenkins-1.8.2/tests/helper.py @@ -2,11 +2,11 @@ import functools import json from multiprocess import Process from multiprocess import Queue +import socketserver import traceback +from unittest.mock import Mock -from mock import Mock import requests -from six.moves import socketserver class TestsTimeoutException(Exception): Index: python-jenkins-1.8.2/tests/jobs/test_build.py =================================================================== --- python-jenkins-1.8.2.orig/tests/jobs/test_build.py +++ python-jenkins-1.8.2/tests/jobs/test_build.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- -from mock import patch +from unittest.mock import patch +from urllib.parse import quote import jenkins -from six.moves.urllib.parse import quote from tests.helper import build_response_mock from tests.jobs.base import JenkinsJobsTestBase Index: python-jenkins-1.8.2/tests/test_jenkins.py =================================================================== --- python-jenkins-1.8.2.orig/tests/test_jenkins.py +++ python-jenkins-1.8.2/tests/test_jenkins.py @@ -1,7 +1,6 @@ import json - -from mock import patch -import six +import io +from unittest.mock import patch from tests.base import JenkinsTestBase from tests.helper import build_response_mock @@ -12,7 +11,7 @@ import jenkins def get_mock_urlopen_return_value(a_dict=None): if a_dict is None: a_dict = {} - return six.BytesIO(json.dumps(a_dict).encode('utf-8')) + return io.BytesIO(json.dumps(a_dict).encode('utf-8')) class JenkinsConstructorTest(JenkinsTestBase): @@ -45,8 +44,8 @@ class JenkinsConstructorTest(JenkinsTest def test_unicode_password(self): j = jenkins.Jenkins('{0}'.format(self.base_url), - six.u('nonascii'), - six.u('\xe9\u20ac')) + 'nonascii', + '\xe9\u20ac') j._maybe_add_auth() self.assertEqual(j.server, self.make_url('')) self.assertEqual(j.auth(self.req).headers['Authorization'], Index: python-jenkins-1.8.2/tests/test_jenkins_sockets.py =================================================================== --- python-jenkins-1.8.2.orig/tests/test_jenkins_sockets.py +++ python-jenkins-1.8.2/tests/test_jenkins_sockets.py @@ -1,4 +1,5 @@ -from six.moves import StringIO +from io import StringIO + import testtools from testtools.content import text_content Index: python-jenkins-1.8.2/tests/test_promotion.py =================================================================== --- python-jenkins-1.8.2.orig/tests/test_promotion.py +++ python-jenkins-1.8.2/tests/test_promotion.py @@ -1,11 +1,10 @@ import json -from mock import patch +from unittest.mock import patch +from urllib.error import HTTPError import jenkins from tests.base import JenkinsTestBase -from six.moves.urllib.error import HTTPError - class JenkinsPromotionsTestBase(JenkinsTestBase): config_xml = """<hudson.plugins.promoted__builds.PromotionProcess>