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 61b8e4e..03987b1 100644 --- a/beaker/cache.py +++ b/beaker/cache.py @@ -6,7 +6,11 @@ :func:`.region_invalidate`. """ +import importlib.metadata +import sys +import traceback import warnings +from io import StringIO from itertools import chain from beaker._compat import u_, unicode_text, func_signature, bindfuncargs @@ -80,42 +84,32 @@ def __getitem__(self, key): raise e def _init(self): - try: - import pkg_resources - - # Load up the additional entry point defined backends - for entry_point in pkg_resources.iter_entry_points('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: - import sys - from pkg_resources import DistributionNotFound - # 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) - except ImportError: - pass + # Load up the additional entry point defined 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 + 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 + 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({