Skip to content
25 changes: 20 additions & 5 deletions sentry_sdk/integrations/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,30 @@
_installed_modules = None


def _normalize_module_name(name):
Comment thread
sentrivana marked this conversation as resolved.
# type: (str) -> str
return name.lower()


def _generate_installed_modules():
# type: () -> Iterator[Tuple[str, str]]
try:
import pkg_resources
except ImportError:
return
from importlib.metadata import distributions, version

for info in pkg_resources.working_set:
yield info.key, info.version
for dist in distributions():
yield _normalize_module_name(dist.metadata["Name"]), version(
dist.metadata["Name"]
)

except ImportError:
# < py3.8
try:
import pkg_resources
except ImportError:
return

for info in pkg_resources.working_set:
yield _normalize_module_name(info.key), info.version


def _get_installed_modules():
Expand Down
48 changes: 47 additions & 1 deletion tests/integrations/modules/test_modules.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import sentry_sdk

from sentry_sdk.integrations.modules import ModulesIntegration
from sentry_sdk.integrations.modules import (
ModulesIntegration,
_get_installed_modules,
_normalize_module_name,
)


def test_basic(sentry_init, capture_events):
Expand All @@ -12,3 +16,45 @@ def test_basic(sentry_init, capture_events):
(event,) = events
assert "sentry-sdk" in event["modules"]
assert "pytest" in event["modules"]


def test_installed_modules():
try:
from importlib import distributions, version

importlib_available = True
except ImportError:
importlib_available = False

try:
import pkg_resources

pkg_resources_available = True
except ImportError:
pkg_resources_available = False

installed_modules = _get_installed_modules()

# This one package is reported differently by importlib
# and pkg_resources, but we don't really care, so let's
# just ignore it
installed_modules.pop("typing-extensions", None)
installed_modules.pop("typing_extensions", None)

if importlib_available:
importlib_modules = {
_normalize_module_name(dist.metadata["Name"]): version(
dist.metadata["Name"]
)
for dist in distributions()
}
importlib_modules.pop("typing-extensions", None)
assert installed_modules == importlib_modules

if pkg_resources_available:
pkg_resources_modules = {
_normalize_module_name(dist.key): dist.version
for dist in pkg_resources.working_set
}
pkg_resources_modules.pop("typing-extensions", None)
assert installed_modules == pkg_resources_modules
17 changes: 12 additions & 5 deletions tests/integrations/pyramid/test_pyramid.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import json
import logging
import pkg_resources
import pytest

from io import BytesIO

import pyramid.testing
Expand All @@ -17,9 +15,18 @@
from werkzeug.test import Client


PYRAMID_VERSION = tuple(
map(int, pkg_resources.get_distribution("pyramid").version.split("."))
)
try:
from importlib.metadata import version

PYRAMID_VERSION = tuple(map(int, version("pyramid").split(".")))

except ImportError:
# < py3.8
import pkg_resources

PYRAMID_VERSION = tuple(
map(int, pkg_resources.get_distribution("pyramid").version.split("."))
)


def hi(request):
Expand Down