@@ -189,10 +189,10 @@ def test_complete(self):
189189 with path .open ("r" , encoding = "utf-8" ) as file :
190190 metadata_contents = file .read ()
191191 raw , unparsed = metadata .parse_email (metadata_contents )
192- assert len (unparsed ) == 1
192+ assert len (unparsed ) == 1 # "ThisIsNotReal" key
193193 assert unparsed ["thisisnotreal" ] == ["Hello!" ]
194- assert len (raw ) == 26
195- assert raw ["metadata_version" ] == "2.4 "
194+ assert len (raw ) == 28
195+ assert raw ["metadata_version" ] == "2.5 "
196196 assert raw ["name" ] == "BeagleVote"
197197 assert raw ["version" ] == "1.0a2"
198198 assert raw ["platforms" ] == ["ObscureUnix" , "RareDOS" ]
@@ -251,6 +251,8 @@ def test_complete(self):
251251 ]
252252 assert raw ["dynamic" ] == ["Obsoletes-Dist" ]
253253 assert raw ["description" ] == "This description intentionally left blank.\n "
254+ assert raw ["import_names" ] == ["beaglevote" , "_beaglevote ; private" ]
255+ assert raw ["import_namespaces" ] == ["spam" , "_bacon ; private" ]
254256
255257
256258class TestExceptionGroup :
@@ -267,7 +269,7 @@ def test_repr(self):
267269
268270
269271_RAW_EXAMPLE = {
270- "metadata_version" : "2.3 " ,
272+ "metadata_version" : "2.5 " ,
271273 "name" : "packaging" ,
272274 "version" : "2023.0.0" ,
273275}
@@ -287,12 +289,19 @@ def _invalid_with_cause(self, meta, attr, cause=None, *, field=None):
287289 assert isinstance (exc .__cause__ , cause )
288290
289291 def test_from_email (self ):
290- metadata_version = "2.3 "
292+ metadata_version = "2.5 "
291293 meta = metadata .Metadata .from_email (
292294 f"Metadata-Version: { metadata_version } " , validate = False
293295 )
294296
295297 assert meta .metadata_version == metadata_version
298+ assert meta .import_names is None
299+
300+ def test_from_email_empty_import_name (self ):
301+ meta = metadata .Metadata .from_email (
302+ "Metadata-Version: 2.5\n Import-Name:\n " , validate = False
303+ )
304+ assert meta .import_names == []
296305
297306 def test_from_email_unparsed (self ):
298307 with pytest .raises (ExceptionGroup ) as exc_info :
@@ -778,13 +787,43 @@ def test_invalid_license_files(self, license_files):
778787 with pytest .raises (metadata .InvalidMetadata ):
779788 meta .license_files # noqa: B018
780789
790+ @pytest .mark .parametrize ("key" , ["import_namespaces" , "import_names" ])
791+ def test_valid_import_names (self , key ):
792+ import_names = [
793+ "packaging" ,
794+ "packaging.metadata" ,
795+ "_utils ; private" ,
796+ "_stuff;private" ,
797+ ]
798+ meta = metadata .Metadata .from_raw ({key : import_names }, validate = False )
799+
800+ assert getattr (meta , key ) == import_names
801+
802+ @pytest .mark .parametrize ("key" , ["import_namespaces" , "import_names" ])
803+ @pytest .mark .parametrize (
804+ "name" , ["not-valid" , "still.not-valid" , "stuff;" , "stuff; extra" ]
805+ )
806+ def test_invalid_import_names_identifier (self , key , name ):
807+ meta = metadata .Metadata .from_raw ({key : [name ]}, validate = False )
808+
809+ with pytest .raises (metadata .InvalidMetadata ):
810+ getattr (meta , key )
811+
812+ @pytest .mark .parametrize ("key" , ["import_namespaces" , "import_names" ])
813+ def test_invalid_import_names_keyword (self , key ):
814+ import_names = ["class" ]
815+ meta = metadata .Metadata .from_raw ({key : import_names }, validate = False )
816+
817+ with pytest .raises (metadata .InvalidMetadata ):
818+ getattr (meta , key )
819+
781820
782821class TestMetadataWriting :
783822 def test_write_metadata (self ):
784823 meta = metadata .Metadata .from_raw (_RAW_EXAMPLE )
785824 written = meta .as_rfc822 ().as_string ()
786825 assert (
787- written == "metadata-version: 2.3 \n name: packaging\n version: 2023.0.0\n \n "
826+ written == "metadata-version: 2.5 \n name: packaging\n version: 2023.0.0\n \n "
788827 )
789828
790829 def test_write_metadata_with_description (self ):
@@ -931,6 +970,49 @@ def test_modern_license(self):
931970
932971 assert core_metadata .get_payload () is None
933972
973+ def test__import_names (self ):
974+ meta = metadata .Metadata .from_raw (
975+ {
976+ "metadata_version" : "2.5" ,
977+ "name" : "full_metadata" ,
978+ "version" : "3.2.1" ,
979+ "import_names" : ["one" , "two" ],
980+ "import_namespaces" : ["three" ],
981+ }
982+ )
983+
984+ core_metadata = meta .as_rfc822 ()
985+ assert core_metadata .items () == [
986+ ("metadata-version" , "2.5" ),
987+ ("name" , "full_metadata" ),
988+ ("version" , "3.2.1" ),
989+ ("import-name" , "one" ),
990+ ("import-name" , "two" ),
991+ ("import-namespace" , "three" ),
992+ ]
993+
994+ assert core_metadata .get_payload () is None
995+
996+ def test_empty_import_names (self ):
997+ meta = metadata .Metadata .from_raw (
998+ {
999+ "metadata_version" : "2.5" ,
1000+ "name" : "full_metadata" ,
1001+ "version" : "3.2.1" ,
1002+ "import_names" : [],
1003+ }
1004+ )
1005+
1006+ core_metadata = meta .as_rfc822 ()
1007+ assert core_metadata .items () == [
1008+ ("metadata-version" , "2.5" ),
1009+ ("name" , "full_metadata" ),
1010+ ("version" , "3.2.1" ),
1011+ ("import-name" , "" ),
1012+ ]
1013+
1014+ assert core_metadata .get_payload () is None
1015+
9341016 @pytest .mark .parametrize (
9351017 ("items" , "data" ),
9361018 [
0 commit comments