@@ -831,6 +831,106 @@ 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+ # foo has baz dep, baz also declared in main group, exclude only foo
863+ (
864+ [
865+ {
866+ "name" : "foo" ,
867+ "version" : "1.2.3" ,
868+ "dependencies" : {"baz" : ">=7.8.9" },
869+ },
870+ {"name" : "bar" , "version" : "4.5.6" },
871+ {"name" : "baz" , "version" : "7.8.9" },
872+ ],
873+ None ,
874+ ["foo" ],
875+ [f"bar==4.5.6 ; { MARKER_PY } " , f"baz==7.8.9 ; { MARKER_PY } " ],
876+ ),
877+ # foo has baz dep, bar also has baz dep, exclude only foo
878+ (
879+ [
880+ {
881+ "name" : "foo" ,
882+ "version" : "1.2.3" ,
883+ "dependencies" : {"baz" : ">=7.8.9" },
884+ },
885+ {
886+ "name" : "bar" ,
887+ "version" : "4.5.6" ,
888+ "dependencies" : {"baz" : ">=7.8.9" },
889+ },
890+ {"name" : "baz" , "version" : "7.8.9" , "optional" : True },
891+ ],
892+ {"baz" },
893+ ["foo" ],
894+ [f"bar==4.5.6 ; { MARKER_PY } " , f"baz==7.8.9 ; { MARKER_PY } " ],
895+ ),
896+ ],
897+ )
898+ def test_exporter_exports_requirements_txt_with_excludes (
899+ tmp_path : Path ,
900+ poetry : Poetry ,
901+ packages_data : list [dict [str , Any ]],
902+ excludes : Collection [NormalizedName ],
903+ skip : set [str ] | None ,
904+ lines : list [str ],
905+ ) -> None :
906+ for package_data in packages_data :
907+ if "optional" not in package_data :
908+ package_data ["optional" ] = False
909+ if "python-versions" not in package_data :
910+ package_data ["python-versions" ] = "*"
911+
912+ poetry .locker .mock_lock_data ({ # type: ignore[attr-defined]
913+ "package" : packages_data ,
914+ "metadata" : {
915+ "content-hash" : "123456789" ,
916+ "files" : {package ["name" ]: [] for package in packages_data },
917+ },
918+ })
919+ set_package_requires (poetry , skip = skip )
920+
921+ exporter = Exporter (poetry , NullIO ())
922+ exporter .with_hashes (False )
923+ exporter .with_excludes (excludes )
924+ exporter .export ("requirements.txt" , tmp_path , "requirements.txt" )
925+
926+ with (tmp_path / "requirements.txt" ).open (encoding = "utf-8" ) as f :
927+ content = f .read ()
928+
929+ expected = "\n " .join (lines ) + "\n "
930+
931+ assert content == expected
932+
933+
834934@pytest .mark .parametrize (
835935 ["extras" , "lines" ],
836936 [
0 commit comments