|
41 | 41 | else:
|
42 | 42 | import tomllib
|
43 | 43 |
|
| 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 |
44 | 53 | import pyproject_metadata
|
45 | 54 |
|
46 | 55 | import mesonpy._compat
|
@@ -658,10 +667,32 @@ def build_editable(self, directory: Path, verbose: bool = False) -> pathlib.Path
|
658 | 667 | return wheel_file
|
659 | 668 |
|
660 | 669 |
|
| 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 | + |
661 | 691 | class Project():
|
662 | 692 | """Meson project wrapper to generate Python artifacts."""
|
663 | 693 |
|
664 | 694 | _ALLOWED_DYNAMIC_FIELDS: ClassVar[List[str]] = [
|
| 695 | + 'dependencies', |
665 | 696 | 'version',
|
666 | 697 | ]
|
667 | 698 | _metadata: Optional[pyproject_metadata.StandardMetadata]
|
@@ -778,6 +809,10 @@ def __init__( # noqa: C901
|
778 | 809 | if self._metadata and 'version' in self._metadata.dynamic:
|
779 | 810 | self._metadata.version = self.version
|
780 | 811 |
|
| 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 | + |
781 | 816 | def _get_config_key(self, key: str) -> Any:
|
782 | 817 | value: Any = self._config
|
783 | 818 | for part in f'tool.meson-python.{key}'.split('.'):
|
|
0 commit comments