summaryrefslogtreecommitdiffstats
path: root/utils_prog.py
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2014-06-16 17:55:36 +0200
committerJan Pokorný <jpokorny@redhat.com>2014-06-16 18:57:17 +0200
commitf1a9f5e75c420a8710c46203163119b49bb48f4a (patch)
tree1b042e480b8231f4233107ae4b4b33d7639cb7d5 /utils_prog.py
parent2489b45814189739ad832aed32b13db693848207 (diff)
downloadclufter-f1a9f5e75c420a8710c46203163119b49bb48f4a.tar.gz
clufter-f1a9f5e75c420a8710c46203163119b49bb48f4a.tar.xz
clufter-f1a9f5e75c420a8710c46203163119b49bb48f4a.zip
command: add behavior of deferring to _common as already doc'd
(in doc/HACKING in the previous commit) Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to 'utils_prog.py')
-rw-r--r--utils_prog.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/utils_prog.py b/utils_prog.py
index 9a57f7f..ff178fc 100644
--- a/utils_prog.py
+++ b/utils_prog.py
@@ -12,6 +12,7 @@ from subprocess import Popen
from sys import stderr, stdin
from .error import ClufterError
+from .utils import filterdict_pop, func_defaults_varnames, selfaware
#
@@ -97,3 +98,24 @@ def which(name, *where):
return None
dirname_x = lambda p, c=1: reduce(lambda x, y: path.dirname(x), xrange(c), p)
+
+
+@selfaware
+def defer_common(me, fnc, skip=0):
+ """Use when you have a func with common initial kwargs consumption"""
+ fnc_defaults, fnc_varnames = func_defaults_varnames(fnc, skip=skip)
+ common = fnc_defaults.pop('_common', None)
+ if not common:
+ wrapfnc = fnc
+ else:
+ common_defaults, common_varnames, common = me(common, skip=skip)
+ fnc_defaults.update(common_defaults)
+ fnc_varnames = list(fnc_varnames)
+ fnc_varnames.remove('_common') # but we could rely on last argument
+ fnc_varnames = tuple(fnc_varnames) + common_varnames
+ def wrapfnc(cmd_ctxt, **kwargs):
+ common(cmd_ctxt, **filterdict_pop(kwargs, common_varnames))
+ kwargs.pop('_common', None)
+ return fnc(cmd_ctxt, **kwargs)
+ wrapfnc.__doc__ = fnc.__doc__ + common.__doc__
+ return fnc_defaults, fnc_varnames, wrapfnc