69
69
import pdm .backend ._vendor .packaging .utils
70
70
import pdm .backend ._vendor .packaging .version
71
71
72
- __version__ = "0.9.0b7 "
72
+ __version__ = "0.9.0 "
73
73
74
74
__all__ = [
75
75
"ConfigurationError" ,
@@ -127,7 +127,6 @@ class _SmartMessageSetter:
127
127
reduce boilerplate.
128
128
129
129
If a value is None, do nothing.
130
- If a value contains a newline, indent it (may produce a warning in the future).
131
130
"""
132
131
133
132
message : email .message .Message
@@ -253,23 +252,10 @@ class StandardMetadata:
253
252
"""
254
253
If True, all errors will be collected and raised in an ExceptionGroup.
255
254
"""
256
- _locked_metadata : bool = False
257
- """
258
- Internal flag to prevent setting non-dynamic fields after initialization.
259
- """
260
255
261
256
def __post_init__ (self ) -> None :
262
257
self .validate ()
263
258
264
- def __setattr__ (self , name : str , value : Any ) -> None :
265
- if self ._locked_metadata :
266
- metadata_name = name .replace ("_" , "-" )
267
- locked_fields = constants .KNOWN_METADATA_FIELDS - set (self .dynamic )
268
- if metadata_name in locked_fields :
269
- msg = f"Field { name !r} is not dynamic"
270
- raise AttributeError (msg )
271
- super ().__setattr__ (name , value )
272
-
273
259
@property
274
260
def auto_metadata_version (self ) -> str :
275
261
"""
@@ -443,7 +429,6 @@ def from_pyproject( # noqa: C901
443
429
metadata_version = metadata_version ,
444
430
all_errors = all_errors ,
445
431
)
446
- self ._locked_metadata = True
447
432
448
433
pyproject .finalize ("Failed to parse pyproject.toml" )
449
434
assert self is not None
@@ -482,6 +467,7 @@ def validate(self, *, warn: bool = True) -> None: # noqa: C901
482
467
- License classifiers deprecated for metadata_version >= 2.4 (warning)
483
468
- ``license`` is an SPDX license expression if metadata_version >= 2.4
484
469
- ``license_files`` is supported only for metadata_version >= 2.4
470
+ - ``project_url`` can't contain keys over 32 characters
485
471
"""
486
472
errors = ErrorCollector (collect_errors = self .all_errors )
487
473
@@ -545,6 +531,11 @@ def validate(self, *, warn: bool = True) -> None: # noqa: C901
545
531
msg = "{key} is supported only when emitting metadata version >= 2.4"
546
532
errors .config_error (msg , key = "project.license-files" )
547
533
534
+ for name in self .urls :
535
+ if len (name ) > 32 :
536
+ msg = "{key} names cannot be more than 32 characters long"
537
+ errors .config_error (msg , key = "project.urls" , got = name )
538
+
548
539
errors .finalize ("Metadata validation failed" )
549
540
550
541
def _write_metadata ( # noqa: C901
@@ -566,8 +557,7 @@ def _write_metadata( # noqa: C901
566
557
if self .description :
567
558
smart_message ["Summary" ] = self .description
568
559
smart_message ["Keywords" ] = "," .join (self .keywords ) or None
569
- if "homepage" in self .urls :
570
- smart_message ["Home-page" ] = self .urls ["homepage" ]
560
+ # skip 'Home-page'
571
561
# skip 'Download-URL'
572
562
smart_message ["Author" ] = _name_list (self .authors )
573
563
smart_message ["Author-Email" ] = _email_list (self .authors )
@@ -582,14 +572,20 @@ def _write_metadata( # noqa: C901
582
572
if self .license_files is not None :
583
573
for license_file in sorted (set (self .license_files )):
584
574
smart_message ["License-File" ] = os .fspath (license_file .as_posix ())
575
+ elif (
576
+ self .auto_metadata_version not in constants .PRE_SPDX_METADATA_VERSIONS
577
+ and isinstance (self .license , License )
578
+ and self .license .file
579
+ ):
580
+ smart_message ["License-File" ] = os .fspath (self .license .file .as_posix ())
585
581
586
582
for classifier in self .classifiers :
587
583
smart_message ["Classifier" ] = classifier
588
584
# skip 'Provides-Dist'
589
585
# skip 'Obsoletes-Dist'
590
586
# skip 'Requires-External'
591
587
for name , url in self .urls .items ():
592
- smart_message ["Project-URL" ] = f"{ name . capitalize () } , { url } "
588
+ smart_message ["Project-URL" ] = f"{ name } , { url } "
593
589
if self .requires_python :
594
590
smart_message ["Requires-Python" ] = str (self .requires_python )
595
591
for dep in self .dependencies :
0 commit comments