diff options
author | Jan Pokorný <jpokorny@redhat.com> | 2014-06-16 17:55:36 +0200 |
---|---|---|
committer | Jan Pokorný <jpokorny@redhat.com> | 2014-06-16 18:57:17 +0200 |
commit | f1a9f5e75c420a8710c46203163119b49bb48f4a (patch) | |
tree | 1b042e480b8231f4233107ae4b4b33d7639cb7d5 /utils_prog.py | |
parent | 2489b45814189739ad832aed32b13db693848207 (diff) | |
download | clufter-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.py | 22 |
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 |