|
| 1 | +import inspect |
| 2 | + |
| 3 | + |
| 4 | +class DynamicApi: |
| 5 | + """A wrapper to make static API libraries use the dynamic API.""" |
| 6 | + def __init__(self, library, kwdoc=True, argsdoc=True): |
| 7 | + self._library = library |
| 8 | + if kwdoc: |
| 9 | + self.get_keyword_documentation = self._get_keyword_documentation |
| 10 | + if argsdoc: |
| 11 | + self.get_keyword_arguments = self._get_keyword_arguments |
| 12 | + |
| 13 | + def get_keyword_names(self): |
| 14 | + return [attr for attr in dir(self._library) if attr[0] != '_' |
| 15 | + and inspect.isroutine(getattr(self._library, attr))] |
| 16 | + |
| 17 | + def run_keyword(self, name, args): |
| 18 | + return self._get_keyword(name)(*args) |
| 19 | + |
| 20 | + def _get_keyword_documentation(self, name): |
| 21 | + if name == '__intro__': |
| 22 | + return inspect.getdoc(self._library) or '' |
| 23 | + if name == '__init__' and inspect.ismodule(self._library): |
| 24 | + return '' |
| 25 | + return inspect.getdoc(self._get_keyword(name)) or '' |
| 26 | + |
| 27 | + def _get_keyword_arguments(self, name): |
| 28 | + kw = self._get_keyword(name) |
| 29 | + if not kw: |
| 30 | + return [] |
| 31 | + return self._arguments_from_kw(kw) |
| 32 | + |
| 33 | + def _get_keyword(self, name): |
| 34 | + kw = getattr(self._library, name, None) |
| 35 | + if inspect.isroutine(kw): |
| 36 | + return kw |
| 37 | + return None |
| 38 | + |
| 39 | + def _arguments_from_kw(self, kw): |
| 40 | + args, varargs, _, defaults = inspect.getargspec(kw) |
| 41 | + if inspect.ismethod(kw): |
| 42 | + args = args[1:] # drop 'self' |
| 43 | + if defaults: |
| 44 | + args, names = args[:-len(defaults)], args[-len(defaults):] |
| 45 | + args += ['%s=%s' % (n, d) for n, d in zip(names, defaults)] |
| 46 | + if varargs: |
| 47 | + args.append('*%s' % varargs) |
| 48 | + return args |
0 commit comments