summaryrefslogtreecommitdiffstats
path: root/powerline/lint/inspect.py
blob: 15bb6103bad3288b6564928113259ac1bbdbc03b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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))