|
26 | 26 | """ |
27 | 27 | __all__ = ['Handler'] |
28 | 28 |
|
29 | | -from moretools import isstring, dictitems |
| 29 | +from six import with_metaclass |
30 | 30 |
|
| 31 | +from moretools import isstring, isdict, dictitems |
31 | 32 |
|
32 | | -class Handler(object): |
33 | | - """A wrapper for instances of classes from ``robot.running.handlers``, |
34 | | - implementing a custom :meth:`.resolve_arguments`, |
35 | | - which supports passing arbitrary python objects |
36 | | - as keyword argument values. |
37 | | - """ |
38 | | - def __init__(self, handler): |
39 | | - """Create with the `handler` instance to wrap. |
40 | | - """ |
41 | | - self._handler = handler |
42 | 33 |
|
43 | | - def __getattr__(self, name): |
44 | | - return getattr(self._handler, name) |
| 34 | +class HandlerMeta(type): |
| 35 | + |
| 36 | + def __getitem__(cls, handlercls): |
| 37 | + return type('Handler', (cls, handlercls), { |
| 38 | + '_resolve_arguments': handlercls.resolve_arguments, |
| 39 | + }) |
45 | 40 |
|
| 41 | + |
| 42 | +class Handler(with_metaclass(HandlerMeta, object)): |
| 43 | + """A wrapper base class for instances of classes |
| 44 | + from ``robot.running.handlers``. |
| 45 | +
|
| 46 | + * Implements a custom :meth:`.resolve_arguments`, |
| 47 | + which supports passing arbitrary python objects |
| 48 | + as keyword argument values. |
| 49 | + """ |
46 | 50 | # HACK |
47 | | - def resolve_arguments(self, args_and_kwargs, variables): |
| 51 | + def resolve_arguments(self, args_and_kwargs, variables=None): |
48 | 52 | """More Pythonic argument handling for interactive |
49 | 53 | :class:`robottools.testrobot.keyword.Keyword` calls. |
50 | 54 |
|
@@ -77,13 +81,19 @@ def resolve_arguments(self, args_and_kwargs, variables): |
77 | 81 | if not isstring(value): |
78 | 82 | value = repr(value) |
79 | 83 | rfwargs.append(u'%s=%s' % (name, value)) |
80 | | - posargs, rfwkwargslist \ |
81 | | - = self._handler.resolve_arguments(rfwargs, variables) |
| 84 | + posargs, rfwkwargs = self._resolve_arguments(rfwargs, variables) |
82 | 85 | # and replace values with original non-string objects after resolving |
83 | 86 | kwargslist = [] |
84 | | - for name, rfwvalue in rfwkwargslist: |
| 87 | + if isdict(rfwkwargs): |
| 88 | + # ==> RFW < 3.0 |
| 89 | + rfwkwargs = dictitems(rfwkwargs) |
| 90 | + for name, rfwvalue in rfwkwargs: |
85 | 91 | value = kwargs[name] |
86 | 92 | if isstring(value): |
87 | 93 | value = rfwvalue |
88 | | - kwargslist.append(value) |
| 94 | + kwargslist.append((name, value)) |
| 95 | + if hasattr(self, 'run'): |
| 96 | + # ==> RFW < 3.0 |
| 97 | + return posargs, dict(kwargslist) |
| 98 | + # RFW >= 3.0 |
89 | 99 | return posargs, kwargslist |
0 commit comments