From 969184c843c932221ca85c63beb4e91548df04d7 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Fri, 5 May 2023 13:39:10 +0200 Subject: [PATCH 01/11] Prefer importlib.metadata over pkg_resources if available --- sentry_sdk/integrations/modules.py | 18 +++++++++++++----- tests/integrations/pyramid/test_pyramid.py | 17 ++++++++++++----- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index c9066ebda6..d967a63a4b 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -21,12 +21,20 @@ def _generate_installed_modules(): # type: () -> Iterator[Tuple[str, str]] try: - import pkg_resources - except ImportError: - return + from importlib.metadata import distributions, version + + for dist in distributions(): + yield dist.metadata["Name"], version(dist.metadata["Name"]) - for info in pkg_resources.working_set: - yield info.key, info.version + except ImportError: + # < py3.8 + try: + import pkg_resources + except ImportError: + return + + for info in pkg_resources.working_set: + yield info.key, info.version def _get_installed_modules(): diff --git a/tests/integrations/pyramid/test_pyramid.py b/tests/integrations/pyramid/test_pyramid.py index 01dd1c6a04..9fc15c052f 100644 --- a/tests/integrations/pyramid/test_pyramid.py +++ b/tests/integrations/pyramid/test_pyramid.py @@ -1,8 +1,6 @@ import json import logging -import pkg_resources import pytest - from io import BytesIO import pyramid.testing @@ -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): From 0905f9b01e666c97a722510fd81237f2f37a4e9e Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Mon, 8 May 2023 13:53:42 +0200 Subject: [PATCH 02/11] Lowercase the dist name to be the same as with pkg_resources --- sentry_sdk/integrations/modules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index d967a63a4b..3962e085da 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -24,7 +24,7 @@ def _generate_installed_modules(): from importlib.metadata import distributions, version for dist in distributions(): - yield dist.metadata["Name"], version(dist.metadata["Name"]) + yield dist.metadata["Name"].lower(), version(dist.metadata["Name"]) except ImportError: # < py3.8 From 86b6f7d500682a7dd92c5a1cc55e27529ef592ca Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Tue, 9 May 2023 14:45:37 +0200 Subject: [PATCH 03/11] add test --- tests/integrations/modules/test_modules.py | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 3f4d7bd9dc..6d23ed1092 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -1,6 +1,6 @@ import sentry_sdk -from sentry_sdk.integrations.modules import ModulesIntegration +from sentry_sdk.integrations.modules import ModulesIntegration, _get_installed_modules def test_basic(sentry_init, capture_events): @@ -12,3 +12,30 @@ 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() + if importlib_available: + assert installed_modules == [ + (dist.metadata["Name"].lower(), version(dist.metadata["Name"])) + for dist in distributions() + ] + if pkg_resources_available: + assert installed_modules == [ + (dist.key, dist.version) for dist in pkg_resources.working_set + ] From dd9835aa9995db9ba6def43937baf9275770a3a1 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Thu, 11 May 2023 16:45:39 +0200 Subject: [PATCH 04/11] fix --- tests/integrations/modules/test_modules.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 6d23ed1092..cd36c60ff8 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -31,11 +31,11 @@ def test_installed_modules(): installed_modules = _get_installed_modules() if importlib_available: - assert installed_modules == [ - (dist.metadata["Name"].lower(), version(dist.metadata["Name"])) + assert installed_modules == { + dist.metadata["Name"].lower(): version(dist.metadata["Name"]) for dist in distributions() - ] + } if pkg_resources_available: - assert installed_modules == [ - (dist.key, dist.version) for dist in pkg_resources.working_set - ] + assert installed_modules == { + dist.key: dist.version for dist in pkg_resources.working_set + } From 0443189eca88f5df19128c93165ad1a9ef542934 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Thu, 11 May 2023 17:06:21 +0200 Subject: [PATCH 05/11] fix --- sentry_sdk/integrations/modules.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index 3962e085da..d5ff46dd0d 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -24,7 +24,9 @@ def _generate_installed_modules(): from importlib.metadata import distributions, version for dist in distributions(): - yield dist.metadata["Name"].lower(), version(dist.metadata["Name"]) + yield dist.metadata["Name"].lower().replace("-", "_"), version( + dist.metadata["Name"] + ) except ImportError: # < py3.8 From 1d179bab90e6169264f52ace381caa20f82b90d4 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Thu, 11 May 2023 17:14:28 +0200 Subject: [PATCH 06/11] fix --- tests/integrations/modules/test_modules.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index cd36c60ff8..71bf10cb74 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -32,7 +32,9 @@ def test_installed_modules(): installed_modules = _get_installed_modules() if importlib_available: assert installed_modules == { - dist.metadata["Name"].lower(): version(dist.metadata["Name"]) + dist.metadata["Name"] + .lower() + .replace("-", "_"): version(dist.metadata["Name"]) for dist in distributions() } if pkg_resources_available: From 885992c3ca1cf781c66f326ebd684bd03647e243 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Thu, 11 May 2023 17:20:39 +0200 Subject: [PATCH 07/11] more fixes --- sentry_sdk/integrations/modules.py | 8 ++++++-- tests/integrations/modules/test_modules.py | 15 ++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index d5ff46dd0d..6282fbd210 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -18,13 +18,17 @@ _installed_modules = None +def _normalize_module_name(name): + return name.lower().replace("-", "_") + + def _generate_installed_modules(): # type: () -> Iterator[Tuple[str, str]] try: from importlib.metadata import distributions, version for dist in distributions(): - yield dist.metadata["Name"].lower().replace("-", "_"), version( + yield _normalize_module_name(dist.metadata["Name"]), version( dist.metadata["Name"] ) @@ -36,7 +40,7 @@ def _generate_installed_modules(): return for info in pkg_resources.working_set: - yield info.key, info.version + yield _normalize_module_name(info.key), info.version def _get_installed_modules(): diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 71bf10cb74..66bc27f3e6 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -1,6 +1,10 @@ import sentry_sdk -from sentry_sdk.integrations.modules import ModulesIntegration, _get_installed_modules +from sentry_sdk.integrations.modules import ( + ModulesIntegration, + _get_installed_modules, + _normalize_module_name, +) def test_basic(sentry_init, capture_events): @@ -32,12 +36,13 @@ def test_installed_modules(): installed_modules = _get_installed_modules() if importlib_available: assert installed_modules == { - dist.metadata["Name"] - .lower() - .replace("-", "_"): version(dist.metadata["Name"]) + _normalize_module_name(dist.metadata["Name"]): version( + dist.metadata["Name"] + ) for dist in distributions() } if pkg_resources_available: assert installed_modules == { - dist.key: dist.version for dist in pkg_resources.working_set + _normalize_module_name(dist.key): dist.version + for dist in pkg_resources.working_set } From 2ff8594a63ee4b5651aa9ba8c0eeddbcbaa0445d Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Mon, 22 May 2023 09:44:59 +0200 Subject: [PATCH 08/11] Update sentry_sdk/integrations/modules.py Co-authored-by: Antoni Szych --- sentry_sdk/integrations/modules.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index 6282fbd210..f6a7b47dfe 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -19,6 +19,7 @@ def _normalize_module_name(name): + # type: (str) -> str return name.lower().replace("-", "_") From dc13ad7162e858f66dfc151251091eb1745d50f2 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Mon, 22 May 2023 09:46:46 +0200 Subject: [PATCH 09/11] fix --- tests/integrations/modules/test_modules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 66bc27f3e6..27376e68ee 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -14,7 +14,7 @@ def test_basic(sentry_init, capture_events): sentry_sdk.capture_exception(ValueError()) (event,) = events - assert "sentry-sdk" in event["modules"] + assert "sentry_sdk" in event["modules"] assert "pytest" in event["modules"] From a644717a193e5d9b3568f269f94e4a2b7e80f387 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Mon, 22 May 2023 15:31:15 +0200 Subject: [PATCH 10/11] ignore typing-extensions --- sentry_sdk/integrations/modules.py | 2 +- tests/integrations/modules/test_modules.py | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/sentry_sdk/integrations/modules.py b/sentry_sdk/integrations/modules.py index f6a7b47dfe..76d55c8bbe 100644 --- a/sentry_sdk/integrations/modules.py +++ b/sentry_sdk/integrations/modules.py @@ -20,7 +20,7 @@ def _normalize_module_name(name): # type: (str) -> str - return name.lower().replace("-", "_") + return name.lower() def _generate_installed_modules(): diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 27376e68ee..639dc28cf0 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -14,7 +14,7 @@ def test_basic(sentry_init, capture_events): sentry_sdk.capture_exception(ValueError()) (event,) = events - assert "sentry_sdk" in event["modules"] + assert "sentry-sdk" in event["modules"] assert "pytest" in event["modules"] @@ -34,15 +34,27 @@ def test_installed_modules(): 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: - assert installed_modules == { + importlib_modules = { _normalize_module_name(dist.metadata["Name"]): version( dist.metadata["Name"] ) for dist in distributions() } + del importlib_modules["typing-extensions"] + assert installed_modules == importlib_modules + if pkg_resources_available: - assert installed_modules == { + pkg_resources_modules = { _normalize_module_name(dist.key): dist.version for dist in pkg_resources.working_set } + del pkg_resources_modules["typing-extensions"] + assert installed_modules == pkg_resources_modules From c7fdd46ac8e98b1258c249090c59dc0b9e3e5fb8 Mon Sep 17 00:00:00 2001 From: Ivana Kellyerova Date: Mon, 22 May 2023 16:14:10 +0200 Subject: [PATCH 11/11] fix? --- tests/integrations/modules/test_modules.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integrations/modules/test_modules.py b/tests/integrations/modules/test_modules.py index 639dc28cf0..bc108f9fb1 100644 --- a/tests/integrations/modules/test_modules.py +++ b/tests/integrations/modules/test_modules.py @@ -48,7 +48,7 @@ def test_installed_modules(): ) for dist in distributions() } - del importlib_modules["typing-extensions"] + importlib_modules.pop("typing-extensions", None) assert installed_modules == importlib_modules if pkg_resources_available: @@ -56,5 +56,5 @@ def test_installed_modules(): _normalize_module_name(dist.key): dist.version for dist in pkg_resources.working_set } - del pkg_resources_modules["typing-extensions"] + pkg_resources_modules.pop("typing-extensions", None) assert installed_modules == pkg_resources_modules