diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 10f19c5..2399c1d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v5.0.0 hooks: - id: trailing-whitespace # Replaces or checks mixed line ending @@ -19,12 +19,17 @@ repos: - id: check-yaml files: .*\.(yaml|yml)$ - repo: https://opendev.org/openstack/hacking - rev: 6.1.0 + rev: 7.0.0 hooks: - id: hacking additional_dependencies: [] - repo: https://github.com/PyCQA/bandit - rev: 1.7.6 + rev: 1.7.10 hooks: - id: bandit args: ['-x', 'tests'] + - repo: https://github.com/asottile/pyupgrade + rev: v3.18.0 + hooks: + - id: pyupgrade + args: [--py3-only] diff --git a/doc/source/conf.py b/doc/source/conf.py index 8926b14..0584875 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2020 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py index 1368071..7994d9d 100644 --- a/releasenotes/source/conf.py +++ b/releasenotes/source/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2020 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/stevedore/_cache.py b/stevedore/_cache.py index fd703af..e43493c 100644 --- a/stevedore/_cache.py +++ b/stevedore/_cache.py @@ -159,9 +159,9 @@ class Cache: filename = os.path.join(self._dir, digest) try: log.debug('reading %s', filename) - with open(filename, 'r') as f: + with open(filename) as f: data = json.load(f) - except (IOError, json.JSONDecodeError): + except (OSError, json.JSONDecodeError): data = _build_cacheable_data() data['path_values'] = path_values if not self._disable_caching: @@ -170,7 +170,7 @@ class Cache: os.makedirs(self._dir, exist_ok=True) with open(filename, 'w') as f: json.dump(data, f) - except (IOError, OSError): + except OSError: # Could not create cache dir or write file. pass diff --git a/stevedore/dispatch.py b/stevedore/dispatch.py index 27b511f..137f5c7 100644 --- a/stevedore/dispatch.py +++ b/stevedore/dispatch.py @@ -157,7 +157,7 @@ class NameDispatchExtensionManager(DispatchExtensionManager): propagate_map_exceptions=False, on_load_failure_callback=None, verify_requirements=False): - super(NameDispatchExtensionManager, self).__init__( + super().__init__( namespace=namespace, check_func=check_func, invoke_on_load=invoke_on_load, @@ -169,8 +169,8 @@ class NameDispatchExtensionManager(DispatchExtensionManager): ) def _init_plugins(self, extensions): - super(NameDispatchExtensionManager, self)._init_plugins(extensions) - self.by_name = dict((e.name, e) for e in self.extensions) + super()._init_plugins(extensions) + self.by_name = {e.name: e for e in self.extensions} def map(self, names, func, *args, **kwds): """Iterate over the extensions invoking func() for any where diff --git a/stevedore/driver.py b/stevedore/driver.py index bccbcd1..d8e39a2 100644 --- a/stevedore/driver.py +++ b/stevedore/driver.py @@ -51,7 +51,7 @@ class DriverManager(NamedExtensionManager): warn_on_missing_entrypoint=True): on_load_failure_callback = on_load_failure_callback \ or self._default_on_load_failure - super(DriverManager, self).__init__( + super().__init__( namespace=namespace, names=[name], invoke_on_load=invoke_on_load, @@ -98,7 +98,7 @@ class DriverManager(NamedExtensionManager): """ - o = super(DriverManager, cls).make_test_instance( + o = super().make_test_instance( [extension], namespace=namespace, propagate_map_exceptions=propagate_map_exceptions, on_load_failure_callback=on_load_failure_callback, @@ -106,7 +106,7 @@ class DriverManager(NamedExtensionManager): return o def _init_plugins(self, extensions): - super(DriverManager, self)._init_plugins(extensions) + super()._init_plugins(extensions) if not self.extensions: name = self._names[0] diff --git a/stevedore/enabled.py b/stevedore/enabled.py index 7c12499..b5bbe19 100644 --- a/stevedore/enabled.py +++ b/stevedore/enabled.py @@ -62,7 +62,7 @@ class EnabledExtensionManager(ExtensionManager): on_load_failure_callback=None, verify_requirements=False,): self.check_func = check_func - super(EnabledExtensionManager, self).__init__( + super().__init__( namespace, invoke_on_load=invoke_on_load, invoke_args=invoke_args, @@ -74,7 +74,7 @@ class EnabledExtensionManager(ExtensionManager): def _load_one_plugin(self, ep, invoke_on_load, invoke_args, invoke_kwds, verify_requirements): - ext = super(EnabledExtensionManager, self)._load_one_plugin( + ext = super()._load_one_plugin( ep, invoke_on_load, invoke_args, invoke_kwds, verify_requirements, ) diff --git a/stevedore/example/base.py b/stevedore/example/base.py index cd48bf2..736f1f7 100644 --- a/stevedore/example/base.py +++ b/stevedore/example/base.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2020 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/stevedore/example/load_as_extension.py b/stevedore/example/load_as_extension.py index 1af1f46..b6c9192 100644 --- a/stevedore/example/load_as_extension.py +++ b/stevedore/example/load_as_extension.py @@ -45,7 +45,7 @@ if __name__ == '__main__': results = mgr.map(format_data, data) for name, result in results: - print('Formatter: {0}'.format(name)) + print('Formatter: {}'.format(name)) for chunk in result: print(chunk, end='') print('') diff --git a/stevedore/example2/fields.py b/stevedore/example2/fields.py index 82db747..9a20b80 100644 --- a/stevedore/example2/fields.py +++ b/stevedore/example2/fields.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2020 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/stevedore/extension.py b/stevedore/extension.py index 9db769f..900775b 100644 --- a/stevedore/extension.py +++ b/stevedore/extension.py @@ -22,7 +22,7 @@ from .exception import NoMatches LOG = logging.getLogger(__name__) -class Extension(object): +class Extension: """Book-keeping object for tracking extensions. The arguments passed to the constructor are saved as attributes of @@ -74,7 +74,7 @@ class Extension(object): return self.entry_point.value -class ExtensionManager(object): +class ExtensionManager: """Base class for all of the other managers. :param namespace: The namespace for the entry points. diff --git a/stevedore/hook.py b/stevedore/hook.py index 4225db3..51ee719 100644 --- a/stevedore/hook.py +++ b/stevedore/hook.py @@ -56,7 +56,7 @@ class HookManager(NamedExtensionManager): # base class because for hooks it is less likely to # be an error to have no entry points present. warn_on_missing_entrypoint=False): - super(HookManager, self).__init__( + super().__init__( namespace, [name], invoke_on_load=invoke_on_load, @@ -71,7 +71,7 @@ class HookManager(NamedExtensionManager): def _init_attributes(self, namespace, names, name_order=False, propagate_map_exceptions=False, on_load_failure_callback=None): - super(HookManager, self)._init_attributes( + super()._init_attributes( namespace, names, propagate_map_exceptions=propagate_map_exceptions, on_load_failure_callback=on_load_failure_callback) diff --git a/stevedore/named.py b/stevedore/named.py index 1be3922..14cb9bd 100644 --- a/stevedore/named.py +++ b/stevedore/named.py @@ -79,7 +79,7 @@ class NamedExtensionManager(ExtensionManager): invoke_args, invoke_kwds, verify_requirements) - self._missing_names = set(names) - set([e.name for e in extensions]) + self._missing_names = set(names) - {e.name for e in extensions} if self._missing_names: if on_missing_entrypoints_callback: on_missing_entrypoints_callback(self._missing_names) @@ -131,7 +131,7 @@ class NamedExtensionManager(ExtensionManager): def _init_attributes(self, namespace, names, name_order=False, propagate_map_exceptions=False, on_load_failure_callback=None): - super(NamedExtensionManager, self)._init_attributes( + super()._init_attributes( namespace, propagate_map_exceptions=propagate_map_exceptions, on_load_failure_callback=on_load_failure_callback) @@ -140,7 +140,7 @@ class NamedExtensionManager(ExtensionManager): self._name_order = name_order def _init_plugins(self, extensions): - super(NamedExtensionManager, self)._init_plugins(extensions) + super()._init_plugins(extensions) if self._name_order: self.extensions = [self[n] for n in self._names @@ -153,7 +153,7 @@ class NamedExtensionManager(ExtensionManager): # going to use it. if ep.name not in self._names: return None - return super(NamedExtensionManager, self)._load_one_plugin( + return super()._load_one_plugin( ep, invoke_on_load, invoke_args, invoke_kwds, verify_requirements, ) diff --git a/stevedore/sphinxext.py b/stevedore/sphinxext.py index 857b0cd..acc7eff 100644 --- a/stevedore/sphinxext.py +++ b/stevedore/sphinxext.py @@ -33,7 +33,7 @@ def _simple_list(mgr): ext = mgr[name] doc = _get_docstring(ext.plugin) or '\n' summary = doc.splitlines()[0].strip() - yield ('* %s -- %s' % (ext.name, summary), + yield ('* {} -- {}'.format(ext.name, summary), ext.module_name) @@ -82,7 +82,7 @@ class ListPluginsDirective(rst.Directive): underline_style = self.options.get('underline-style', '=') def report_load_failure(mgr, ep, err): - LOG.warning(u'Failed to load %s: %s' % (ep.module, err)) + LOG.warning('Failed to load {}: {}'.format(ep.module, err)) mgr = extension.ExtensionManager( namespace, diff --git a/stevedore/tests/manager.py b/stevedore/tests/manager.py index 8c97a68..69fe29c 100644 --- a/stevedore/tests/manager.py +++ b/stevedore/tests/manager.py @@ -53,11 +53,11 @@ class TestExtensionManager(extension.ExtensionManager): invoke_on_load=False, invoke_args=(), invoke_kwds={}): - super(TestExtensionManager, self).__init__(namespace, - invoke_on_load, - invoke_args, - invoke_kwds, - ) + super().__init__(namespace, + invoke_on_load, + invoke_args, + invoke_kwds, + ) self.extensions = extensions warnings.warn( 'TestExtesionManager has been replaced by make_test_instance()', diff --git a/stevedore/tests/test_dispatch.py b/stevedore/tests/test_dispatch.py index e54e492..5b9569f 100644 --- a/stevedore/tests/test_dispatch.py +++ b/stevedore/tests/test_dispatch.py @@ -34,7 +34,7 @@ class TestDispatch(utils.TestCase): invoke_kwds={'b': 'B'}, ) self.assertEqual(len(em.extensions), 2) - self.assertEqual(set(em.names()), set(['t1', 't2'])) + self.assertEqual(set(em.names()), {'t1', 't2'}) results = em.map(check_dispatch, invoke, @@ -67,7 +67,7 @@ class TestDispatch(utils.TestCase): invoke_kwds={'b': 'B'}, ) self.assertEqual(len(em.extensions), 2) - self.assertEqual(set(em.names()), set(['t1', 't2'])) + self.assertEqual(set(em.names()), {'t1', 't2'}) results = em.map(['t2'], invoke, 'first', named='named value',) expected = [('t2', ('first',), {'named': 'named value'})] diff --git a/stevedore/tests/test_extension.py b/stevedore/tests/test_extension.py index e8c64c2..add122b 100644 --- a/stevedore/tests/test_extension.py +++ b/stevedore/tests/test_extension.py @@ -26,7 +26,7 @@ ALL_NAMES = ['e1', 't1', 't2'] WORKING_NAMES = ['t1', 't2'] -class FauxExtension(object): +class FauxExtension: def __init__(self, *args, **kwds): self.args = args self.kwds = kwds @@ -35,9 +35,9 @@ class FauxExtension(object): return self.args, self.kwds, data -class BrokenExtension(object): +class BrokenExtension: def __init__(self, *args, **kwds): - raise IOError("Did not create") + raise OSError("Did not create") class TestCallback(utils.TestCase): @@ -54,14 +54,14 @@ class TestCallback(utils.TestCase): def test_list_entry_points(self): em = extension.ExtensionManager('stevedore.test.extension') n = em.list_entry_points() - self.assertEqual(set(['e1', 'e2', 't1', 't2']), + self.assertEqual({'e1', 'e2', 't1', 't2'}, set(map(operator.attrgetter("name"), n))) self.assertEqual(4, len(n)) def test_list_entry_points_names(self): em = extension.ExtensionManager('stevedore.test.extension') names = em.entry_points_names() - self.assertEqual(set(['e1', 'e2', 't1', 't2']), set(names)) + self.assertEqual({'e1', 'e2', 't1', 't2'}, set(names)) self.assertEqual(4, len(names)) def test_contains_by_name(self): @@ -196,11 +196,11 @@ class TestCallback(utils.TestCase): ) result = em.map_method('get_args_and_data', 42) - self.assertEqual(set(r[2] for r in result), set([42])) + self.assertEqual({r[2] for r in result}, {42}) def test_items(self): em = extension.ExtensionManager('stevedore.test.extension') - expected_output = set([(name, em[name]) for name in ALL_NAMES]) + expected_output = {(name, em[name]) for name in ALL_NAMES} self.assertEqual(expected_output, set(em.items())) @@ -208,7 +208,7 @@ class TestLoadRequirementsNewSetuptools(utils.TestCase): # setuptools 11.3 and later def setUp(self): - super(TestLoadRequirementsNewSetuptools, self).setUp() + super().setUp() self.mock_ep = mock.Mock(spec=['require', 'resolve', 'load', 'name']) self.em = extension.ExtensionManager.make_test_instance([]) @@ -229,7 +229,7 @@ class TestLoadRequirementsOldSetuptools(utils.TestCase): # Before setuptools 11.3 def setUp(self): - super(TestLoadRequirementsOldSetuptools, self).setUp() + super().setUp() self.mock_ep = mock.Mock(spec=['load', 'name']) self.em = extension.ExtensionManager.make_test_instance([]) diff --git a/stevedore/tests/test_sphinxext.py b/stevedore/tests/test_sphinxext.py index 2315c4e..843cb4f 100644 --- a/stevedore/tests/test_sphinxext.py +++ b/stevedore/tests/test_sphinxext.py @@ -33,7 +33,7 @@ def _make_ext(name, docstring): class TestSphinxExt(utils.TestCase): def setUp(self): - super(TestSphinxExt, self).setUp() + super().setUp() self.exts = [ _make_ext('test1', 'One-line docstring'), _make_ext('test2', 'Multi-line docstring\n\nAnother para'),