Allow to fetch test dependencies from tox

This commit is contained in:
Miro Hrončok 2019-07-26 14:34:21 +02:00
parent 6cfe9d4b22
commit 8a60635881
8 changed files with 131 additions and 16 deletions

View File

@ -55,6 +55,21 @@ For example, if upstream suggests installing test dependencies with
%generate_buildrequires %generate_buildrequires
%pyproject_buildrequires -r -x testing %pyproject_buildrequires -r -x testing
For projects that specify test requirements in their [tox] configuration,
these can be added using the `-t` flag followed by the tox environment.
For example, if upstream suggests running the tests on Python 3.7 with `tox -e py37`,
the test deps would be generated by:
%generate_buildrequires
%pyproject_buildrequires -t py37
Note that `-t` implies `-r`, because tox normally assumes the package is installed
including all the runtime dependencies.
The `-t` option uses [tox-current-env]'s `--print-deps-only` behind the scenes.
[tox]: https://tox.readthedocs.io/
[tox-current-env]: https://github.com/fedora-python/tox-current-env/
Limitations Limitations
----------- -----------
@ -64,14 +79,13 @@ Limitations
This macro changes shebang lines of every Python script in `%{buildroot}%{_bindir}` to `#! %{__python3} %{py3_shbang_opt}` (`#! /usr/bin/python3 -s`). This macro changes shebang lines of every Python script in `%{buildroot}%{_bindir}` to `#! %{__python3} %{py3_shbang_opt}` (`#! /usr/bin/python3 -s`).
We plan to preserve existing Python flags in shebangs, but the work is not yet finished. We plan to preserve existing Python flags in shebangs, but the work is not yet finished.
The PEPs don't (yet) define a way to specify test dependencies and test runners.
That means you still need to handle test dependencies and `%check` on your own.
Extras are currently ignored. Extras are currently ignored.
Some valid Python version specifiers are not supported. Some valid Python version specifiers are not supported.
The `-x` flag does not yet support multiple (comma-separated) extras. The `-x` flag does not yet support multiple (comma-separated) extras.
The `-t` flag does not yet support a reasonable default.
[PEP 517]: https://www.python.org/dev/peps/pep-0517/ [PEP 517]: https://www.python.org/dev/peps/pep-0517/
[PEP 518]: https://www.python.org/dev/peps/pep-0518/ [PEP 518]: https://www.python.org/dev/peps/pep-0518/

View File

@ -17,7 +17,7 @@ if [ -d %{buildroot}%{python3_sitearch} ]; then
fi fi
} }
%pyproject_buildrequires(rx:) %{expand:\\\ %pyproject_buildrequires(rx:t:) %{expand:\\\
echo 'python3-devel' echo 'python3-devel'
echo 'python3dist(packaging)' echo 'python3dist(packaging)'
echo 'python3dist(pip) >= 19' echo 'python3dist(pip) >= 19'

View File

@ -6,7 +6,7 @@ License: MIT
# Keep the version at zero and increment only release # Keep the version at zero and increment only release
Version: 0 Version: 0
Release: 4%{?dist} Release: 5%{?dist}
Source0: macros.pyproject Source0: macros.pyproject
Source1: pyproject_buildrequires.py Source1: pyproject_buildrequires.py
@ -35,6 +35,7 @@ BuildRequires: python3dist(packaging)
BuildRequires: python3dist(pytoml) BuildRequires: python3dist(pytoml)
BuildRequires: python3dist(pip) BuildRequires: python3dist(pip)
BuildRequires: python3dist(setuptools) BuildRequires: python3dist(setuptools)
BuildRequires: python3dist(tox-current-env)
BuildRequires: python3dist(wheel) BuildRequires: python3dist(wheel)
%endif %endif
@ -75,6 +76,9 @@ install -m 644 pyproject_buildrequires.py %{buildroot}%{_rpmconfigdir}/redhat/
%license LICENSE %license LICENSE
%changelog %changelog
* Fri Jul 26 2019 Miro Hrončok <mhroncok@redhat.com> - 0-5
- Allow to fetch test dependencies from tox
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0-4 * Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild

View File

@ -174,6 +174,19 @@ def generate_run_requirements(backend, requirements):
requirements.extend(requires, source=f'wheel metadata: {key}') requirements.extend(requires, source=f'wheel metadata: {key}')
def generate_tox_requirements(toxenv, requirements):
requirements.extend(['tox-current-env'], source='tox itself')
tox_output = subprocess.run(
['tox', '--print-deps-only', '-qre', toxenv],
encoding='utf-8',
stdout=subprocess.PIPE,
check=True,
).stdout
lines = tox_output.splitlines()
summary = lines.index(35 * '_' + ' summary ' + 36 * '_')
requirements.extend(lines[:summary], source=f'tox --print-deps-only: {toxenv}')
def python3dist(name, op=None, version=None): def python3dist(name, op=None, version=None):
if op is None: if op is None:
if version is not None: if version is not None:
@ -191,6 +204,9 @@ def generate_requires(
try: try:
backend = get_backend(requirements) backend = get_backend(requirements)
generate_build_requirements(backend, requirements) generate_build_requirements(backend, requirements)
if toxenv is not None:
include_runtime = True
generate_tox_requirements(toxenv, requirements)
if include_runtime: if include_runtime:
generate_run_requirements(backend, requirements) generate_run_requirements(backend, requirements)
except EndPass: except EndPass:
@ -207,8 +223,8 @@ def main(argv):
) )
parser.add_argument( parser.add_argument(
'-t', '--toxenv', metavar='TOXENVS', '-t', '--toxenv', metavar='TOXENVS',
help='generate test tequirements from tox environment ' help=('generate test tequirements from tox environment '
+ '(not implemented; implies --runtime)', '(implies --runtime)'),
) )
parser.add_argument( parser.add_argument(
'-x', '--extras', metavar='EXTRAS', default='', '-x', '--extras', metavar='EXTRAS', default='',
@ -219,10 +235,6 @@ def main(argv):
) )
args = parser.parse_args(argv) args = parser.parse_args(argv)
if args.toxenv:
args.runtime = True
print_err('-t (--toxenv) is not implemented')
exit(1)
if args.extras and not args.runtime: if args.extras and not args.runtime:
print_err('-x (--extras) are only useful with -r (--runtime)') print_err('-x (--extras) are only useful with -r (--runtime)')
exit(1) exit(1)
@ -238,6 +250,7 @@ def main(argv):
generate_requires( generate_requires(
freeze_output, freeze_output,
include_runtime=args.runtime, include_runtime=args.runtime,
toxenv=args.toxenv,
extras=args.extras, extras=args.extras,
) )
except Exception as e: except Exception as e:

View File

@ -22,17 +22,16 @@ def test_data(case_name, capsys, tmp_path, monkeypatch):
if case.get('xfail'): if case.get('xfail'):
pytest.xfail(case.get('xfail')) pytest.xfail(case.get('xfail'))
if 'pyproject.toml' in case: for filename in 'pyproject.toml', 'setup.py', 'tox.ini':
cwd.joinpath('pyproject.toml').write_text(case['pyproject.toml']) if filename in case:
cwd.joinpath(filename).write_text(case[filename])
if 'setup.py' in case:
cwd.joinpath('setup.py').write_text(case['setup.py'])
try: try:
generate_requires( generate_requires(
case['freeze_output'], case['freeze_output'],
include_runtime=case.get('include_runtime', False), include_runtime=case.get('include_runtime', False),
extras=case.get('extras', ''), extras=case.get('extras', ''),
toxenv=case.get('toxenv', None),
) )
except SystemExit as e: except SystemExit as e:
assert e.code == case['result'] assert e.code == case['result']

View File

@ -252,3 +252,34 @@ Run dependencies with multiple extras:
python3dist(dep3) python3dist(dep3)
python3dist(dep4) python3dist(dep4)
result: 0 result: 0
Tox depndencies:
freeze_output: |
setuptools==50
wheel==1
toxenv: py3
setup.py: |
from setuptools import setup
setup(
name='test',
version='0.1',
install_requires=['inst'],
)
tox.ini: |
[tox]
envlist = py36,py37,py38
[testenv]
deps =
toxdep1
toxdep2
commands =
true
expected: |
python3dist(setuptools) >= 40.8
python3dist(wheel)
python3dist(wheel)
python3dist(tox-current-env)
python3dist(toxdep1)
python3dist(toxdep2)
python3dist(inst)
result: 0

51
tests/python-pluggy.spec Normal file
View File

@ -0,0 +1,51 @@
%global pypi_name pluggy
Name: python-%{pypi_name}
Version: 0.12.0
Release: 1%{?dist}
Summary: The plugin manager stripped of pytest specific details
License: MIT
URL: https://github.com/pytest-dev/pluggy
Source0: %{pypi_source}
BuildArch: noarch
BuildRequires: pyproject-rpm-macros
%description
%{summary}.
%package -n python3-%{pypi_name}
Summary: %{summary}
%{?python_provide:%python_provide python3-%{pypi_name}}
%description -n python3-%{pypi_name}
%{summary}.
%prep
%autosetup -p1 -n %{pypi_name}-%{version}
%generate_buildrequires
%pyproject_buildrequires -t py%{python3_version_nodots}-pytestrelease
%build
%pyproject_wheel
%install
%pyproject_install
%check
export PYTHONPATH=%{buildroot}%{python3_sitelib}
%{__python3} -m pytest
%files -n python3-%{pypi_name}
%doc README.rst
%license LICENSE
%{python3_sitelib}/%{pypi_name}/
%{python3_sitelib}/%{pypi_name}-%{version}.dist-info/

View File

@ -19,6 +19,9 @@
- entrypoints: - entrypoints:
dir: . dir: .
run: ./mocktest.sh python-entrypoints run: ./mocktest.sh python-entrypoints
- pluggy:
dir: .
run: ./mocktest.sh python-pluggy
required_packages: required_packages:
- mock - mock
- rpmdevtools - rpmdevtools