41
41
else :
42
42
import tomllib
43
43
44
+ import packaging .version
44
45
import pyproject_metadata
45
46
46
47
import mesonpy ._compat
@@ -694,7 +695,7 @@ class Project():
694
695
_ALLOWED_DYNAMIC_FIELDS : ClassVar [List [str ]] = [
695
696
'version' ,
696
697
]
697
- _metadata : Optional [ pyproject_metadata .StandardMetadata ]
698
+ _metadata : pyproject_metadata .StandardMetadata
698
699
699
700
def __init__ ( # noqa: C901
700
701
self ,
@@ -748,20 +749,6 @@ def __init__( # noqa: C901
748
749
# load pyproject.toml
749
750
pyproject = tomllib .loads (self ._source_dir .joinpath ('pyproject.toml' ).read_text ())
750
751
751
- # package metadata
752
- self ._pep621 = 'project' in pyproject :
753
- if self .pep621 :
754
- self ._metadata = pyproject_metadata .StandardMetadata .from_pyproject (pyproject , self ._source_dir )
755
- else :
756
- print (
757
- '{yellow}{bold}! Using Meson to generate the project metadata '
758
- '(no `project` section in pyproject.toml){reset}' .format (** _STYLES )
759
- )
760
- self ._metadata = None
761
-
762
- if self ._metadata :
763
- self ._validate_metadata ()
764
-
765
752
# load meson args from pyproject.toml
766
753
pyproject_config = _validate_pyproject_config (pyproject )
767
754
for key , value in pyproject_config .get ('args' , {}).items ():
@@ -802,9 +789,21 @@ def __init__( # noqa: C901
802
789
has_valid_build_dir = self ._build_dir .joinpath ('meson-private' , 'coredata.dat' ).is_file ()
803
790
self ._configure (reconfigure = has_valid_build_dir and not native_file_mismatch )
804
791
805
- # set version if dynamic (this fetches it from Meson)
806
- if self ._metadata and 'version' in self ._metadata .dynamic :
807
- self ._metadata .version = self .version
792
+ # package metadata
793
+ if 'project' in pyproject :
794
+ self ._metadata = pyproject_metadata .StandardMetadata .from_pyproject (pyproject , self ._source_dir )
795
+ else :
796
+ self ._metadata = pyproject_metadata .StandardMetadata (
797
+ name = self ._meson_name , version = packaging .version .Version (self ._meson_version ))
798
+ print (
799
+ '{yellow}{bold}! Using Meson to generate the project metadata '
800
+ '(no `project` section in pyproject.toml){reset}' .format (** _STYLES )
801
+ )
802
+ self ._validate_metadata ()
803
+
804
+ # set version from meson.build if dynamic
805
+ if 'version' in self ._metadata .dynamic :
806
+ self ._metadata .version = packaging .version .Version (self ._meson_version )
808
807
809
808
def _proc (self , * args : str ) -> None :
810
809
"""Invoke a subprocess."""
@@ -858,8 +857,6 @@ def _configure(self, reconfigure: bool = False) -> None:
858
857
def _validate_metadata (self ) -> None :
859
858
"""Check the pyproject.toml metadata and see if there are any issues."""
860
859
861
- assert self ._metadata
862
-
863
860
# check for unsupported dynamic fields
864
861
unsupported_dynamic = {
865
862
key for key in self ._metadata .dynamic
@@ -991,45 +988,18 @@ def _meson_version(self) -> str:
991
988
992
989
@property
993
990
def name (self ) -> str :
994
- """Project name. Specified in pyproject.toml."""
995
- name = self ._metadata .name if self ._metadata else self ._meson_name
996
- assert isinstance (name , str )
997
- return name .replace ('-' , '_' )
991
+ """Project name."""
992
+ return str (self ._metadata .name ).replace ('-' , '_' )
998
993
999
994
@property
1000
995
def version (self ) -> str :
1001
- """Project version. Either specified in pyproject.toml or meson.build."""
1002
- if self ._metadata and 'version' not in self ._metadata .dynamic :
1003
- version = str (self ._metadata .version )
1004
- else :
1005
- version = self ._meson_version
1006
- assert isinstance (version , str )
1007
- return version
996
+ """Project version."""
997
+ return str (self ._metadata .version )
1008
998
1009
999
@cached_property
1010
1000
def metadata (self ) -> bytes :
1011
- """Project metadata."""
1012
- # the rest of the keys are only available when using PEP 621 metadata
1013
- if not self .pep621 :
1014
- data = textwrap .dedent (f'''
1015
- Metadata-Version: 2.1
1016
- Name: { self .name }
1017
- Version: { self .version }
1018
- ''' ).strip ()
1019
- return data .encode ()
1020
-
1021
- # re-import pyproject_metadata to raise ModuleNotFoundError if it is really missing
1022
- import pyproject_metadata # noqa: F401
1023
- assert self ._metadata
1024
-
1025
- core_metadata = self ._metadata .as_rfc822 ()
1026
- # use self.version as the version may be dynamic -- fetched from Meson
1027
- #
1028
- # we need to overwrite this field in the RFC822 field as
1029
- # pyproject_metadata removes 'version' from the dynamic fields when
1030
- # giving it a value via the dataclass
1031
- core_metadata .headers ['Version' ] = [self .version ]
1032
- return bytes (core_metadata )
1001
+ """Project metadata as an RFC822 message."""
1002
+ return bytes (self ._metadata .as_rfc822 ())
1033
1003
1034
1004
@property
1035
1005
def license_file (self ) -> Optional [pathlib .Path ]:
@@ -1044,11 +1014,6 @@ def is_pure(self) -> bool:
1044
1014
"""Is the wheel "pure" (architecture independent)?"""
1045
1015
return bool (self ._wheel_builder .is_pure )
1046
1016
1047
- @property
1048
- def pep621 (self ) -> bool :
1049
- """Does the project use PEP 621 metadata?"""
1050
- return self ._pep621
1051
-
1052
1017
def sdist (self , directory : Path ) -> pathlib .Path :
1053
1018
"""Generates a sdist (source distribution) in the specified directory."""
1054
1019
# generate meson dist file
0 commit comments