Revision: 3698
Author: pekka.klarck
Date: Mon May 31 15:09:54 2010
Log: cleanup while investigating the possibility to log from listeners (issue 548)
http://code.google.com/p/robotframework/source/detail?r=3698

Modified:
 /trunk/src/robot/output/listeners.py
 /trunk/src/robot/output/logger.py
 /trunk/src/robot/output/loggerhelper.py

=======================================
--- /trunk/src/robot/output/listeners.py        Mon May 31 05:21:54 2010
+++ /trunk/src/robot/output/listeners.py        Mon May 31 15:09:54 2010
@@ -26,7 +26,6 @@


 class Listeners:
-
     _start_attrs = ['doc', 'starttime', 'longname']
_end_attrs = _start_attrs + ['endtime', 'elapsedtime', 'status', 'message']

@@ -34,7 +33,7 @@
         self._listeners = self._import_listeners(listeners)

     def __nonzero__(self):
-        return len(self._listeners) > 0
+        return bool(self._listeners)

     def _import_listeners(self, listener_data):
         listeners = []
@@ -55,9 +54,9 @@
             if li.version == 1:
                 li.call_method(li.start_suite, suite.name, suite.doc)
             else:
-                attrs = self._get_start_attrs(suite, ['metadata'])
-                attrs.update({'tests' : [ t.name for t in suite.tests ],
-                              'suites': [ s.name for s in suite.suites],
+                attrs = self._get_start_attrs(suite, 'metadata')
+                attrs.update({'tests' : [t.name for t in suite.tests ],
+                              'suites': [s.name for s in suite.suites],
                               'totaltests': suite.get_test_count()})
                 li.call_method(li.start_suite, suite.name, attrs)

@@ -67,8 +66,8 @@
                 li.call_method(li.end_suite, suite.status,
                                suite.get_full_message())
             else:
-                attrs = self._get_end_attrs(suite, [],
- {'statistics': 'get_stat_message'})
+                attrs = self._get_end_attrs(suite)
+                attrs.update({'statistics': suite.get_stat_message()})
                 li.call_method(li.end_suite, suite.name, attrs)

     def start_test(self, test):
@@ -76,7 +75,7 @@
             if li.version == 1:
li.call_method(li.start_test, test.name, test.doc, test.tags)
             else:
-                attrs = self._get_start_attrs(test, ['tags'])
+                attrs = self._get_start_attrs(test, 'tags')
                 li.call_method(li.start_test, test.name, attrs)

     def end_test(self, test):
@@ -84,7 +83,7 @@
             if li.version == 1:
                 li.call_method(li.end_test, test.status, test.message)
             else:
-                attrs = self._get_end_attrs(test, ['tags'])
+                attrs = self._get_end_attrs(test, 'tags')
                 li.call_method(li.end_test, test.name, attrs)

     def start_keyword(self, kw):
@@ -92,7 +91,7 @@
             if li.version == 1:
                 li.call_method(li.start_keyword, kw.name, kw.args)
             else:
-                attrs = self._get_start_attrs(kw, ['args', '-longname'])
+                attrs = self._get_start_attrs(kw, 'args', '-longname')
                 li.call_method(li.start_keyword, kw.name, attrs)

     def end_keyword(self, kw):
@@ -100,7 +99,7 @@
             if li.version == 1:
                 li.call_method(li.end_keyword, kw.status)
             else:
- attrs = self._get_end_attrs(kw, ['args', '-longname', '-message']) + attrs = self._get_end_attrs(kw, 'args', '-longname', '-message')
                 li.call_method(li.end_keyword, kw.name, attrs)

     def log_message(self, msg):
@@ -114,9 +113,8 @@
                 li.call_method(li.message, self._create_msg_dict(msg))

     def _create_msg_dict(self, msg):
-        return {'message': msg.message, 'level': msg.level,
-                'timestamp': msg.timestamp,
-                'html': msg.html and 'yes' or 'no'}
+        return {'timestamp': msg.timestamp, 'message': msg.message,
+                'level': msg.level, 'html': 'yes' if msg.html else 'no'}

     def output_file(self, name, path):
         for li in self._listeners:
@@ -126,36 +124,35 @@
         for li in self._listeners:
             li.call_method(li.close)

-    def _get_start_attrs(self, item, names, mapping=None):
-        return self._get_attrs(item, self._start_attrs, names, mapping)
-
-    def _get_end_attrs(self, item, names, mapping=None):
-        return self._get_attrs(item, self._end_attrs, names, mapping)
-
-    def _get_attrs(self, item, defaults, extras, mapping=None):
-        names = defaults[:]
+    def _get_start_attrs(self, item, *names):
+        return self._get_attrs(item, self._start_attrs, names)
+
+    def _get_end_attrs(self, item, *names):
+        return self._get_attrs(item, self._end_attrs, names)
+
+    def _get_attrs(self, item, defaults, extras):
+        names = self._get_attr_names(defaults, extras)
+        return dict((n, self._get_attr_value(item, n)) for n in names)
+
+    def _get_attr_names(self, defaults, extras):
+        names = list(defaults)
         for name in extras:
             if name.startswith('-'):
                 names.remove(name[1:])
             else:
                 names.append(name)
-        if not mapping:
-            mapping = {}
-        mapping.update(dict([(n, n) for n in names]))
-        attrs = {}
-        for name, attr in mapping.items():
-            attrs[name] = self._get_attr_value(item, attr)
-        return attrs
-
-    def _get_attr_value(self, item, attr_name):
-        attr = getattr(item, attr_name)
-        if callable(attr):
-            attr = attr()
-        if isinstance(attr, (utils.NormalizedDict, dict)):
-            attr = dict(attr)
-        if isinstance(attr, list):
-            attr = list(attr)
-        return attr
+        return names
+
+    def _get_attr_value(self, item, name):
+        value = getattr(item, name)
+        return self._take_copy_of_mutable_value(value)
+
+    def _take_copy_of_mutable_value(self, value):
+        if isinstance(value, (dict, utils.NormalizedDict)):
+            return dict(value)
+        if isinstance(value, list):
+            return list(value)
+        return value


 class _ListenerProxy(AbstractLoggerProxy):
@@ -189,7 +186,7 @@

     def call_method(self, method, *args):
         if self.is_java:
-            args = [ self._convert_possible_dict_to_map(a) for a in args ]
+ args = [self._to_map(a) if isinstance(a, dict) else a for a in args]
         try:
             method(*args)
         except:
@@ -198,15 +195,8 @@
                          % (method.__name__, self.name, message))
             LOGGER.info("Details:\n%s" % details)

-    def _convert_possible_dict_to_map(self, arg):
-        if isinstance(arg, dict):
-            return self._dict2map(arg)
-        return arg
-
-    def _dict2map(self, dictionary):
-        if not utils.is_jython:
-            return dictionary
+    def _to_map(self, dictionary):
         map = HashMap()
-        for key, value in dictionary.items():
+        for key, value in dictionary.iteritems():
             map.put(key, value)
         return map
=======================================
--- /trunk/src/robot/output/logger.py   Mon May 31 05:21:54 2010
+++ /trunk/src/robot/output/logger.py   Mon May 31 15:09:54 2010
@@ -56,14 +56,13 @@
                     logger.message(msg)

     def _register_logger(self, log):
-        logger = _LoggerProxy(log)
-        self._loggers.append(logger)
-        return logger
+        self._loggers.append(_LoggerProxy(log))
+        return self._loggers[-1]

     def unregister_logger(self, *loggers):
         for log in loggers:
-            self._loggers = [ proxy for proxy in self._loggers
-                              if proxy.logger is not log ]
+            self._loggers = [proxy for proxy in self._loggers
+                             if proxy.logger is not log]

     def register_console_logger(self, width=78, colors=True):
         self.disable_automatic_console_logger()
=======================================
--- /trunk/src/robot/output/loggerhelper.py     Mon May 31 05:21:54 2010
+++ /trunk/src/robot/output/loggerhelper.py     Mon May 31 15:09:54 2010
@@ -63,7 +63,7 @@

 class Message:

-    def __init__(self, message, level, html=False):
+    def __init__(self, message, level='INFO', html=False):
         self.timestamp = utils.get_timestamp(daysep='', daytimesep=' ',
                                              timesep=':', millissep='.')
         self.level, self.html = self._get_level_and_html(level, html)

Reply via email to