Sync dependency conversion with upstream pyreq2rpm.

Improve handling of > operator, preventing post-release from satisfying most rpm requirements.
Improve handling of < operator, preventing pre-release from satisfying rpm requirement.
Improve handling of != operator with prefix matching, preventing pre-release from satisfying rpm requirements.
This commit is contained in:
Gordon Messmer 2021-10-22 16:41:44 -07:00
parent 98fa009fc8
commit 27f9733f0b
3 changed files with 76 additions and 54 deletions

View File

@ -1,7 +1,7 @@
Name: python-rpm-generators
Summary: Dependency generators for Python RPMs
Version: 12
Release: 8%{?dist}
Release: 9%{?dist}
# Originally all those files were part of RPM, so license is kept here
License: GPLv2+
@ -47,6 +47,10 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py
%{_rpmconfigdir}/pythonbundles.py
%changelog
* 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
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild

View File

@ -134,6 +134,9 @@ class RpmVersion():
self.pre = version._version.pre
self.dev = version._version.dev
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 increment(self):
self.version[-1] += 1
@ -201,18 +204,27 @@ def convert_not_equal(name, operator, version_id):
if version_id.endswith('.*'):
version_id = version_id[:-2]
version = RpmVersion(version_id)
lower_version = RpmVersion(version_id).increment()
version_gt = RpmVersion(version_id).increment()
version_gt_operator = '>='
# Prevent pre-releases from satisfying a < requirement
version = '{}~'.format(version)
else:
version = RpmVersion(version_id)
lower_version = version
return '({} < {} or {} > {})'.format(
name, version, name, lower_version)
version_gt = version
version_gt_operator = '>'
return '({} < {} or {} {} {})'.format(
name, version, name, version_gt_operator, version_gt)
def convert_ordered(name, operator, version_id):
if version_id.endswith('.*'):
# PEP 440 does not define semantics for prefix matching
# 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 = RpmVersion(version_id)
if operator == '>':
@ -223,6 +235,12 @@ def convert_ordered(name, operator, version_id):
operator = '<'
else:
version = RpmVersion(version_id)
# Prevent 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)

View File

@ -28,7 +28,7 @@
python2.7dist(setuptools) >= 21
python2.7dist(six) >= 1.9
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:
provides: |-
python2.7dist(mistune) = 0.8.4
@ -75,12 +75,12 @@
python2dist(tox) = 3.14
requires: |-
python(abi) = 2.7
(python2.7dist(filelock) < 4 with python2.7dist(filelock) >= 3)
(python2.7dist(importlib-metadata) < 1 with python2.7dist(importlib-metadata) >= 0.12)
(python2.7dist(filelock) < 4~ with python2.7dist(filelock) >= 3)
(python2.7dist(importlib-metadata) < 1~ with python2.7dist(importlib-metadata) >= 0.12)
python2.7dist(packaging) >= 14
(python2.7dist(pluggy) < 1 with python2.7dist(pluggy) >= 0.12)
(python2.7dist(py) < 2 with python2.7dist(py) >= 1.4.17)
(python2.7dist(six) < 2 with python2.7dist(six) >= 1)
(python2.7dist(pluggy) < 1~ with python2.7dist(pluggy) >= 0.12)
(python2.7dist(py) < 2~ with python2.7dist(py) >= 1.4.17)
(python2.7dist(six) < 2~ with python2.7dist(six) >= 1)
python2.7dist(toml) >= 0.9.4
python2.7dist(virtualenv) >= 14
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
@ -105,7 +105,7 @@
python(abi) = 3.7
(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(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)
usr/lib/python3.7/site-packages/packaging-19.0.dist-info:
provides: |-
@ -148,12 +148,12 @@
python3dist(tox) = 3.14
requires: |-
python(abi) = 3.7
(python3.7dist(filelock) < 4 with python3.7dist(filelock) >= 3)
(python3.7dist(importlib-metadata) < 1 with python3.7dist(importlib-metadata) >= 0.12)
(python3.7dist(filelock) < 4~ with python3.7dist(filelock) >= 3)
(python3.7dist(importlib-metadata) < 1~ with python3.7dist(importlib-metadata) >= 0.12)
python3.7dist(packaging) >= 14
(python3.7dist(pluggy) < 1 with python3.7dist(pluggy) >= 0.12)
(python3.7dist(py) < 2 with python3.7dist(py) >= 1.4.17)
(python3.7dist(six) < 2 with python3.7dist(six) >= 1)
(python3.7dist(pluggy) < 1~ with python3.7dist(pluggy) >= 0.12)
(python3.7dist(py) < 2~ with python3.7dist(py) >= 1.4.17)
(python3.7dist(six) < 2~ with python3.7dist(six) >= 1)
python3.7dist(toml) >= 0.9.4
python3.7dist(virtualenv) >= 14
usr/lib/python3.9/site-packages/astroid-2.3.3.dist-info:
@ -205,7 +205,7 @@
python3.9dist(setuptools) >= 21
python3.9dist(six) >= 1.9
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:
provides: |-
python3.9dist(mistune) = 0.8.4
@ -260,11 +260,11 @@
python3dist(tox) = 3.14
requires: |-
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(pluggy) < 1 with python3.9dist(pluggy) >= 0.12)
(python3.9dist(py) < 2 with python3.9dist(py) >= 1.4.17)
(python3.9dist(six) < 2 with python3.9dist(six) >= 1)
(python3.9dist(pluggy) < 1~ with python3.9dist(pluggy) >= 0.12)
(python3.9dist(py) < 2~ with python3.9dist(py) >= 1.4.17)
(python3.9dist(six) < 2~ with python3.9dist(six) >= 1)
python3.9dist(toml) >= 0.9.4
python3.9dist(virtualenv) >= 14
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
@ -437,7 +437,7 @@
python2.7dist(setuptools) >= 21
python2.7dist(six) >= 1.9
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:
provides: |-
python2.7dist(mistune) = 0.8.4
@ -489,7 +489,7 @@
python(abi) = 3.7
(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(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)
usr/lib/python3.7/site-packages/packaging-19.0.dist-info:
provides: python3.7dist(packaging) = 19
@ -554,11 +554,11 @@
python3dist(tox) = 3.14
requires: |-
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(pluggy) < 1 with python3.9dist(pluggy) >= 0.12)
(python3.9dist(py) < 2 with python3.9dist(py) >= 1.4.17)
(python3.9dist(six) < 2 with python3.9dist(six) >= 1)
(python3.9dist(pluggy) < 1~ with python3.9dist(pluggy) >= 0.12)
(python3.9dist(py) < 2~ with python3.9dist(py) >= 1.4.17)
(python3.9dist(six) < 2~ with python3.9dist(six) >= 1)
python3.9dist(toml) >= 0.9.4
python3.9dist(virtualenv) >= 14
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
@ -611,12 +611,12 @@
python2dist(tox) = 3.14
requires: |-
python(abi) = 2.7
(python2.7dist(filelock) < 4 with python2.7dist(filelock) >= 3)
(python2.7dist(importlib-metadata) < 1 with python2.7dist(importlib-metadata) >= 0.12)
(python2.7dist(filelock) < 4~ with python2.7dist(filelock) >= 3)
(python2.7dist(importlib-metadata) < 1~ with python2.7dist(importlib-metadata) >= 0.12)
python2.7dist(packaging) >= 14
(python2.7dist(pluggy) < 1 with python2.7dist(pluggy) >= 0.12)
(python2.7dist(py) < 2 with python2.7dist(py) >= 1.4.17)
(python2.7dist(six) < 2 with python2.7dist(six) >= 1)
(python2.7dist(pluggy) < 1~ with python2.7dist(pluggy) >= 0.12)
(python2.7dist(py) < 2~ with python2.7dist(py) >= 1.4.17)
(python2.7dist(six) < 2~ with python2.7dist(six) >= 1)
python2.7dist(toml) >= 0.9.4
python2.7dist(virtualenv) >= 14
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
@ -653,12 +653,12 @@
provides: python3.7dist(tox) = 3.14
requires: |-
python(abi) = 3.7
(python3.7dist(filelock) < 4 with python3.7dist(filelock) >= 3)
(python3.7dist(importlib-metadata) < 1 with python3.7dist(importlib-metadata) >= 0.12)
(python3.7dist(filelock) < 4~ with python3.7dist(filelock) >= 3)
(python3.7dist(importlib-metadata) < 1~ with python3.7dist(importlib-metadata) >= 0.12)
python3.7dist(packaging) >= 14
(python3.7dist(pluggy) < 1 with python3.7dist(pluggy) >= 0.12)
(python3.7dist(py) < 2 with python3.7dist(py) >= 1.4.17)
(python3.7dist(six) < 2 with python3.7dist(six) >= 1)
(python3.7dist(pluggy) < 1~ with python3.7dist(pluggy) >= 0.12)
(python3.7dist(py) < 2~ with python3.7dist(py) >= 1.4.17)
(python3.7dist(six) < 2~ with python3.7dist(six) >= 1)
python3.7dist(toml) >= 0.9.4
python3.7dist(virtualenv) >= 14
usr/lib64/python2.7/site-packages/scipy-1.2.1.dist-info:
@ -1251,10 +1251,10 @@
(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(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(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(foobar40) < 2.4.8~b5 or python3.9dist(foobar40) > 2.4.8~b5)
(python3.9dist(foobar41) < 2~b5 or python3.9dist(foobar41) > 2~b5)
@ -1263,21 +1263,21 @@
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(foobar47) < 2.4.8~
python3.9dist(foobar48) <= 2
python3.9dist(foobar49) <= 2
python3.9dist(foobar50) < 2
python3.9dist(foobar50) < 2~
python3.9dist(foobar51) <= 2.4.8~b5
python3.9dist(foobar52) <= 2~b5
python3.9dist(foobar53) <= 2.4.8^post1
python3.9dist(foobar54) <= 2^post1
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(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
@ -1294,13 +1294,13 @@
python3.9dist(foobar74) >= 2~b5
python3.9dist(foobar75) >= 2.4.8^post1
python3.9dist(foobar76) >= 2^post1
python3.9dist(foobar77) > 2.4.8
python3.9dist(foobar78) > 2.4.8
python3.9dist(foobar79) > 2.4.8.1
python3.9dist(foobar77) > 2.4.8.0
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
python3.9dist(foobar82) > 2
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