summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/frontend.py3
-rw-r--r--tests/test_ipalib/test_frontend.py10
2 files changed, 12 insertions, 1 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py
index d2985fa73..d70a725e6 100644
--- a/ipalib/frontend.py
+++ b/ipalib/frontend.py
@@ -121,7 +121,8 @@ class DefaultFrom(plugable.ReadOnly):
raise TypeError('callback must be callable; got %r' % callback)
self.callback = callback
if len(keys) == 0:
- self.keys = callback.func_code.co_varnames
+ fc = callback.func_code
+ self.keys = fc.co_varnames[:fc.co_argcount]
else:
self.keys = keys
for key in self.keys:
diff --git a/tests/test_ipalib/test_frontend.py b/tests/test_ipalib/test_frontend.py
index 7760ffbe3..966b5e935 100644
--- a/tests/test_ipalib/test_frontend.py
+++ b/tests/test_ipalib/test_frontend.py
@@ -115,11 +115,21 @@ class test_DefaultFrom(ClassChecker):
kw_copy = dict(kw)
del kw_copy[key]
assert o(**kw_copy) is None
+
+ # Test using implied keys:
o = self.cls(lambda first, last: first[0] + last)
assert o(first='john', last='doe') == 'jdoe'
assert o(first='', last='doe') is None
assert o(one='john', two='doe') is None
+ # Test that co_varnames slice is used:
+ def callback2(first, last):
+ letter = first[0]
+ return letter + last
+ o = self.cls(callback2)
+ assert o.keys == ('first', 'last')
+ assert o(first='john', last='doe') == 'jdoe'
+
def test_parse_param_spec():
"""