[z3-checkins] r41948 - in z3/deliverance/DeliveranceVHoster/trunk: dvhoster tests

ianb at codespeak.net ianb at codespeak.net
Sat Apr 7 00:08:14 CEST 2007


Author: ianb
Date: Sat Apr  7 00:08:13 2007
New Revision: 41948

Added:
   z3/deliverance/DeliveranceVHoster/trunk/dvhoster/logcreate.py   (contents, props changed)
Modified:
   z3/deliverance/DeliveranceVHoster/trunk/dvhoster/debuginterp.py
   z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py
   z3/deliverance/DeliveranceVHoster/trunk/tests/test_init_func.py
Log:
Added logging of error messages

Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/debuginterp.py
==============================================================================
--- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/debuginterp.py	(original)
+++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/debuginterp.py	Sat Apr  7 00:08:13 2007
@@ -2,6 +2,7 @@
 from lxml import etree
 from paste.request import construct_url
 from dvhoster import current_environ
+import re
 
 class Renderer(PyRenderer):
 
@@ -11,7 +12,6 @@
         error = super(PyRenderer, self).format_error(message, rule, elts)
         if error is None:
             return None 
-
         error_container = etree.Element('div')
         error_container.attrib['style'] = self.error_style
         environ = None
@@ -25,15 +25,14 @@
                 "No environment with dvhoster.remote_uri can be found, "
                 "which is unexpected")
             # But lets not actually keep the error message from working
-            assert 0
             return error
-        environ = current_environ._current_obj()
-        if not environ.get('dvhoster.has_errors'):
-            environ['dvhoster.has_errors'] = True
-            remote_uri = environ.get('dvhoster.remote_uri', '')
-            remote_uri += environ.get('PATH_INFO', '')
-            if environ.get('QUERY_STRING'):
-                remote_uri += '?' + environ['QUERY_STRING']
+        top_environ = current_environ._current_obj()
+        remote_uri = environ.get('dvhoster.remote_uri', '')
+        remote_uri += environ.get('PATH_INFO', '')
+        if environ.get('QUERY_STRING'):
+            remote_uri += '?' + environ['QUERY_STRING']
+        if not top_environ.get('dvhoster.has_errors'):
+            top_environ['dvhoster.has_errors'] = True
             link = etree.Element('a')
             link.attrib['href'] = remote_uri
             link.attrib['target'] = '_blank'
@@ -41,8 +40,36 @@
             container = etree.Element('div')
             container.append(link)
             error_container.append(container)
+        self.log_error(environ, error, remote_uri)
         error_container.append(error)
         return error_container
 
-            
-        
+    def log_error(self, environ, error, remote_uri):
+        logger = environ['dvhoster.logger']
+        cur_url = environ['dvhoster.original_url']
+        error = el_as_string(error)
+        error = '\n'.join(['  '+l for l in error.splitlines()])
+        logger.warn('Error in matching rule in URL %s content at %s:\n%s'
+                    % (cur_url, remote_uri, error))
+
+_space_re = re.compile(r'[ ][ ]+')
+
+def el_as_string(el):
+    s = []
+    _el_to_string(el, s)
+    s = ''.join(s)
+    s = s.replace('\t', '    ')
+    s = _space_re.sub(' ', s)
+    return s.strip()
+
+def _el_to_string(el, s):
+    if el.text:
+        s.append(el.text)
+    if el.tag == 'br':
+        s.append('\n')
+    for sub_el in el.getchildren():
+        _el_to_string(sub_el, s)
+        if sub_el.tail:
+            s.append(sub_el.tail)
+    if el.tag == 'a' and el.attrib.get('href'):
+        s.append(' (%s) ' % el.attrib['href'])

Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py
==============================================================================
--- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py	(original)
+++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py	Sat Apr  7 00:08:13 2007
@@ -14,6 +14,7 @@
 from dvhoster import current_environ
 from dvhoster.debuginterp import Renderer
 from dvhoster.util import load_func
+from dvhoster.logcreate import make_logger
 
 def norm_path(urlpath):
     if not urlpath:
@@ -54,6 +55,8 @@
             self.clean_environ_headers_regex = re.compile(app_conf['clean_environ_headers_regex'])
         else:
             self.clean_environ_headers_regex = None
+        logger = make_logger(app_conf.get('logger'), 'dvhoster')
+        self.logger = logger
 
     def __call__(self, environ, start_response):
         """
@@ -67,6 +70,8 @@
         environ['dvhoster.base_url'] = construct_url(
             environ, with_query_string=False,
             path_info='')
+        environ['dvhoster.original_url'] = construct_url(environ)
+        environ['dvhoster.logger'] = self.logger
         environ['PATH_INFO'] = path_info = norm_path(environ.get('PATH_INFO', ''))
         if path_info.startswith('/.deliverance'):
             path_info_pop(environ)

Added: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/logcreate.py
==============================================================================
--- (empty file)
+++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/logcreate.py	Sat Apr  7 00:08:13 2007
@@ -0,0 +1,28 @@
+import logging
+
+def make_logger(name, default_name):
+    if name is None:
+        name = default_name
+    setup_console = False
+    setup_file = None
+    if name == '-' or name.endswith('+stdout'):
+        if name.endswith('+stdout'):
+            name = name[:-len('+stdout')].strip()
+        else:
+            name = default_name
+        setup_console = True
+    if name.startswith('/'):
+        setup_file = name
+        name = default_name
+    logger = logging.getLogger(name)
+    if setup_console:
+        console = logging.StreamHandler()
+        console.setLevel(logging.DEBUG)
+        logger.addHandler(console)
+        logger.propagate = False
+    if setup_file:
+        file_log = logging.RotatingFileHandler(setup_file)
+        file_log.setLevel(logging.DEBUG)
+        logger.addHandler(file_log)
+        logger.propagate = False
+    return logger

Modified: z3/deliverance/DeliveranceVHoster/trunk/tests/test_init_func.py
==============================================================================
--- z3/deliverance/DeliveranceVHoster/trunk/tests/test_init_func.py	(original)
+++ z3/deliverance/DeliveranceVHoster/trunk/tests/test_init_func.py	Sat Apr  7 00:08:13 2007
@@ -24,7 +24,8 @@
                     should_theme_uri=example,
                     zope_location='http://localhost:8080',
                     default_theme_uri='http://openplans.org',
-                    data_dir=data_filename)
+                    data_dir=data_filename,
+                    logger='-')
 app = TestApp(wsgi_app)
 
 def test_init_domain():


More information about the z3-checkins mailing list