@@ -763,3 +763,168 @@ def test_invalid_license_files(self, license_files):
763763
764764 with pytest .raises (metadata .InvalidMetadata ):
765765 meta .license_files # noqa: B018
766+
767+ class TestMetadataWriting :
768+ def test_write_metadata (self ):
769+ meta = metadata .Metadata .from_raw (_RAW_EXAMPLE )
770+ written = meta .as_rfc822 ().as_string ()
771+ assert (
772+ written == "metadata-version: 2.3\n name: packaging\n version: 2023.0.0\n \n "
773+ )
774+
775+ def test_write_metadata_with_description (self ):
776+ # Intentionally out of order to make sure it is written in order
777+ meta = metadata .Metadata .from_raw (
778+ {
779+ "version" : "1.2.3" ,
780+ "name" : "Hello" ,
781+ "description" : "Hello\n \n World👋" ,
782+ "metadata_version" : "2.3" ,
783+ }
784+ )
785+ written = meta .as_rfc822 ().as_string ()
786+ assert (
787+ written == "metadata-version: 2.3\n name: Hello\n "
788+ "version: 1.2.3\n \n Hello\n \n World👋"
789+ )
790+ written = meta .as_rfc822 ().as_bytes ()
791+ assert (
792+ written
793+ == "metadata-version: 2.3\n name: Hello\n "
794+ "version: 1.2.3\n \n Hello\n \n World👋" .encode ()
795+ )
796+
797+ def test_multiline_license (self ):
798+ meta = metadata .Metadata .from_raw (
799+ {
800+ "version" : "1.2.3" ,
801+ "name" : "packaging" ,
802+ "license" : "Hello\n World🐍" ,
803+ "metadata_version" : "2.3" ,
804+ }
805+ )
806+ written = meta .as_rfc822 ().as_string ()
807+ assert (
808+ written == "metadata-version: 2.3\n name: packaging\n version: 1.2.3"
809+ "\n license: Hello\n World🐍\n \n "
810+ )
811+ written = meta .as_rfc822 ().as_bytes ()
812+ assert (
813+ written
814+ == "metadata-version: 2.3\n name: packaging\n version: 1.2.3"
815+ "\n license: Hello\n World🐍\n \n " .encode ()
816+ )
817+
818+ def test_large (self ):
819+ meta = metadata .Metadata .from_raw (
820+ {
821+ "author" : "Example!" ,
822+ "author_email" :
"Unknown <[email protected] >" ,
823+ "classifiers" : [
824+ "Development Status :: 4 - Beta" ,
825+ "Programming Language :: Python" ,
826+ ],
827+ "description" : "some readme 👋\n " ,
828+ "description_content_type" : "text/markdown" ,
829+ "keywords" : ["trampolim" , "is" , "interesting" ],
830+ "license" : "some license text" ,
831+ "maintainer_email" :
"Other Example <[email protected] >" ,
832+ "metadata_version" : "2.1" ,
833+ "name" : "full_metadata" ,
834+ "project_urls" : {
835+ "homepage" : "example.com" ,
836+ "documentation" : "readthedocs.org" ,
837+ "repository" : "github.com/some/repo" ,
838+ "changelog" : "github.com/some/repo/blob/master/CHANGELOG.rst" ,
839+ },
840+ "provides_extra" : ["test" ],
841+ "requires_dist" : [
842+ "dependency1" ,
843+ "dependency2>1.0.0" ,
844+ "dependency3[extra]" ,
845+ 'dependency4; os_name != "nt"' ,
846+ 'dependency5[other-extra]>1.0; os_name == "nt"' ,
847+ 'test_dependency; extra == "test"' ,
848+ 'test_dependency[test_extra]; extra == "test"' ,
849+ "test_dependency[test_extra2]>3.0; "
850+ 'os_name == "nt" and extra == "test"' ,
851+ ],
852+ "requires_python" : ">=3.8" ,
853+ "summary" : "A package with all the metadata :)" ,
854+ "version" : "3.2.1" ,
855+ }
856+ )
857+
858+ assert meta .as_json () == {
859+ "author" : "Example!" ,
860+ "author_email" :
"Unknown <[email protected] >" ,
861+ "classifier" : [
862+ "Development Status :: 4 - Beta" ,
863+ "Programming Language :: Python" ,
864+ ],
865+ "description" : "some readme 👋\n " ,
866+ "description_content_type" : "text/markdown" ,
867+ "keywords" : ["trampolim" , "is" , "interesting" ],
868+ "license" : "some license text" ,
869+ "maintainer_email" :
"Other Example <[email protected] >" ,
870+ "metadata_version" : "2.1" ,
871+ "name" : "full_metadata" ,
872+ "project_url" : [
873+ "homepage, example.com" ,
874+ "documentation, readthedocs.org" ,
875+ "repository, github.com/some/repo" ,
876+ "changelog, github.com/some/repo/blob/master/CHANGELOG.rst" ,
877+ ],
878+ "provides_extra" : ["test" ],
879+ "requires_dist" : [
880+ "dependency1" ,
881+ "dependency2>1.0.0" ,
882+ "dependency3[extra]" ,
883+ 'dependency4; os_name != "nt"' ,
884+ 'dependency5[other-extra]>1.0; os_name == "nt"' ,
885+ 'test_dependency; extra == "test"' ,
886+ 'test_dependency[test_extra]; extra == "test"' ,
887+ 'test_dependency[test_extra2]>3.0; os_name == "nt" and extra == "test"' ,
888+ ],
889+ "requires_python" : ">=3.8" ,
890+ "summary" : "A package with all the metadata :)" ,
891+ "version" : "3.2.1" ,
892+ }
893+
894+ core_metadata = meta .as_rfc822 ()
895+ assert core_metadata .items () == [
896+ ("metadata-version" , "2.1" ),
897+ ("name" , "full_metadata" ),
898+ ("version" , "3.2.1" ),
899+ ("summary" , "A package with all the metadata :)" ),
900+ ("description-content-type" , "text/markdown" ),
901+ ("keywords" , "trampolim,is,interesting" ),
902+ ("author" , "Example!" ),
903+ (
"author-email" ,
"Unknown <[email protected] >" ),
904+ (
"maintainer-email" ,
"Other Example <[email protected] >" ),
905+ ("license" , "some license text" ),
906+ ("classifier" , "Development Status :: 4 - Beta" ),
907+ ("classifier" , "Programming Language :: Python" ),
908+ ("requires-dist" , "dependency1" ),
909+ ("requires-dist" , "dependency2>1.0.0" ),
910+ ("requires-dist" , "dependency3[extra]" ),
911+ ("requires-dist" , 'dependency4; os_name != "nt"' ),
912+ ("requires-dist" , 'dependency5[other-extra]>1.0; os_name == "nt"' ),
913+ ("requires-dist" , 'test_dependency; extra == "test"' ),
914+ ("requires-dist" , 'test_dependency[test_extra]; extra == "test"' ),
915+ (
916+ "requires-dist" ,
917+ 'test_dependency[test_extra2]>3.0; os_name == "nt" and extra == "test"' ,
918+ ),
919+ ("requires-python" , ">=3.8" ),
920+ ("project-url" , "homepage, example.com" ),
921+ ("project-url" , "documentation, readthedocs.org" ),
922+ ("project-url" , "repository, github.com/some/repo" ),
923+ (
924+ "project-url" ,
925+ "changelog, github.com/some/repo/blob/master/CHANGELOG.rst" ,
926+ ),
927+ ("provides-extra" , "test" ),
928+ ]
929+
930+ assert core_metadata .get_payload () == "some readme 👋\n "
0 commit comments