Skip to content

Commit 06f6d87

Browse files
author
Roman Inflianskas
committed
Skip distributions with incomplete metadata
In rare cases, `importlib.metadata` values may contain `None`, see python/cpython#91216 and python/importlib_metadata#371 The fix skips all distributions with incomplete metadata.
1 parent a7b3136 commit 06f6d87

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

sentry_sdk/integrations/modules.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,18 @@ def _normalize_module_name(name):
2626
def _generate_installed_modules():
2727
# type: () -> Iterator[Tuple[str, str]]
2828
try:
29-
from importlib.metadata import distributions, version
30-
31-
for dist in distributions():
32-
yield _normalize_module_name(dist.metadata["Name"]), version(
33-
dist.metadata["Name"]
34-
)
29+
from importlib import metadata
30+
31+
for dist in metadata.distributions():
32+
name = dist.metadata["Name"]
33+
# `metadata` values may be `None`, see:
34+
# https://github.com/python/cpython/issues/91216
35+
# and
36+
# https://github.com/python/importlib_metadata/issues/371
37+
if name is not None:
38+
version = metadata.version(name)
39+
if version is not None:
40+
yield _normalize_module_name(name), version
3541

3642
except ImportError:
3743
# < py3.8

tests/integrations/modules/test_modules.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,16 @@ def test_installed_modules():
5555
dist.metadata["Name"]
5656
)
5757
for dist in distributions()
58+
if dist.metadata["Name"] is not None and
59+
version(dist.metadata["Name"]) is not None
5860
}
5961
assert installed_distributions == importlib_distributions
6062

61-
if pkg_resources_available:
63+
elif pkg_resources_available:
6264
pkg_resources_distributions = {
6365
_normalize_distribution_name(dist.key): dist.version
6466
for dist in pkg_resources.working_set
6567
}
6668
assert installed_distributions == pkg_resources_distributions
69+
else:
70+
pytest.fail("Neither importlib nor pkg_resources is available")

0 commit comments

Comments
 (0)