@@ -831,6 +831,107 @@ def test_exporter_exports_requirements_txt_without_optional_packages(
831831 assert content == expected
832832
833833
834+ @pytest .mark .parametrize (
835+ ["packages_data" , "skip" , "excludes" , "lines" ],
836+ [
837+ # two package without deps, exclude foo
838+ (
839+ [
840+ {"name" : "foo" , "version" : "1.2.3" },
841+ {"name" : "bar" , "version" : "4.5.6" },
842+ ],
843+ None ,
844+ ["foo" ],
845+ [f"bar==4.5.6 ; { MARKER_PY } " ],
846+ ),
847+ # foo has baz dep, exclude foo with baz dep
848+ (
849+ [
850+ {
851+ "name" : "foo" ,
852+ "version" : "1.2.3" ,
853+ "dependencies" : {"baz" : ">=7.8.9" },
854+ },
855+ {"name" : "bar" , "version" : "4.5.6" },
856+ {"name" : "baz" , "version" : "7.8.9" , "optional" : True },
857+ ],
858+ {"baz" },
859+ ["foo" ],
860+ [f"bar==4.5.6 ; { MARKER_PY } " ],
861+
862+ ),
863+ # foo has baz dep, baz also declared in main group, exclude only foo
864+ (
865+ [
866+ {
867+ "name" : "foo" ,
868+ "version" : "1.2.3" ,
869+ "dependencies" : {"baz" : ">=7.8.9" },
870+ },
871+ {"name" : "bar" , "version" : "4.5.6" },
872+ {"name" : "baz" , "version" : "7.8.9" },
873+ ],
874+ None ,
875+ ["foo" ],
876+ [f"bar==4.5.6 ; { MARKER_PY } " , f"baz==7.8.9 ; { MARKER_PY } " ],
877+ ),
878+ # foo has baz dep, bar also has baz dep, exclude only foo
879+ (
880+ [
881+ {
882+ "name" : "foo" ,
883+ "version" : "1.2.3" ,
884+ "dependencies" : {"baz" : ">=7.8.9" },
885+ },
886+ {
887+ "name" : "bar" ,
888+ "version" : "4.5.6" ,
889+ "dependencies" : {"baz" : ">=7.8.9" },
890+ },
891+ {"name" : "baz" , "version" : "7.8.9" , "optional" : True },
892+ ],
893+ {"baz" },
894+ ["foo" ],
895+ [f"bar==4.5.6 ; { MARKER_PY } " , f"baz==7.8.9 ; { MARKER_PY } " ],
896+ ),
897+ ],
898+ )
899+ def test_exporter_exports_requirements_txt_with_excludes (
900+ tmp_path : Path ,
901+ poetry : Poetry ,
902+ packages_data : list [dict [str , Any ]],
903+ excludes : Collection [NormalizedName ],
904+ skip : set [str ] | None ,
905+ lines : list [str ],
906+ ) -> None :
907+ for package_data in packages_data :
908+ if "optional" not in package_data :
909+ package_data ["optional" ] = False
910+ if "python-versions" not in package_data :
911+ package_data ["python-versions" ] = "*"
912+
913+ poetry .locker .mock_lock_data ({ # type: ignore[attr-defined]
914+ "package" : packages_data ,
915+ "metadata" : {
916+ "content-hash" : "123456789" ,
917+ "files" : {package ["name" ]: [] for package in packages_data },
918+ },
919+ })
920+ set_package_requires (poetry , skip = skip )
921+
922+ exporter = Exporter (poetry , NullIO ())
923+ exporter .with_hashes (False )
924+ exporter .with_excludes (excludes )
925+ exporter .export ("requirements.txt" , tmp_path , "requirements.txt" )
926+
927+ with (tmp_path / "requirements.txt" ).open (encoding = "utf-8" ) as f :
928+ content = f .read ()
929+
930+ expected = "\n " .join (lines ) + "\n "
931+
932+ assert content == expected
933+
934+
834935@pytest .mark .parametrize (
835936 ["extras" , "lines" ],
836937 [
0 commit comments