Skip to content

Commit 8c24d33

Browse files
sentrivanaantonpirkerantoni-szych-rtbhouse
authored
Prefer importlib.metadata over pkg_resources if available (#2081)
* Prefer importlib.metadata over pkg_resources if available --------- Co-authored-by: Anton Pirker <[email protected]> Co-authored-by: Antoni Szych <[email protected]>
1 parent 565567f commit 8c24d33

File tree

3 files changed

+79
-11
lines changed

3 files changed

+79
-11
lines changed

Diff for: sentry_sdk/integrations/modules.py

+20-5
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,30 @@
1818
_installed_modules = None
1919

2020

21+
def _normalize_module_name(name):
22+
# type: (str) -> str
23+
return name.lower()
24+
25+
2126
def _generate_installed_modules():
2227
# type: () -> Iterator[Tuple[str, str]]
2328
try:
24-
import pkg_resources
25-
except ImportError:
26-
return
29+
from importlib.metadata import distributions, version
2730

28-
for info in pkg_resources.working_set:
29-
yield info.key, info.version
31+
for dist in distributions():
32+
yield _normalize_module_name(dist.metadata["Name"]), version(
33+
dist.metadata["Name"]
34+
)
35+
36+
except ImportError:
37+
# < py3.8
38+
try:
39+
import pkg_resources
40+
except ImportError:
41+
return
42+
43+
for info in pkg_resources.working_set:
44+
yield _normalize_module_name(info.key), info.version
3045

3146

3247
def _get_installed_modules():

Diff for: tests/integrations/modules/test_modules.py

+47-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import sentry_sdk
22

3-
from sentry_sdk.integrations.modules import ModulesIntegration
3+
from sentry_sdk.integrations.modules import (
4+
ModulesIntegration,
5+
_get_installed_modules,
6+
_normalize_module_name,
7+
)
48

59

610
def test_basic(sentry_init, capture_events):
@@ -12,3 +16,45 @@ def test_basic(sentry_init, capture_events):
1216
(event,) = events
1317
assert "sentry-sdk" in event["modules"]
1418
assert "pytest" in event["modules"]
19+
20+
21+
def test_installed_modules():
22+
try:
23+
from importlib import distributions, version
24+
25+
importlib_available = True
26+
except ImportError:
27+
importlib_available = False
28+
29+
try:
30+
import pkg_resources
31+
32+
pkg_resources_available = True
33+
except ImportError:
34+
pkg_resources_available = False
35+
36+
installed_modules = _get_installed_modules()
37+
38+
# This one package is reported differently by importlib
39+
# and pkg_resources, but we don't really care, so let's
40+
# just ignore it
41+
installed_modules.pop("typing-extensions", None)
42+
installed_modules.pop("typing_extensions", None)
43+
44+
if importlib_available:
45+
importlib_modules = {
46+
_normalize_module_name(dist.metadata["Name"]): version(
47+
dist.metadata["Name"]
48+
)
49+
for dist in distributions()
50+
}
51+
importlib_modules.pop("typing-extensions", None)
52+
assert installed_modules == importlib_modules
53+
54+
if pkg_resources_available:
55+
pkg_resources_modules = {
56+
_normalize_module_name(dist.key): dist.version
57+
for dist in pkg_resources.working_set
58+
}
59+
pkg_resources_modules.pop("typing-extensions", None)
60+
assert installed_modules == pkg_resources_modules

Diff for: tests/integrations/pyramid/test_pyramid.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import json
22
import logging
3-
import pkg_resources
43
import pytest
5-
64
from io import BytesIO
75

86
import pyramid.testing
@@ -17,9 +15,18 @@
1715
from werkzeug.test import Client
1816

1917

20-
PYRAMID_VERSION = tuple(
21-
map(int, pkg_resources.get_distribution("pyramid").version.split("."))
22-
)
18+
try:
19+
from importlib.metadata import version
20+
21+
PYRAMID_VERSION = tuple(map(int, version("pyramid").split(".")))
22+
23+
except ImportError:
24+
# < py3.8
25+
import pkg_resources
26+
27+
PYRAMID_VERSION = tuple(
28+
map(int, pkg_resources.get_distribution("pyramid").version.split("."))
29+
)
2330

2431

2532
def hi(request):

0 commit comments

Comments
 (0)