@@ -2398,3 +2398,59 @@ def test_exporter_respects_package_sources(tmp_dir: str, poetry: Poetry) -> None
23982398"""
23992399
24002400 assert io .fetch_output () == expected
2401+
2402+
2403+ def test_exporter_tolerates_non_existent_extra (tmp_dir : str , poetry : Poetry ) -> None :
2404+ # foo actually has a 'bar' extra, but pyproject.toml mistakenly references a 'baz'
2405+ # extra.
2406+ poetry .locker .mock_lock_data ( # type: ignore[attr-defined]
2407+ {
2408+ "package" : [
2409+ {
2410+ "name" : "foo" ,
2411+ "version" : "1.2.3" ,
2412+ "category" : "main" ,
2413+ "optional" : False ,
2414+ "python-versions" : "*" ,
2415+ "dependencies" : {
2416+ "bar" : {
2417+ "version" : ">=0.1.0" ,
2418+ "optional" : True ,
2419+ "markers" : "extra == 'bar'" ,
2420+ }
2421+ },
2422+ "extras" : {"bar" : ["bar (>=0.1.0)" ]},
2423+ },
2424+ {
2425+ "name" : "bar" ,
2426+ "version" : "4.5.6" ,
2427+ "category" : "main" ,
2428+ "optional" : False ,
2429+ "python-versions" : "*" ,
2430+ },
2431+ ],
2432+ "metadata" : {
2433+ "python-versions" : "*" ,
2434+ "content-hash" : "123456789" ,
2435+ "hashes" : {"foo" : [], "bar" : []},
2436+ },
2437+ }
2438+ )
2439+ root = poetry .package .with_dependency_groups ([], only = True )
2440+ root .add_dependency (
2441+ Factory .create_dependency (
2442+ name = "foo" , constraint = {"version" : "^1.2" , "extras" : ["baz" ]}
2443+ )
2444+ )
2445+ poetry ._package = root
2446+
2447+ exporter = Exporter (poetry )
2448+ exporter .export ("requirements.txt" , Path (tmp_dir ), "requirements.txt" )
2449+
2450+ with (Path (tmp_dir ) / "requirements.txt" ).open (encoding = "utf-8" ) as f :
2451+ content = f .read ()
2452+
2453+ expected = f"""\
2454+ foo[baz]==1.2.3 ; { MARKER_PY27 } or { MARKER_PY36 }
2455+ """
2456+ assert content == expected
0 commit comments