|  | 
| 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,20 @@ def build_editable(self, directory: Path, verbose: bool = False) -> pathlib.Path | 
| 658 | 667 |         return wheel_file | 
| 659 | 668 | 
 | 
| 660 | 669 | 
 | 
|  | 670 | +def _compute_dynamic_dependencies(templates) -> List[str]: | 
|  | 671 | +    dependencies = [] | 
|  | 672 | +    for template in templates: | 
|  | 673 | +        req = packaging.requirements.Requirement(template) | 
|  | 674 | +        version = packaging.version.parse(importlib_metadata.version(req.name)) | 
|  | 675 | +        dependencies.append(template.format(v=version)) | 
|  | 676 | +    return dependencies | 
|  | 677 | + | 
|  | 678 | + | 
| 661 | 679 | class Project(): | 
| 662 | 680 |     """Meson project wrapper to generate Python artifacts.""" | 
| 663 | 681 | 
 | 
| 664 | 682 |     _ALLOWED_DYNAMIC_FIELDS: ClassVar[List[str]] = [ | 
|  | 683 | +        'dependencies', | 
| 665 | 684 |         'version', | 
| 666 | 685 |     ] | 
| 667 | 686 |     _metadata: Optional[pyproject_metadata.StandardMetadata] | 
| @@ -778,6 +797,10 @@ def __init__(  # noqa: C901 | 
| 778 | 797 |         if self._metadata and 'version' in self._metadata.dynamic: | 
| 779 | 798 |             self._metadata.version = self.version | 
| 780 | 799 | 
 | 
|  | 800 | +        if self._metadata and 'dependencies' in self._metadata.dynamic: | 
|  | 801 | +            self._metadata.dependencies = _compute_dynamic_dependencies( | 
|  | 802 | +                self._get_config_key('dynamic').get('dependencies', [])) | 
|  | 803 | + | 
| 781 | 804 |     def _get_config_key(self, key: str) -> Any: | 
| 782 | 805 |         value: Any = self._config | 
| 783 | 806 |         for part in f'tool.meson-python.{key}'.split('.'): | 
|  | 
0 commit comments