Skip to content

Commit 34ecf15

Browse files
Fix issue with optional arguments
1 parent ef45927 commit 34ecf15

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

cloudinary_cli/utils/utils.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,19 @@ def parse_args_kwargs(func, params):
9393
n_req = n_args - n_defaults
9494
if len(params) < n_req:
9595
raise Exception("Function '{}' requires {} arguments".format(func.__name__, n_req))
96-
args = [parse_option_value(x) for x in params[:n_req]]
96+
# consume required args
97+
args = [parse_option_value(p) for p in params[:n_req]]
98+
kwargs = {}
99+
100+
for p in params[n_req:]:
101+
if '=' not in p:
102+
# named/positional with default value args passed as positional
103+
args.append(parse_option_value(p))
104+
continue
105+
106+
k, v = p.split('=', 1)
107+
kwargs[k] = parse_option_value(v)
97108

98-
kwargs = {k: parse_option_value(v) for k, v in [x.split('=') for x in params[n_req:]]} if params[n_req:] else {}
99109
return args, kwargs
100110

101111

test/test_utils.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import unittest
22

3-
from cloudinary_cli.utils.utils import parse_option_value, whitelist_keys, merge_responses, normalize_list_params
3+
from cloudinary_cli.utils.utils import parse_option_value, parse_args_kwargs, whitelist_keys, merge_responses, \
4+
normalize_list_params
45

56

67
class UtilsTest(unittest.TestCase):
@@ -19,6 +20,32 @@ def test_parse_option_value_converts_int_to_str(self):
1920
""" should convert a parsed int to a str """
2021
self.assertEqual("1", parse_option_value(1))
2122

23+
def test_parse_args_kwargs(self):
24+
args, kwargs = parse_args_kwargs(_no_args_test_func, [])
25+
self.assertEqual(0, len(args))
26+
self.assertEqual(0, len(kwargs))
27+
28+
args, kwargs = parse_args_kwargs(_only_args_test_func, ["a1", "a2"])
29+
self.assertListEqual(["a1", "a2"], args)
30+
self.assertEqual(0, len(kwargs))
31+
32+
with self.assertRaisesRegex(Exception, "requires 2 arguments"):
33+
parse_args_kwargs(_only_args_test_func, ["a1"])
34+
35+
args, kwargs = parse_args_kwargs(_args_kwargs_test_func, ["a1", 'arg2=a2'])
36+
self.assertListEqual(["a1"], args)
37+
self.assertDictEqual({"arg2": "a2"}, kwargs)
38+
39+
# should parse values
40+
args, kwargs = parse_args_kwargs(_args_kwargs_test_func, ['["a1"]', 'arg2={"k2":"a2"}'])
41+
self.assertListEqual([["a1"]], args)
42+
self.assertDictEqual({"arg2": {"k2": "a2"}}, kwargs)
43+
44+
# should allow passing optional args as positional
45+
args, kwargs = parse_args_kwargs(_args_kwargs_test_func, ["a1", "a2"])
46+
self.assertListEqual(["a1", "a2"], args)
47+
self.assertEqual(0, len(kwargs))
48+
2249
def test_whitelist_keys(self):
2350
""" should whitelist keys correctly """
2451
self.assertEqual([{"k1": "v1"}], whitelist_keys([{"k1": "v1", "k2": "v2"}], ["k1"]))
@@ -61,3 +88,15 @@ def test_merge_responses(self):
6188
def test_normalize_list_params(self):
6289
""" should normalize a list of parameters """
6390
self.assertEqual(["f1", "f2", "f3"], normalize_list_params(["f1,f2", "f3"]))
91+
92+
93+
def _no_args_test_func():
94+
pass
95+
96+
97+
def _only_args_test_func(arg1, arg2):
98+
return arg1, arg2
99+
100+
101+
def _args_kwargs_test_func(arg1, arg2=None):
102+
return arg1, arg2

0 commit comments

Comments
 (0)