From 7e57010c1952e66e56bd6782b33baffd281091e2 Mon Sep 17 00:00:00 2001
From: ZyX <kp-pav@ya.ru>
Date: Sat, 13 Apr 2013 00:09:00 +0400
Subject: [PATCH] Move some code from powerline_autodoc to
 powerline.lib.inspect

To make it available later in lint checker.
---
 docs/source/powerline_autodoc.py | 60 +++-----------------------------
 powerline/lint/inspect.py        | 59 +++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 55 deletions(-)
 create mode 100644 powerline/lint/inspect.py

diff --git a/docs/source/powerline_autodoc.py b/docs/source/powerline_autodoc.py
index 87412cfa..4806c3cf 100644
--- a/docs/source/powerline_autodoc.py
+++ b/docs/source/powerline_autodoc.py
@@ -1,8 +1,8 @@
+# vim:fileencoding=utf-8:noet
 from sphinx.ext import autodoc
-from sphinx.util.inspect import getargspec
-from inspect import ArgSpec, formatargspec
-from powerline.lib.threaded import ThreadedSegment, KwThreadedSegment
-from itertools import count
+from inspect import formatargspec
+from powerline.lint.inspect import getconfigargspec
+from powerline.lib.threaded import ThreadedSegment
 
 try:
 	from __builtin__ import unicode
@@ -25,57 +25,7 @@ class ThreadedDocumenter(autodoc.FunctionDocumenter):
 			super(ThreadedDocumenter, cls).can_document_member(member, membername, isattr, parent))
 
 	def format_args(self):
-		if isinstance(self.object, ThreadedSegment):
-			args = ['interval']
-			defaults = [getattr(self.object, 'interval', 1)]
-			if self.object.update_first:
-				args.append('update_first')
-				defaults.append(True)
-			methods = ['render', 'set_state']
-			if isinstance(self.object, KwThreadedSegment):
-				methods += ['key', 'render_one']
-
-			for method in methods:
-				if hasattr(self.object, method):
-					# Note: on <python-2.6 it may return simple tuple, not 
-					# ArgSpec instance.
-					argspec = getargspec(getattr(self.object, method))
-					for i, arg in zip(count(-1, -1), reversed(argspec.args)):
-						if (arg == 'self' or
-								(arg == 'segment_info' and
-									getattr(self.object, 'powerline_requires_segment_info', None)) or
-								(arg == 'pl') or
-								(method.startswith('render') and (1 if argspec.args[0] == 'self' else 0) - i == len(argspec.args)) or
-								arg in args):
-							continue
-						if argspec.defaults and len(argspec.defaults) >= -i:
-							default = argspec.defaults[i]
-							defaults.append(default)
-							args.append(arg)
-						else:
-							args.insert(0, arg)
-			argspec = ArgSpec(args=args, varargs=None, keywords=None, defaults=tuple(defaults))
-		else:
-			if hasattr(self.object, 'powerline_origin'):
-				obj = self.object.powerline_origin
-			else:
-				obj = self.object
-
-			argspec = getargspec(obj)
-			args = []
-			defaults = []
-			for i, arg in zip(count(-1, -1), reversed(argspec.args)):
-				if ((arg == 'segment_info' and getattr(self.object, 'powerline_requires_segment_info', None)) or
-					arg == 'pl'):
-					continue
-				if argspec.defaults and len(argspec.defaults) >= -i:
-					default = argspec.defaults[i]
-					defaults.append(default)
-					args.append(arg)
-				else:
-					args.insert(0, arg)
-			argspec = ArgSpec(args=args, varargs=argspec.varargs, keywords=argspec.keywords, defaults=tuple(defaults))
-
+		argspec = getconfigargspec(self.object)
 		return formatargspec(*argspec, formatvalue=formatvalue).replace('\\', '\\\\')
 
 
diff --git a/powerline/lint/inspect.py b/powerline/lint/inspect.py
new file mode 100644
index 00000000..6c2c0fab
--- /dev/null
+++ b/powerline/lint/inspect.py
@@ -0,0 +1,59 @@
+# vim:fileencoding=utf-8:noet
+from __future__ import absolute_import
+from inspect import ArgSpec, getargspec
+from powerline.lib.threaded import ThreadedSegment, KwThreadedSegment
+from itertools import count
+
+def getconfigargspec(obj):
+	if isinstance(obj, ThreadedSegment):
+		args = ['interval']
+		defaults = [getattr(obj, 'interval', 1)]
+		if obj.update_first:
+			args.append('update_first')
+			defaults.append(True)
+		methods = ['render', 'set_state']
+		if isinstance(obj, KwThreadedSegment):
+			methods += ['key', 'render_one']
+
+		for method in methods:
+			if hasattr(obj, method):
+				# Note: on <python-2.6 it may return simple tuple, not 
+				# ArgSpec instance.
+				argspec = getargspec(getattr(obj, method))
+				for i, arg in zip(count(-1, -1), reversed(argspec.args)):
+					if (arg == 'self' or
+							(arg == 'segment_info' and
+								getattr(obj, 'powerline_requires_segment_info', None)) or
+							(arg == 'pl') or
+							(method.startswith('render') and (1 if argspec.args[0] == 'self' else 0) - i == len(argspec.args)) or
+							arg in args):
+						continue
+					if argspec.defaults and len(argspec.defaults) >= -i:
+						default = argspec.defaults[i]
+						defaults.append(default)
+						args.append(arg)
+					else:
+						args.insert(0, arg)
+		argspec = ArgSpec(args=args, varargs=None, keywords=None, defaults=tuple(defaults))
+	else:
+		if hasattr(obj, 'powerline_origin'):
+			obj = obj.powerline_origin
+		else:
+			obj = obj
+
+		argspec = getargspec(obj)
+		args = []
+		defaults = []
+		for i, arg in zip(count(-1, -1), reversed(argspec.args)):
+			if ((arg == 'segment_info' and getattr(obj, 'powerline_requires_segment_info', None)) or
+				arg == 'pl'):
+				continue
+			if argspec.defaults and len(argspec.defaults) >= -i:
+				default = argspec.defaults[i]
+				defaults.append(default)
+				args.append(arg)
+			else:
+				args.insert(0, arg)
+		argspec = ArgSpec(args=args, varargs=argspec.varargs, keywords=argspec.keywords, defaults=tuple(defaults))
+
+	return argspec