Author: janne.t.harkonen
Date: Tue Nov 25 05:53:40 2008
New Revision: 1103
Modified:
trunk/src/robot/running/handlers.py
trunk/src/robot/running/importer.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 05:53:40 2008
@@ -22,6 +22,28 @@
from runkwregister import RUN_KW_REGISTER
+def Handler(library, name, method):
+ if name == '__init__':
+ if _is_java_method(method):
+ return _JavaInitHandler(library, method)
+ else:
+ return _PythonInitHandler(library, method)
+ else:
+ if _is_java_method(method):
+ return _JavaHandler(library, name, method)
+ else:
+ return _PythonHandler(library, name, method)
+
+
+def _is_java_method(method):
+ if not method or not utils.is_jython:
+ return False
+ try:
+ return 'reflectedfunction' in str(type(method.im_func))
+ except AttributeError:
+ return 'reflectedconstructor' in str(type(method))
+
+
class _RunnableHandler(BaseHandler):
"""Base class for PythonHandler, JavaHandler and DynamicHandler"""
@@ -129,7 +151,7 @@
sys.stderr.write(stderr+'\n')
-class PythonHandler(_RunnableHandler):
+class _PythonHandler(_RunnableHandler):
def __init__(self, library, handler_name, handler_method):
_RunnableHandler.__init__(self, library, handler_name,
handler_method)
@@ -174,7 +196,7 @@
return args, defaults, varargs
-class JavaHandler(_RunnableHandler):
+class _JavaHandler(_RunnableHandler):
def __init__(self, library, handler_name, handler_method):
if not self._is_valid_handler(handler_method):
@@ -330,16 +352,16 @@
return "Test Library '%s'" % self.library.name
-class PythonInitHandler(_BaseInitHandler, PythonHandler):
+class _PythonInitHandler(_BaseInitHandler, _PythonHandler):
def __init__(self, library, handler_method):
- _BaseInitHandler.__init__(self, PythonHandler, library,
handler_method)
+ _BaseInitHandler.__init__(self, _PythonHandler, library,
handler_method)
-class JavaInitHandler(_BaseInitHandler, JavaHandler):
+class _JavaInitHandler(_BaseInitHandler, _JavaHandler):
def __init__(self, library, handler_method):
- _BaseInitHandler.__init__(self, JavaHandler, library,
handler_method)
+ _BaseInitHandler.__init__(self, _JavaHandler, library,
handler_method)
def _get_code_object(self, handler):
return handler
Modified: trunk/src/robot/running/importer.py
==============================================================================
--- trunk/src/robot/running/importer.py (original)
+++ trunk/src/robot/running/importer.py Tue Nov 25 05:53:40 2008
@@ -34,7 +34,7 @@
else:
lib = TestLibrary(name, args, syslog)
self._libraries[key] = lib
- libtype = lib.__class__.__name__.replace('Library', '').lower()
+ libtype =
lib.__class__.__name__.replace('Library', '').lower()[1:]
syslog.info("Imported library '%s' with arguments %s
(version %s, "
"%s type, %s scope, %d keywords, source %s)"
% (name, utils.seq2str2(args), lib.version,
libtype,
Modified: trunk/src/robot/running/testlibraries.py
==============================================================================
--- trunk/src/robot/running/testlibraries.py (original)
+++ trunk/src/robot/running/testlibraries.py Tue Nov 25 05:53:40 2008
@@ -21,37 +21,37 @@
from robot.common import BaseLibrary
from robot.output import SystemLogger
-from handlers import PythonHandler, JavaHandler, DynamicHandler, \
- PythonInitHandler, JavaInitHandler
+from handlers import Handler, DynamicHandler
def TestLibrary(name, args=None, syslog=None):
if syslog is None:
syslog = SystemLogger()
libcode, source = utils.import_(name)
- args = utils.to_list(args)
+ libclass = _get_lib_class(libcode)
+ return libclass(libcode, source, name, utils.to_list(args), syslog)
+
+
+def _get_lib_class(libcode):
if isinstance(libcode, types.ModuleType):
- if args:
- 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'):
- return DynamicLibrary(libcode, source, name, args, syslog)
+ return _ModuleLibrary
+ if _get_dynamic_method(libcode, 'get_keyword_names'):
+ if _get_dynamic_method(libcode, 'run_keyword'):
+ return _DynamicLibrary
else:
- return HybridLibrary(libcode, source, name, args, syslog)
- # Using type check and not isinstance for ClassType, because it does
not
- # match Java classes whose type is javaclass.
- if type(libcode) is types.ClassType or isinstance(libcode,
types.TypeType):
- return PythonLibrary(libcode, source, name, args, syslog)
- return JavaLibrary(libcode, source, name, args, syslog)
-
+ return _HybridLibrary
+ return _ClassLibrary
-def _has_method(code, *names):
- for name in names:
- if hasattr(code, name) and callable(getattr(code, name)):
- return True
- return False
+def _get_dynamic_method(code, underscore_name):
+ tokens = underscore_name.split('_')
+ tokens = [tokens[0]] + [ t.capitalize() for t in tokens[1:] ]
+ camelCaseName = ''.join(tokens)
+ for name in underscore_name, camelCaseName:
+ if hasattr(code, name):
+ method = getattr(code, name)
+ if callable(method):
+ return method
+ return None
class _BaseTestLibrary(BaseLibrary):
@@ -74,25 +74,6 @@
self.handlers = self._create_handlers(self._libinst, syslog)
self._init_scope_handling()
- def _get_version(self, code):
- try:
- return str(code.ROBOT_LIBRARY_VERSION)
- except AttributeError:
- try:
- return str(code.__version__)
- except AttributeError:
- return '<unknown>'
-
- def _init_scope_handling(self):
- if self.scope == 'GLOBAL':
- return
- self._libinst = None
- self.start_suite = self._caching_start
- self.end_suite = self._restoring_end
- if self.scope == 'TESTCASE':
- self.start_test = self._caching_start
- self.end_test = self._restoring_end
-
def copy(self, name):
lib = _BaseTestLibrary(None, self.version, name, self.args, None)
lib.orig_name = self.name
@@ -119,6 +100,29 @@
def end_test(self):
pass
+ def _get_version(self, code):
+ try:
+ return str(code.ROBOT_LIBRARY_VERSION)
+ except AttributeError:
+ try:
+ return str(code.__version__)
+ except AttributeError:
+ return '<unknown>'
+
+ def _create_init_handler(self, libcode):
+ init_method = getattr(libcode, '__init__', None)
+ return Handler(self, '__init__', init_method)
+
+ def _init_scope_handling(self):
+ if self.scope == 'GLOBAL':
+ return
+ self._libinst = None
+ self.start_suite = self._caching_start
+ self.end_suite = self._restoring_end
+ if self.scope == 'TESTCASE':
+ self.start_test = self._caching_start
+ self.end_test = self._restoring_end
+
def _caching_start(self):
self._instance_cache.append(self._libinst)
self._libinst = None
@@ -188,36 +192,26 @@
if not isinstance(method, (types.MethodType, types.FunctionType)):
raise TypeError('Not a method or function')
return method
-
+
+ def _create_handler(self, handler_name, handler_method):
+ return Handler(self, handler_name, handler_method)
+
def _raise_creating_instance_failed(self):
- error_msg, error_details = utils.get_error_details()
- msg = "Creating an instance of the test library '%s' " % self.name
- if len(self.args) == 0:
- msg += "with no arguments "
- elif len(self.args) == 1:
- msg += "with argument '%s' " % self.args[0]
+ msg, details = utils.get_error_details()
+ if self.args:
+ args = "argument%s %s" % (utils.plural_or_not(self.args),
+ utils.seq2str(self.args))
else:
- msg += "with arguments %s " % utils.seq2str(self.args)
- msg += "failed: " + error_msg
- msg += "\n" + error_details
- raise DataError(msg)
+ args = "no arguments"
+ raise DataError("Creating an instance of the test library '%s'
with %s "
+ "failed: %s\n%s" % (self.name, args, msg, details))
- 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 method or not utils.is_jython:
- return False
- try:
- return 'reflectedfunction' in str(type(method.im_func))
- except AttributeError:
- return 'reflectedconstructor' in str(type(method))
+
+class _ClassLibrary(_BaseTestLibrary):
+ pass
-class ModuleLibrary(_BaseTestLibrary):
+class _ModuleLibrary(_BaseTestLibrary):
def _get_scope(self, libcode):
return 'GLOBAL'
@@ -225,20 +219,9 @@
def get_instance(self):
self.init.check_arg_limits(self.args)
return self._libcode
-
- def _create_handler(self, handler_name, handler_method):
- return PythonHandler(self, handler_name, handler_method)
-
-
-class PythonLibrary(_BaseTestLibrary):
-
- def _create_handler(self, handler_name, handler_method):
- if self._is_java_method(handler_method):
- return JavaHandler(self, handler_name, handler_method)
- return PythonHandler(self, handler_name, handler_method)
-class HybridLibrary(PythonLibrary):
+class _HybridLibrary(_BaseTestLibrary):
def _get_handler_names(self, instance):
try:
@@ -253,23 +236,12 @@
return syslog.debug, syslog.warn, syslog.info
-class DynamicLibrary(_BaseTestLibrary):
-
- _get_kw_doc_names =
['get_keyword_documentation', 'getKeywordDocumentation']
- _get_kw_args_names = ['get_keyword_arguments', 'getKeywordArguments']
+class _DynamicLibrary(_BaseTestLibrary):
def __init__(self, libcode, source, name, args, syslog):
- self._get_keyword_documentation = self._get_method(libcode,
*self._get_kw_doc_names)
- self._get_keyword_arguments = self._get_method(libcode,
*self._get_kw_args_names)
+ self._get_kw_doc =
_get_dynamic_method(libcode, 'get_keyword_documentation')
+ self._get_kw_args =
_get_dynamic_method(libcode, 'get_keyword_arguments')
_BaseTestLibrary.__init__(self, libcode, source, name, args,
syslog)
-
- def _get_method(self, libcode, *names):
- for name in names:
- if hasattr(libcode, name):
- method = getattr(libcode, name)
- if callable(method):
- return method
- return None
def _get_handler_names(self, instance):
try:
@@ -284,22 +256,12 @@
return instance.runKeyword
def _create_handler(self, handler_name, handler_method):
- doc = self._get_kw_doc(handler_name)
- argspec = self._get_kw_argspec(handler_name)
+ if self._get_kw_doc:
+ doc = self._get_kw_doc(self._libinst, handler_name)
+ else:
+ doc = ''
+ if self._get_kw_args:
+ argspec = self._get_kw_args(self._libinst, handler_name)
+ else:
+ argspec = None
return DynamicHandler(self, handler_name, handler_method, doc,
argspec)
-
- def _get_kw_doc(self, name):
- 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:
- return self._get_keyword_arguments(self._libinst, name)
- return None
-
-
-class JavaLibrary(_BaseTestLibrary):
-
- def _create_handler(self, handler_name, handler_method):
- return JavaHandler(self, handler_name, handler_method)