|  | 
| 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