Skip to content

Commit 83bf033

Browse files
authored
Fix using a dict in alt= parameter of clize.run (#102)
* Fix using a dict in alt= parameter * fix uncovered test mocks
1 parent 162f849 commit 83bf033

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

clize/runner.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def __init__(self, fn, owner=None, alt=(), extra=(),
7878
update_wrapper(self, fn)
7979
self.func = fn
8080
self.owner = owner
81-
self.alt = util.maybe_iter(alt)
81+
self.alt = util.dict_from_names(alt)
8282
self.extra = extra
8383
self.help_names = help_names
8484
self.help_aliases = [util.name_py2cli(s, kw=True) for s in help_names]
@@ -103,7 +103,7 @@ def _key(self):
103103
return (
104104
self.func,
105105
self.owner,
106-
tuple(self.alt),
106+
tuple(self.alt.items()),
107107
tuple(self.extra),
108108
tuple(self.help_names),
109109
tuple(self.help_aliases),
@@ -215,7 +215,7 @@ def helper(self):
215215
@util.property_once
216216
def signature(self):
217217
"""The `.parser.CliSignature` object used to parse arguments."""
218-
extra = itertools.chain(self._process_alt(self.alt), self.extra)
218+
extra = itertools.chain(self._process_alt(), self.extra)
219219
with self._move_warnings_to_func():
220220
return parser.CliSignature.from_signature(
221221
self.func_signature,
@@ -242,14 +242,14 @@ def _move_warnings_to_func(self):
242242
registry = module_globals.setdefault("__warningregistry__", {})
243243
warnings.warn_explicit(warning.message, warning.category, filename, lineno, module, registry, module_globals)
244244

245-
def _process_alt(self, alt):
245+
def _process_alt(self):
246246
if self.help_names:
247247
p = parser.FallbackCommandParameter(
248248
func=self.helper.cli, undocumented=self.hide_help,
249249
aliases=self.help_aliases)
250250
yield p
251251

252-
for name, func in util.dict_from_names(alt).items():
252+
for name, func in self.alt.items():
253253
func = self.get_cli(func)
254254
param = parser.AlternateCommandParameter(
255255
undocumented=False, func=func,

clize/tests/test_runner.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,32 @@ def func2(): return '2'
491491
self.assertFalse(stderr.getvalue())
492492
self.assertEqual(stdout.getvalue(), '2\n')
493493

494+
def test_alt_list(self):
495+
def base(): return '0'
496+
def func1(): return '1'
497+
def func2(): return '2'
498+
alt = [func1, func2]
499+
self.crun(base, alt=alt, args=['test'])
500+
stdout, stderr = self.crun(base, alt=alt, args=['test', '--func1'])
501+
self.assertFalse(stderr.getvalue())
502+
self.assertEqual(stdout.getvalue(), '1\n')
503+
stdout, stderr = self.crun(base, alt=alt, args=['test', '--func2'])
504+
self.assertFalse(stderr.getvalue())
505+
self.assertEqual(stdout.getvalue(), '2\n')
506+
507+
def test_alt_dict(self):
508+
def base(): return '0'
509+
def func1(): return '1'
510+
def func2(): return '2'
511+
alt = {'1': func1, '2': func2}
512+
self.crun(base, alt=alt, args=['test'])
513+
stdout, stderr = self.crun(base, alt=alt, args=['test', '-1'])
514+
self.assertFalse(stderr.getvalue())
515+
self.assertEqual(stdout.getvalue(), '1\n')
516+
stdout, stderr = self.crun(base, alt=alt, args=['test', '-2'])
517+
self.assertFalse(stderr.getvalue())
518+
self.assertEqual(stdout.getvalue(), '2\n')
519+
494520
def test_disable_help(self):
495521
def func1(): raise NotImplementedError
496522
stdout, stderr = self.crun(

docs/releases.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
Release notes
66
=============
77

8+
.. _v5.0.1:
9+
10+
5.0.1 (2023-07-06)
11+
------------------
12+
13+
* Fixed ``run(..., alt={...})`` not working correctly with dicts
14+
815
.. _v5.0:
916
.. _v5.0.0:
1017

0 commit comments

Comments
 (0)