Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-copr for openSUSE:Factory checked in at 2026-01-13 21:26:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-copr (Old) and /work/SRC/openSUSE:Factory/.python-copr.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-copr" Tue Jan 13 21:26:22 2026 rev:11 rq:1326750 version:2.5 Changes: -------- --- /work/SRC/openSUSE:Factory/python-copr/python-copr.changes 2025-04-07 18:56:03.796282328 +0200 +++ /work/SRC/openSUSE:Factory/.python-copr.new.1928/python-copr.changes 2026-01-13 21:26:25.839800157 +0100 @@ -1,0 +2,10 @@ +Fri Jan 9 22:25:53 UTC 2026 - Marius Grossu <[email protected]> + +- Update to 2.5: + * The wait() helper has become an official part of the python-copr API + * Copr now allows storing wildcard strings in the "Packit allowed forge projects" field + * The Fedora Copr Frontend is now protected by Anubis to defend against unreasonable bot load +- complete changelog: + * https://github.com/fedora-copr/copr/compare/python-copr-2.1-1...python-copr-2.5-1 + +------------------------------------------------------------------- Old: ---- copr-2.1.tar.gz New: ---- copr-2.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-copr.spec ++++++ --- /var/tmp/diff_new_pack.EEAM8M/_old 2026-01-13 21:26:26.483826738 +0100 +++ /var/tmp/diff_new_pack.EEAM8M/_new 2026-01-13 21:26:26.483826738 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-copr # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?sle15_python_module_pythons} Name: python-copr -Version: 2.1 +Version: 2.5 Release: 0 Summary: Python client for copr service License: GPL-2.0-or-later ++++++ copr-2.1.tar.gz -> copr-2.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/PKG-INFO new/copr-2.5/PKG-INFO --- old/copr-2.1/PKG-INFO 2025-03-26 18:16:22.536998000 +0100 +++ new/copr-2.5/PKG-INFO 2025-12-15 12:50:53.327138200 +0100 @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: copr -Version: 2.1 +Version: 2.5 Summary: Python client for copr service. Home-page: https://github.com/fedora-copr/copr Author: Valentin Gologuzov @@ -19,6 +19,15 @@ Requires-Dist: requests-toolbelt Requires-Dist: setuptools Requires-Dist: munch +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: requires-dist +Dynamic: summary Copr is designed to be a lightweight buildsystem that allows contributors to create packages, put them in repositories, and make it easy for users diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/test/client_v3/test_modules.py new/copr-2.5/copr/test/client_v3/test_modules.py --- old/copr-2.1/copr/test/client_v3/test_modules.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/test/client_v3/test_modules.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,69 +0,0 @@ -import os -import pytest -import tempfile -import shutil -from json import loads -from copr.test import mock -from copr.test.client_v3.test_auth import FakeCache -from copr.v3 import ModuleProxy - - -class TestModuleProxy(object): - config_auth = { - "copr_url": "http://copr", - "login": "test_api_login", - "token": "test_api_token", - } - - def setup_method(self, method): - self.tmpdir = tempfile.mkdtemp(prefix='test-python-copr-modules') - self.yaml_file = os.path.join(self.tmpdir, 'test.yaml') - with open(self.yaml_file, 'w') as f: - f.write("") - - def teardown_method(self, method): - shutil.rmtree(self.tmpdir) - - @pytest.mark.parametrize('distgit_opt', [None, 'fedora']) - @mock.patch('copr.v3.requests.requests.Session.request') - def test_module_dist_git_choice_url(self, request, distgit_opt): - proxy = ModuleProxy(self.config_auth) - proxy.auth.cache = FakeCache(None) - proxy.build_from_url('owner', 'project', 'http://test.yaml', - distgit=distgit_opt) - - assert len(request.call_args_list) == 1 - call = request.call_args_list[0] - kwargs = call[1] - json = kwargs['json'] - if distgit_opt is None: - assert 'distgit' not in json - else: - assert json['distgit'] == distgit_opt - - assert json['scmurl'] == 'http://test.yaml' - - @pytest.mark.parametrize('distgit_opt', [None, 'fedora']) - @mock.patch('copr.v3.requests.requests.Session.request') - def test_module_dist_git_choice_upload(self, request, distgit_opt): - proxy = ModuleProxy(self.config_auth) - proxy.auth.cache = FakeCache(None) - proxy.build_from_file('owner', 'project', - self.yaml_file, - distgit=distgit_opt) - - assert len(request.call_args_list) == 1 - call = request.call_args_list[0] - kwargs = call[1] - json = kwargs['json'] - - assert json is None - - # ('json', 'jsonstr', 'application/json') - json_encoded = kwargs['data'].encoder.fields['json'] - json = loads(json_encoded[1]) - - if distgit_opt is None: - assert json is None - else: - assert json['distgit'] == distgit_opt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/__init__.py new/copr-2.5/copr/v3/__init__.py --- old/copr-2.1/copr/v3/__init__.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/__init__.py 2025-12-09 15:09:38.000000000 +0100 @@ -1,6 +1,6 @@ from __future__ import absolute_import -from .helpers import config_from_file +from .helpers import config_from_file, wait from .client import Client from .proxies import BaseProxy from .proxies.project import ProjectProxy @@ -9,7 +9,6 @@ from .proxies.mock_chroot import MockChrootProxy from .proxies.project_chroot import ProjectChrootProxy from .proxies.build_chroot import BuildChrootProxy -from .proxies.module import ModuleProxy from .exceptions import (CoprException, CoprRequestException, CoprNoResultException, @@ -21,6 +20,7 @@ __all__ = [ "config_from_file", + "wait", "Client", "BaseProxy", @@ -29,7 +29,6 @@ "MockChrootProxy", "ProjectChrootProxy", "BuildChrootProxy", - "ModuleProxy", "CoprException", "CoprRequestException", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/client.py new/copr-2.5/copr/v3/client.py --- old/copr-2.1/copr/v3/client.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/client.py 2025-12-09 15:09:38.000000000 +0100 @@ -3,7 +3,6 @@ from .proxies.project import ProjectProxy from .proxies.build import BuildProxy from .proxies.package import PackageProxy -from .proxies.module import ModuleProxy from .proxies.mock_chroot import MockChrootProxy from .proxies.monitor import MonitorProxy from .proxies.project_chroot import ProjectChrootProxy @@ -18,7 +17,6 @@ self.project_proxy = ProjectProxy(config) self.build_proxy = BuildProxy(config) self.package_proxy = PackageProxy(config) - self.module_proxy = ModuleProxy(config) self.mock_chroot_proxy = MockChrootProxy(config) self.monitor_proxy = MonitorProxy(config) self.project_chroot_proxy = ProjectChrootProxy(config) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/proxies/__init__.py new/copr-2.5/copr/v3/proxies/__init__.py --- old/copr-2.1/copr/v3/proxies/__init__.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/proxies/__init__.py 2025-12-09 15:09:38.000000000 +0100 @@ -1,7 +1,7 @@ import os from copr.v3.auth import auth_from_config -from copr.v3.requests import munchify, Request +from copr.v3.requests import munchify, Request, POST from ..helpers import for_all_methods, bind_proxy, config_from_file @@ -62,3 +62,17 @@ if not self.auth.username: self.auth.make() return self.auth.username + + def new_api_token(self): + """ + Generate a new API token + + :return: Munch + """ + endpoint = "/api-token" + response = self.request.send( + endpoint=endpoint, + method=POST, + auth=self.auth, + ) + return munchify(response) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/proxies/build.py new/copr-2.5/copr/v3/proxies/build.py --- old/copr-2.1/copr/v3/proxies/build.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/proxies/build.py 2025-12-09 15:09:38.000000000 +0100 @@ -2,7 +2,7 @@ import os from . import BaseProxy -from ..requests import FileRequest, munchify, POST +from ..requests import FileRequest, munchify, DELETE, POST, PUT from ..exceptions import CoprValidationException from ..helpers import for_all_methods, bind_proxy @@ -85,7 +85,7 @@ """ endpoint = "/build/cancel/{0}".format(build_id) response = self.request.send( - endpoint=endpoint, method=POST, auth=self.auth) + endpoint=endpoint, method=PUT, auth=self.auth) return munchify(response) def create_from_urls(self, ownername, projectname, urls, buildopts=None, project_dirname=None): @@ -356,7 +356,7 @@ """ endpoint = "/build/delete/{0}".format(build_id) response = self.request.send( - endpoint=endpoint, method=POST, auth=self.auth) + endpoint=endpoint, method=DELETE, auth=self.auth) return munchify(response) def delete_list(self, build_ids): @@ -370,5 +370,5 @@ endpoint = "/build/delete/list" data = {"builds": build_ids} response = self.request.send( - endpoint=endpoint, data=data, method=POST, auth=self.auth) + endpoint=endpoint, data=data, method=DELETE, auth=self.auth) return munchify(response) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/proxies/module.py new/copr-2.5/copr/v3/proxies/module.py --- old/copr-2.1/copr/v3/proxies/module.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/proxies/module.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,76 +0,0 @@ -from __future__ import absolute_import - -import os -from . import BaseProxy -from ..requests import FileRequest, munchify, POST -from ..helpers import for_all_methods, bind_proxy - - -@for_all_methods(bind_proxy) -class ModuleProxy(BaseProxy): - - def build_from_url(self, ownername, projectname, url, branch="master", - distgit=None): - """ - Build a module from a URL pointing to a modulemd YAML file - - :param str ownername: - :param str projectname: - :param str url: URL pointing to a raw .yaml file - :param str branch: - :return: Munch - """ - endpoint = "/module/build/{ownername}/{projectname}" - params = { - "ownername": ownername, - "projectname": projectname, - } - data = { - "scmurl": url, - "branch": branch, - } - if distgit is not None: - data["distgit"] = distgit - response = self.request.send( - endpoint=endpoint, - method=POST, - params=params, - data=data, - auth=self.auth, - ) - return munchify(response) - - def build_from_file(self, ownername, projectname, path, distgit=None): - """ - Build a module from a local modulemd YAML file - - :param str ownername: - :param str projectname: - :param str path: - :return: Munch - """ - endpoint = "/module/build/{ownername}/{projectname}" - f = open(path, "rb") - params = { - "ownername": ownername, - "projectname": projectname, - } - files = { - "modulemd": (os.path.basename(f.name), f, "application/x-rpm") - } - data = None - if distgit is not None: - data = {"distgit": distgit} - request = FileRequest( - files=files, - api_base_url=self.api_base_url, - connection_attempts=self.config.get("connection_attempts", 1) - ) - response = request.send( - endpoint=endpoint, - method=POST, - params=params, - data=data, - auth=self.auth, - ) - return munchify(response) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/proxies/package.py new/copr-2.5/copr/v3/proxies/package.py --- old/copr-2.1/copr/v3/proxies/package.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/proxies/package.py 2025-12-09 15:09:38.000000000 +0100 @@ -1,7 +1,7 @@ from __future__ import absolute_import from . import BaseProxy from .build import BuildProxy -from ..requests import munchify, POST +from ..requests import munchify, DELETE, POST, PUT from ..helpers import for_all_methods, bind_proxy @@ -141,7 +141,7 @@ "package_name": packagename, } response = self.request.send( - endpoint=endpoint, data=data, method=POST, auth=self.auth) + endpoint=endpoint, data=data, method=PUT, auth=self.auth) return munchify(response) def build(self, ownername, projectname, packagename, buildopts=None, project_dirname=None): @@ -181,5 +181,5 @@ "package_name": packagename, } response = self.request.send( - endpoint=endpoint, data=data, method=POST, auth=self.auth) + endpoint=endpoint, data=data, method=DELETE, auth=self.auth) return munchify(response) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/proxies/project.py new/copr-2.5/copr/v3/proxies/project.py --- old/copr-2.1/copr/v3/proxies/project.py 2025-03-10 16:48:35.000000000 +0100 +++ new/copr-2.5/copr/v3/proxies/project.py 2025-12-09 15:09:38.000000000 +0100 @@ -3,7 +3,7 @@ import warnings from . import BaseProxy -from ..requests import munchify, POST, GET, PUT +from ..requests import munchify, DELETE, POST, PUT from ..helpers import for_all_methods, bind_proxy @@ -236,7 +236,7 @@ response = self.request.send( endpoint=endpoint, - method=POST, + method=PUT, params=params, data=data, auth=self.auth, @@ -261,7 +261,7 @@ } response = self.request.send( endpoint=endpoint, - method=POST, + method=DELETE, params=params, data=data, auth=self.auth, @@ -301,12 +301,12 @@ def can_build_in(self, who, ownername, projectname): """ - Return `True` a user can submit builds for a ownername/projectname + Return ``True`` a user can submit builds for a ownername/projectname :param str who: name of the user checking their permissions :param str ownername: owner of the project :param str projectname: name of the project - :return Bool: `True` or raise + :return Bool: ``True`` or raise """ endpoint = ("/project/permissions/can_build_in/" "{who}/{ownername}/{projectname}/") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/proxies/project_chroot.py new/copr-2.5/copr/v3/proxies/project_chroot.py --- old/copr-2.1/copr/v3/proxies/project_chroot.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/copr/v3/proxies/project_chroot.py 2025-12-09 15:09:38.000000000 +0100 @@ -2,7 +2,7 @@ import os from . import BaseProxy -from ..requests import FileRequest, munchify, POST +from ..requests import FileRequest, munchify, PUT from ..helpers import for_all_methods, bind_proxy @@ -72,7 +72,7 @@ Possible values are 'default', 'simple', 'nspawn'. :param list reset_fields: list of chroot attributes, that should be reseted to their respective defaults. Possible values are - `additional_packages`, `additional_modules`, `isolation`, etc. See + ``additional_packages``, ``additional_modules``, ``isolation``, etc. See the output of `ProjectProxy.get` for all the possible field names. :return: Munch """ @@ -110,7 +110,7 @@ ) response = request.send( endpoint=endpoint, - method=POST, + method=PUT, params=params, data=data, auth=self.auth, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr/v3/requests.py new/copr-2.5/copr/v3/requests.py --- old/copr-2.1/copr/v3/requests.py 2025-03-10 16:48:35.000000000 +0100 +++ new/copr-2.5/copr/v3/requests.py 2025-12-09 15:09:38.000000000 +0100 @@ -13,6 +13,7 @@ GET = "GET" POST = "POST" PUT = "PUT" +DELETE = "DELETE" class Request(object): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr.egg-info/PKG-INFO new/copr-2.5/copr.egg-info/PKG-INFO --- old/copr-2.1/copr.egg-info/PKG-INFO 2025-03-26 18:16:22.000000000 +0100 +++ new/copr-2.5/copr.egg-info/PKG-INFO 2025-12-15 12:50:53.000000000 +0100 @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.4 Name: copr -Version: 2.1 +Version: 2.5 Summary: Python client for copr service. Home-page: https://github.com/fedora-copr/copr Author: Valentin Gologuzov @@ -19,6 +19,15 @@ Requires-Dist: requests-toolbelt Requires-Dist: setuptools Requires-Dist: munch +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: requires-dist +Dynamic: summary Copr is designed to be a lightweight buildsystem that allows contributors to create packages, put them in repositories, and make it easy for users diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/copr.egg-info/SOURCES.txt new/copr-2.5/copr.egg-info/SOURCES.txt --- old/copr-2.1/copr.egg-info/SOURCES.txt 2025-03-26 18:16:22.000000000 +0100 +++ new/copr-2.5/copr.egg-info/SOURCES.txt 2025-12-15 12:50:53.000000000 +0100 @@ -21,7 +21,6 @@ copr/test/client_v3/test_builds.py copr/test/client_v3/test_general.py copr/test/client_v3/test_helpers.py -copr/test/client_v3/test_modules.py copr/test/client_v3/test_packages.py copr/test/client_v3/test_requests.py copr/test/resources/build_config.200.json @@ -42,7 +41,6 @@ copr/v3/proxies/build.py copr/v3/proxies/build_chroot.py copr/v3/proxies/mock_chroot.py -copr/v3/proxies/module.py copr/v3/proxies/monitor.py copr/v3/proxies/package.py copr/v3/proxies/project.py @@ -73,4 +71,5 @@ docs/client_v3/package_source_types.rst docs/client_v3/pagination.rst docs/client_v3/proxies.rst +docs/client_v3/utilities.rst docs/client_v3/working_with_proxies_directly.rst \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/ClientV1.rst new/copr-2.5/docs/ClientV1.rst --- old/copr-2.1/docs/ClientV1.rst 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/ClientV1.rst 2025-12-09 15:09:38.000000000 +0100 @@ -1,7 +1,8 @@ +:orphan: + .. warning:: Legacy client is obsolete, please use Client version 3 instead. :ref:`This document <migration>` describes the migration process. - Legacy client ============= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/ClientV2.rst new/copr-2.5/docs/ClientV2.rst --- old/copr-2.1/docs/ClientV2.rst 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/ClientV2.rst 2025-12-09 15:09:38.000000000 +0100 @@ -1,3 +1,5 @@ +:orphan: + .. warning:: Client version 2 is obsolete, please use Client version 3 instead. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/ClientV3.rst new/copr-2.5/docs/ClientV3.rst --- old/copr-2.1/docs/ClientV3.rst 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/ClientV3.rst 2025-12-09 15:09:38.000000000 +0100 @@ -38,6 +38,7 @@ client_v3/data_structures.rst client_v3/error_handling.rst client_v3/pagination.rst + client_v3/utilities.rst client_v3/working_with_proxies_directly.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/client_v3/migration.rst new/copr-2.5/docs/client_v3/migration.rst --- old/copr-2.1/docs/client_v3/migration.rst 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/client_v3/migration.rst 2025-12-09 15:09:38.000000000 +0100 @@ -1,3 +1,5 @@ +:orphan: + .. _migration: Migration @@ -96,4 +98,3 @@ | ``build_module(...)`` | ``module_proxy.build_from_url``, | | | ``module_proxy.build_from_file`` | +-------------------------------------+-------------------------------------------------------------+ - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/client_v3/package_source_types.rst new/copr-2.5/docs/client_v3/package_source_types.rst --- old/copr-2.1/docs/client_v3/package_source_types.rst 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/client_v3/package_source_types.rst 2025-12-09 15:09:38.000000000 +0100 @@ -2,14 +2,14 @@ =================== Read more about source types in the -`User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#build-source-types>`_. +`User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#build-source-types>`__. SCM --- Parameters when ``source_type=scm`` is used. -See `User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#scm>`_ for more information. +See `User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#scm>`__ for more information. ===================== ==================== =============== Field Type Description @@ -19,7 +19,7 @@ subdirectory str spec str scm_type str "git", "svn" -source_build_method str See `User documentation <https://docs.pagure.org/copr.copr/user_documentation.html#scm>`_ for more info +source_build_method str See `User documentation <https://docs.pagure.org/copr.copr/user_documentation.html#scm>`__ for more info ===================== ==================== =============== @@ -27,7 +27,7 @@ -------- Parameters when ``source_type=rubygems`` is used. -See `User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#rubygems>`_ for more information. +See `User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#rubygems>`__ for more information. ================== ==================== =============== Field Type Description @@ -40,7 +40,7 @@ ---- Parameters when ``source_type=pypi`` is used. -See `User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#pypi>`_ for more information. +See `User Documentation <https://docs.pagure.org/copr.copr/user_documentation.html#pypi>`__ for more information. ===================== ==================== =============== Field Type Description @@ -56,7 +56,7 @@ ------ Parameters when ``source_type=custom`` is used. -See `User Documentation <https://docs.pagure.org/copr.copr/custom_source_method.html#custom-source-method>`_ for more information. +See `User Documentation <https://docs.pagure.org/copr.copr/custom_source_method.html#custom-source-method>`__ for more information. ===================== ==================== =============== Field Type Description diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/client_v3/proxies.rst new/copr-2.5/docs/client_v3/proxies.rst --- old/copr-2.1/docs/client_v3/proxies.rst 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/client_v3/proxies.rst 2025-12-09 15:09:38.000000000 +0100 @@ -40,13 +40,6 @@ :members: -Module ------- - -.. autoclass:: copr.v3.proxies.module.ModuleProxy - :members: - - Monitor ------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/client_v3/utilities.rst new/copr-2.5/docs/client_v3/utilities.rst --- old/copr-2.1/docs/client_v3/utilities.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/copr-2.5/docs/client_v3/utilities.rst 2025-12-09 15:09:38.000000000 +0100 @@ -0,0 +1,53 @@ +.. _utilities: + +Helper Functions +================ + +The copr.v3 module provides several utility functions that make working with builds and other operations more convenient. + +wait function +------------- + +The ``wait`` function allows you to wait for builds to complete before continuing execution. + +.. autofunction:: copr.v3.wait + +Usage Example +~~~~~~~~~~~~~ + +.. code-block:: python + + from copr.v3 import Client, wait + + # Create a client + client = Client.create_from_config_file() + + # Submit builds + build1 = client.build_proxy.create_from_file("@user", "project", "/path/to/file.src.rpm") + build2 = client.build_proxy.create_from_url("@user", "project", "http://example.com/package.src.rpm") + + # Wait for both builds to finish + finished_builds = wait([build1, build2]) + + # Check the results + for build in finished_builds: + print(f"Build {build.id} finished with state: {build.state}") + +With Callback +~~~~~~~~~~~~~ + +You can provide a callback function to monitor progress: + +.. code-block:: python + + from copr.v3 import Client, wait + + def progress_callback(builds): + for build in builds: + print(f"Build {build.id}: {build.state}") + + client = Client.create_from_config_file() + build = client.build_proxy.create_from_file("@user", "project", "/path/to/file.src.rpm") + + # Wait with progress updates every 30 seconds + wait(build, callback=progress_callback) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/docs/conf.py new/copr-2.5/docs/conf.py --- old/copr-2.1/docs/conf.py 2024-12-01 22:14:17.000000000 +0100 +++ new/copr-2.5/docs/conf.py 2025-12-09 15:09:38.000000000 +0100 @@ -11,9 +11,9 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys, os - - +import importlib +import os +import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the @@ -27,7 +27,13 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode'] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.coverage', + 'sphinx.ext.ifconfig', + 'sphinx.ext.viewcode', + 'sphinx.ext.todo' +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -100,11 +106,7 @@ # Use readthedocs theme if it is installed # Ideally, we want to develop the documentation in the same theme # that will be used in the production -try: - import sphinx_rtd_theme - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] -except ImportError: +if not importlib.util.find_spec("sphinx_rtd_theme"): print("Please install the readthedocs theme with:") print("dnf install python*-sphinx_rtd_theme") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/python-copr.spec new/copr-2.5/python-copr.spec --- old/copr-2.1/python-copr.spec 2025-03-26 08:57:56.000000000 +0100 +++ new/copr-2.5/python-copr.spec 2025-12-09 15:45:42.000000000 +0100 @@ -1,13 +1,7 @@ %global srcname copr -%if 0%{?rhel} && 0%{?rhel} <= 7 -%global with_python2 1 -%else -%global with_python3 1 -%endif - Name: python-copr -Version: 2.1 +Version: 2.5 Release: 1%{?dist} Summary: Python interface for Copr @@ -24,36 +18,6 @@ BuildRequires: libxslt BuildRequires: util-linux -%if %{with python2} -%if 0%{?rhel} && 0%{?rhel} <= 7 -BuildRequires: python-setuptools -BuildRequires: python-requests -BuildRequires: python-requests-toolbelt -BuildRequires: python-mock -BuildRequires: python-munch -BuildRequires: python-filelock -BuildRequires: python-configparser -BuildRequires: pytest -BuildRequires: python2-devel -BuildRequires: python2-requests-gssapi -# for doc package -BuildRequires: python-sphinx -BuildRequires: python-docutils -%else -BuildRequires: python2-setuptools -BuildRequires: python2-requests -BuildRequires: python2-requests-toolbelt -BuildRequires: python2-pytest -BuildRequires: python2-devel -BuildRequires: python-munch -BuildRequires: python2-filelock -BuildRequires: python2-configparser -BuildRequires: python2-requests-gssapi -# for doc package -BuildRequires: python2-sphinx -BuildRequires: python2-docutils -%endif -%endif #doc BuildRequires: make @@ -67,35 +31,6 @@ %description %_description -%if %{with python2} -%package -n python2-copr -Summary: %summary - -%if 0%{?rhel} == 7 -Requires: python-configparser -Requires: python-munch -Requires: python-filelock -Requires: python-requests -Requires: python-requests-toolbelt -Requires: python-requests-gssapi -Requires: python-setuptools -%else -Requires: python2-configparser -Requires: python2-munch -Requires: python2-filelock -Requires: python2-requests -Requires: python2-requests-toolbelt -Requires: python2-setuptools -Requires: python2-requests-gssapi -%endif - -%{?python_provide:%python_provide python2-copr} - -%description -n python2-copr %_description -%endif -# with python2 - -%if %{with python3} %package -n python3-copr Summary: Python interface for Copr @@ -144,9 +79,6 @@ This package contains python interface to access Copr service. Mostly useful for developers only. -%endif -# with python3 - %package -n python-copr-doc Summary: Code documentation for python-copr package @@ -164,13 +96,12 @@ %build -%if %{with python3} +%if 0%{?rhel} && 0%{?rhel} <= 8 version=%version %py3_build +%else +version=%version %pyproject_wheel %endif -%if %{with python2} -version=%version %py2_build -%endif mv copr/README.rst ./ @@ -179,12 +110,10 @@ %install -%if %{with python3} +%if 0%{?rhel} && 0%{?rhel} <= 8 version=%version %py3_install -%endif - -%if %{with python2} -version=%version %py2_install +%else +version=%version %pyproject_install %endif find %{buildroot} -name '*.exe' -delete @@ -193,36 +122,35 @@ cp -a docs/_build/html %{buildroot}%{_pkgdocdir}/ %check -%if %{with python3} %{__python3} -m pytest -vv copr/test -%endif - -%if %{with python2} -%{__python2} -m pytest -vv copr/test -%endif -%if %{with python3} %files -n python3-copr %license LICENSE %doc README.rst %{python3_sitelib}/* -%endif -# with python3 -%if %{with python2} -%files -n python2-copr -%license LICENSE -%doc README.rst -%{python2_sitelib}/* -%endif -# with python2 %files -n python-copr-doc %license LICENSE %doc %{_pkgdocdir} %changelog +* Tue Dec 09 2025 Jiri Kyjovsky <[email protected]> 2.5-1 +- Add API endpoint for generating a new token +- Make copr.v3.helpers.wait official part of API + +* Mon Sep 29 2025 Jakub Kadlcik <[email protected]> 2.4-1 +- Drop support for building modules + +* Tue Sep 16 2025 Jakub Kadlcik <[email protected]> 2.3-1 +- Use correct used HTTP methods for delete and update requests +- Introduce v3.requests.DELETE method + +* Tue Aug 26 2025 Jakub Kadlcik <[email protected]> 2.2-1 +- Stop using deprecated %%py3_build/%%py3_install macros +- Remove rhel7 conditions and remove python2 support + * Tue Mar 25 2025 Pavel Raiskup <[email protected]> 2.1-1 - doc: remove a non existent parameter from docstring - drop six dependency diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/copr-2.1/setup.py new/copr-2.5/setup.py --- old/copr-2.1/setup.py 2025-03-26 08:57:56.000000000 +0100 +++ new/copr-2.5/setup.py 2025-12-09 15:45:42.000000000 +0100 @@ -29,7 +29,7 @@ setup( name='copr', - version="2.1", + version="2.5", description=__description__, long_description=long_description, author=__author__,
