Author: janne.t.harkonen
Date: Tue Nov 25 03:55:59 2008
New Revision: 1100
Modified:
trunk/src/robot/running/handlers.py
trunk/src/robot/running/testlibraries.py
Log:
refactoring
Modified: trunk/src/robot/running/handlers.py
==============================================================================
--- trunk/src/robot/running/handlers.py (original)
+++ trunk/src/robot/running/handlers.py Tue Nov 25 03:55:59 2008
@@ -17,7 +17,7 @@
from types import MethodType, FunctionType
from robot import utils
-from robot.errors import DataError, FrameworkError
+from robot.errors import FrameworkError
from robot.common import BaseHandler
from runkwregister import RUN_KW_REGISTER
@@ -154,7 +154,9 @@
elif type(handler) is FunctionType:
func = handler
first_arg = 0
- elif self._is_new_style_init_method(handler):
+ # New style classes always inherit __init__ from object.
+ elif getattr(handler, '__name__', '') == '__init__' or \
+ getattr(handler, 'name', '') == '__init__':
return [], [], None
else:
raise FrameworkError("Only MethodType and FunctionType
accepted. "
@@ -171,11 +173,6 @@
varargs = None
return args, defaults, varargs
- def _is_new_style_init_method(self, handler):
- return '__init__' in str(handler) and str(type(handler)) in \
-
["<type 'wrapper_descriptor'>", "<type 'builtin_function_or_method'>",
- "<type 'methoddescr'>"]
-
class JavaHandler(_RunnableHandler):
@@ -192,10 +189,7 @@
# Ignore methods only in 'java.lang.Object'
(e.g. 'equals', 'wait').
# Also ignore methods declared only in 'org.python.proxies' (there
# seems to be 'clone' and 'finalize').
- if 'reflectedconstructor' in str(type(handler)):
- co = handler
- else:
- co = handler.im_func
+ co = self._get_code_object(handler)
# signature is an instance of org.python.ReflectedArgs
for signature in co.argslist[:co.nargs]:
# 'getName' may raise an exception -- not sure why but that
happens
@@ -212,16 +206,16 @@
return False
def _get_arg_limits(self, handler):
- if 'reflectedconstructor' in str(type(handler)):
- co = handler
- else:
- co = handler.im_func
+ co = self._get_code_object(handler)
signatures = co.argslist[:co.nargs]
if len(signatures) == 1:
return self._get_single_sig_arg_limits(signatures[0])
else:
return self._get_multi_sig_arg_limits(signatures)
+ def _get_code_object(self, handler):
+ return handler.im_func
+
def _get_single_sig_arg_limits(self, signature):
args = signature.args
if len(args) > 0 and args[-1].isArray():
@@ -336,7 +330,7 @@
return "Test Library '%s'" % self.library.name
-class InitHandler(_BaseInitHandler, PythonHandler):
+class PythonInitHandler(_BaseInitHandler, PythonHandler):
def __init__(self, library, handler_method):
_BaseInitHandler.__init__(self, PythonHandler, library,
handler_method)
@@ -346,3 +340,6 @@
def __init__(self, library, handler_method):
_BaseInitHandler.__init__(self, JavaHandler, library,
handler_method)
+
+ def _get_code_object(self, handler):
+ return handler
Modified: trunk/src/robot/running/testlibraries.py
==============================================================================
--- trunk/src/robot/running/testlibraries.py (original)
+++ trunk/src/robot/running/testlibraries.py Tue Nov 25 03:55:59 2008
@@ -21,7 +21,8 @@
from robot.common import BaseLibrary
from robot.output import SystemLogger
-from handlers import PythonHandler, JavaHandler, DynamicHandler,
InitHandler, JavaInitHandler
+from handlers import PythonHandler, JavaHandler, DynamicHandler, \
+ PythonInitHandler, JavaInitHandler
def TestLibrary(name, args=None, syslog=None):
@@ -34,8 +35,8 @@
raise DataError('Libraries implemented as modules do not take '
'arguments, got: %s' % str(args))
return ModuleLibrary(libcode, source, name, args, syslog)
- if _has_method(libcode, ['get_keyword_names', 'getKeywordNames']):
- if _has_method(libcode, ['run_keyword', 'runKeyword']):
+ if _has_method(libcode, 'get_keyword_names', 'getKeywordNames'):
+ if _has_method(libcode, 'run_keyword', 'runKeyword'):
return DynamicLibrary(libcode, source, name, args, syslog)
else:
return HybridLibrary(libcode, source, name, args, syslog)
@@ -46,16 +47,12 @@
return JavaLibrary(libcode, source, name, args, syslog)
-def _has_method(code, names):
+def _has_method(code, *names):
for name in names:
- if hasattr(code, name) and _is_method(getattr(code, name)):
+ if hasattr(code, name) and callable(getattr(code, name)):
return True
return False
-def _is_method(code):
- return isinstance(code, types.MethodType) or \
- (utils.is_jython and 'reflectedfunction' in str(type(code)))
-
class _BaseTestLibrary(BaseLibrary):
@@ -72,7 +69,7 @@
self.doc = utils.get_doc(libcode)
self.scope = self._get_scope(libcode)
self._libcode = libcode
- self.init = self._get_init(libcode)
+ self.init = self._create_init_handler(libcode)
self._libinst = self.get_instance()
self.handlers = self._create_handlers(self._libinst, syslog)
self._init_scope_handling()
@@ -146,21 +143,12 @@
return self._libinst
def _get_instance(self):
- if self.init:
- self.init._check_arg_limits(self.args)
+ self.init._check_arg_limits(self.args)
try:
return self._libcode(*self.args)
except:
self._raise_creating_instance_failed()
- def _get_init(self, libinst):
- init = getattr(libinst, '__init__', None)
- if callable(init):
- return self._create_init_handler(init)
- else:
- return self._create_init_handler(None)
- return None
-
def _create_handlers(self, libinst, syslog):
success, failure, details = self._get_reporting_methods(syslog)
handlers = utils.NormalizedDict(ignore=['_'])
@@ -214,21 +202,19 @@
msg += "\n" + error_details
raise DataError(msg)
- def _create_init_handler(self, init_method):
- if self._is_java_method(init_method):
- return JavaInitHandler(self, init_method)
- return InitHandler(self, init_method)
+ def _create_init_handler(self, libcode):
+ init = getattr(libcode, '__init__', None)
+ if self._is_java_method(init):
+ return JavaInitHandler(self, init)
+ return PythonInitHandler(self, init)
def _is_java_method(self, method):
- if not utils.is_jython:
+ if not method or not utils.is_jython:
return False
try:
return 'reflectedfunction' in str(type(method.im_func))
except AttributeError:
- try:
- return 'reflectedconstructor' in str(type(method))
- except AttributeError:
- return False
+ return 'reflectedconstructor' in str(type(method))
class ModuleLibrary(_BaseTestLibrary):
@@ -237,10 +223,8 @@
return 'GLOBAL'
def get_instance(self):
+ self.init._check_arg_limits(self.args)
return self._libcode
-
- def _get_init(self, libinst):
- return None
def _create_handler(self, handler_name, handler_method):
return PythonHandler(self, handler_name, handler_method)
@@ -305,19 +289,13 @@
return DynamicHandler(self, handler_name, handler_method, doc,
argspec)
def _get_kw_doc(self, name):
- if self._get_keyword_documentation is not None:
- try:
- return self._get_keyword_documentation(self._libinst, name)
- except TypeError:
- pass
+ if self._get_keyword_documentation:
+ return self._get_keyword_documentation(self._libinst, name)
return ''
def _get_kw_argspec(self, name):
- if self._get_keyword_arguments is not None:
- try:
- return self._get_keyword_arguments(self._libinst, name)
- except TypeError:
- pass
+ if self._get_keyword_arguments:
+ return self._get_keyword_arguments(self._libinst, name)
return None
@@ -325,7 +303,3 @@
def _create_handler(self, handler_name, handler_method):
return JavaHandler(self, handler_name, handler_method)
-
- def _create_init_handler(self, init_method):
- return JavaInitHandler(self, init_method)
-