Compare commits

...
Sign in to create a new pull request.

25 commits

Author SHA1 Message Date
Lukáš Zachar
b284634b22 Drop STI and use tmt instead
Resolves: rhbz#2383043
2025-08-15 17:33:08 +02:00
Fedora Release Engineering
0bb99dc9e9 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-25 10:14:53 +00:00
Fedora Release Engineering
db95d6e735 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-18 18:59:56 +00:00
Karolina Surma
03fc0de4ac Add centpkg to use in CentOS Stream
If tests are run in this repository, they exist.
Other packages in Fedora require fedpkg-minimal to download the sources.
We also want to run this test in CentOS Stream where fedpkg-minimal is
not available, hence adding centpkg invocation.
The change will have no effect in this repository, but is essential for
the smooth tests run of other components.
2024-11-06 12:31:35 +01:00
Karolina Surma
91729cf8a0 CI: Look for the correct obsolete name in tests 2024-08-19 14:24:39 +02:00
Fedora Release Engineering
02ef9fde40 Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-19 15:32:13 +00:00
Fedora Release Engineering
223b71bb5e Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-26 10:19:05 +00:00
Fedora Release Engineering
f3d6832f4d Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-22 06:41:25 +00:00
Miro Hrončok
592400f58b Remove a no longer needed workaround for RPM <= 4.16 warning
This removes an ugly hack that was used to get rid of:

    warning: Macro %1 defined but not used within scope

I've noticed the %_pythonname_obsoletes generator does not expand %1
on non-RHELs and yet the warning is not shown.
When debugging the missing warning,
I've noticed it is never shown at all.

According to RPM upstream, the warning was an undesired artifact:
https://github.com/rpm-software-management/rpm/discussions/2501

It was purposefully removed starting with RPM 4.17.
2023-10-06 11:59:15 +02:00
Miro Hrončok
52372a464c Avoid DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors
The warning only happened on corrupted metadata.

The warning originates in 880a6219a1
2023-10-03 12:07:49 +02:00
Fedora Release Engineering
8fe27ad070 Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-21 13:45:10 +00:00
Todd Zullinger
f9b21eca49 Fix URL tag
The Pagure instance at src.fedoraproject.org requires namespaces.  This
project is in the rpms namespace.  Update the URL tag accordingly.
2023-05-24 12:58:14 -04:00
Miro Hrončok
50768e7a3d Declare the license via a complex SPDX expression rather than "effective license" 2023-05-05 14:14:41 +02:00
Miro Hrončok
e348b87fd9 License: Clarify pythonbundles.py license
See https://gitlab.com/fedora/legal/fedora-license-data/-/issues/214

The script was only ever contributed to by me and Tomas Orsava.

    $ git log --format='%aN <%aE>' pythonbundles.py | sort -u
    Miro Hrončok <miro@hroncok.cz>
    Tomas Orsava <torsava@redhat.com>

This license clarification is:

Signed-off-by: Miro Hrončok <miro@hroncok.cz>
Signed-off-by: Tomas Orsava <torsava@redhat.com>
2023-05-05 14:01:14 +02:00
Kalev Lember
47a0b37ac0 Generate provides for /app-installed flatpak builds
The generator deliberately does not use %{_prefix} in order to avoid
generating provides for packages that set a custom prefix. This is done
to ensure that provides are only generated for paths where the Python
interpreter actually loads modules from.

As we can't use %{_prefix} (which would make it all much simpler), this
commit adds a conditional to look in /app only when the %flatpak macro
is defined, and /usr otherwise.

This should fix provides generation for /app-installed flatpak builds.
2023-04-20 04:23:47 +02:00
Miro Hrončok
d6993270c2 CI: Run pytest via script to make it easier to reuse it in python-packaging 2023-04-19 20:27:07 +02:00
Miro Hrončok
2b8d03b0b1 CI: Add rpm -qa | sort for easier inspectability 2023-04-18 11:14:49 +02:00
Miro Hrončok
2b230d8b53 CI: Assert pythonbundles also ignores [extras]
See https://bugzilla.redhat.com/show_bug.cgi?id=2140230#c12 to #c14.
2023-03-13 15:49:45 +01:00
Miro Hrončok
079b71a567 Ignore environment markers in pythonbundles.py
Use packaging.requirements instead of a naïve split on ==.
2023-03-07 17:35:06 +01:00
Miro Hrončok
279638a969 Avoid needless pkg_resources import in pythonbundles.py 2023-03-07 17:16:58 +01:00
Miro Hrončok
500fda1e6d CI: Remove tests for non-PEP440 versions
packaging 22+ no longer supports them, so neither can we.
2023-02-03 12:28:22 +00:00
Miro Hrončok
1bdd94dd1d CI: Include stdout/stderr in test failures 2023-02-03 12:28:22 +00:00
Fedora Release Engineering
9d7ca941e7 Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-01-20 17:03:50 +00:00
Karolina Surma
78c739cfd1 Update the test data sources 2023-01-05 09:39:19 +01:00
Karolina Surma
197a88bf93 https://fedoraproject.org/wiki/Changes/Prevent-Providing-python3dist(pkg)=0 2023-01-05 09:39:19 +01:00
22 changed files with 215 additions and 102 deletions

1
.fmf/version Normal file
View file

@ -0,0 +1 @@
1

1
.gitignore vendored
View file

@ -3,3 +3,4 @@
/tests/__pycache__/
/tests/data/scripts_pythondistdeps/usr/
/test-sources-2021-03-11.tar.gz
/test-sources-2023-01-04.tar.gz

45
plan.fmf Normal file
View file

@ -0,0 +1,45 @@
execute:
how: tmt
discover:
- name: same_repo
how: shell
dist-git-source: true
dist-git-download-only: true
tests:
- name: pythonabi
path: /tests
test: ./pythonabi.sh
- name: pythonname
path: /tests
test: ./pythonname.sh
- name: pythondist
path: /tests
test: ./pythondist.sh
- name: console_script
path: /tests
test: ./console_script.sh
- name: pytest
test: cd $TMT_SOURCE_DIR && ./tests/download_data_and_run_pytest.sh
prepare:
- name: Install dependencies
how: install
package:
- rpm-build
- rpmdevtools
- fedpkg-minimal
- python3-devel
- python3-pip
- python3-pytest
- python3-pyyaml
- python3-setuptools
- python3-wheel
- dnf
- name: Update packages
how: shell
script: dnf upgrade -y
- name: rpm_qa
order: 100
how: shell
script: rpm -qa | sort | tee $TMT_PLAN_DATA/rpmqa.txt

View file

@ -1,19 +1,28 @@
Name: python-rpm-generators
Summary: Dependency generators for Python RPMs
Version: 13
Release: 2%{?dist}
Version: 14
Release: 13%{?dist}
# Originally all those files were part of RPM, so license is kept here
License: GPLv2+
Url: https://src.fedoraproject.org/python-rpm-generators
# Commit is the last change in following files
Url: https://src.fedoraproject.org/rpms/python-rpm-generators
# Originally the following files were part of RPM, so the license is inherited: GPL-2.0-or-later
# The COPYING file is grabbed from the last commit that changed the files
Source0: https://raw.githubusercontent.com/rpm-software-management/rpm/102eab50b3d0d6546dfe082eac0ade21e6b3dbf1/COPYING
Source1: python.attr
Source2: pythondist.attr
# This was crafted in-place as a fork of python.attr, hence also GPL-2.0-or-later
Source3: pythonname.attr
# This one is also originally from RPM, but it has its own license declaration: LGPL-2.1-or-later
Source4: pythondistdeps.py
# This was crafted in-place with the following license declaration:
# LicenseRef-Fedora-Public-Domain OR CC0-1.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later
# Note that CC0-1.0 is not allowed for code in Fedora, so we skip it in the package License tag
Source5: pythonbundles.py
# See individual licenses above Source declarations
# Originally, this was simplified to GPL-2.0-or-later, but "effective license" analysis is no longer allowed
License: GPL-2.0-or-later AND LGPL-2.1-or-later AND (LicenseRef-Fedora-Public-Domain OR LGPL-2.1-or-later OR GPL-2.0-or-later)
BuildArch: noarch
%description
@ -47,6 +56,46 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py
%{_rpmconfigdir}/pythonbundles.py
%changelog
* Fri Jul 25 2025 Fedora Release Engineering <releng@fedoraproject.org> - 14-13
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Sat Jan 18 2025 Fedora Release Engineering <releng@fedoraproject.org> - 14-12
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Fri Jul 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 14-11
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 14-10
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Jan 22 2024 Fedora Release Engineering <releng@fedoraproject.org> - 14-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Tue Oct 03 2023 Miro Hrončok <mhroncok@redhat.com> - 14-8
- Avoid DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 14-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Wed May 24 2023 Todd Zullinger <tmz@pobox.com> - 14-6
- Fix URL tag
* Fri May 05 2023 Miro Hrončok <mhroncok@redhat.com> - 14-5
- Declare the license via a complex SPDX expression rather than "effective license"
* Mon Apr 17 2023 Kalev Lember <klember@redhat.com> - 14-4
- Generate provides for /app-installed flatpak builds
* Tue Mar 07 2023 Miro Hrončok <mhroncok@redhat.com> - 14-3
- Avoid needless pkg_resources import in pythonbundles.py
- Ignore environment markers in pythonbundles.py
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 14-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Thu Dec 22 2022 Karolina Surma <ksurma@redhat.com> - 14-1
- https://fedoraproject.org/wiki/Changes/Prevent-Providing-python3dist(pkg)=0
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 13-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild

View file

@ -5,8 +5,10 @@
-- python(abi) = MAJOR.MINOR
-- (Don't match against -config tools e.g. /usr/bin/python2.6-config)
local path = rpm.expand('%1')
if path:match('/usr/bin/python%d+%.%d+$') then
local provides = path:gsub('.*/usr/bin/python(%d+%.%d+)', 'python(abi) = %1')
-- Use /usr prefix by default, and /app for flatpak builds
local prefix = rpm.expand('%{?!flatpak:/usr}%{?flatpak:/app}')
if path:match(prefix .. '/bin/python%d+%.%d+$') then
local provides = path:gsub('.*' .. prefix .. '/bin/python(%d+%.%d+)', 'python(abi) = %1')
print(provides)
end
}
@ -18,10 +20,12 @@
-- generating a line of the form:
-- python(abi) = MAJOR.MINOR
local path = rpm.expand('%1')
if path:match('/usr/lib%d*/python%d+%.%d+/.*') then
local requires = path:gsub('.*/usr/lib%d*/python(%d+%.%d+)/.*', 'python(abi) = %1')
-- Use /usr prefix by default, and /app for flatpak builds
local prefix = rpm.expand('%{?!flatpak:/usr}%{?flatpak:/app}')
if path:match(prefix .. '/lib%d*/python%d+%.%d+/.*') then
local requires = path:gsub('.*' .. prefix .. '/lib%d*/python(%d+%.%d+)/.*', 'python(abi) = %1')
print(requires)
end
}
%__python_path ^((%{_prefix}/lib(64)?/python[[:digit:]]+\\.[[:digit:]]+/.*\\.(py[oc]?|so))|(%{_bindir}/python[[:digit:]]+\\.[[:digit:]]+))$
%__python_path ^((%{?!flatpak:/usr}%{?flatpak:/app}/lib(64)?/python[[:digit:]]+\\.[[:digit:]]+/.*\\.(py[oc]?|so))|(%{_bindir}/python[[:digit:]]+\\.[[:digit:]]+))$

View file

@ -4,7 +4,7 @@
# This program is free software.
#
# It is placed in the public domain or under the CC0-1.0-Universal license,
# whichever is more permissive.
# whichever you choose.
#
# Alternatively, it may be redistributed and/or modified under the terms of
# the LGPL version 2.1 (or later) or GPL version 2 (or later).
@ -15,12 +15,9 @@
import pathlib
import sys
# inject parse_version import to pythondistdeps
# not the nicest API, but :/
from pkg_resources import parse_version
import pythondistdeps
pythondistdeps.parse_version = parse_version
from packaging import requirements
import pythondistdeps
def generate_bundled_provides(paths, namespace):
provides = set()
@ -38,8 +35,14 @@ def generate_bundled_provides(paths, namespace):
continue
line = line.strip()
if line:
name, _, version = line.partition('==')
name = pythondistdeps.normalize_name(name)
requirement = requirements.Requirement(line)
for spec in requirement.specifier:
if spec.operator == '==':
version = spec.version
break
else:
raise ValueError('pythonbundles.py only handles exactly one == requirement')
name = pythondistdeps.normalize_name(requirement.name)
bundled_name = f"bundled({namespace}({name}))"
python_provide = pythondistdeps.convert(bundled_name, '==', version)
provides.add(f'Provides: {python_provide}')

View file

@ -1,3 +1,3 @@
%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --majorver-provides-versions %{__default_python3_version}
%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --majorver-provides-versions %{__default_python3_version} %{?!_python_dist_allow_version_zero:--fail-if-zero}
%__pythondist_requires %{_rpmconfigdir}/pythondistdeps.py --requires --normalized-names-format pep503 --package-name %{name} %{?!_python_no_extras_requires:--require-extras-subpackages} --console-scripts-nodep-setuptools-since 3.10
%__pythondist_path ^/usr/lib(64)?/python[3-9]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$
%__pythondist_path ^%{?!flatpak:/usr}%{?flatpak:/app}/lib(64)?/python[3-9]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$

View file

@ -94,8 +94,8 @@ class Distribution(PathDistribution):
# that it works also on previous Python/importlib_metadata versions.
@property
def name(self):
"""Return the 'Name' metadata for the distribution package."""
return self.metadata['Name']
"""Return the 'Name' metadata for the distribution package or None."""
return self.metadata.get('Name')
def _parse_py_version(self, path):
# Try to parse the Python version from the path the metadata
@ -155,6 +155,9 @@ class RpmVersion():
self.post = None
return self
def is_zero(self):
return self.__str__() == '0'
def __str__(self):
if self.is_legacy():
return self.version
@ -334,9 +337,13 @@ def main():
help="If there is a dependency on a package with extras functionality, require the extras subpackage")
parser.add_argument('--package-name', action='store', help="Name of the RPM package that's being inspected. Required for extras requires/provides to work.")
parser.add_argument('--namespace', action='store', help="Namespace for the printed Requires, Provides, Recommends and Conflicts")
parser.add_argument('--fail-if-zero', action='store_true', help='Fail the script if the automatically generated Provides version was 0, which usually indicates a packaging error.')
parser.add_argument('files', nargs=argparse.REMAINDER, help="Files from the RPM package that are to be inspected, can also be supplied on stdin")
args = parser.parse_args()
if args.fail_if_zero and not args.provides:
raise parser.error('--fail-if-zero only works with --provides')
py_abi = args.requires
py_deps = {}
@ -470,6 +477,17 @@ def main():
if dist.version:
version = dist.version
spec = ('==', version)
if args.fail_if_zero:
if RpmVersion(version).is_zero():
print('*** PYTHON_PROVIDED_VERSION_NORMALIZES_TO_ZERO___SEE_STDERR ***')
print(f'\nError: The version in the Python package metadata {version} normalizes to zero.\n'
'It\'s likely a packaging error caused by missing version information\n'
'(e.g. when using a version control system snapshot as a source).\n'
'Try providing the version information manually when building the Python package,\n'
'for example by setting the SETUPTOOLS_SCM_PRETEND_VERSION environment variable if the package uses setuptools_scm.\n'
'If you are confident that the version of the Python package is intentionally zero,\n'
'you may %define the _python_dist_allow_version_zero macro in the spec file to disable this check.\n', file=stderr)
exit(65) # os.EX_DATAERR
if normalized_names_provide_legacy:
if spec not in py_deps[name]:

View file

@ -1,9 +1,6 @@
%__pythonname_provides() %{lua:
local python = require 'fedora.srpm.python'
-- this macro is called for each file in a package, the path being in %1
-- but we don't need to know the path, so we would get for each file: Macro %1 defined but not used within scope
-- in here, we expand %name conditionally on %1 to suppress the warning
local name = rpm.expand('%{?1:%{name}}')
local name = rpm.expand('%{name}')
local evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}')
local provides = python.python_altprovides_once(name, evr)
-- provides is either an array/table or nil
@ -23,10 +20,7 @@
-- In Fedora this is not needed as we don't ship ecosystem packages
-- for alternative Python interpreters.
local python = require 'fedora.srpm.python'
-- this macro is called for each file in a package, the path being in %1
-- but we don't need to know the path, so we would get for each file: Macro %1 defined but not used within scope
-- in here, we expand %name conditionally on %1 to suppress the warning
local name = rpm.expand('%{?1:%{name}}')
local name = rpm.expand('%{name}')
local evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}')
local obsoletes = python.python_altobsoletes_once(name, evr)
-- obsoletes is either an array/table or nil

View file

@ -1 +1 @@
SHA512 (test-sources-2021-03-11.tar.gz) = 6f34c8151625be489a6a4d56d1fd3d39b7908bd31402c9703cb65918385320dfad35f35a32920c816fb85a829f44aaf04dc1d0654ccf512e26e87e95dbf87430
SHA512 (test-sources-2023-01-04.tar.gz) = ca25c35970e91adeaed0873c045f4335c33b96a4ef4c56a36bfb2fd9e1d4799142cf0513abb066479fdb14d2d184b3b825c1d90119ac8e8d0e9aa1a4423701d1

View file

@ -31,7 +31,7 @@ requirementslib==1.5.11
distlib==0.3.0
packaging==20.3
pyparsing==2.4.7
plette==0.2.3
plette[validation]==0.2.3
tomlkit==0.5.11
shellingham==1.3.2
six==1.14.0

View file

@ -3,3 +3,4 @@ Provides: bundled(python3dist(ordered-set)) = 3.1.1
Provides: bundled(python3dist(packaging)) = 16.8
Provides: bundled(python3dist(pyparsing)) = 2.2.1
Provides: bundled(python3dist(six)) = 1.10
Provides: bundled(python3dist(tomli)) = 1.2.3

View file

@ -1,3 +1,4 @@
packaging==16.8
pyparsing==2.2.1
ordered-set==3.1.1
tomli==1.2.3;python_version<"3.11"

View file

@ -1,3 +1,4 @@
Provides: bundled(python3dist(ordered-set)) = 3.1.1
Provides: bundled(python3dist(packaging)) = 16.8
Provides: bundled(python3dist(pyparsing)) = 2.2.1
Provides: bundled(python3dist(tomli)) = 1.2.3

View file

@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pyreq2rpm.tests
Version: 2020.04.07.024dab0
Version: 2020.04.07.024
Summary: Test package to verify conversion of dependencies from pip/python to rpm format, data taken from pyreq2rpm
Author: Tomas Orsava (author of this metapackage)
Home-page: https://github.com/gordonmessmer/pyreq2rpm

View file

@ -45,10 +45,8 @@ foobar43!=2.0.post1
foobar44<=2.4.8
foobar45<=2.4.8.0
foobar46<=2.4.8.1
foobar47<=2.4.8.*
foobar48<=2.0
foobar49<=2
foobar50<=2.*
foobar51<=2.4.8b5
foobar52<=2.0.0b5
foobar53<=2.4.8.post1
@ -56,10 +54,8 @@ foobar54<=2.0.post1
foobar55<2.4.8
foobar56<2.4.8.0
foobar57<2.4.8.1
foobar58<2.4.8.*
foobar59<2.0
foobar60<2
foobar61<2.*
foobar62<2.4.8b5
foobar63<2.0.0b5
foobar64<2.4.8.post1
@ -67,10 +63,8 @@ foobar65<2.0.post1
foobar66>=2.4.8
foobar67>=2.4.8.0
foobar68>=2.4.8.1
foobar69>=2.4.8.*
foobar70>=2.0
foobar71>=2
foobar72>=2.*
foobar73>=2.4.8b5
foobar74>=2.0.0b5
foobar75>=2.4.8.post1
@ -78,10 +72,8 @@ foobar76>=2.0.post1
foobar77>2.4.8
foobar78>2.4.8.0
foobar79>2.4.8.1
foobar80>2.4.8.*
foobar81>2.0
foobar82>2
foobar83>2.*
foobar84>2.4.8b5
foobar85>2.0.0b5
foobar86>2.4.8.post1

View file

@ -1224,8 +1224,8 @@
stdout:
provides: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***'
requires: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***'
pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info:
provides: python3.9dist(pyreq2rpm-tests) = 2020.04.07.024dab0
pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info:
provides: python3.9dist(pyreq2rpm-tests) = 2020.4.7.24
requires: |-
python(abi) = 3.9
((python3.9dist(babel) < 2 or python3.9dist(babel) > 2) with python3.9dist(babel) >= 1.3)
@ -1271,10 +1271,8 @@
python3.9dist(foobar44) <= 2.4.8
python3.9dist(foobar45) <= 2.4.8
python3.9dist(foobar46) <= 2.4.8.1
python3.9dist(foobar47) < 2.4.8~~
python3.9dist(foobar48) <= 2
python3.9dist(foobar49) <= 2
python3.9dist(foobar50) < 2~~
python3.9dist(foobar51) <= 2.4.8~b5
python3.9dist(foobar52) <= 2~b5
python3.9dist(foobar53) <= 2.4.8^post1
@ -1282,10 +1280,8 @@
python3.9dist(foobar55) < 2.4.8~~
python3.9dist(foobar56) < 2.4.8~~
python3.9dist(foobar57) < 2.4.8.1~~
python3.9dist(foobar58) < 2.4.8~~
python3.9dist(foobar59) < 2~~
python3.9dist(foobar60) < 2~~
python3.9dist(foobar61) < 2~~
python3.9dist(foobar62) < 2.4.8~b5
python3.9dist(foobar63) < 2~b5
python3.9dist(foobar64) < 2.4.8^post1
@ -1293,11 +1289,9 @@
python3.9dist(foobar66) >= 2.4.8
python3.9dist(foobar67) >= 2.4.8
python3.9dist(foobar68) >= 2.4.8.1
python3.9dist(foobar69) >= 2.4.8
(python3.9dist(foobar7) >= 2.4.8~b5 with python3.9dist(foobar7) < 2.5)
python3.9dist(foobar70) >= 2
python3.9dist(foobar71) >= 2
python3.9dist(foobar72) >= 2
python3.9dist(foobar73) >= 2.4.8~b5
python3.9dist(foobar74) >= 2~b5
python3.9dist(foobar75) >= 2.4.8^post1
@ -1306,10 +1300,8 @@
python3.9dist(foobar78) > 2.4.8.0
python3.9dist(foobar79) > 2.4.8.1.0
(python3.9dist(foobar8) >= 2~b5 with python3.9dist(foobar8) < 2.1)
python3.9dist(foobar80) >= 2.4.8
python3.9dist(foobar81) > 2.0
python3.9dist(foobar82) > 2.0
python3.9dist(foobar83) >= 2
python3.9dist(foobar84) > 2.4.8~b5
python3.9dist(foobar85) > 2~b5
python3.9dist(foobar86) > 2.4.8^post1
@ -1362,4 +1354,39 @@
requires: |-
python(abi) = 3.10
python3.10dist(virtualenv) >= 20.0.35
--requires --fail-if-zero:
--provides --majorver-provides --fail-if-zero:
usr/lib/python3.11/site-packages/importlib_metadata-0.0-py3.11.egg-info:
stderr:
provides: |-
Error: The version in the Python package metadata 0.0 normalizes to zero.
It's likely a packaging error caused by missing version information
(e.g. when using a version control system snapshot as a source).
Try providing the version information manually when building the Python package,
for example by setting the SETUPTOOLS_SCM_PRETEND_VERSION environment variable if the package uses setuptools_scm.
If you are confident that the version of the Python package is intentionally zero,
you may %define the _python_dist_allow_version_zero macro in the spec file to disable this check.
requires: '*error: --fail-if-zero only works with --provides*'
stdout:
provides: '*** PYTHON_PROVIDED_VERSION_NORMALIZES_TO_ZERO___SEE_STDERR ***'
requires: ''
--requires:
--provides --majorver-provides:
usr/lib/python3.11/site-packages/importlib_metadata-0.0-py3.11.egg-info:
provides: |-
python3.11dist(importlib-metadata) = 0
python3dist(importlib-metadata) = 0
requires: |-
python(abi) = 3.11
python3.11dist(setuptools)
python3.11dist(wheel)
--requires:
--provides --majorver-provides --fail-if-zero:
usr/lib/python3.11/site-packages/importlib_metadata-0.1-py3.11.egg-info:
provides: |-
python3.11dist(importlib-metadata) = 0.1
python3dist(importlib-metadata) = 0.1
requires: |-
python(abi) = 3.11
python3.11dist(setuptools)
python3.11dist(wheel)

View file

@ -103,3 +103,7 @@ dnspython:
build:
wheel:
'0.8.0': ['3.10']
importlib_metadata:
sdist:
'0.0': ['3.11']
'0.1': ['3.11']

View file

@ -0,0 +1,15 @@
#!/usr/bin/bash -eux
# Use update-test-sources.sh to update the test data
# When the tests run in python-rpm-generators,
# the structure on disk does not match the dist-git repository.
# We apparently must use the standard-test-source role to grab the sources.
# OTOH in other packages, we must use fedpkg(-minimal) or centpkg(-minimal),
# depending on the destination OS.
# The --force flag is required in full-blown fedpkg/centpkg (the source is unused in spec),
# and it is ignored in fedpkg/centpkg-minimal (all sources are always downloaded).
test -f test-sources-*.tar.gz || fedpkg sources --force || centpkg sources --force
tar -xvf test-sources-*.tar.gz -C ./tests/data/scripts_pythondistdeps/
cd tests/
python3 -m pytest -vvv

View file

@ -43,7 +43,7 @@ test $(rpm -qp --obsoletes ${RPMDIR}/python${X_Y}-foo-0-0.noarch.rpm | wc -l) -e
echo "Obsoletes for python3-foo"
rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm
# In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly.
rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | grep -q '^python'${X_Y}'-py_provides < 0-0$' && exit 1 || true
rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | grep -q '^python'${X_Y}'-foo < 0-0$' && exit 1 || true
test $(rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | wc -l) -eq 0
echo "Obsoletes for python2-foo"

View file

@ -53,6 +53,11 @@ def run_pythondistdeps(provides_params, requires_params, dist_egg_info_path, exp
requires = subprocess.run((sys.executable, PYTHONDISTDEPS_PATH, *shlex.split(requires_params)),
input=files, capture_output=True, check=False, encoding="utf-8")
print(provides_params, provides.stdout, sep=':\n', file=sys.stdout)
print(requires_params, requires.stdout, sep=':\n', file=sys.stdout)
print(provides_params, provides.stderr, sep=':\n', file=sys.stderr)
print(requires_params, requires.stderr, sep=':\n', file=sys.stderr)
if expect_failure:
if provides.returncode == 0 or requires.returncode == 0:
raise RuntimeError(f"pythondistdeps.py did not exit with a non-zero code as expected.\n"

View file

@ -1,48 +0,0 @@
---
- hosts: localhost
tags:
- classic
tasks:
- dnf:
name: "*"
state: latest
- hosts: localhost
tags:
- classic
pre_tasks:
- import_role:
name: standard-test-source
vars:
fetch_only: True
roles:
- role: standard-test-basic
tests:
- pythonabi:
dir: .
run: ./pythonabi.sh
- pythonname:
dir: .
run: ./pythonname.sh
- pythondist:
dir: .
run: ./pythondist.sh
- console_script:
dir: .
run: ./console_script.sh
- prepare-test-data:
dir: .
run: tar -xvf test-sources-*.tar.gz -C ./tests/data/scripts_pythondistdeps/
- pytest:
dir: ./tests
# Use update-test-sources.sh to update the test data
run: python3 -m pytest --capture=no -vvv
required_packages:
- rpm-build
- rpmdevtools
- python3-devel
- python3-pip
- python3-pytest
- python3-pyyaml
- python3-setuptools
- python3-wheel