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)
-

Reply via email to