Compare commits
37 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b284634b22 | ||
|
|
0bb99dc9e9 | ||
|
|
db95d6e735 | ||
|
|
03fc0de4ac | ||
|
|
91729cf8a0 | ||
|
|
02ef9fde40 | ||
|
|
223b71bb5e | ||
|
|
f3d6832f4d | ||
|
|
592400f58b | ||
|
|
52372a464c | ||
|
|
8fe27ad070 | ||
|
|
f9b21eca49 | ||
|
|
50768e7a3d | ||
|
|
e348b87fd9 | ||
|
|
47a0b37ac0 | ||
|
|
d6993270c2 | ||
|
|
2b8d03b0b1 | ||
|
|
2b230d8b53 | ||
|
|
079b71a567 | ||
|
|
279638a969 | ||
|
|
500fda1e6d | ||
|
|
1bdd94dd1d | ||
|
|
9d7ca941e7 | ||
|
|
78c739cfd1 | ||
|
|
197a88bf93 | ||
|
|
7b3e3b30de | ||
|
|
cf65060b7e | ||
|
|
0bd051d514 | ||
|
|
76e71def2c | ||
|
|
ecd2f8b3f8 | ||
|
|
e18b8c952c | ||
|
|
b1fa63bf02 | ||
|
|
fbd2f87265 | ||
|
|
2ff265d8fd | ||
|
|
2c2f8bd984 | ||
|
|
a3ad67b505 | ||
|
|
27f9733f0b |
24 changed files with 441 additions and 165 deletions
1
.fmf/version
Normal file
1
.fmf/version
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -3,3 +3,4 @@
|
||||||
/tests/__pycache__/
|
/tests/__pycache__/
|
||||||
/tests/data/scripts_pythondistdeps/usr/
|
/tests/data/scripts_pythondistdeps/usr/
|
||||||
/test-sources-2021-03-11.tar.gz
|
/test-sources-2021-03-11.tar.gz
|
||||||
|
/test-sources-2023-01-04.tar.gz
|
||||||
|
|
|
||||||
45
plan.fmf
Normal file
45
plan.fmf
Normal 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
|
||||||
|
|
@ -1,19 +1,28 @@
|
||||||
Name: python-rpm-generators
|
Name: python-rpm-generators
|
||||||
Summary: Dependency generators for Python RPMs
|
Summary: Dependency generators for Python RPMs
|
||||||
Version: 12
|
Version: 14
|
||||||
Release: 8%{?dist}
|
Release: 13%{?dist}
|
||||||
|
|
||||||
# Originally all those files were part of RPM, so license is kept here
|
Url: https://src.fedoraproject.org/rpms/python-rpm-generators
|
||||||
License: GPLv2+
|
|
||||||
Url: https://src.fedoraproject.org/python-rpm-generators
|
# Originally the following files were part of RPM, so the license is inherited: GPL-2.0-or-later
|
||||||
# Commit is the last change in following files
|
# The COPYING file is grabbed from the last commit that changed the files
|
||||||
Source0: https://raw.githubusercontent.com/rpm-software-management/rpm/102eab50b3d0d6546dfe082eac0ade21e6b3dbf1/COPYING
|
Source0: https://raw.githubusercontent.com/rpm-software-management/rpm/102eab50b3d0d6546dfe082eac0ade21e6b3dbf1/COPYING
|
||||||
Source1: python.attr
|
Source1: python.attr
|
||||||
Source2: pythondist.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
|
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
|
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
|
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
|
BuildArch: noarch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
|
|
@ -25,7 +34,7 @@ Requires: python3-packaging
|
||||||
# We have parametric macro generators, we need RPM 4.16 (4.15.90+ is 4.16 alpha)
|
# We have parametric macro generators, we need RPM 4.16 (4.15.90+ is 4.16 alpha)
|
||||||
Requires: rpm > 4.15.90-0
|
Requires: rpm > 4.15.90-0
|
||||||
# This contains the Lua functions we use:
|
# This contains the Lua functions we use:
|
||||||
Requires: python-srpm-macros >= 3.8-5
|
Requires: python-srpm-macros >= 3.10-15
|
||||||
|
|
||||||
%description -n python3-rpm-generators
|
%description -n python3-rpm-generators
|
||||||
%{summary}.
|
%{summary}.
|
||||||
|
|
@ -47,6 +56,76 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py
|
||||||
%{_rpmconfigdir}/pythonbundles.py
|
%{_rpmconfigdir}/pythonbundles.py
|
||||||
|
|
||||||
%changelog
|
%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
|
||||||
|
|
||||||
|
* Thu Jun 02 2022 Miro Hrončok <mhroncok@redhat.com> - 13-1
|
||||||
|
- https://fedoraproject.org/wiki/Changes/PythonDistPEP503ProvidesOnly
|
||||||
|
|
||||||
|
* Fri May 27 2022 Miro Hrončok <mhroncok@redhat.com> - 12-15
|
||||||
|
- Don't include all requirements with True-evaluating markers in extras subpackages
|
||||||
|
- Fixes: rhbz#2090186
|
||||||
|
|
||||||
|
* Thu Feb 10 2022 Sandro Mani <manisandro@gmail.com> - 12-14
|
||||||
|
- Add namespace option to pythodistdeps.py to allow mingw-python generatros
|
||||||
|
|
||||||
|
* Wed Jan 26 2022 Tomas Orsava <torsava@redhat.com> - 12-13
|
||||||
|
- From `python3-foo` packages automatically generate `python3.X-foo` Obsoletes
|
||||||
|
tags on CentOS/RHEL
|
||||||
|
|
||||||
|
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 12-12
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sun Dec 19 2021 Gordon Messmer <gordon.messmer@gmail.com> - 12-11
|
||||||
|
- Handle legacy version specifiers that would previously raise exceptions.
|
||||||
|
|
||||||
|
* Fri Oct 29 2021 Gordon Messmer <gordon.messmer@gmail.com> - 12-10
|
||||||
|
- Additional fix for dev releases.
|
||||||
|
|
||||||
|
* Thu Oct 28 2021 Gordon Messmer <gordon.messmer@gmail.com> - 12-9
|
||||||
|
- Sync dependency conversion with upstream pyreq2rpm.
|
||||||
|
- Improve handling of > and < operators, and != operator with prefix matching
|
||||||
|
|
||||||
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 12-8
|
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 12-8
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||||
|
|
||||||
|
|
|
||||||
14
python.attr
14
python.attr
|
|
@ -5,8 +5,10 @@
|
||||||
-- python(abi) = MAJOR.MINOR
|
-- python(abi) = MAJOR.MINOR
|
||||||
-- (Don't match against -config tools e.g. /usr/bin/python2.6-config)
|
-- (Don't match against -config tools e.g. /usr/bin/python2.6-config)
|
||||||
local path = rpm.expand('%1')
|
local path = rpm.expand('%1')
|
||||||
if path:match('/usr/bin/python%d+%.%d+$') then
|
-- Use /usr prefix by default, and /app for flatpak builds
|
||||||
local provides = path:gsub('.*/usr/bin/python(%d+%.%d+)', 'python(abi) = %1')
|
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)
|
print(provides)
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
@ -18,10 +20,12 @@
|
||||||
-- generating a line of the form:
|
-- generating a line of the form:
|
||||||
-- python(abi) = MAJOR.MINOR
|
-- python(abi) = MAJOR.MINOR
|
||||||
local path = rpm.expand('%1')
|
local path = rpm.expand('%1')
|
||||||
if path:match('/usr/lib%d*/python%d+%.%d+/.*') then
|
-- Use /usr prefix by default, and /app for flatpak builds
|
||||||
local requires = path:gsub('.*/usr/lib%d*/python(%d+%.%d+)/.*', 'python(abi) = %1')
|
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)
|
print(requires)
|
||||||
end
|
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:]]+))$
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
# This program is free software.
|
# This program is free software.
|
||||||
#
|
#
|
||||||
# It is placed in the public domain or under the CC0-1.0-Universal license,
|
# 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
|
# 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).
|
# the LGPL version 2.1 (or later) or GPL version 2 (or later).
|
||||||
|
|
@ -15,12 +15,9 @@
|
||||||
import pathlib
|
import pathlib
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# inject parse_version import to pythondistdeps
|
from packaging import requirements
|
||||||
# not the nicest API, but :/
|
|
||||||
from pkg_resources import parse_version
|
|
||||||
import pythondistdeps
|
|
||||||
pythondistdeps.parse_version = parse_version
|
|
||||||
|
|
||||||
|
import pythondistdeps
|
||||||
|
|
||||||
def generate_bundled_provides(paths, namespace):
|
def generate_bundled_provides(paths, namespace):
|
||||||
provides = set()
|
provides = set()
|
||||||
|
|
@ -38,8 +35,14 @@ def generate_bundled_provides(paths, namespace):
|
||||||
continue
|
continue
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if line:
|
if line:
|
||||||
name, _, version = line.partition('==')
|
requirement = requirements.Requirement(line)
|
||||||
name = pythondistdeps.normalize_name(name)
|
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}))"
|
bundled_name = f"bundled({namespace}({name}))"
|
||||||
python_provide = pythondistdeps.convert(bundled_name, '==', version)
|
python_provide = pythondistdeps.convert(bundled_name, '==', version)
|
||||||
provides.add(f'Provides: {python_provide}')
|
provides.add(f'Provides: {python_provide}')
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --normalized-names-provide-both --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_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)$
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,8 @@ class Distribution(PathDistribution):
|
||||||
# that it works also on previous Python/importlib_metadata versions.
|
# that it works also on previous Python/importlib_metadata versions.
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"""Return the 'Name' metadata for the distribution package."""
|
"""Return the 'Name' metadata for the distribution package or None."""
|
||||||
return self.metadata['Name']
|
return self.metadata.get('Name')
|
||||||
|
|
||||||
def _parse_py_version(self, path):
|
def _parse_py_version(self, path):
|
||||||
# Try to parse the Python version from the path the metadata
|
# Try to parse the Python version from the path the metadata
|
||||||
|
|
@ -112,10 +112,17 @@ class Distribution(PathDistribution):
|
||||||
|
|
||||||
def requirements_for_extra(self, extra):
|
def requirements_for_extra(self, extra):
|
||||||
extra_deps = []
|
extra_deps = []
|
||||||
|
# we are only interested in dependencies with extra == 'our_extra' marker
|
||||||
for req in self.requirements:
|
for req in self.requirements:
|
||||||
|
# no marker at all, nothing to evaluate
|
||||||
if not req.marker:
|
if not req.marker:
|
||||||
continue
|
continue
|
||||||
if req.marker.evaluate(get_marker_env(self, extra)):
|
# does the marker include extra == 'our_extra'?
|
||||||
|
# we can only evaluate the marker as a whole,
|
||||||
|
# so we evaluate it twice (using 2 different marker_envs)
|
||||||
|
# and see if it only evaluates to True with our extra
|
||||||
|
if (req.marker.evaluate(get_marker_env(self, extra)) and
|
||||||
|
not req.marker.evaluate(get_marker_env(self, None))):
|
||||||
extra_deps.append(req)
|
extra_deps.append(req)
|
||||||
return extra_deps
|
return extra_deps
|
||||||
|
|
||||||
|
|
@ -134,6 +141,12 @@ class RpmVersion():
|
||||||
self.pre = version._version.pre
|
self.pre = version._version.pre
|
||||||
self.dev = version._version.dev
|
self.dev = version._version.dev
|
||||||
self.post = version._version.post
|
self.post = version._version.post
|
||||||
|
# version.local is ignored as it is not expected to appear
|
||||||
|
# in public releases
|
||||||
|
# https://www.python.org/dev/peps/pep-0440/#local-version-identifiers
|
||||||
|
|
||||||
|
def is_legacy(self):
|
||||||
|
return isinstance(self.version, str)
|
||||||
|
|
||||||
def increment(self):
|
def increment(self):
|
||||||
self.version[-1] += 1
|
self.version[-1] += 1
|
||||||
|
|
@ -142,8 +155,11 @@ class RpmVersion():
|
||||||
self.post = None
|
self.post = None
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def is_zero(self):
|
||||||
|
return self.__str__() == '0'
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if isinstance(self.version, str):
|
if self.is_legacy():
|
||||||
return self.version
|
return self.version
|
||||||
if self.epoch:
|
if self.epoch:
|
||||||
rpm_epoch = str(self.epoch) + ':'
|
rpm_epoch = str(self.epoch) + ':'
|
||||||
|
|
@ -169,6 +185,11 @@ def convert_compatible(name, operator, version_id):
|
||||||
print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr)
|
print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr)
|
||||||
exit(65) # os.EX_DATAERR
|
exit(65) # os.EX_DATAERR
|
||||||
version = RpmVersion(version_id)
|
version = RpmVersion(version_id)
|
||||||
|
if version.is_legacy():
|
||||||
|
# LegacyVersions are not supported in this context
|
||||||
|
print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***")
|
||||||
|
print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr)
|
||||||
|
exit(65) # os.EX_DATAERR
|
||||||
if len(version.version) == 1:
|
if len(version.version) == 1:
|
||||||
print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***")
|
print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***")
|
||||||
print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr)
|
print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr)
|
||||||
|
|
@ -201,18 +222,32 @@ def convert_not_equal(name, operator, version_id):
|
||||||
if version_id.endswith('.*'):
|
if version_id.endswith('.*'):
|
||||||
version_id = version_id[:-2]
|
version_id = version_id[:-2]
|
||||||
version = RpmVersion(version_id)
|
version = RpmVersion(version_id)
|
||||||
lower_version = RpmVersion(version_id).increment()
|
if version.is_legacy():
|
||||||
|
# LegacyVersions are not supported in this context
|
||||||
|
print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***")
|
||||||
|
print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr)
|
||||||
|
exit(65) # os.EX_DATAERR
|
||||||
|
version_gt = RpmVersion(version_id).increment()
|
||||||
|
version_gt_operator = '>='
|
||||||
|
# Prevent dev and pre-releases from satisfying a < requirement
|
||||||
|
version = '{}~~'.format(version)
|
||||||
else:
|
else:
|
||||||
version = RpmVersion(version_id)
|
version = RpmVersion(version_id)
|
||||||
lower_version = version
|
version_gt = version
|
||||||
return '({} < {} or {} > {})'.format(
|
version_gt_operator = '>'
|
||||||
name, version, name, lower_version)
|
return '({} < {} or {} {} {})'.format(
|
||||||
|
name, version, name, version_gt_operator, version_gt)
|
||||||
|
|
||||||
|
|
||||||
def convert_ordered(name, operator, version_id):
|
def convert_ordered(name, operator, version_id):
|
||||||
if version_id.endswith('.*'):
|
if version_id.endswith('.*'):
|
||||||
# PEP 440 does not define semantics for prefix matching
|
# PEP 440 does not define semantics for prefix matching
|
||||||
# with ordered comparisons
|
# with ordered comparisons
|
||||||
|
# see: https://github.com/pypa/packaging/issues/320
|
||||||
|
# and: https://github.com/pypa/packaging/issues/321
|
||||||
|
# This style of specifier is officially "unsupported",
|
||||||
|
# even though it is processed. Support may be removed
|
||||||
|
# in version 21.0.
|
||||||
version_id = version_id[:-2]
|
version_id = version_id[:-2]
|
||||||
version = RpmVersion(version_id)
|
version = RpmVersion(version_id)
|
||||||
if operator == '>':
|
if operator == '>':
|
||||||
|
|
@ -223,6 +258,14 @@ def convert_ordered(name, operator, version_id):
|
||||||
operator = '<'
|
operator = '<'
|
||||||
else:
|
else:
|
||||||
version = RpmVersion(version_id)
|
version = RpmVersion(version_id)
|
||||||
|
# For backwards compatibility, fallback to previous behavior with LegacyVersions
|
||||||
|
if not version.is_legacy():
|
||||||
|
# Prevent dev and pre-releases from satisfying a < requirement
|
||||||
|
if operator == '<' and not version.pre and not version.dev and not version.post:
|
||||||
|
version = '{}~~'.format(version)
|
||||||
|
# Prevent post-releases from satisfying a > requirement
|
||||||
|
if operator == '>' and not version.pre and not version.dev and not version.post:
|
||||||
|
version = '{}.0'.format(version)
|
||||||
return '{} {} {}'.format(name, operator, version)
|
return '{} {} {}'.format(name, operator, version)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -293,9 +336,14 @@ def main():
|
||||||
parser.add_argument('--require-extras-subpackages', action='store_true',
|
parser.add_argument('--require-extras-subpackages', action='store_true',
|
||||||
help="If there is a dependency on a package with extras functionality, require the extras subpackage")
|
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('--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")
|
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()
|
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_abi = args.requires
|
||||||
py_deps = {}
|
py_deps = {}
|
||||||
|
|
||||||
|
|
@ -341,6 +389,8 @@ def main():
|
||||||
package_name_parts = args.package_name.rpartition('+')
|
package_name_parts = args.package_name.rpartition('+')
|
||||||
extras_subpackage = package_name_parts[2].lower() or None
|
extras_subpackage = package_name_parts[2].lower() or None
|
||||||
|
|
||||||
|
namespace = (args.namespace + "({})") if args.namespace else "{}"
|
||||||
|
|
||||||
for f in (args.files or stdin.readlines()):
|
for f in (args.files or stdin.readlines()):
|
||||||
f = f.strip()
|
f = f.strip()
|
||||||
lower = f.lower()
|
lower = f.lower()
|
||||||
|
|
@ -397,36 +447,47 @@ def main():
|
||||||
extras_suffix = f"[{extras_subpackage}]" if extras_subpackage else ""
|
extras_suffix = f"[{extras_subpackage}]" if extras_subpackage else ""
|
||||||
# If egg/dist metadata says package name is python, we provide python(abi)
|
# If egg/dist metadata says package name is python, we provide python(abi)
|
||||||
if dist.normalized_name == 'python':
|
if dist.normalized_name == 'python':
|
||||||
name = 'python(abi)'
|
name = namespace.format('python(abi)')
|
||||||
if name not in py_deps:
|
if name not in py_deps:
|
||||||
py_deps[name] = []
|
py_deps[name] = []
|
||||||
py_deps[name].append(('==', dist.py_version))
|
py_deps[name].append(('==', dist.py_version))
|
||||||
if not args.legacy or not args.majorver_only:
|
if not args.legacy or not args.majorver_only:
|
||||||
if normalized_names_provide_legacy:
|
if normalized_names_provide_legacy:
|
||||||
name = 'python{}dist({}{})'.format(dist.py_version, dist.legacy_normalized_name, extras_suffix)
|
name = namespace.format('python{}dist({}{})').format(dist.py_version, dist.legacy_normalized_name, extras_suffix)
|
||||||
if name not in py_deps:
|
if name not in py_deps:
|
||||||
py_deps[name] = []
|
py_deps[name] = []
|
||||||
if normalized_names_provide_pep503:
|
if normalized_names_provide_pep503:
|
||||||
name_ = 'python{}dist({}{})'.format(dist.py_version, dist.normalized_name, extras_suffix)
|
name_ = namespace.format('python{}dist({}{})').format(dist.py_version, dist.normalized_name, extras_suffix)
|
||||||
if name_ not in py_deps:
|
if name_ not in py_deps:
|
||||||
py_deps[name_] = []
|
py_deps[name_] = []
|
||||||
if args.majorver_provides or args.majorver_only or \
|
if args.majorver_provides or args.majorver_only or \
|
||||||
(args.majorver_provides_versions and dist.py_version in args.majorver_provides_versions):
|
(args.majorver_provides_versions and dist.py_version in args.majorver_provides_versions):
|
||||||
if normalized_names_provide_legacy:
|
if normalized_names_provide_legacy:
|
||||||
pymajor_name = 'python{}dist({}{})'.format(pyver_major, dist.legacy_normalized_name, extras_suffix)
|
pymajor_name = namespace.format('python{}dist({}{})').format(pyver_major, dist.legacy_normalized_name, extras_suffix)
|
||||||
if pymajor_name not in py_deps:
|
if pymajor_name not in py_deps:
|
||||||
py_deps[pymajor_name] = []
|
py_deps[pymajor_name] = []
|
||||||
if normalized_names_provide_pep503:
|
if normalized_names_provide_pep503:
|
||||||
pymajor_name_ = 'python{}dist({}{})'.format(pyver_major, dist.normalized_name, extras_suffix)
|
pymajor_name_ = namespace.format('python{}dist({}{})').format(pyver_major, dist.normalized_name, extras_suffix)
|
||||||
if pymajor_name_ not in py_deps:
|
if pymajor_name_ not in py_deps:
|
||||||
py_deps[pymajor_name_] = []
|
py_deps[pymajor_name_] = []
|
||||||
if args.legacy or args.legacy_provides:
|
if args.legacy or args.legacy_provides:
|
||||||
legacy_name = 'pythonegg({})({})'.format(pyver_major, dist.legacy_normalized_name)
|
legacy_name = namespace.format('pythonegg({})({})').format(pyver_major, dist.legacy_normalized_name)
|
||||||
if legacy_name not in py_deps:
|
if legacy_name not in py_deps:
|
||||||
py_deps[legacy_name] = []
|
py_deps[legacy_name] = []
|
||||||
if dist.version:
|
if dist.version:
|
||||||
version = dist.version
|
version = dist.version
|
||||||
spec = ('==', 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 normalized_names_provide_legacy:
|
||||||
if spec not in py_deps[name]:
|
if spec not in py_deps[name]:
|
||||||
|
|
@ -444,7 +505,7 @@ def main():
|
||||||
if spec not in py_deps[legacy_name]:
|
if spec not in py_deps[legacy_name]:
|
||||||
py_deps[legacy_name].append(spec)
|
py_deps[legacy_name].append(spec)
|
||||||
if args.requires or (args.recommends and dist.extras):
|
if args.requires or (args.recommends and dist.extras):
|
||||||
name = 'python(abi)'
|
name = namespace.format('python(abi)')
|
||||||
# If egg/dist metadata says package name is python, we don't add dependency on python(abi)
|
# If egg/dist metadata says package name is python, we don't add dependency on python(abi)
|
||||||
if dist.normalized_name == 'python':
|
if dist.normalized_name == 'python':
|
||||||
py_abi = False
|
py_abi = False
|
||||||
|
|
@ -491,12 +552,12 @@ def main():
|
||||||
dep_normalized_name = dep.legacy_normalized_name
|
dep_normalized_name = dep.legacy_normalized_name
|
||||||
|
|
||||||
if args.legacy:
|
if args.legacy:
|
||||||
name = 'pythonegg({})({})'.format(pyver_major, dep.legacy_normalized_name)
|
name = namespace.format('pythonegg({})({})').format(pyver_major, dep.legacy_normalized_name)
|
||||||
else:
|
else:
|
||||||
if args.majorver_only:
|
if args.majorver_only:
|
||||||
name = 'python{}dist({}{})'.format(pyver_major, dep_normalized_name, extras_suffix)
|
name = namespace.format('python{}dist({}{})').format(pyver_major, dep_normalized_name, extras_suffix)
|
||||||
else:
|
else:
|
||||||
name = 'python{}dist({}{})'.format(dist.py_version, dep_normalized_name, extras_suffix)
|
name = namespace.format('python{}dist({}{})').format(dist.py_version, dep_normalized_name, extras_suffix)
|
||||||
|
|
||||||
if dep.marker and not args.recommends and not extras_subpackage:
|
if dep.marker and not args.recommends and not extras_subpackage:
|
||||||
if not dep.marker.evaluate(get_marker_env(dist, '')):
|
if not dep.marker.evaluate(get_marker_env(dist, '')):
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,11 @@
|
||||||
%__pythonname_provides() %{lua:
|
%__pythonname_provides() %{lua:
|
||||||
local python = require 'fedora.srpm.python'
|
local python = require 'fedora.srpm.python'
|
||||||
-- this macro is called for each file in a package, the path being in %1
|
local name = rpm.expand('%{name}')
|
||||||
-- 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 evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}')
|
local evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}')
|
||||||
local provides = python.python_altprovides_once(name, evr)
|
local provides = python.python_altprovides_once(name, evr)
|
||||||
-- provides is either an array/table or nil
|
-- provides is either an array/table or nil
|
||||||
-- nil means the function was already called with the same arguments:
|
-- nil means the function was already called with the same arguments:
|
||||||
-- either with another file in %1 or manually via %py_provide
|
-- either with another file in %1 or manually via %py_provides
|
||||||
if provides then
|
if provides then
|
||||||
for i, provide in ipairs(provides) do
|
for i, provide in ipairs(provides) do
|
||||||
print(provide .. ' ')
|
print(provide .. ' ')
|
||||||
|
|
@ -16,4 +13,24 @@
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
%__pythonname_obsoletes() %{?rhel:%{lua:
|
||||||
|
-- On CentOS/RHEL we automatically generate Obsoletes tags in the form:
|
||||||
|
-- package python3-foo -> Obsoletes: python3.XY-foo
|
||||||
|
-- This provides a clean upgrade path between major versions of CentOS/RHEL.
|
||||||
|
-- In Fedora this is not needed as we don't ship ecosystem packages
|
||||||
|
-- for alternative Python interpreters.
|
||||||
|
local python = require 'fedora.srpm.python'
|
||||||
|
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
|
||||||
|
-- nil means the function was already called with the same arguments:
|
||||||
|
-- either with another file in %1 or manually via %py_provides
|
||||||
|
if obsoletes then
|
||||||
|
for i, obsolete in ipairs(obsoletes) do
|
||||||
|
print(obsolete .. ' ')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}}
|
||||||
|
|
||||||
%__pythonname_path ^/
|
%__pythonname_path ^/
|
||||||
|
|
|
||||||
7
rpminspect.yaml
Normal file
7
rpminspect.yaml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# completely disabled inspections:
|
||||||
|
inspections:
|
||||||
|
# there is no upstream and the files are changed from time to time
|
||||||
|
addedfiles: off
|
||||||
|
changedfiles: off
|
||||||
|
filesize: off
|
||||||
|
upstream: off
|
||||||
2
sources
2
sources
|
|
@ -1 +1 @@
|
||||||
SHA512 (test-sources-2021-03-11.tar.gz) = 6f34c8151625be489a6a4d56d1fd3d39b7908bd31402c9703cb65918385320dfad35f35a32920c816fb85a829f44aaf04dc1d0654ccf512e26e87e95dbf87430
|
SHA512 (test-sources-2023-01-04.tar.gz) = ca25c35970e91adeaed0873c045f4335c33b96a4ef4c56a36bfb2fd9e1d4799142cf0513abb066479fdb14d2d184b3b825c1d90119ac8e8d0e9aa1a4423701d1
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ requirementslib==1.5.11
|
||||||
distlib==0.3.0
|
distlib==0.3.0
|
||||||
packaging==20.3
|
packaging==20.3
|
||||||
pyparsing==2.4.7
|
pyparsing==2.4.7
|
||||||
plette==0.2.3
|
plette[validation]==0.2.3
|
||||||
tomlkit==0.5.11
|
tomlkit==0.5.11
|
||||||
shellingham==1.3.2
|
shellingham==1.3.2
|
||||||
six==1.14.0
|
six==1.14.0
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,4 @@ Provides: bundled(python3dist(ordered-set)) = 3.1.1
|
||||||
Provides: bundled(python3dist(packaging)) = 16.8
|
Provides: bundled(python3dist(packaging)) = 16.8
|
||||||
Provides: bundled(python3dist(pyparsing)) = 2.2.1
|
Provides: bundled(python3dist(pyparsing)) = 2.2.1
|
||||||
Provides: bundled(python3dist(six)) = 1.10
|
Provides: bundled(python3dist(six)) = 1.10
|
||||||
|
Provides: bundled(python3dist(tomli)) = 1.2.3
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
packaging==16.8
|
packaging==16.8
|
||||||
pyparsing==2.2.1
|
pyparsing==2.2.1
|
||||||
ordered-set==3.1.1
|
ordered-set==3.1.1
|
||||||
|
tomli==1.2.3;python_version<"3.11"
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
Provides: bundled(python3dist(ordered-set)) = 3.1.1
|
Provides: bundled(python3dist(ordered-set)) = 3.1.1
|
||||||
Provides: bundled(python3dist(packaging)) = 16.8
|
Provides: bundled(python3dist(packaging)) = 16.8
|
||||||
Provides: bundled(python3dist(pyparsing)) = 2.2.1
|
Provides: bundled(python3dist(pyparsing)) = 2.2.1
|
||||||
|
Provides: bundled(python3dist(tomli)) = 1.2.3
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
Metadata-Version: 2.1
|
Metadata-Version: 2.1
|
||||||
Name: pyreq2rpm.tests
|
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
|
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)
|
Author: Tomas Orsava (author of this metapackage)
|
||||||
Home-page: https://github.com/gordonmessmer/pyreq2rpm
|
Home-page: https://github.com/gordonmessmer/pyreq2rpm
|
||||||
|
|
@ -45,10 +45,8 @@ foobar43!=2.0.post1
|
||||||
foobar44<=2.4.8
|
foobar44<=2.4.8
|
||||||
foobar45<=2.4.8.0
|
foobar45<=2.4.8.0
|
||||||
foobar46<=2.4.8.1
|
foobar46<=2.4.8.1
|
||||||
foobar47<=2.4.8.*
|
|
||||||
foobar48<=2.0
|
foobar48<=2.0
|
||||||
foobar49<=2
|
foobar49<=2
|
||||||
foobar50<=2.*
|
|
||||||
foobar51<=2.4.8b5
|
foobar51<=2.4.8b5
|
||||||
foobar52<=2.0.0b5
|
foobar52<=2.0.0b5
|
||||||
foobar53<=2.4.8.post1
|
foobar53<=2.4.8.post1
|
||||||
|
|
@ -56,10 +54,8 @@ foobar54<=2.0.post1
|
||||||
foobar55<2.4.8
|
foobar55<2.4.8
|
||||||
foobar56<2.4.8.0
|
foobar56<2.4.8.0
|
||||||
foobar57<2.4.8.1
|
foobar57<2.4.8.1
|
||||||
foobar58<2.4.8.*
|
|
||||||
foobar59<2.0
|
foobar59<2.0
|
||||||
foobar60<2
|
foobar60<2
|
||||||
foobar61<2.*
|
|
||||||
foobar62<2.4.8b5
|
foobar62<2.4.8b5
|
||||||
foobar63<2.0.0b5
|
foobar63<2.0.0b5
|
||||||
foobar64<2.4.8.post1
|
foobar64<2.4.8.post1
|
||||||
|
|
@ -67,10 +63,8 @@ foobar65<2.0.post1
|
||||||
foobar66>=2.4.8
|
foobar66>=2.4.8
|
||||||
foobar67>=2.4.8.0
|
foobar67>=2.4.8.0
|
||||||
foobar68>=2.4.8.1
|
foobar68>=2.4.8.1
|
||||||
foobar69>=2.4.8.*
|
|
||||||
foobar70>=2.0
|
foobar70>=2.0
|
||||||
foobar71>=2
|
foobar71>=2
|
||||||
foobar72>=2.*
|
|
||||||
foobar73>=2.4.8b5
|
foobar73>=2.4.8b5
|
||||||
foobar74>=2.0.0b5
|
foobar74>=2.0.0b5
|
||||||
foobar75>=2.4.8.post1
|
foobar75>=2.4.8.post1
|
||||||
|
|
@ -78,10 +72,8 @@ foobar76>=2.0.post1
|
||||||
foobar77>2.4.8
|
foobar77>2.4.8
|
||||||
foobar78>2.4.8.0
|
foobar78>2.4.8.0
|
||||||
foobar79>2.4.8.1
|
foobar79>2.4.8.1
|
||||||
foobar80>2.4.8.*
|
|
||||||
foobar81>2.0
|
foobar81>2.0
|
||||||
foobar82>2
|
foobar82>2
|
||||||
foobar83>2.*
|
|
||||||
foobar84>2.4.8b5
|
foobar84>2.4.8b5
|
||||||
foobar85>2.0.0b5
|
foobar85>2.0.0b5
|
||||||
foobar86>2.4.8.post1
|
foobar86>2.4.8.post1
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
python2.7dist(setuptools) >= 21
|
python2.7dist(setuptools) >= 21
|
||||||
python2.7dist(six) >= 1.9
|
python2.7dist(six) >= 1.9
|
||||||
python2.7dist(urllib3) >= 1.24.2
|
python2.7dist(urllib3) >= 1.24.2
|
||||||
((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41 or python2.7dist(websocket-client) > 0.42) with (python2.7dist(websocket-client) < 0.42 or python2.7dist(websocket-client) > 0.43) with python2.7dist(websocket-client) >= 0.32)
|
((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32)
|
||||||
usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info:
|
usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info:
|
||||||
provides: |-
|
provides: |-
|
||||||
python2.7dist(mistune) = 0.8.4
|
python2.7dist(mistune) = 0.8.4
|
||||||
|
|
@ -75,12 +75,12 @@
|
||||||
python2dist(tox) = 3.14
|
python2dist(tox) = 3.14
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 2.7
|
python(abi) = 2.7
|
||||||
(python2.7dist(filelock) < 4 with python2.7dist(filelock) >= 3)
|
(python2.7dist(filelock) < 4~~ with python2.7dist(filelock) >= 3)
|
||||||
(python2.7dist(importlib-metadata) < 1 with python2.7dist(importlib-metadata) >= 0.12)
|
(python2.7dist(importlib-metadata) < 1~~ with python2.7dist(importlib-metadata) >= 0.12)
|
||||||
python2.7dist(packaging) >= 14
|
python2.7dist(packaging) >= 14
|
||||||
(python2.7dist(pluggy) < 1 with python2.7dist(pluggy) >= 0.12)
|
(python2.7dist(pluggy) < 1~~ with python2.7dist(pluggy) >= 0.12)
|
||||||
(python2.7dist(py) < 2 with python2.7dist(py) >= 1.4.17)
|
(python2.7dist(py) < 2~~ with python2.7dist(py) >= 1.4.17)
|
||||||
(python2.7dist(six) < 2 with python2.7dist(six) >= 1)
|
(python2.7dist(six) < 2~~ with python2.7dist(six) >= 1)
|
||||||
python2.7dist(toml) >= 0.9.4
|
python2.7dist(toml) >= 0.9.4
|
||||||
python2.7dist(virtualenv) >= 14
|
python2.7dist(virtualenv) >= 14
|
||||||
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
|
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
|
||||||
|
|
@ -105,7 +105,7 @@
|
||||||
python(abi) = 3.7
|
python(abi) = 3.7
|
||||||
(python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5)
|
(python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5)
|
||||||
(python3.7dist(six) >= 1.12 with python3.7dist(six) < 2)
|
(python3.7dist(six) >= 1.12 with python3.7dist(six) < 2)
|
||||||
(python3.7dist(typed-ast) < 1.5 with python3.7dist(typed-ast) >= 1.4)
|
(python3.7dist(typed-ast) < 1.5~~ with python3.7dist(typed-ast) >= 1.4)
|
||||||
(python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12)
|
(python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12)
|
||||||
usr/lib/python3.7/site-packages/packaging-19.0.dist-info:
|
usr/lib/python3.7/site-packages/packaging-19.0.dist-info:
|
||||||
provides: |-
|
provides: |-
|
||||||
|
|
@ -148,12 +148,12 @@
|
||||||
python3dist(tox) = 3.14
|
python3dist(tox) = 3.14
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 3.7
|
python(abi) = 3.7
|
||||||
(python3.7dist(filelock) < 4 with python3.7dist(filelock) >= 3)
|
(python3.7dist(filelock) < 4~~ with python3.7dist(filelock) >= 3)
|
||||||
(python3.7dist(importlib-metadata) < 1 with python3.7dist(importlib-metadata) >= 0.12)
|
(python3.7dist(importlib-metadata) < 1~~ with python3.7dist(importlib-metadata) >= 0.12)
|
||||||
python3.7dist(packaging) >= 14
|
python3.7dist(packaging) >= 14
|
||||||
(python3.7dist(pluggy) < 1 with python3.7dist(pluggy) >= 0.12)
|
(python3.7dist(pluggy) < 1~~ with python3.7dist(pluggy) >= 0.12)
|
||||||
(python3.7dist(py) < 2 with python3.7dist(py) >= 1.4.17)
|
(python3.7dist(py) < 2~~ with python3.7dist(py) >= 1.4.17)
|
||||||
(python3.7dist(six) < 2 with python3.7dist(six) >= 1)
|
(python3.7dist(six) < 2~~ with python3.7dist(six) >= 1)
|
||||||
python3.7dist(toml) >= 0.9.4
|
python3.7dist(toml) >= 0.9.4
|
||||||
python3.7dist(virtualenv) >= 14
|
python3.7dist(virtualenv) >= 14
|
||||||
usr/lib/python3.9/site-packages/astroid-2.3.3.dist-info:
|
usr/lib/python3.9/site-packages/astroid-2.3.3.dist-info:
|
||||||
|
|
@ -205,7 +205,7 @@
|
||||||
python3.9dist(setuptools) >= 21
|
python3.9dist(setuptools) >= 21
|
||||||
python3.9dist(six) >= 1.9
|
python3.9dist(six) >= 1.9
|
||||||
python3.9dist(urllib3) >= 1.24.2
|
python3.9dist(urllib3) >= 1.24.2
|
||||||
((python3.9dist(websocket-client) < 0.40 or python3.9dist(websocket-client) > 0.40) with (python3.9dist(websocket-client) < 0.41 or python3.9dist(websocket-client) > 0.42) with (python3.9dist(websocket-client) < 0.42 or python3.9dist(websocket-client) > 0.43) with python3.9dist(websocket-client) >= 0.32)
|
((python3.9dist(websocket-client) < 0.40 or python3.9dist(websocket-client) > 0.40) with (python3.9dist(websocket-client) < 0.41~~ or python3.9dist(websocket-client) >= 0.42) with (python3.9dist(websocket-client) < 0.42~~ or python3.9dist(websocket-client) >= 0.43) with python3.9dist(websocket-client) >= 0.32)
|
||||||
usr/lib/python3.9/site-packages/mistune-0.8.4-py3.9.egg-info:
|
usr/lib/python3.9/site-packages/mistune-0.8.4-py3.9.egg-info:
|
||||||
provides: |-
|
provides: |-
|
||||||
python3.9dist(mistune) = 0.8.4
|
python3.9dist(mistune) = 0.8.4
|
||||||
|
|
@ -260,11 +260,11 @@
|
||||||
python3dist(tox) = 3.14
|
python3dist(tox) = 3.14
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 3.9
|
python(abi) = 3.9
|
||||||
(python3.9dist(filelock) < 4 with python3.9dist(filelock) >= 3)
|
(python3.9dist(filelock) < 4~~ with python3.9dist(filelock) >= 3)
|
||||||
python3.9dist(packaging) >= 14
|
python3.9dist(packaging) >= 14
|
||||||
(python3.9dist(pluggy) < 1 with python3.9dist(pluggy) >= 0.12)
|
(python3.9dist(pluggy) < 1~~ with python3.9dist(pluggy) >= 0.12)
|
||||||
(python3.9dist(py) < 2 with python3.9dist(py) >= 1.4.17)
|
(python3.9dist(py) < 2~~ with python3.9dist(py) >= 1.4.17)
|
||||||
(python3.9dist(six) < 2 with python3.9dist(six) >= 1)
|
(python3.9dist(six) < 2~~ with python3.9dist(six) >= 1)
|
||||||
python3.9dist(toml) >= 0.9.4
|
python3.9dist(toml) >= 0.9.4
|
||||||
python3.9dist(virtualenv) >= 14
|
python3.9dist(virtualenv) >= 14
|
||||||
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
|
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
|
||||||
|
|
@ -437,7 +437,7 @@
|
||||||
python2.7dist(setuptools) >= 21
|
python2.7dist(setuptools) >= 21
|
||||||
python2.7dist(six) >= 1.9
|
python2.7dist(six) >= 1.9
|
||||||
python2.7dist(urllib3) >= 1.24.2
|
python2.7dist(urllib3) >= 1.24.2
|
||||||
((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41 or python2.7dist(websocket-client) > 0.42) with (python2.7dist(websocket-client) < 0.42 or python2.7dist(websocket-client) > 0.43) with python2.7dist(websocket-client) >= 0.32)
|
((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32)
|
||||||
usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info:
|
usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info:
|
||||||
provides: |-
|
provides: |-
|
||||||
python2.7dist(mistune) = 0.8.4
|
python2.7dist(mistune) = 0.8.4
|
||||||
|
|
@ -489,7 +489,7 @@
|
||||||
python(abi) = 3.7
|
python(abi) = 3.7
|
||||||
(python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5)
|
(python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5)
|
||||||
(python3.7dist(six) >= 1.12 with python3.7dist(six) < 2)
|
(python3.7dist(six) >= 1.12 with python3.7dist(six) < 2)
|
||||||
(python3.7dist(typed-ast) < 1.5 with python3.7dist(typed-ast) >= 1.4)
|
(python3.7dist(typed-ast) < 1.5~~ with python3.7dist(typed-ast) >= 1.4)
|
||||||
(python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12)
|
(python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12)
|
||||||
usr/lib/python3.7/site-packages/packaging-19.0.dist-info:
|
usr/lib/python3.7/site-packages/packaging-19.0.dist-info:
|
||||||
provides: python3.7dist(packaging) = 19
|
provides: python3.7dist(packaging) = 19
|
||||||
|
|
@ -554,11 +554,11 @@
|
||||||
python3dist(tox) = 3.14
|
python3dist(tox) = 3.14
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 3.9
|
python(abi) = 3.9
|
||||||
(python3.9dist(filelock) < 4 with python3.9dist(filelock) >= 3)
|
(python3.9dist(filelock) < 4~~ with python3.9dist(filelock) >= 3)
|
||||||
python3.9dist(packaging) >= 14
|
python3.9dist(packaging) >= 14
|
||||||
(python3.9dist(pluggy) < 1 with python3.9dist(pluggy) >= 0.12)
|
(python3.9dist(pluggy) < 1~~ with python3.9dist(pluggy) >= 0.12)
|
||||||
(python3.9dist(py) < 2 with python3.9dist(py) >= 1.4.17)
|
(python3.9dist(py) < 2~~ with python3.9dist(py) >= 1.4.17)
|
||||||
(python3.9dist(six) < 2 with python3.9dist(six) >= 1)
|
(python3.9dist(six) < 2~~ with python3.9dist(six) >= 1)
|
||||||
python3.9dist(toml) >= 0.9.4
|
python3.9dist(toml) >= 0.9.4
|
||||||
python3.9dist(virtualenv) >= 14
|
python3.9dist(virtualenv) >= 14
|
||||||
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
|
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
|
||||||
|
|
@ -611,12 +611,12 @@
|
||||||
python2dist(tox) = 3.14
|
python2dist(tox) = 3.14
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 2.7
|
python(abi) = 2.7
|
||||||
(python2.7dist(filelock) < 4 with python2.7dist(filelock) >= 3)
|
(python2.7dist(filelock) < 4~~ with python2.7dist(filelock) >= 3)
|
||||||
(python2.7dist(importlib-metadata) < 1 with python2.7dist(importlib-metadata) >= 0.12)
|
(python2.7dist(importlib-metadata) < 1~~ with python2.7dist(importlib-metadata) >= 0.12)
|
||||||
python2.7dist(packaging) >= 14
|
python2.7dist(packaging) >= 14
|
||||||
(python2.7dist(pluggy) < 1 with python2.7dist(pluggy) >= 0.12)
|
(python2.7dist(pluggy) < 1~~ with python2.7dist(pluggy) >= 0.12)
|
||||||
(python2.7dist(py) < 2 with python2.7dist(py) >= 1.4.17)
|
(python2.7dist(py) < 2~~ with python2.7dist(py) >= 1.4.17)
|
||||||
(python2.7dist(six) < 2 with python2.7dist(six) >= 1)
|
(python2.7dist(six) < 2~~ with python2.7dist(six) >= 1)
|
||||||
python2.7dist(toml) >= 0.9.4
|
python2.7dist(toml) >= 0.9.4
|
||||||
python2.7dist(virtualenv) >= 14
|
python2.7dist(virtualenv) >= 14
|
||||||
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
|
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
|
||||||
|
|
@ -653,12 +653,12 @@
|
||||||
provides: python3.7dist(tox) = 3.14
|
provides: python3.7dist(tox) = 3.14
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 3.7
|
python(abi) = 3.7
|
||||||
(python3.7dist(filelock) < 4 with python3.7dist(filelock) >= 3)
|
(python3.7dist(filelock) < 4~~ with python3.7dist(filelock) >= 3)
|
||||||
(python3.7dist(importlib-metadata) < 1 with python3.7dist(importlib-metadata) >= 0.12)
|
(python3.7dist(importlib-metadata) < 1~~ with python3.7dist(importlib-metadata) >= 0.12)
|
||||||
python3.7dist(packaging) >= 14
|
python3.7dist(packaging) >= 14
|
||||||
(python3.7dist(pluggy) < 1 with python3.7dist(pluggy) >= 0.12)
|
(python3.7dist(pluggy) < 1~~ with python3.7dist(pluggy) >= 0.12)
|
||||||
(python3.7dist(py) < 2 with python3.7dist(py) >= 1.4.17)
|
(python3.7dist(py) < 2~~ with python3.7dist(py) >= 1.4.17)
|
||||||
(python3.7dist(six) < 2 with python3.7dist(six) >= 1)
|
(python3.7dist(six) < 2~~ with python3.7dist(six) >= 1)
|
||||||
python3.7dist(toml) >= 0.9.4
|
python3.7dist(toml) >= 0.9.4
|
||||||
python3.7dist(virtualenv) >= 14
|
python3.7dist(virtualenv) >= 14
|
||||||
usr/lib64/python2.7/site-packages/scipy-1.2.1.dist-info:
|
usr/lib64/python2.7/site-packages/scipy-1.2.1.dist-info:
|
||||||
|
|
@ -762,6 +762,14 @@
|
||||||
python3.9dist(simplejson) = 3.16
|
python3.9dist(simplejson) = 3.16
|
||||||
python3dist(simplejson) = 3.16
|
python3dist(simplejson) = 3.16
|
||||||
requires: python(abi) = 3.9
|
requires: python(abi) = 3.9
|
||||||
|
--requires --namespace mingw64:
|
||||||
|
--provides --namespace mingw64:
|
||||||
|
usr/lib/python3.9/site-packages/taskotron_python_versions-0.1.dev6.dist-info:
|
||||||
|
provides: mingw64(python3.9dist(taskotron-python-versions)) = 0.1~~dev6
|
||||||
|
requires: |-
|
||||||
|
mingw64(python(abi)) = 3.9
|
||||||
|
mingw64(python3.9dist(libarchive-c))
|
||||||
|
mingw64(python3.9dist(python-bugzilla))
|
||||||
--requires --console-scripts-nodep-setuptools-since 3.7:
|
--requires --console-scripts-nodep-setuptools-since 3.7:
|
||||||
--provides --console-scripts-nodep-setuptools-since 3.6:
|
--provides --console-scripts-nodep-setuptools-since 3.6:
|
||||||
usr/lib/python3.9/site-packages/zope.component-4.3.0-py3.9.egg-info:
|
usr/lib/python3.9/site-packages/zope.component-4.3.0-py3.9.egg-info:
|
||||||
|
|
@ -1216,8 +1224,8 @@
|
||||||
stdout:
|
stdout:
|
||||||
provides: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***'
|
provides: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***'
|
||||||
requires: '*** 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:
|
pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info:
|
||||||
provides: python3.9dist(pyreq2rpm-tests) = 2020.04.07.024dab0
|
provides: python3.9dist(pyreq2rpm-tests) = 2020.4.7.24
|
||||||
requires: |-
|
requires: |-
|
||||||
python(abi) = 3.9
|
python(abi) = 3.9
|
||||||
((python3.9dist(babel) < 2 or python3.9dist(babel) > 2) with python3.9dist(babel) >= 1.3)
|
((python3.9dist(babel) < 2 or python3.9dist(babel) > 2) with python3.9dist(babel) >= 1.3)
|
||||||
|
|
@ -1251,10 +1259,10 @@
|
||||||
(python3.9dist(foobar33) < 2.4.8 or python3.9dist(foobar33) > 2.4.8)
|
(python3.9dist(foobar33) < 2.4.8 or python3.9dist(foobar33) > 2.4.8)
|
||||||
(python3.9dist(foobar34) < 2.4.8 or python3.9dist(foobar34) > 2.4.8)
|
(python3.9dist(foobar34) < 2.4.8 or python3.9dist(foobar34) > 2.4.8)
|
||||||
(python3.9dist(foobar35) < 2.4.8.1 or python3.9dist(foobar35) > 2.4.8.1)
|
(python3.9dist(foobar35) < 2.4.8.1 or python3.9dist(foobar35) > 2.4.8.1)
|
||||||
(python3.9dist(foobar36) < 2.4.8 or python3.9dist(foobar36) > 2.4.9)
|
(python3.9dist(foobar36) < 2.4.8~~ or python3.9dist(foobar36) >= 2.4.9)
|
||||||
(python3.9dist(foobar37) < 2 or python3.9dist(foobar37) > 2)
|
(python3.9dist(foobar37) < 2 or python3.9dist(foobar37) > 2)
|
||||||
(python3.9dist(foobar38) < 2 or python3.9dist(foobar38) > 2)
|
(python3.9dist(foobar38) < 2 or python3.9dist(foobar38) > 2)
|
||||||
(python3.9dist(foobar39) < 2 or python3.9dist(foobar39) > 3)
|
(python3.9dist(foobar39) < 2~~ or python3.9dist(foobar39) >= 3)
|
||||||
(python3.9dist(foobar4) >= 2 with python3.9dist(foobar4) < 3)
|
(python3.9dist(foobar4) >= 2 with python3.9dist(foobar4) < 3)
|
||||||
(python3.9dist(foobar40) < 2.4.8~b5 or python3.9dist(foobar40) > 2.4.8~b5)
|
(python3.9dist(foobar40) < 2.4.8~b5 or python3.9dist(foobar40) > 2.4.8~b5)
|
||||||
(python3.9dist(foobar41) < 2~b5 or python3.9dist(foobar41) > 2~b5)
|
(python3.9dist(foobar41) < 2~b5 or python3.9dist(foobar41) > 2~b5)
|
||||||
|
|
@ -1263,21 +1271,17 @@
|
||||||
python3.9dist(foobar44) <= 2.4.8
|
python3.9dist(foobar44) <= 2.4.8
|
||||||
python3.9dist(foobar45) <= 2.4.8
|
python3.9dist(foobar45) <= 2.4.8
|
||||||
python3.9dist(foobar46) <= 2.4.8.1
|
python3.9dist(foobar46) <= 2.4.8.1
|
||||||
python3.9dist(foobar47) < 2.4.8
|
|
||||||
python3.9dist(foobar48) <= 2
|
python3.9dist(foobar48) <= 2
|
||||||
python3.9dist(foobar49) <= 2
|
python3.9dist(foobar49) <= 2
|
||||||
python3.9dist(foobar50) < 2
|
|
||||||
python3.9dist(foobar51) <= 2.4.8~b5
|
python3.9dist(foobar51) <= 2.4.8~b5
|
||||||
python3.9dist(foobar52) <= 2~b5
|
python3.9dist(foobar52) <= 2~b5
|
||||||
python3.9dist(foobar53) <= 2.4.8^post1
|
python3.9dist(foobar53) <= 2.4.8^post1
|
||||||
python3.9dist(foobar54) <= 2^post1
|
python3.9dist(foobar54) <= 2^post1
|
||||||
python3.9dist(foobar55) < 2.4.8
|
python3.9dist(foobar55) < 2.4.8~~
|
||||||
python3.9dist(foobar56) < 2.4.8
|
python3.9dist(foobar56) < 2.4.8~~
|
||||||
python3.9dist(foobar57) < 2.4.8.1
|
python3.9dist(foobar57) < 2.4.8.1~~
|
||||||
python3.9dist(foobar58) < 2.4.8
|
python3.9dist(foobar59) < 2~~
|
||||||
python3.9dist(foobar59) < 2
|
python3.9dist(foobar60) < 2~~
|
||||||
python3.9dist(foobar60) < 2
|
|
||||||
python3.9dist(foobar61) < 2
|
|
||||||
python3.9dist(foobar62) < 2.4.8~b5
|
python3.9dist(foobar62) < 2.4.8~b5
|
||||||
python3.9dist(foobar63) < 2~b5
|
python3.9dist(foobar63) < 2~b5
|
||||||
python3.9dist(foobar64) < 2.4.8^post1
|
python3.9dist(foobar64) < 2.4.8^post1
|
||||||
|
|
@ -1285,23 +1289,19 @@
|
||||||
python3.9dist(foobar66) >= 2.4.8
|
python3.9dist(foobar66) >= 2.4.8
|
||||||
python3.9dist(foobar67) >= 2.4.8
|
python3.9dist(foobar67) >= 2.4.8
|
||||||
python3.9dist(foobar68) >= 2.4.8.1
|
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(foobar7) >= 2.4.8~b5 with python3.9dist(foobar7) < 2.5)
|
||||||
python3.9dist(foobar70) >= 2
|
python3.9dist(foobar70) >= 2
|
||||||
python3.9dist(foobar71) >= 2
|
python3.9dist(foobar71) >= 2
|
||||||
python3.9dist(foobar72) >= 2
|
|
||||||
python3.9dist(foobar73) >= 2.4.8~b5
|
python3.9dist(foobar73) >= 2.4.8~b5
|
||||||
python3.9dist(foobar74) >= 2~b5
|
python3.9dist(foobar74) >= 2~b5
|
||||||
python3.9dist(foobar75) >= 2.4.8^post1
|
python3.9dist(foobar75) >= 2.4.8^post1
|
||||||
python3.9dist(foobar76) >= 2^post1
|
python3.9dist(foobar76) >= 2^post1
|
||||||
python3.9dist(foobar77) > 2.4.8
|
python3.9dist(foobar77) > 2.4.8.0
|
||||||
python3.9dist(foobar78) > 2.4.8
|
python3.9dist(foobar78) > 2.4.8.0
|
||||||
python3.9dist(foobar79) > 2.4.8.1
|
python3.9dist(foobar79) > 2.4.8.1.0
|
||||||
(python3.9dist(foobar8) >= 2~b5 with python3.9dist(foobar8) < 2.1)
|
(python3.9dist(foobar8) >= 2~b5 with python3.9dist(foobar8) < 2.1)
|
||||||
python3.9dist(foobar80) >= 2.4.8
|
python3.9dist(foobar81) > 2.0
|
||||||
python3.9dist(foobar81) > 2
|
python3.9dist(foobar82) > 2.0
|
||||||
python3.9dist(foobar82) > 2
|
|
||||||
python3.9dist(foobar83) >= 2
|
|
||||||
python3.9dist(foobar84) > 2.4.8~b5
|
python3.9dist(foobar84) > 2.4.8~b5
|
||||||
python3.9dist(foobar85) > 2~b5
|
python3.9dist(foobar85) > 2~b5
|
||||||
python3.9dist(foobar86) > 2.4.8^post1
|
python3.9dist(foobar86) > 2.4.8^post1
|
||||||
|
|
@ -1345,4 +1345,48 @@
|
||||||
python3.9dist(zope-component[security])
|
python3.9dist(zope-component[security])
|
||||||
python3.9dist(zope-component[zcml])
|
python3.9dist(zope-component[zcml])
|
||||||
python3.9dist(zope-testing)
|
python3.9dist(zope-testing)
|
||||||
|
--requires --normalized-names-format pep503 --require-extras-subpackages --package-name python3-build+virtualenv:
|
||||||
|
--provides --majorver-provides --normalized-names-format pep503 --package-name python3-build+virtualenv:
|
||||||
|
usr/lib/python3.10/site-packages/build-0.8.0.dist-info:
|
||||||
|
provides: |-
|
||||||
|
python3.10dist(build[virtualenv]) = 0.8
|
||||||
|
python3dist(build[virtualenv]) = 0.8
|
||||||
|
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)
|
||||||
|
|
|
||||||
|
|
@ -100,3 +100,10 @@ dnspython:
|
||||||
'2.1.0': ['3.9']
|
'2.1.0': ['3.9']
|
||||||
wheel:
|
wheel:
|
||||||
'2.1.0': ['3.9']
|
'2.1.0': ['3.9']
|
||||||
|
build:
|
||||||
|
wheel:
|
||||||
|
'0.8.0': ['3.10']
|
||||||
|
importlib_metadata:
|
||||||
|
sdist:
|
||||||
|
'0.0': ['3.11']
|
||||||
|
'0.1': ['3.11']
|
||||||
|
|
|
||||||
15
tests/download_data_and_run_pytest.sh
Executable file
15
tests/download_data_and_run_pytest.sh
Executable 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
|
||||||
|
|
@ -8,9 +8,9 @@ spectool -g -R pythondist.spec
|
||||||
rpmbuild -ba pythondist.spec
|
rpmbuild -ba pythondist.spec
|
||||||
|
|
||||||
|
|
||||||
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)'
|
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)'
|
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)'
|
||||||
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope\.component)'
|
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope-component)'
|
rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope-component)'
|
||||||
|
|
||||||
rpm -qp --requires ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope-event)'
|
rpm -qp --requires ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope-event)'
|
||||||
|
|
@ -19,7 +19,7 @@ rpm -qp --requires ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^
|
||||||
|
|
||||||
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true
|
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope\.component)'
|
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-component)'
|
rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-component)'
|
||||||
|
|
||||||
rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-event)'
|
rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-event)'
|
||||||
|
|
@ -28,7 +28,7 @@ rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep
|
||||||
if [ "$X_Y" != "3.9" ]; then
|
if [ "$X_Y" != "3.9" ]; then
|
||||||
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true
|
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope\.component)'
|
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-component)'
|
rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-component)'
|
||||||
|
|
||||||
rpm -qp --requires ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-event)'
|
rpm -qp --requires ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-event)'
|
||||||
|
|
@ -38,7 +38,7 @@ fi
|
||||||
if [ "$X_Y" != "3.10" ]; then
|
if [ "$X_Y" != "3.10" ]; then
|
||||||
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true
|
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope\.component)'
|
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope\.component)' && exit 1 || true
|
||||||
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-component)'
|
rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-component)'
|
||||||
|
|
||||||
rpm -qp --requires ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-event)'
|
rpm -qp --requires ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-event)'
|
||||||
|
|
|
||||||
|
|
@ -34,3 +34,43 @@ test $(rpm -qp --provides ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep
|
||||||
echo "Provides for python3-py_provides"
|
echo "Provides for python3-py_provides"
|
||||||
rpm -qp --provides ${RPMDIR}/python3-py_provides-0-0.noarch.rpm
|
rpm -qp --provides ${RPMDIR}/python3-py_provides-0-0.noarch.rpm
|
||||||
test $(rpm -qp --provides ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep python-py_provides | wc -l) -eq 1
|
test $(rpm -qp --provides ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep python-py_provides | wc -l) -eq 1
|
||||||
|
|
||||||
|
|
||||||
|
echo "Obsoletes for python${X_Y}-foo"
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python${X_Y}-foo-0-0.noarch.rpm
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python${X_Y}-foo-0-0.noarch.rpm | wc -l) -eq 0
|
||||||
|
|
||||||
|
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}'-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"
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python2-foo-0-0.noarch.rpm
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python2-foo-0-0.noarch.rpm | wc -l) -eq 0
|
||||||
|
|
||||||
|
echo "Obsoletes for python-foo"
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python-foo-0-0.noarch.rpm
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python-foo-0-0.noarch.rpm | wc -l) -eq 0
|
||||||
|
|
||||||
|
echo "Obsoletes for python3.5-foo"
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3.5-foo-0-0.noarch.rpm
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python3.5-foo-0-0.noarch.rpm | wc -l) -eq 0
|
||||||
|
|
||||||
|
echo "Obsoletes for python3-python_provide"
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm
|
||||||
|
# The deprecated %python_provide macro always obsoletes python-foo
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep -q '^python-python_provide < 0-0$'
|
||||||
|
# In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly.
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep -q '^python'${X_Y}'-python_provide < 0-0$' && exit 1 || true
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep python-python_provide | wc -l) -eq 1
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | wc -l) -eq 1
|
||||||
|
|
||||||
|
echo "Obsoletes for python3-py_provides"
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep -q '^python-py_provides < 0-0$' && exit 1 || true
|
||||||
|
# In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly.
|
||||||
|
rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep -q '^python'${X_Y}'-py_provides < 0-0$' && exit 1 || true
|
||||||
|
test $(rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | wc -l) -eq 0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)),
|
requires = subprocess.run((sys.executable, PYTHONDISTDEPS_PATH, *shlex.split(requires_params)),
|
||||||
input=files, capture_output=True, check=False, encoding="utf-8")
|
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 expect_failure:
|
||||||
if provides.returncode == 0 or requires.returncode == 0:
|
if provides.returncode == 0 or requires.returncode == 0:
|
||||||
raise RuntimeError(f"pythondistdeps.py did not exit with a non-zero code as expected.\n"
|
raise RuntimeError(f"pythondistdeps.py did not exit with a non-zero code as expected.\n"
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue