From 8eb97446db69bc34fee40b5a06ac0a9156e204f4 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Fri, 9 Sep 2022 16:50:45 +0100 Subject: [PATCH] Fix compatibility with Python 3.10, 3.9.11 A fix to 'importlib.metadata' in Python 3.10 [1], later backported to 3.9 and released in 3.9.11 [2], has broken our tests. Fix them. [1] https://github.com/python/cpython/commit/b1e286860742e7ba6fadc75e3ddb6c2899a56919 [2] https://github.com/python/cpython/commit/177be52517da9a876a3f9e670f88c4731b906986 Signed-off-by: Stephen Finucane Closes-bug: #1966040 Change-Id: Iff536d4f4267efbebc4be1e7e5da8a9fde39f79b --- stevedore/extension.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/stevedore/extension.py b/stevedore/extension.py index 06ac067..d9ee084 100644 --- a/stevedore/extension.py +++ b/stevedore/extension.py @@ -61,17 +61,25 @@ class Extension(object): @property def extras(self): """The 'extras' settings for the plugin.""" - # NOTE: The underlying package returns re.Match objects for - # some reason. Translate those to the matched strings, which - # seem more useful. - return [ - # Python 3.6 returns _sre.SRE_Match objects. Later - # versions of python return re.Match objects. Both types - # have a 'string' attribute containing the text that - # matched the pattern. - getattr(e, 'string', e) - for e in self.entry_point.extras - ] + # NOTE: The underlying package returned re.Match objects until this was + # fixed in importlib-metadata 4.11.3. This was fixed in Python 3.10 and + # backported to Python 3.9.11. For older versions without this fix, + # translate the re.Match objects to the matched strings, which seem + # more useful. + extras = [] + for extra in self.entry_point.extras: + if isinstance(extra, str): + # We were previously returning the whole string including + # backets. We need to continue doing so to preserve API + # compatibility. + extras.append(f'[{extra}]') + else: + # Python 3.6 returns _sre.SRE_Match objects. Later + # versions of python return re.Match objects. Both types + # have a 'string' attribute containing the text that + # matched the pattern. + extras.append(getattr(extra, 'string', extra)) + return extras @property def attr(self):