64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
# vim:fileencoding=utf-8:noet
|
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
|
|
|
from inspect import ArgSpec, getargspec
|
|
|
|
from powerline.segments import Segment
|
|
|
|
|
|
def getconfigargspec(obj):
|
|
if hasattr(obj, 'powerline_origin'):
|
|
obj = obj.powerline_origin
|
|
else:
|
|
obj = obj
|
|
|
|
args = []
|
|
defaults = []
|
|
|
|
if isinstance(obj, Segment):
|
|
additional_args = obj.additional_args()
|
|
argspecobjs = obj.argspecobjs()
|
|
get_omitted_args = obj.omitted_args
|
|
else:
|
|
additional_args = ()
|
|
argspecobjs = ((None, obj),)
|
|
get_omitted_args = lambda *args: ()
|
|
|
|
for arg in additional_args:
|
|
args.append(arg[0])
|
|
if len(arg) > 1:
|
|
defaults.append(arg[1])
|
|
|
|
requires_segment_info = hasattr(obj, 'powerline_requires_segment_info')
|
|
requires_filesystem_watcher = hasattr(obj, 'powerline_requires_filesystem_watcher')
|
|
|
|
for name, method in argspecobjs:
|
|
argspec = getargspec(method)
|
|
omitted_args = get_omitted_args(name, method)
|
|
largs = len(argspec.args)
|
|
for i, arg in enumerate(reversed(argspec.args)):
|
|
if (
|
|
largs - (i + 1) in omitted_args
|
|
or arg in omitted_args
|
|
or arg == 'pl'
|
|
or arg == 'self'
|
|
or (arg == 'create_watcher' and requires_filesystem_watcher)
|
|
or (arg == 'segment_info' and requires_segment_info)
|
|
):
|
|
continue
|
|
if argspec.defaults and len(argspec.defaults) > i:
|
|
if arg in args:
|
|
idx = args.index(arg)
|
|
if len(args) - idx > len(defaults):
|
|
args.pop(idx)
|
|
else:
|
|
continue
|
|
default = argspec.defaults[-(i + 1)]
|
|
defaults.append(default)
|
|
args.append(arg)
|
|
else:
|
|
if arg not in args:
|
|
args.insert(0, arg)
|
|
|
|
return ArgSpec(args=args, varargs=None, keywords=None, defaults=tuple(defaults))
|