Skip to content

Commit 1a6f41d

Browse files
committed
handle None metadata
1 parent f3943ef commit 1a6f41d

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/prefect/cli/root.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,15 @@ def get_prefect_integrations() -> dict[str, str]:
152152

153153
integrations: dict[str, str] = {}
154154
for dist in distributions():
155-
if dist.metadata["Name"].startswith("prefect-"):
155+
name = dist.metadata.get("Name")
156+
if name and name.startswith("prefect-"):
156157
author_email = dist.metadata.get("Author-email", "").strip()
157158
if author_email.endswith("@prefect.io>"):
158159
if ( # TODO: remove clause after updating `prefect-client` packaging config
159-
dist.metadata["Name"] == "prefect-client"
160-
and dist.version == "0.0.0"
160+
name == "prefect-client" and dist.version == "0.0.0"
161161
):
162162
continue
163-
integrations[dist.metadata["Name"]] = dist.version
163+
integrations[name] = dist.version
164164

165165
return integrations
166166

tests/cli/test_version.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,39 @@ def test_version_cloud_server_type():
6060
)
6161

6262

63+
@pytest.mark.usefixtures("disable_hosted_api_server")
64+
def test_version_handles_none_metadata_names(monkeypatch: pytest.MonkeyPatch):
65+
"""Test that version command handles packages with None metadata names gracefully."""
66+
67+
class MockDistribution:
68+
def __init__(self, metadata: dict[str, str | None], version: str = "1.0.0"):
69+
self.metadata = metadata
70+
self.version = version
71+
72+
mock_distributions = [
73+
MockDistribution(
74+
{"Name": "prefect-aws", "Author-email": "help@prefect.io>"}, "2.0.0"
75+
),
76+
MockDistribution({"Name": None, "Author-email": "help@prefect.io>"}),
77+
MockDistribution({"Author-email": "help@prefect.io>"}),
78+
MockDistribution(
79+
{"Name": "some-other-package", "Author-email": "other@example.com"}
80+
),
81+
]
82+
83+
def mock_distributions_func():
84+
return mock_distributions
85+
86+
monkeypatch.setattr("importlib.metadata.distributions", mock_distributions_func)
87+
88+
result = invoke_and_assert(
89+
["version"],
90+
expected_code=0,
91+
)
92+
assert "prefect-aws" in result.output
93+
assert "2.0.0" in result.output
94+
95+
6396
@pytest.mark.usefixtures("disable_hosted_api_server")
6497
def test_correct_output_ephemeral_sqlite(monkeypatch: pytest.MonkeyPatch):
6598
version_info = prefect.__version_info__

0 commit comments

Comments
 (0)