@@ -78,6 +78,8 @@ def canonicalize_license_expression(s: str) -> str:
78
78
79
79
__version__ = '0.17.0.dev0'
80
80
81
+ _PYPROJECT_METADATA_VERSION = tuple (map (int , pyproject_metadata .__version__ .split ('.' )[:2 ]))
82
+ _SUPPORTED_DYNAMIC_FIELDS = {'version' , } if _PYPROJECT_METADATA_VERSION < (0 , 9 ) else {'version' , 'license' , 'license-files' }
81
83
82
84
_NINJA_REQUIRED_VERSION = '1.8.2'
83
85
_MESON_REQUIRED_VERSION = '0.63.3' # keep in sync with the version requirement in pyproject.toml
@@ -272,7 +274,7 @@ def from_pyproject(
272
274
'Required "project.version" field is missing and not declared as dynamic' )
273
275
274
276
# Check for unsupported dynamic fields.
275
- unsupported_dynamic = set (metadata .dynamic ) - { 'version' , }
277
+ unsupported_dynamic = set (metadata .dynamic ) - _SUPPORTED_DYNAMIC_FIELDS
276
278
if unsupported_dynamic :
277
279
fields = ', ' .join (f'"{ x } "' for x in unsupported_dynamic )
278
280
raise pyproject_metadata .ConfigurationError (f'Unsupported dynamic fields: { fields } ' )
@@ -754,13 +756,30 @@ def __init__(
754
756
raise pyproject_metadata .ConfigurationError (
755
757
'Field "version" declared as dynamic but version is not defined in meson.build' )
756
758
self ._metadata .version = packaging .version .Version (version )
759
+ if 'license' in self ._metadata .dynamic :
760
+ license = self ._meson_license
761
+ if license is None :
762
+ raise pyproject_metadata .ConfigurationError (
763
+ 'Field "license" declared as dynamic but license is not specified in meson.build' )
764
+ # mypy is not happy when analyzing typing based on
765
+ # pyproject-metadata < 0.9 where license needs to be of
766
+ # License type. However, this code is not executed if
767
+ # pyproject-metadata is older than 0.9 because then dynamic
768
+ # license is not allowed.
769
+ self ._metadata .license = license # type: ignore[assignment]
770
+ if 'license-files' in self ._metadata .dynamic :
771
+ self ._metadata .license_files = self ._meson_license_files
757
772
else :
758
773
# if project section is missing, use minimal metdata from meson.build
759
774
name , version = self ._meson_name , self ._meson_version
760
775
if version is None :
761
776
raise pyproject_metadata .ConfigurationError (
762
777
'Section "project" missing in pyproject.toml and version is not defined in meson.build' )
763
- self ._metadata = Metadata (name = name , version = packaging .version .Version (version ))
778
+ kwargs = {
779
+ 'license' : self ._meson_license ,
780
+ 'license_files' : self ._meson_license_files
781
+ } if _PYPROJECT_METADATA_VERSION >= (0 , 9 ) else {}
782
+ self ._metadata = Metadata (name = name , version = packaging .version .Version (version ), ** kwargs )
764
783
765
784
# verify that we are running on a supported interpreter
766
785
if self ._metadata .requires_python :
@@ -885,6 +904,31 @@ def _meson_version(self) -> Optional[str]:
885
904
return None
886
905
return value
887
906
907
+ @property
908
+ def _meson_license (self ) -> Optional [str ]:
909
+ """The license specified with the ``license`` argument to ``project()`` in meson.build."""
910
+ value = self ._info ('intro-projectinfo' ).get ('license' , None )
911
+ if value is None :
912
+ return None
913
+ assert isinstance (value , list )
914
+ if len (value ) > 1 :
915
+ raise pyproject_metadata .ConfigurationError (
916
+ 'using a list of strings for the license declared in meson.build is ambiguous: use a SPDX license expression' )
917
+ value = value [0 ]
918
+ assert isinstance (value , str )
919
+ if value == 'unknown' :
920
+ return None
921
+ return str (canonicalize_license_expression (value )) # str() is to make mypy happy
922
+
923
+ @property
924
+ def _meson_license_files (self ) -> Optional [List [pathlib .Path ]]:
925
+ """The license files specified with the ``license_files`` argument to ``project()`` in meson.build."""
926
+ value = self ._info ('intro-projectinfo' ).get ('license_files' , None )
927
+ if not value :
928
+ return None
929
+ assert isinstance (value , list )
930
+ return [pathlib .Path (x ) for x in value ]
931
+
888
932
def sdist (self , directory : Path ) -> pathlib .Path :
889
933
"""Generates a sdist (source distribution) in the specified directory."""
890
934
# Generate meson dist file.
0 commit comments