| 
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