From 66278d38a5d8126514c3e75d6f2ca260dc15406b Mon Sep 17 00:00:00 2001 From: Wolfgang Schnerring Date: Fri, 29 Aug 2025 10:57:49 +0200 Subject: [PATCH 1/5] Select exception class via `except Type:` instead of manual `isinstance` --- beaker/cache.py | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/beaker/cache.py b/beaker/cache.py index 61b8e4e..a2d359a 100644 --- a/beaker/cache.py +++ b/beaker/cache.py @@ -95,25 +95,24 @@ def _init(self): except (InvalidCacheBackendError, SyntaxError): # Ignore invalid backends pass - except: - import sys - from pkg_resources import DistributionNotFound + except pkg_resources.DistributionNotFound: + pass + except Exception: # Warn when there's a problem loading a NamespaceManager - if not isinstance(sys.exc_info()[1], DistributionNotFound): - import traceback - try: - from StringIO import StringIO # Python2 - except ImportError: - from io import StringIO # Python3 - - tb = StringIO() - traceback.print_exc(file=tb) - warnings.warn( - "Unable to load NamespaceManager " - "entry point: '%s': %s" % ( - entry_point, - tb.getvalue()), - RuntimeWarning, 2) + import traceback + try: + from StringIO import StringIO # Python2 + except ImportError: + from io import StringIO # Python3 + + tb = StringIO() + traceback.print_exc(file=tb) + warnings.warn( + "Unable to load NamespaceManager " + "entry point: '%s': %s" % ( + entry_point, + tb.getvalue()), + RuntimeWarning, 2) except ImportError: pass From b610dd66696613bb0b91c274e3efbf53e9683d20 Mon Sep 17 00:00:00 2001 From: Wolfgang Schnerring Date: Fri, 29 Aug 2025 11:00:52 +0200 Subject: [PATCH 2/5] Load entry points with importlib.metadata instead of deprecated pkg_resources I'm not sure in which circumstance DistributionNotFound may have been raised here previously, why it has been desireable to suppress that, and what the current machinery would raise instead, but if in doubt I'd rather have a warning than things silently not working. --- CHANGELOG | 1 + beaker/cache.py | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e37d794..484ebba 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ Release 1.14.0 (2025-??-??) * Fixed an error when using json encoder with cookie based sessions * Removed support for pylibmc * Beaker is now tested on Python 3.8+ ... 3.13 +* Load entry points with importlib.metadata instead of deprecated pkg_resources Release 1.13.0 (2024-04-11) =========================== diff --git a/beaker/cache.py b/beaker/cache.py index a2d359a..1f87df4 100644 --- a/beaker/cache.py +++ b/beaker/cache.py @@ -81,10 +81,10 @@ def __getitem__(self, key): def _init(self): try: - import pkg_resources + import importlib.metadata # Load up the additional entry point defined backends - for entry_point in pkg_resources.iter_entry_points('beaker.backends'): + for entry_point in importlib.metadata.entry_points(group='beaker.backends'): try: namespace_manager = entry_point.load() name = entry_point.name @@ -95,8 +95,6 @@ def _init(self): except (InvalidCacheBackendError, SyntaxError): # Ignore invalid backends pass - except pkg_resources.DistributionNotFound: - pass except Exception: # Warn when there's a problem loading a NamespaceManager import traceback From 2919ea691666385849098a46bfb99c693349365e Mon Sep 17 00:00:00 2001 From: Wolfgang Schnerring Date: Fri, 29 Aug 2025 11:03:34 +0200 Subject: [PATCH 3/5] Remove pkg_resources import guard, importlib is part of the stdlib, so always present --- beaker/cache.py | 61 +++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/beaker/cache.py b/beaker/cache.py index 1f87df4..85cb349 100644 --- a/beaker/cache.py +++ b/beaker/cache.py @@ -80,39 +80,36 @@ def __getitem__(self, key): raise e def _init(self): - try: - import importlib.metadata - - # Load up the additional entry point defined backends - for entry_point in importlib.metadata.entry_points(group='beaker.backends'): + import importlib.metadata + + # Load up the additional entry point defined backends + for entry_point in importlib.metadata.entry_points(group='beaker.backends'): + try: + namespace_manager = entry_point.load() + name = entry_point.name + if name in self._clsmap: + raise BeakerException("NamespaceManager name conflict,'%s' " + "already loaded" % name) + self._clsmap[name] = namespace_manager + except (InvalidCacheBackendError, SyntaxError): + # Ignore invalid backends + pass + except Exception: + # Warn when there's a problem loading a NamespaceManager + import traceback try: - namespace_manager = entry_point.load() - name = entry_point.name - if name in self._clsmap: - raise BeakerException("NamespaceManager name conflict,'%s' " - "already loaded" % name) - self._clsmap[name] = namespace_manager - except (InvalidCacheBackendError, SyntaxError): - # Ignore invalid backends - pass - except Exception: - # Warn when there's a problem loading a NamespaceManager - import traceback - try: - from StringIO import StringIO # Python2 - except ImportError: - from io import StringIO # Python3 - - tb = StringIO() - traceback.print_exc(file=tb) - warnings.warn( - "Unable to load NamespaceManager " - "entry point: '%s': %s" % ( - entry_point, - tb.getvalue()), - RuntimeWarning, 2) - except ImportError: - pass + from StringIO import StringIO # Python2 + except ImportError: + from io import StringIO # Python3 + + tb = StringIO() + traceback.print_exc(file=tb) + warnings.warn( + "Unable to load NamespaceManager " + "entry point: '%s': %s" % ( + entry_point, + tb.getvalue()), + RuntimeWarning, 2) # Initialize the basic available backends clsmap = _backends({ From 9ba1b1f34532767e5e987dd8ea9618e1563ed866 Mon Sep 17 00:00:00 2001 From: Wolfgang Schnerring Date: Tue, 18 Nov 2025 08:15:05 +0100 Subject: [PATCH 4/5] Remove long-obsolete python-2 compatibility code It especially makes no sense now anymore, since importlib is python-3 only. --- beaker/cache.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/beaker/cache.py b/beaker/cache.py index 85cb349..1d5bca3 100644 --- a/beaker/cache.py +++ b/beaker/cache.py @@ -6,7 +6,10 @@ :func:`.region_invalidate`. """ +import importlib.metadata +import traceback import warnings +from io import StringIO from itertools import chain from beaker._compat import u_, unicode_text, func_signature, bindfuncargs @@ -80,8 +83,6 @@ def __getitem__(self, key): raise e def _init(self): - import importlib.metadata - # Load up the additional entry point defined backends for entry_point in importlib.metadata.entry_points(group='beaker.backends'): try: @@ -96,12 +97,6 @@ def _init(self): pass except Exception: # Warn when there's a problem loading a NamespaceManager - import traceback - try: - from StringIO import StringIO # Python2 - except ImportError: - from io import StringIO # Python3 - tb = StringIO() traceback.print_exc(file=tb) warnings.warn( From 0c6a837997a04d36b3ee777bde36533dc5a48905 Mon Sep 17 00:00:00 2001 From: Wolfgang Schnerring Date: Sun, 30 Nov 2025 12:34:40 +0100 Subject: [PATCH 5/5] Use importlib.metatdata API that's backward-compatible with Python<3.10 --- beaker/cache.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/beaker/cache.py b/beaker/cache.py index 1d5bca3..03987b1 100644 --- a/beaker/cache.py +++ b/beaker/cache.py @@ -7,6 +7,7 @@ """ import importlib.metadata +import sys import traceback import warnings from io import StringIO @@ -84,7 +85,11 @@ def __getitem__(self, key): def _init(self): # Load up the additional entry point defined backends - for entry_point in importlib.metadata.entry_points(group='beaker.backends'): + if sys.version_info < (3, 10): + entry_points = importlib.metadata.entry_points()['beaker.backends'] + else: + entry_points = importlib.metadata.entry_points(group='beaker.backends') + for entry_point in entry_points: try: namespace_manager = entry_point.load() name = entry_point.name