From 9f3eea2ae5ee09efc68bd532ab7caf46c653e486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 30 Sep 2020 22:12:03 +0200 Subject: [PATCH] Support the extras configuration option of tox in %pyproject_buildrequires -t Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1877977 --- pyproject-rpm-macros.spec | 4 ++- pyproject_buildrequires.py | 27 ++++++++++----- pyproject_buildrequires_testcases.yaml | 48 ++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/pyproject-rpm-macros.spec b/pyproject-rpm-macros.spec index ed009d5..3c681e0 100644 --- a/pyproject-rpm-macros.spec +++ b/pyproject-rpm-macros.spec @@ -46,7 +46,7 @@ BuildRequires: (python3dist(importlib-metadata) if python3 < 3.8) BuildRequires: python3dist(pip) BuildRequires: python3dist(setuptools) BuildRequires: python3dist(toml) -BuildRequires: python3dist(tox-current-env) >= 0.0.2 +BuildRequires: python3dist(tox-current-env) >= 0.0.3 BuildRequires: python3dist(wheel) %endif @@ -96,6 +96,8 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856 %changelog * Tue Sep 29 2020 Lumír Balhar - 0-30 - Process RECORD files in %%pyproject_install and remove them +- Support the extras configuration option of tox in %%pyproject_buildrequires -t +- Fixes: rhbz#1877977 * Wed Sep 23 2020 Miro Hrončok - 0-29 - Check the requirements after installing "requires_for_build_wheel" diff --git a/pyproject_buildrequires.py b/pyproject_buildrequires.py index 34ccbd0..f20c378 100644 --- a/pyproject_buildrequires.py +++ b/pyproject_buildrequires.py @@ -52,17 +52,25 @@ class Requirements: def __init__(self, get_installed_version, extras='', generate_extras=False, python3_pkgversion='3'): self.get_installed_version = get_installed_version + self.extras = set() if extras: - self.marker_envs = [{'extra': e.strip()} for e in extras.split(',')] - else: - self.marker_envs = [{'extra': ''}] + self.add_extras(*extras.split(',')) self.missing_requirements = False self.generate_extras = generate_extras self.python3_pkgversion = python3_pkgversion + def add_extras(self, *extras): + self.extras |= set(e.strip() for e in extras) + + @property + def marker_envs(self): + if self.extras: + return [{'extra': e} for e in sorted(self.extras)] + return [{'extra': ''}] + def evaluate_all_environamnets(self, requirement): for marker_env in self.marker_envs: if requirement.marker.evaluate(environment=marker_env): @@ -232,12 +240,14 @@ def parse_tox_requires_lines(lines): def generate_tox_requirements(toxenv, requirements): - requirements.add('tox-current-env >= 0.0.2', source='tox itself') + requirements.add('tox-current-env >= 0.0.3', source='tox itself') requirements.check(source='tox itself') - with tempfile.NamedTemporaryFile('r') as depfile: + with tempfile.NamedTemporaryFile('r') as deps, tempfile.NamedTemporaryFile('r') as extras: r = subprocess.run( - [sys.executable, '-m', 'tox', '--print-deps-to-file', - depfile.name, '-qre', toxenv], + [sys.executable, '-m', 'tox', + '--print-deps-to', deps.name, + '--print-extras-to', extras.name, + '-qre', toxenv], check=False, encoding='utf-8', stdout=subprocess.PIPE, @@ -247,8 +257,9 @@ def generate_tox_requirements(toxenv, requirements): print_err(r.stdout, end='') r.check_returncode() - deplines = depfile.read().splitlines() + deplines = deps.read().splitlines() packages = parse_tox_requires_lines(deplines) + requirements.add_extras(*extras.read().splitlines()) requirements.extend(packages, source=f'tox --print-deps-only: {toxenv}') diff --git a/pyproject_buildrequires_testcases.yaml b/pyproject_buildrequires_testcases.yaml index 77360c6..3f534a3 100644 --- a/pyproject_buildrequires_testcases.yaml +++ b/pyproject_buildrequires_testcases.yaml @@ -290,7 +290,7 @@ Tox dependencies: setuptools: 50 wheel: 1 tox: 3.5.3 - tox-current-env: 0.0.2 + tox-current-env: 0.0.3 toxenv: py3 setup.py: | from setuptools import setup @@ -312,8 +312,52 @@ Tox dependencies: python3dist(setuptools) >= 40.8 python3dist(wheel) python3dist(wheel) - python3dist(tox-current-env) >= 0.0.2 + python3dist(tox-current-env) >= 0.0.3 python3dist(toxdep1) python3dist(toxdep2) python3dist(inst) result: 0 + +Tox extras: + installed: + setuptools: 50 + wheel: 1 + tox: 3.5.3 + tox-current-env: 0.0.3 + toxenv: py3 + setup.py: | + from setuptools import setup + setup( + name='test', + version='0.1', + install_requires=['inst'], + extras_require={ + 'extra1': ['dep11 > 11', 'dep12'], + 'extra2': ['dep21', 'dep22', 'dep23'], + 'nope': ['nopedep'], + } + ) + tox.ini: | + [tox] + envlist = py36,py37,py38 + [testenv] + deps = + toxdep + extras = + extra2 + extra1 + commands = + true + expected: | + python3dist(setuptools) >= 40.8 + python3dist(wheel) + python3dist(wheel) + python3dist(tox-current-env) >= 0.0.3 + python3dist(toxdep) + python3dist(inst) + python3dist(dep11) > 11 + python3dist(dep12) + python3dist(dep21) + python3dist(dep22) + python3dist(dep23) + result: 0