Skip to content

Commit a2da89a

Browse files
committed
Implement conflict resolution
Change-Id: I9ee1e73ca7858457cd0e3343b0d191c967ad9d09 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
1 parent b33c023 commit a2da89a

2 files changed

Lines changed: 34 additions & 8 deletions

File tree

cliff/commandmanager.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from typing import TypeAlias
1919

2020
import stevedore
21+
from stevedore import extension
2122

2223
from cliff import command
2324

@@ -64,15 +65,24 @@ class CommandManager:
6465
plugins to be loaded. For example, ``'cliff.formatter.list'``.
6566
:param convert_underscores: Whether cliff should convert underscores to
6667
spaces in entry_point commands.
68+
:param conflict_resolver: The conflict resolver to use in the event that
69+
there are multiple plugins sharing the same namespace and name.
6770
"""
6871

6972
def __init__(
70-
self, namespace: str, convert_underscores: bool = True
73+
self,
74+
namespace: str,
75+
convert_underscores: bool = True,
76+
*,
77+
conflict_resolver: extension.ConflictResolverT[command.Command] = (
78+
extension.ignore_conflicts
79+
),
7180
) -> None:
7281
self.commands: dict[str, EntryPointT] = {}
7382
self._legacy: dict[str, str] = {}
7483
self.namespace = namespace
7584
self.convert_underscores = convert_underscores
85+
self.conflict_resolver = conflict_resolver
7686
self.group_list: list[str] = []
7787
self._load_commands()
7888

@@ -82,10 +92,16 @@ def _load_commands(self) -> None:
8292
self.load_commands(self.namespace)
8393

8494
def load_commands(self, namespace: str) -> None:
85-
"""Load all the commands from an entrypoint"""
95+
"""Load all the commands from an entrypoint
96+
97+
:param namespace: The namespace to load commands from.
98+
:returns: None
99+
"""
86100
self.group_list.append(namespace)
87101
em: stevedore.ExtensionManager[command.Command]
88-
em = stevedore.ExtensionManager(namespace)
102+
em = stevedore.ExtensionManager(
103+
namespace, conflict_resolver=self.conflict_resolver
104+
)
89105
for ep in em:
90106
LOG.debug('found command %r', ep.name)
91107
cmd_name = (
@@ -171,7 +187,9 @@ def get_command_names(self, group: str | None = None) -> list[str]:
171187
group_list: list[str] = []
172188
if group is not None:
173189
em: stevedore.ExtensionManager[command.Command]
174-
em = stevedore.ExtensionManager(group)
190+
em = stevedore.ExtensionManager(
191+
group, conflict_resolver=self.conflict_resolver
192+
)
175193
for ep in em:
176194
cmd_name = (
177195
ep.name.replace('_', ' ')

cliff/tests/test_commandmanager.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ def test_load_commands(self):
120120
'stevedore.ExtensionManager', mock_get_group_all
121121
) as mock_manager:
122122
mgr = commandmanager.CommandManager('test')
123-
mock_manager.assert_called_once_with('test')
123+
mock_manager.assert_called_once_with(
124+
'test', conflict_resolver=mock.ANY
125+
)
124126
names = [n for n, v in mgr]
125127
self.assertEqual(['test'], names)
126128

@@ -135,7 +137,9 @@ def test_load_commands_keep_underscores(self):
135137
'test',
136138
convert_underscores=False,
137139
)
138-
mock_manager.assert_called_once_with('test')
140+
mock_manager.assert_called_once_with(
141+
'test', conflict_resolver=mock.ANY
142+
)
139143
names = [n for n, v in mgr]
140144
self.assertEqual(['test_cmd'], names)
141145

@@ -150,7 +154,9 @@ def test_load_commands_replace_underscores(self):
150154
'test',
151155
convert_underscores=True,
152156
)
153-
mock_manager.assert_called_once_with('test')
157+
mock_manager.assert_called_once_with(
158+
'test', conflict_resolver=mock.ANY
159+
)
154160
names = [n for n, v in mgr]
155161
self.assertEqual(['test cmd'], names)
156162

@@ -344,6 +350,8 @@ def test_get_command_names(self):
344350
mock_get_group_all,
345351
) as mock_manager:
346352
mgr = commandmanager.CommandManager('test')
347-
mock_manager.assert_called_once_with('test')
353+
mock_manager.assert_called_once_with(
354+
'test', conflict_resolver=mock.ANY
355+
)
348356
cmds = mgr.get_command_names('test')
349357
self.assertEqual(['one', 'cmd two'], cmds)

0 commit comments

Comments
 (0)