From c659d45eefa60ddfb3ae8d61c0d9f0f1f0473d0e Mon Sep 17 00:00:00 2001 From: Ed Wagner Date: Tue, 5 Mar 2024 23:28:28 -0600 Subject: [PATCH] Fix plugin loading After the switch to importlib, plugins are retrieved by name, not integer index. For details see importlib.metadata.EntryPoints.__getitem__() Also update the mock.patch to match: entry_points() -> EntryPoints --- src/ofxstatement/plugin.py | 2 +- src/ofxstatement/tests/test_plugin.py | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ofxstatement/plugin.py b/src/ofxstatement/plugin.py index 6875c39..ea81f34 100644 --- a/src/ofxstatement/plugin.py +++ b/src/ofxstatement/plugin.py @@ -22,7 +22,7 @@ def get_plugin(name: str, ui: UI, settings: MutableMapping) -> "Plugin": raise PluginNotRegistered(name) if len(plugins) > 1: raise PluginNameConflict(plugins) - plugin = plugins[0].load() # type: ignore[index] # index requires a int but class expects a string + plugin = plugins[name].load() return plugin(ui, settings) diff --git a/src/ofxstatement/tests/test_plugin.py b/src/ofxstatement/tests/test_plugin.py index 34618d1..2d156de 100644 --- a/src/ofxstatement/tests/test_plugin.py +++ b/src/ofxstatement/tests/test_plugin.py @@ -2,6 +2,13 @@ import mock +import sys + +if sys.version_info < (3, 10): + from importlib_metadata import EntryPoints +else: + from importlib.metadata import EntryPoints + from ofxstatement import plugin @@ -13,7 +20,9 @@ def get_parser(self): ep = mock.Mock() ep.load.return_value = SamplePlugin - ep_patch = mock.patch("ofxstatement.plugin.entry_points", return_value=[ep]) + ep_patch = mock.patch( + "ofxstatement.plugin.entry_points", return_value=EntryPoints([ep]) + ) with ep_patch: p = plugin.get_plugin("sample", mock.Mock("UI"), mock.Mock("Settings")) self.assertIsInstance(p, SamplePlugin) @@ -21,7 +30,9 @@ def get_parser(self): def test_get_plugin_conflict(self) -> None: ep = mock.Mock() - ep_patch = mock.patch("ofxstatement.plugin.entry_points", return_value=[ep, ep]) + ep_patch = mock.patch( + "ofxstatement.plugin.entry_points", return_value=EntryPoints([ep, ep]) + ) with ep_patch: with self.assertRaises(plugin.PluginNameConflict): plugin.get_plugin("conflicting", mock.Mock("UI"), mock.Mock("Settings"))