Skip to content

Commit a1f4ebc

Browse files
authored
tolerate a non-existent extra (#109)
1 parent cef21cb commit a1f4ebc

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/poetry_plugin_export/walker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def walk_dependencies(
160160

161161
for require in locked_package.requires:
162162
if require.is_optional() and not any(
163-
require in locked_package.extras[feature]
163+
require in locked_package.extras.get(feature, ())
164164
for feature in locked_package.features
165165
):
166166
continue

tests/test_exporter.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)