scripts/pythondistdeps: Add tests

The test data download themselves using pip if not present
This commit is contained in:
Tomas Orsava 2020-04-07 01:16:34 +02:00
parent 1634914c2e
commit 89e1676cee
7 changed files with 935 additions and 1 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/tests/data/scripts_pythondistdeps/usr/

View File

@ -367,7 +367,8 @@ for name in names:
if len(spec_list) == 1:
print(spec_list[0])
else:
print('({})'.format(' with '.join(spec_list)))
# Sort spec_list so that the results can be tested easily
print('({})'.format(' with '.join(sorted(spec_list))))
else:
# Print out unversioned provides, requires, recommends, conflicts
print(name)

View File

@ -0,0 +1,21 @@
Metadata-Version: 2.1
Name: pyreq2rpm.tests
Version: 2020.04.07.024dab0
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
License: MIT
Description: This dist-info is mock metadata for a fictional package pyreq2rpm.tests
The important part of its contents is the requires.txt that contains
different formats of Python requirements taken from
https://github.com/gordonmessmer/pyreq2rpm, that are numbered as to be
unique. The metadata is then processed through
scripts/pythondistdeps.py and the resulting RPM requires compared to
expected results.
The version of the package contains the date when I converted the test
data from upstream to this metapackage, as well as the short hash of
the last git commit.
From the requirements I have omitted those that are incorrect, as they
crash the pythondistdeps.py script.

View File

@ -0,0 +1,95 @@
# Taken from pyreq2rpm, removed tests that are expected to fail
foobar0~=2.4.8
foobar1~=2.4.8.0
foobar2~=2.4.8.1
foobar4~=2.0
foobar7~=2.4.8b5
foobar8~=2.0.0b5
foobar9~=2.4.8.post1
foobar10~=2.0.post1
foobar11==2.4.8
foobar12==2.4.8.0
foobar13==2.4.8.1
foobar14==2.4.8.*
foobar15==2.0
foobar16==2
foobar17==2.*
foobar18==2.4.8b5
foobar19==2.0.0b5
foobar20==2.4.8.post1
foobar21==2.0.post1
foobar22===2.4.8
foobar23===2.4.8.0
foobar24===2.4.8.1
foobar26===2.0
foobar27===2
foobar29===2.4.8b5
foobar30===2.0.0b5
foobar31===2.4.8.post1
foobar32===2.0.post1
foobar33!=2.4.8
foobar34!=2.4.8.0
foobar35!=2.4.8.1
foobar36!=2.4.8.*
foobar37!=2.0
foobar38!=2
foobar39!=2.*
foobar40!=2.4.8b5
foobar41!=2.0.0b5
foobar42!=2.4.8.post1
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
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
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
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
foobar87>2.0.post1
pyparsing0
pyparsing1>=2.0.1,!=2.0.4,!=2.1.2,!=2.1.6
babel>=1.3,!=2.0
# Tests for breakages in Fedora
fedora-python-nb2plots==0+unknown

View File

@ -0,0 +1,480 @@
--requires:
--provides:
pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info:
provides: python3.9dist(pyreq2rpm.tests) = 2020.04.07.024dab0
requires: |-
python(abi) = 3.9
((python3.9dist(babel) < 2 or python3.9dist(babel) > 2) with python3.9dist(babel) >= 1.3)
python3.9dist(fedora-python-nb2plots) = 0
(python3.9dist(foobar0) >= 2.4.8 with python3.9dist(foobar0) < 2.5)
(python3.9dist(foobar1) >= 2.4.8 with python3.9dist(foobar1) < 2.4.9)
(python3.9dist(foobar10) >= 2^post1 with python3.9dist(foobar10) < 3)
python3.9dist(foobar11) = 2.4.8
python3.9dist(foobar12) = 2.4.8
python3.9dist(foobar13) = 2.4.8.1
(python3.9dist(foobar14) >= 2.4.8 with python3.9dist(foobar14) < 2.4.9)
python3.9dist(foobar15) = 2
python3.9dist(foobar16) = 2
(python3.9dist(foobar17) >= 2 with python3.9dist(foobar17) < 3)
python3.9dist(foobar18) = 2.4.8~b5
python3.9dist(foobar19) = 2~b5
(python3.9dist(foobar2) >= 2.4.8.1 with python3.9dist(foobar2) < 2.4.9)
python3.9dist(foobar20) = 2.4.8^post1
python3.9dist(foobar21) = 2^post1
python3.9dist(foobar22) = 2.4.8
python3.9dist(foobar23) = 2.4.8
python3.9dist(foobar24) = 2.4.8.1
python3.9dist(foobar26) = 2
python3.9dist(foobar27) = 2
python3.9dist(foobar29) = 2.4.8~b5
python3.9dist(foobar30) = 2~b5
python3.9dist(foobar31) = 2.4.8^post1
python3.9dist(foobar32) = 2^post1
(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(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(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)
(python3.9dist(foobar42) < 2.4.8^post1 or python3.9dist(foobar42) > 2.4.8^post1)
(python3.9dist(foobar43) < 2^post1 or python3.9dist(foobar43) > 2^post1)
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
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(foobar62) < 2.4.8~b5
python3.9dist(foobar63) < 2~b5
python3.9dist(foobar64) < 2.4.8^post1
python3.9dist(foobar65) < 2^post1
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
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(foobar8) >= 2~b5 with python3.9dist(foobar8) < 2.1)
python3.9dist(foobar80) >= 2.4.9
python3.9dist(foobar81) > 2
python3.9dist(foobar82) > 2
python3.9dist(foobar83) >= 3
python3.9dist(foobar84) > 2.4.8~b5
python3.9dist(foobar85) > 2~b5
python3.9dist(foobar86) > 2.4.8^post1
python3.9dist(foobar87) > 2^post1
(python3.9dist(foobar9) >= 2.4.8^post1 with python3.9dist(foobar9) < 2.5)
python3.9dist(pyparsing0)
((python3.9dist(pyparsing1) < 2.0.4 or python3.9dist(pyparsing1) > 2.0.4) with (python3.9dist(pyparsing1) < 2.1.2 or python3.9dist(pyparsing1) > 2.1.2) with (python3.9dist(pyparsing1) < 2.1.6 or python3.9dist(pyparsing1) > 2.1.6) with python3.9dist(pyparsing1) >= 2.0.1)
--provides --majorver-provides:
usr/lib/python2.7/site-packages/attrs-19.1.0-py2.7.egg-info:
provides: |-
python2.7dist(attrs) = 19.1
python2dist(attrs) = 19.1
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/kubernetes-11.0.0b2.dist-info:
provides: |-
python2.7dist(kubernetes) = 11~b2
python2dist(kubernetes) = 11~b2
requires: |-
python(abi) = 2.7
python2.7dist(certifi) >= 14.5.14
python2.7dist(google-auth) >= 1.0.1
python2.7dist(ipaddress) >= 1.0.17
python2.7dist(python-dateutil) >= 2.5.3
python2.7dist(pyyaml) >= 3.12
python2.7dist(requests)
python2.7dist(requests-oauthlib)
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)
usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info:
provides: |-
python2.7dist(mistune) = 0.8.4
python2dist(mistune) = 0.8.4
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/packaging-19.0.dist-info:
provides: |-
python2.7dist(packaging) = 19
python2dist(packaging) = 19
requires: |-
python(abi) = 2.7
python2.7dist(pyparsing) >= 2.0.2
python2.7dist(six)
usr/lib/python2.7/site-packages/pip-19.1.1.dist-info:
provides: |-
python2.7dist(pip) = 19.1.1
python2dist(pip) = 19.1.1
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/pyparsing-2.4.0.dist-info:
provides: |-
python2.7dist(pyparsing) = 2.4
python2dist(pyparsing) = 2.4
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/setuptools-41.6.0-py2.7.egg-info:
provides: |-
python2.7dist(setuptools) = 41.6
python2dist(setuptools) = 41.6
requires: |-
python(abi) = 2.7
python2.7dist(setuptools)
usr/lib/python2.7/site-packages/setuptools-41.6.0.dist-info:
provides: |-
python2.7dist(setuptools) = 41.6
python2dist(setuptools) = 41.6
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/six-1.12.0.dist-info:
provides: |-
python2.7dist(six) = 1.12
python2dist(six) = 1.12
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/tox-3.14.0.dist-info:
provides: |-
python2.7dist(tox) = 3.14
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(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(toml) >= 0.9.4
python2.7dist(virtualenv) >= 14
usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info:
provides: |-
python2.7dist(urllib3) = 1.25.7
python2dist(urllib3) = 1.25.7
requires: python(abi) = 2.7
usr/lib/python2.7/site-packages/zope.component-4.3.0-py2.7.egg-info:
provides: |-
python2.7dist(zope.component) = 4.3
python2dist(zope.component) = 4.3
requires: |-
python(abi) = 2.7
python2.7dist(setuptools)
python2.7dist(zope.event)
python2.7dist(zope.interface) >= 4.1
usr/lib/python3.7/site-packages/astroid-2.3.3.dist-info:
provides: |-
python3.7dist(astroid) = 2.3.3
python3dist(astroid) = 2.3.3
requires: |-
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(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
python3dist(packaging) = 19
requires: |-
python(abi) = 3.7
python3.7dist(pyparsing) >= 2.0.2
python3.7dist(six)
usr/lib/python3.7/site-packages/pip-19.1.1.dist-info:
provides: |-
python3.7dist(pip) = 19.1.1
python3dist(pip) = 19.1.1
requires: python(abi) = 3.7
usr/lib/python3.7/site-packages/pyparsing-2.4.0.dist-info:
provides: |-
python3.7dist(pyparsing) = 2.4
python3dist(pyparsing) = 2.4
requires: python(abi) = 3.7
usr/lib/python3.7/site-packages/setuptools-41.6.0-py3.7.egg-info:
provides: |-
python3.7dist(setuptools) = 41.6
python3dist(setuptools) = 41.6
requires: |-
python(abi) = 3.7
python3.7dist(setuptools)
usr/lib/python3.7/site-packages/setuptools-41.6.0.dist-info:
provides: |-
python3.7dist(setuptools) = 41.6
python3dist(setuptools) = 41.6
requires: python(abi) = 3.7
usr/lib/python3.7/site-packages/six-1.12.0.dist-info:
provides: |-
python3.7dist(six) = 1.12
python3dist(six) = 1.12
requires: python(abi) = 3.7
usr/lib/python3.7/site-packages/tox-3.14.0.dist-info:
provides: |-
python3.7dist(tox) = 3.14
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(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(toml) >= 0.9.4
python3.7dist(virtualenv) >= 14
usr/lib/python3.9/site-packages/astroid-2.3.3.dist-info:
provides: |-
python3.9dist(astroid) = 2.3.3
python3dist(astroid) = 2.3.3
requires: |-
python(abi) = 3.9
(python3.9dist(lazy-object-proxy) >= 1.4 with python3.9dist(lazy-object-proxy) < 1.5)
(python3.9dist(six) >= 1.12 with python3.9dist(six) < 2)
(python3.9dist(wrapt) >= 1.11 with python3.9dist(wrapt) < 1.12)
usr/lib/python3.9/site-packages/attrs-19.1.0-py3.9.egg-info:
provides: |-
python3.9dist(attrs) = 19.1
python3dist(attrs) = 19.1
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/fsleyes-0.32.3.dist-info:
provides: |-
python3.9dist(fsleyes) = 0.32.3
python3dist(fsleyes) = 0.32.3
requires: |-
python(abi) = 3.9
python3.9dist(fsleyes-props) >= 1.6.7
python3.9dist(fsleyes-widgets) >= 0.8.4
python3.9dist(fslpy) >= 2.8.4
(python3.9dist(jinja2) >= 2 with python3.9dist(jinja2) < 3)
python3.9dist(matplotlib) >= 1.5.1
python3.9dist(nibabel) >= 2.3
python3.9dist(numpy) >= 1.14
python3.9dist(pillow) >= 3.2
python3.9dist(pyopengl) >= 3.1
(python3.9dist(pyparsing) >= 2 with python3.9dist(pyparsing) < 3)
python3.9dist(scipy) >= 0.18
python3.9dist(setuptools)
(python3.9dist(six) >= 1 with python3.9dist(six) < 2)
python3.9dist(wxpython) >= 3.0.2
usr/lib/python3.9/site-packages/kubernetes-11.0.0.dist-info:
provides: |-
python3.9dist(kubernetes) = 11
python3dist(kubernetes) = 11
requires: |-
python(abi) = 3.9
python3.9dist(certifi) >= 14.5.14
python3.9dist(google-auth) >= 1.0.1
python3.9dist(python-dateutil) >= 2.5.3
python3.9dist(pyyaml) >= 3.12
python3.9dist(requests)
python3.9dist(requests-oauthlib)
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)
usr/lib/python3.9/site-packages/mistune-0.8.4-py3.9.egg-info:
provides: |-
python3.9dist(mistune) = 0.8.4
python3dist(mistune) = 0.8.4
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/packaging-20.1.dist-info:
provides: |-
python3.9dist(packaging) = 20.1
python3dist(packaging) = 20.1
requires: |-
python(abi) = 3.9
python3.9dist(pyparsing) >= 2.0.2
python3.9dist(six)
usr/lib/python3.9/site-packages/pip-20.0.2.dist-info:
provides: |-
python3.9dist(pip) = 20.0.2
python3dist(pip) = 20.0.2
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/pyparsing-2.4.0.dist-info:
provides: |-
python3.9dist(pyparsing) = 2.4
python3dist(pyparsing) = 2.4
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/setuptools-41.6.0-py3.9.egg-info:
provides: |-
python3.9dist(setuptools) = 41.6
python3dist(setuptools) = 41.6
requires: |-
python(abi) = 3.9
python3.9dist(setuptools)
usr/lib/python3.9/site-packages/setuptools-41.6.0.dist-info:
provides: |-
python3.9dist(setuptools) = 41.6
python3dist(setuptools) = 41.6
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/six-1.12.0.dist-info:
provides: |-
python3.9dist(six) = 1.12
python3dist(six) = 1.12
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/tox-3.14.0.dist-info:
provides: |-
python3.9dist(tox) = 3.14
python3dist(tox) = 3.14
requires: |-
python(abi) = 3.9
(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(toml) >= 0.9.4
python3.9dist(virtualenv) >= 14
usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info:
provides: |-
python3.9dist(urllib3) = 1.25.7
python3dist(urllib3) = 1.25.7
requires: python(abi) = 3.9
usr/lib/python3.9/site-packages/zope.schema-4.4.2-py3.9.egg-info:
provides: |-
python3.9dist(zope.schema) = 4.4.2
python3dist(zope.schema) = 4.4.2
requires: |-
python(abi) = 3.9
python3.9dist(setuptools)
python3.9dist(zope.event)
python3.9dist(zope.interface) >= 3.6
usr/lib64/python2.7/site-packages/MarkupSafe-1.1.1.dist-info:
provides: |-
python2.7dist(markupsafe) = 1.1.1
python2dist(markupsafe) = 1.1.1
requires: python(abi) = 2.7
usr/lib64/python2.7/site-packages/backports.range-3.7.2-py2.7.egg-info:
provides: |-
python2.7dist(backports.range) = 3.7.2
python2dist(backports.range) = 3.7.2
requires: python(abi) = 2.7
usr/lib64/python2.7/site-packages/lxml-4.4.0.dist-info:
provides: |-
python2.7dist(lxml) = 4.4
python2dist(lxml) = 4.4
requires: python(abi) = 2.7
usr/lib64/python2.7/site-packages/numpy-1.16.4.dist-info:
provides: |-
python2.7dist(numpy) = 1.16.4
python2dist(numpy) = 1.16.4
requires: python(abi) = 2.7
usr/lib64/python2.7/site-packages/numpy_stl-2.11.2-py2.7.egg-info:
provides: |-
python2.7dist(numpy-stl) = 2.11.2
python2dist(numpy-stl) = 2.11.2
requires: |-
python(abi) = 2.7
python2.7dist(numpy)
python2.7dist(python-utils) >= 1.6.2
python2.7dist(setuptools)
usr/lib64/python2.7/site-packages/scipy-1.2.1.dist-info:
provides: |-
python2.7dist(scipy) = 1.2.1
python2dist(scipy) = 1.2.1
requires: |-
python(abi) = 2.7
python2.7dist(numpy) >= 1.8.2
usr/lib64/python2.7/site-packages/simplejson-3.16.0-py2.7.egg-info:
provides: |-
python2.7dist(simplejson) = 3.16
python2dist(simplejson) = 3.16
requires: python(abi) = 2.7
usr/lib64/python3.7/site-packages/MarkupSafe-1.1.1.dist-info:
provides: |-
python3.7dist(markupsafe) = 1.1.1
python3dist(markupsafe) = 1.1.1
requires: python(abi) = 3.7
usr/lib64/python3.7/site-packages/PyQt5_sip-4.19.19.dist-info:
provides: |-
python3.7dist(pyqt5-sip) = 4.19.19
python3dist(pyqt5-sip) = 4.19.19
requires: python(abi) = 3.7
usr/lib64/python3.7/site-packages/PyQtWebEngine-5.12.1.dist-info:
provides: |-
python3.7dist(pyqtwebengine) = 5.12.1
python3dist(pyqtwebengine) = 5.12.1
requires: |-
python(abi) = 3.7
python3.7dist(pyqt5) >= 5.12
usr/lib64/python3.7/site-packages/backports.range-3.7.2-py3.7.egg-info:
provides: |-
python3.7dist(backports.range) = 3.7.2
python3dist(backports.range) = 3.7.2
requires: python(abi) = 3.7
usr/lib64/python3.7/site-packages/lxml-4.4.0.dist-info:
provides: |-
python3.7dist(lxml) = 4.4
python3dist(lxml) = 4.4
requires: python(abi) = 3.7
usr/lib64/python3.7/site-packages/numpy-1.17.4.dist-info:
provides: |-
python3.7dist(numpy) = 1.17.4
python3dist(numpy) = 1.17.4
requires: python(abi) = 3.7
usr/lib64/python3.7/site-packages/numpy_stl-2.11.2-py3.7.egg-info:
provides: |-
python3.7dist(numpy-stl) = 2.11.2
python3dist(numpy-stl) = 2.11.2
requires: |-
python(abi) = 3.7
python3.7dist(numpy)
python3.7dist(python-utils) >= 1.6.2
python3.7dist(setuptools)
usr/lib64/python3.7/site-packages/scipy-1.2.1.dist-info:
provides: |-
python3.7dist(scipy) = 1.2.1
python3dist(scipy) = 1.2.1
requires: |-
python(abi) = 3.7
python3.7dist(numpy) >= 1.8.2
usr/lib64/python3.7/site-packages/simplejson-3.16.0-py3.7.egg-info:
provides: |-
python3.7dist(simplejson) = 3.16
python3dist(simplejson) = 3.16
requires: python(abi) = 3.7
usr/lib64/python3.9/site-packages/PyQtWebEngine-5.12.1.dist-info:
provides: |-
python3.9dist(pyqtwebengine) = 5.12.1
python3dist(pyqtwebengine) = 5.12.1
requires: |-
python(abi) = 3.9
python3.9dist(pyqt5) >= 5.12
usr/lib64/python3.9/site-packages/backports.range-3.7.2-py3.9.egg-info:
provides: |-
python3.9dist(backports.range) = 3.7.2
python3dist(backports.range) = 3.7.2
requires: python(abi) = 3.9
usr/lib64/python3.9/site-packages/numpy_stl-2.11.2-py3.9.egg-info:
provides: |-
python3.9dist(numpy-stl) = 2.11.2
python3dist(numpy-stl) = 2.11.2
requires: |-
python(abi) = 3.9
python3.9dist(numpy)
python3.9dist(python-utils) >= 1.6.2
python3.9dist(setuptools)
usr/lib64/python3.9/site-packages/simplejson-3.16.0-py3.9.egg-info:
provides: |-
python3.9dist(simplejson) = 3.16
python3dist(simplejson) = 3.16
requires: python(abi) = 3.9

View File

@ -0,0 +1,94 @@
setuptools:
wheel:
'41.6.0': ['2.7', '3.7', '3.9']
sdist:
'41.6.0': ['2.7', '3.7', '3.9', '3.10']
pip:
wheel:
'19.1.1': ['2.7', '3.7']
'20.0.2': ['3.9']
sdist:
'20.0.2': ['3.11']
packaging:
wheel:
'19.0': ['2.7', '3.7']
'20.1': ['3.9']
attrs:
sdist:
'19.1.0': ['2.7', '3.9']
pyparsing:
wheel:
'2.4.0': ['2.7', '3.7', '3.9']
six:
wheel:
'1.12.0': ['2.7', '3.7', '3.9']
tox:
wheel:
'3.14.0': ['2.7', '3.7', '3.9']
urllib3:
sdist:
'1.25.7': ['2.7', '3.9']
zope.component:
sdist:
'4.3.0': ['2.7', '3.9']
zope.event:
wheel:
'4.2.0': ['2.7', '3.9']
zope.schema:
sdist:
'4.4.2': ['2.7', '3.9']
zope.interface:
sdist:
'5.1.0': ['3.9']
wheel:
'4.6.0': ['2.7']
lxml:
lib: lib64
wheel:
'4.4.0': ['2.7', '3.7']
scipy:
lib: lib64
wheel:
'1.2.1': ['2.7', '3.7']
numpy:
lib: lib64
wheel:
'1.16.4': ['2.7']
'1.17.4': ['3.7']
numpy-stl:
lib: lib64
sdist:
'2.11.2': ['2.7', '3.7', '3.9']
PyQt5_sip:
lib: lib64
wheel:
'4.19.19': ['3.7']
PyQtWebEngine:
lib: lib64
wheel:
'5.12.1': ['3.7', '3.9']
MarkupSafe:
lib: lib64
wheel:
'1.1.1': ['2.7', '3.7']
simplejson:
lib: lib64
sdist:
'3.16.0': ['2.7', '3.7', '3.9']
backports.range:
lib: lib64
sdist:
'3.7.2': ['2.7', '3.7', '3.9']
mistune:
sdist:
'0.8.4': ['2.7', '3.9']
astroid:
wheel:
'2.3.3': ['3.7', '3.9']
kubernetes:
wheel:
'11.0.0b2': ['2.7']
'11.0.0': ['3.9']
fsleyes:
wheel:
'0.32.3': ['3.9']

View File

@ -0,0 +1,242 @@
# Run tests using pytest, e.g. from the root directory
# $ python3 -m pytest --ignore tests/testing/ -vvv
#
# If there are any breakags, the best way to see differences is using a diff:
# $ diff tests/data/scripts_pythondistdeps/test-data.yaml <(python3 tests/test_scripts_pythondistdeps.py)
#
# - Test cases and expected results are saved in test-data.yaml inside
# TEST_DATA_PATH (currently ./data/scripts_pythondistdeps/)
# - To regenerate test-data.yaml file with the current results of
# pythondistdeps.py for each test configuration, execute this test file
# directly and results will be on stdout
# $ python3 test_scripts_pythondistdeps.py
#
# To add new test-data, add them to the test-requires.yaml: they will be
# downloaded automatically. And then add the resulting dist-info/egg-info paths
# into test-data.yaml under whichever requires/provides configurations you want
# to test
# - To find all dist-info/egg-info directories in the test-data directory,
# run inside test-data:
# $ find . -type d -regex ".*\(dist-info\|egg-info\)" | sort
#
# Requirements for this script:
# - Python >= 3.6
# - pip >= 20.0.1
# - setuptools
# - pytest
# - pyyaml
# - wheel
from pathlib import Path
import pytest
import shlex
import shutil
import subprocess
import sys
import tempfile
import yaml
PYTHONDISTDEPS_PATH = Path(__file__).parent / '..' / 'scripts' / 'pythondistdeps.py'
TEST_DATA_PATH = Path(__file__).parent / 'data' / 'scripts_pythondistdeps'
def run_pythondistdeps(provides_params, requires_params, dist_egg_info_path):
"""Runs pythondistdeps.py on `dits_egg_info_path` with given
provides and requires parameters and returns a dict with generated provides and requires"""
info_path = TEST_DATA_PATH / dist_egg_info_path
files = '\n'.join(map(str, info_path.iterdir()))
provides = subprocess.check_output((sys.executable, PYTHONDISTDEPS_PATH, *shlex.split(provides_params)),
input=files, encoding="utf-8")
requires = subprocess.check_output((sys.executable, PYTHONDISTDEPS_PATH, *shlex.split(requires_params)),
input=files, encoding="utf-8")
return {"provides": provides.strip(), "requires": requires.strip()}
def load_test_data():
"""Reads the test-data.yaml and loads the test data into a dict."""
with TEST_DATA_PATH.joinpath('test-data.yaml').open() as file:
return yaml.safe_load(file)
def generate_test_cases(test_data):
"""Goes through the test data dict and yields test cases.
Test case is a tuple of 4 elements:
- provides parameters
- requires parameters
- path to the dist-info/egg-info directory inside test-data
- dict with expected results ("requires" and "provides")"""
for requires_params in test_data:
for provides_params in test_data[requires_params]:
for dist_egg_info_path in test_data[requires_params][provides_params]:
expected = test_data[requires_params][provides_params][dist_egg_info_path]
yield (provides_params, requires_params, dist_egg_info_path, expected)
def check_and_install_test_data():
"""Checks if the appropriate metadata are present in TEST_DATA_PATH, and if
not, downloads them through pip from PyPI."""
with TEST_DATA_PATH.joinpath('test-requires.yaml').open() as file:
test_requires = yaml.safe_load(file)
downloaded_anything = False
for package in test_requires:
# To be as close to the real environment, we want some packages saved in /usr/lib64 instead of /usr/lib,
# for these we explicitly set lib64 as a parameter, and by default we use /usr/lib.
lib = test_requires[package].pop("lib", "lib")
# type is either `wheel` or `sdist`
for type in test_requires[package]:
for pkg_version in test_requires[package][type]:
for py_version in test_requires[package][type][pkg_version]:
py_version_nodots = py_version.replace(".", "")
package_underscores = package.replace("-", "_")
suffix = ".egg-info" if type == "sdist" else ".dist-info"
pre_suffix = f"-py{py_version}" if type == "sdist" else ""
install_path = TEST_DATA_PATH / "usr" / lib / f"python{py_version}" \
/ "site-packages" / f"{package_underscores}-{pkg_version}{pre_suffix}{suffix}"
if install_path.exists():
continue
# If this is the first package we're downloading,
# display what's happening
if not downloaded_anything:
print("=====================")
print("Downloading test data")
print("=====================\n")
downloaded_anything = True
# We use a temporary directory to unpack/install the
# package to, and then we move only the metadata to the
# final location
with tempfile.TemporaryDirectory() as temp_dir:
import runpy
backup_argv = sys.argv[:]
if type == "wheel":
from pkg_resources import parse_version
abi = f"cp{py_version_nodots}"
# The "m" was removed from the abi flag in Python version 3.8
if parse_version(py_version) < parse_version('3.8'):
abi += "m"
# Install = download and unpack wheel into our
# temporary directory
sys.argv[1:] = ["install", "--no-deps",
"--only-binary", ":all:",
"--platform", "manylinux1_x86_64",
"--python-version", py_version,
"--implementation", "cp",
"--abi", abi,
"--target", temp_dir,
"--no-build-isolation",
f"{package}=={pkg_version}"]
else:
# Download sdist that we'll unpack later
sys.argv[1:] = ["download", "--no-deps",
"--no-binary", ":all:",
"--dest", temp_dir,
"--no-build-isolation",
f"{package}=={pkg_version}"]
try:
# run_module() alters sys.modules and sys.argv, but restores them at exit
runpy.run_module("pip", run_name="__main__", alter_sys=True)
except SystemExit as exc:
pass
finally:
sys.argv[:] = backup_argv
temp_path = Path(temp_dir)
if type == "sdist":
# Wheel were already unpacked by pip, sdists we
# have to unpack ourselves
sdist_path = next(temp_path.glob(f"{package}-{pkg_version}.*"))
if sdist_path.suffix == ".zip":
import zipfile
archive = zipfile.ZipFile(sdist_path)
else:
import tarfile
archive = tarfile.open(sdist_path)
archive.extractall(temp_path)
try:
info_path = next(temp_path.glob(f"**/*{suffix}"))
# Let's check the wheel metadata has the
# expected directory name. We don't check for
# egg-info metadata, because we're pulling them
# from sdists where they don't have the proper
# directory name
if type == "wheel":
if info_path.name != install_path.name:
print("\nWarning: wheel metadata have unexpected directory name.\n"
f"Expected: {install_path.name}\n"
f"Actual: {info_path.name}\n"
f"Info: package '{package}', version '{pkg_version}'"
f" for Python {py_version}\n"
f"Possible resolution: Specify the package version with"
f" trailing zeros in test-requires.yaml", file=sys.stderr)
shutil.move(info_path, install_path)
relative_path = install_path.relative_to(TEST_DATA_PATH)
print(f"\nDownloaded metadata to '{relative_path}'" \
f" inside test-data directory.\n")
except StopIteration:
# temp_path.glob() did not find any file and
# thus there's been some problem
sys.exit(f"Problem occured while getting dist-info/egg-info"
f" for package '{package}', version '{pkg_version}'"
f" for Python {py_version}")
if downloaded_anything:
print("\n==============================")
print("Finished downloading test data")
print("==============================")
@pytest.fixture(scope="session", autouse=True)
def fixture_check_and_install_test_data():
"""Wrapper fixture, because a fixture can't be called as a function."""
check_and_install_test_data()
@pytest.mark.parametrize("provides_params, requires_params, dist_egg_info_path, expected",
generate_test_cases(load_test_data()))
def test_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expected):
"""Runs pythondistdeps with the given parameters and dist-info/egg-info
path, compares the results with the expected results"""
assert expected == run_pythondistdeps(provides_params, requires_params, dist_egg_info_path)
if __name__ == "__main__":
"""If the script is called directly, we check and install test data if needed,
we look up all the test configurations in test-data.yaml, run
pythondistdeps for each, save the results and print the resulting YAML file
with the updated results."""
check_and_install_test_data()
# Set YAML dump style to block style
def str_presenter(dumper, data):
if len(data.splitlines()) > 1: # check for multiline string
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
return dumper.represent_scalar('tag:yaml.org,2002:str', data)
yaml.add_representer(str, str_presenter)
# Run pythondistdeps for each test configuration
test_data = load_test_data()
for provides_params, requires_params, dist_egg_info_path, expected in generate_test_cases(test_data):
# Print a dot to stderr for each test run to keep user informed about progress
print(".", end="", flush=True, file=sys.stderr)
test_data[requires_params][provides_params][dist_egg_info_path] = \
run_pythondistdeps(provides_params, requires_params, dist_egg_info_path)
print(yaml.dump(test_data, indent=4))