%pyproject_buildrequires: Add support for dependency groups (PEP 735), via tox configuration
This commit is contained in:
parent
307d2bef63
commit
8baa94160c
@ -155,6 +155,9 @@ The `-e` option redefines `%{toxenv}` for further reuse.
|
|||||||
Use `%{default_toxenv}` to get the default value.
|
Use `%{default_toxenv}` to get the default value.
|
||||||
|
|
||||||
The `-t`/`-e` option uses [tox-current-env]'s `--print-deps-to-file` behind the scenes.
|
The `-t`/`-e` option uses [tox-current-env]'s `--print-deps-to-file` behind the scenes.
|
||||||
|
It generates dependencies listed directly in `deps`,
|
||||||
|
dependencies defined through `extras`,
|
||||||
|
and on tox 4.22+ also dependencies defined through `dependency_groups`.
|
||||||
|
|
||||||
If your package specifies some tox plugins in `tox.requires`,
|
If your package specifies some tox plugins in `tox.requires`,
|
||||||
such plugins will be BuildRequired as well.
|
such plugins will be BuildRequired as well.
|
||||||
|
@ -175,6 +175,7 @@ export HOSTNAME="rpmbuild" # to speedup tox in network-less mock, see rhbz#1856
|
|||||||
%changelog
|
%changelog
|
||||||
* Mon Nov 04 2024 Miro Hrončok <mhroncok@redhat.com> - 1.16.0-1
|
* Mon Nov 04 2024 Miro Hrončok <mhroncok@redhat.com> - 1.16.0-1
|
||||||
- %%pyproject_buildrequires: Add support for dependency groups (PEP 735), via the -g flag
|
- %%pyproject_buildrequires: Add support for dependency groups (PEP 735), via the -g flag
|
||||||
|
- This is implied when used tox testenvs depend on dependency groups (requires tox 4.22+)
|
||||||
- Fixes: rhbz#2318849
|
- Fixes: rhbz#2318849
|
||||||
|
|
||||||
* Thu Oct 03 2024 Karolina Surma <ksurma@redhat.com> - 1.15.1-1
|
* Thu Oct 03 2024 Karolina Surma <ksurma@redhat.com> - 1.15.1-1
|
||||||
|
@ -468,6 +468,29 @@ def generate_tox_requirements(toxenv, requirements):
|
|||||||
source=f'tox --print-deps-only: {toxenv}')
|
source=f'tox --print-deps-only: {toxenv}')
|
||||||
|
|
||||||
|
|
||||||
|
def tox_dependency_groups(toxenv):
|
||||||
|
# We call this command separately instead of folding it into the previous one
|
||||||
|
# becasue --print-dependency-groups-to only works with tox 4.22+ and tox-current-env 0.0.14+.
|
||||||
|
# We handle failure gracefully: upstreams using dependency_groups should require tox >= 4.22.
|
||||||
|
toxenv = ','.join(toxenv)
|
||||||
|
with tempfile.NamedTemporaryFile('r') as groups:
|
||||||
|
r = subprocess.run(
|
||||||
|
[sys.executable, '-m', 'tox',
|
||||||
|
'--print-dependency-groups-to', groups.name,
|
||||||
|
'-q', '-e', toxenv],
|
||||||
|
check=False,
|
||||||
|
encoding='utf-8',
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT,
|
||||||
|
)
|
||||||
|
if r.returncode == 0:
|
||||||
|
if r.stdout:
|
||||||
|
print_err(r.stdout, end='')
|
||||||
|
if output := groups.read().strip():
|
||||||
|
return output.splitlines()
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
def generate_dependency_groups(requested_groups, requirements):
|
def generate_dependency_groups(requested_groups, requirements):
|
||||||
"""Adapted from https://peps.python.org/pep-0735/#reference-implementation (public domain)"""
|
"""Adapted from https://peps.python.org/pep-0735/#reference-implementation (public domain)"""
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
@ -573,6 +596,7 @@ def generate_requires(
|
|||||||
config_settings=config_settings,
|
config_settings=config_settings,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dependency_groups = dependency_groups or []
|
||||||
try:
|
try:
|
||||||
if (include_runtime or toxenv or read_pyproject_dependencies) and not use_build_system:
|
if (include_runtime or toxenv or read_pyproject_dependencies) and not use_build_system:
|
||||||
raise ValueError('-N option cannot be used in combination with -r, -e, -t, -x, -p options')
|
raise ValueError('-N option cannot be used in combination with -r, -e, -t, -x, -p options')
|
||||||
@ -588,7 +612,8 @@ def generate_requires(
|
|||||||
generate_build_requirements(backend, requirements)
|
generate_build_requirements(backend, requirements)
|
||||||
if toxenv:
|
if toxenv:
|
||||||
include_runtime = True
|
include_runtime = True
|
||||||
generate_tox_requirements(toxenv, requirements) # TODO extend dependency_groups
|
generate_tox_requirements(toxenv, requirements)
|
||||||
|
dependency_groups.extend(tox_dependency_groups(toxenv))
|
||||||
if dependency_groups:
|
if dependency_groups:
|
||||||
generate_dependency_groups(dependency_groups, requirements)
|
generate_dependency_groups(dependency_groups, requirements)
|
||||||
if include_runtime:
|
if include_runtime:
|
||||||
|
@ -1385,3 +1385,37 @@ pyproject.toml with dependency-groups nonexisting requested:
|
|||||||
tests = ["pytest>=5", "pytest-mock"]
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
docs = ["sphinx", "python-docs-theme"]
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
except: LookupError
|
except: LookupError
|
||||||
|
|
||||||
|
tox with dependency_groups:
|
||||||
|
skipif: not (SETUPTOOLS_60 and TOX_4_22)
|
||||||
|
installed:
|
||||||
|
setuptools: 50
|
||||||
|
wheel: 1
|
||||||
|
tox: 4.22
|
||||||
|
tox-current-env: 0.0.14
|
||||||
|
toxenv:
|
||||||
|
- py3
|
||||||
|
pyproject.toml: |
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
[project]
|
||||||
|
name = "my_package"
|
||||||
|
version = "0.1"
|
||||||
|
[dependency-groups]
|
||||||
|
tests = ["pytest>=5", "pytest-mock"]
|
||||||
|
docs = ["sphinx", "python-docs-theme"]
|
||||||
|
[tool.tox]
|
||||||
|
requires = ["tox>=4.22"]
|
||||||
|
[tool.tox.env_run_base]
|
||||||
|
dependency_groups = ["tests"]
|
||||||
|
commands = [["pytest"]]
|
||||||
|
expected: |
|
||||||
|
python3dist(setuptools)
|
||||||
|
python3dist(wheel)
|
||||||
|
python3dist(tox-current-env) >= 0.0.6
|
||||||
|
python3dist(tox) >= 4.22
|
||||||
|
python3dist(tox)
|
||||||
|
python3dist(pytest) >= 5
|
||||||
|
python3dist(pytest-mock)
|
||||||
|
result: 0
|
||||||
|
@ -11,6 +11,14 @@ from pyproject_buildrequires import generate_requires, load_pyproject
|
|||||||
SETUPTOOLS_VERSION = packaging.version.parse(setuptools.__version__)
|
SETUPTOOLS_VERSION = packaging.version.parse(setuptools.__version__)
|
||||||
SETUPTOOLS_60 = SETUPTOOLS_VERSION >= packaging.version.parse('60')
|
SETUPTOOLS_60 = SETUPTOOLS_VERSION >= packaging.version.parse('60')
|
||||||
|
|
||||||
|
try:
|
||||||
|
import tox
|
||||||
|
except ImportError:
|
||||||
|
TOX_4_22 = False
|
||||||
|
else:
|
||||||
|
TOX_VERSION = packaging.version.parse(tox.__version__)
|
||||||
|
TOX_4_22 = TOX_VERSION >= packaging.version.parse('4.22')
|
||||||
|
|
||||||
testcases = {}
|
testcases = {}
|
||||||
with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
|
with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
|
||||||
testcases = yaml.safe_load(f)
|
testcases = yaml.safe_load(f)
|
||||||
|
Loading…
Reference in New Issue
Block a user