Fix compatibility with Python 3.12, importlib-metadata 5.0
importlib-metadata 5.0 has removed support for dict-style interaction with entrypoints [1]. This is going to eventually affect us when Python 3.12 is released but even before then anyone not properly using upper constraints with an older Python 3.7-based release (the only Python version where we require the third-party importlib-metadata package rather than the stdlib importlib.metadata package) will be bitten. Fix it now to address both. [1]dde2b9de29
Signed-off-by: Stephen Finucane <stephenfin@redhat.com> Change-Id: Ib9c2b0a14edea91e97d122d2ac93b650029f918e Closes-Bug: #1991559 (cherry picked from commit28fc7164da
) (cherry picked from commit1e4d71d4b5
) (cherry picked from commit143a3e9f07
) (cherry picked from commit54acda936d
)
This commit is contained in:
parent
ab0135e09a
commit
48e178ab5c
|
@ -103,8 +103,16 @@ def _hash_settings_for_path(path):
|
||||||
return (h.hexdigest(), paths)
|
return (h.hexdigest(), paths)
|
||||||
|
|
||||||
|
|
||||||
def _build_cacheable_data(path):
|
def _build_cacheable_data():
|
||||||
real_groups = importlib_metadata.entry_points()
|
real_groups = importlib_metadata.entry_points()
|
||||||
|
|
||||||
|
if not isinstance(real_groups, dict):
|
||||||
|
# importlib-metadata 4.0 or later (or stdlib importlib.metadata in
|
||||||
|
# Python 3.9 or later)
|
||||||
|
real_groups = {
|
||||||
|
name: real_groups.select(name=name) for name in real_groups.names
|
||||||
|
}
|
||||||
|
|
||||||
# Convert the namedtuple values to regular tuples
|
# Convert the namedtuple values to regular tuples
|
||||||
groups = {}
|
groups = {}
|
||||||
for name, group_data in real_groups.items():
|
for name, group_data in real_groups.items():
|
||||||
|
@ -159,7 +167,7 @@ class Cache:
|
||||||
with open(filename, 'r') as f:
|
with open(filename, 'r') as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
except (IOError, json.JSONDecodeError):
|
except (IOError, json.JSONDecodeError):
|
||||||
data = _build_cacheable_data(path)
|
data = _build_cacheable_data()
|
||||||
data['path_values'] = path_values
|
data['path_values'] = path_values
|
||||||
if not self._disable_caching:
|
if not self._disable_caching:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -54,3 +54,11 @@ class TestCache(utils.TestCase):
|
||||||
mock_open.side_effect = IOError
|
mock_open.side_effect = IOError
|
||||||
sot._get_data_for_path('fake')
|
sot._get_data_for_path('fake')
|
||||||
mock_mkdir.assert_not_called()
|
mock_mkdir.assert_not_called()
|
||||||
|
|
||||||
|
def test__build_cacheable_data(self):
|
||||||
|
# this is a rubbish test as we don't actually do anything with the
|
||||||
|
# data, but it's too hard to script since it's totally environmentally
|
||||||
|
# dependent and mocking out the underlying calls would remove the value
|
||||||
|
# of this test (we want to test those underlying API calls)
|
||||||
|
ret = _cache._build_cacheable_data()
|
||||||
|
self.assertIsInstance(ret['groups'], dict)
|
||||||
|
|
Loading…
Reference in New Issue