Skip to content

Commit fb1fde9

Browse files
committed
ENH: add support for dynamic dependencies computation
1 parent 657747a commit fb1fde9

File tree

6 files changed

+64
-2
lines changed

6 files changed

+64
-2
lines changed

mesonpy/__init__.py

+35
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@
4141
else:
4242
import tomllib
4343

44+
45+
if sys.version_info < (3, 8):
46+
import importlib_metadata
47+
else:
48+
import importlib.metadata as importlib_metadata
49+
50+
51+
import packaging.requirements
52+
import packaging.version
4453
import pyproject_metadata
4554

4655
import mesonpy._compat
@@ -658,10 +667,32 @@ def build_editable(self, directory: Path, verbose: bool = False) -> pathlib.Path
658667
return wheel_file
659668

660669

670+
class MesonpyVersion(packaging.version.Version):
671+
def __getitem__(self, key):
672+
return self.release[key]
673+
674+
675+
class _parse_version(version: str) -> Union[packaging.version.LegacyVersion, MesonpyVersion]:
676+
try:
677+
return MesonpyVersion(version)
678+
except packaging.version.InvalidVersion:
679+
return packaging.version.LegacyVersion(version)
680+
681+
682+
def _compute_dynamic_dependencies(templates) -> List[str]:
683+
dependencies = []
684+
for template in templates:
685+
req = packaging.requirements.Requirement(template)
686+
version = _parse_version(importlib_metadata.version(req.name))
687+
dependencies.append(template.format(v=version))
688+
return dependencies
689+
690+
661691
class Project():
662692
"""Meson project wrapper to generate Python artifacts."""
663693

664694
_ALLOWED_DYNAMIC_FIELDS: ClassVar[List[str]] = [
695+
'dependencies',
665696
'version',
666697
]
667698
_metadata: Optional[pyproject_metadata.StandardMetadata]
@@ -778,6 +809,10 @@ def __init__( # noqa: C901
778809
if self._metadata and 'version' in self._metadata.dynamic:
779810
self._metadata.version = self.version
780811

812+
if self._metadata and 'dependencies' in self._metadata.dynamic:
813+
self._metadata.dependencies = _compute_dynamic_dependencies(
814+
self._get_config_key('dynamic').get('dependencies', []))
815+
781816
def _get_config_key(self, key: str) -> Any:
782817
value: Any = self._config
783818
for part in f'tool.meson-python.{key}'.split('.'):

pyproject.toml

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ build-backend = 'mesonpy'
77
backend-path = ['.']
88
requires = [
99
'meson>=0.63.3',
10+
'packaging',
1011
'pyproject-metadata>=0.7.1',
1112
'tomli>=1.0.0; python_version<"3.11"',
1213
]
@@ -29,6 +30,7 @@ classifiers = [
2930
dependencies = [
3031
'colorama; os_name == "nt"',
3132
'meson>=0.63.3',
33+
'packaging',
3234
'pyproject-metadata>=0.7.1',
3335
'tomli>=1.0.0; python_version<"3.11"',
3436
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# SPDX-FileCopyrightText: 2023 The meson-python developers
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
project('dynamic-dependencies', version: '1.0.0')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# SPDX-FileCopyrightText: 2023 The meson-python developers
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
[build-system]
6+
build-backend = 'mesonpy'
7+
requires = ['meson-python']
8+
9+
[project]
10+
name = 'dynamic-dependencies'
11+
version = '1.0.0'
12+
dynamic = [
13+
'dependencies',
14+
]
15+
16+
[tool.meson-python.dynamic]
17+
dependencies = [
18+
'meson ~= {v.major}.{v.minor}',
19+
'meson-python >= {v}',
20+
]

tests/packages/unsupported-dynamic/pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ requires = ['meson-python']
1010
name = 'unsupported-dynamic'
1111
version = '1.0.0'
1212
dynamic = [
13-
'dependencies',
13+
'requires-python',
1414
]

tests/test_project.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def test_version(package):
3939

4040

4141
def test_unsupported_dynamic(package_unsupported_dynamic):
42-
with pytest.raises(mesonpy.MesonBuilderError, match='Unsupported dynamic fields: "dependencies"'):
42+
with pytest.raises(mesonpy.MesonBuilderError, match='Unsupported dynamic fields: "requires-python"'):
4343
with mesonpy.Project.with_temp_working_dir():
4444
pass
4545

0 commit comments

Comments
 (0)