[Checkins] SVN: grokcore.view/trunk/ Merge changes from ulif-logwarnings back into trunk.

Uli Fouquet uli at gnufix.de
Fri May 21 08:12:01 EDT 2010


Log message for revision 112605:
  Merge changes from ulif-logwarnings back into trunk.

Changed:
  U   grokcore.view/trunk/CHANGES.txt
  U   grokcore.view/trunk/src/grokcore/view/templatereg.py
  U   grokcore.view/trunk/src/grokcore/view/tests/view/dirtemplatesonly.py
  U   grokcore.view/trunk/src/grokcore/view/tests/view/inline_unassociated.py
  U   grokcore.view/trunk/src/grokcore/view/tests/view/shared_template_dir.py
  U   grokcore.view/trunk/src/grokcore/view/tests/view/unassociated.py
  A   grokcore.view/trunk/src/grokcore/view/tests/view/warning_msgs.py

-=-
Modified: grokcore.view/trunk/CHANGES.txt
===================================================================
--- grokcore.view/trunk/CHANGES.txt	2010-05-21 12:08:35 UTC (rev 112604)
+++ grokcore.view/trunk/CHANGES.txt	2010-05-21 12:12:00 UTC (rev 112605)
@@ -23,6 +23,19 @@
 
 - Test fix: support windows paths.
 
+- Warnings are now emitted as log messages with level
+  `logging.WARNING` to a logger named ``grokcore.view`` with level
+  `logging.ERROR`.
+
+  That means that by default no warnings are emitted anymore (while
+  errors will still appear).
+
+  To get the warnings back, reduce the level of logger
+  ``grokcore.view`` to `logging.WARNING` or lower. This can be done in
+  Python or via a logging conf file, for instance in the .ini files of
+  regular grokprojects. See the Python standard lib `logging` module
+  for details.
+
 1.12.1 (2009-09-17)
 -------------------
 

Modified: grokcore.view/trunk/src/grokcore/view/templatereg.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/templatereg.py	2010-05-21 12:08:35 UTC (rev 112604)
+++ grokcore.view/trunk/src/grokcore/view/templatereg.py	2010-05-21 12:12:00 UTC (rev 112605)
@@ -13,8 +13,8 @@
 ##############################################################################
 """Template registry
 """
+import logging
 import os
-import warnings
 import zope.component
 import grokcore.component
 import grokcore.view
@@ -22,7 +22,29 @@
 from grokcore.view.interfaces import ITemplateFileFactory, ITemplate
 from grokcore.view.components import PageTemplate
 
+def get_logger():
+    """Setup a 'grokcore.view' logger if none is already defined.
 
+    Return the defined one else.
+
+    We set the logger level to ``logging.ERROR``, which means that by
+    default warning messages will not be displayed.
+
+    Logger level is only set, if that not already happened
+    before. This way third-party components can determine the logging
+    options before grokking packages.
+    """
+    logger = logging.getLogger('grokcore.view')
+    if len(logger.handlers) > 0:
+        return logger
+    if logger.level == logging.NOTSET:
+        logger.setLevel(logging.ERROR)
+    handler = logging.StreamHandler()
+    formatter = logging.Formatter("%(levelname)s: %(message)s")
+    handler.setFormatter(formatter)
+    logger.addHandler(handler)
+    return logger
+
 class TemplateRegistry(object):
 
     def __init__(self):
@@ -71,9 +93,11 @@
                 # Warning when importing files. This should be
                 # allowed because people may be using editors that generate
                 # '.bak' files and such.
-                warnings.warn("File '%s' has an unrecognized extension in "
-                              "directory '%s'" %
-                              (template_file, template_dir), UserWarning, 2)
+                logger = get_logger()
+                msg = ("File '%s' has an unrecognized extension in "
+                       "directory '%s'" %
+                       (template_file, template_dir))
+                logger.warn(msg)
                 continue
 
             inline_template = self.get(template_name)
@@ -104,7 +128,8 @@
                 "grokking %r: %s.  Define view classes inheriting "
                 "from grok.View to enable the template(s)." % (
                 module_info.dotted_name, ', '.join(unassociated)))
-            warnings.warn(msg, UserWarning, 1)
+            logger = get_logger()
+            logger.warn(msg)
 
     def checkTemplates(self, module_info, factory, component_name,
                        has_render, has_no_render):

Modified: grokcore.view/trunk/src/grokcore/view/tests/view/dirtemplatesonly.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/dirtemplatesonly.py	2010-05-21 12:08:35 UTC (rev 112604)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/dirtemplatesonly.py	2010-05-21 12:12:00 UTC (rev 112605)
@@ -1,15 +1,15 @@
 """
 A template directory may only contain recognized template files::
 
-  >>> from grokcore.view.testing import warn, lastwarning
-  >>> import warnings
-  >>> saved_warn = warnings.warn
-  >>> warnings.warn = warn
+  >>> from zope.testing.loggingsupport import InstalledHandler
+  >>> handler = InstalledHandler('grokcore.view')
+  >>> handler.clear()
 
   >>> grok.testing.grok(__name__)
-  From grok.testing's warn():
-  ... UserWarning: File 'invalid.txt' has an unrecognized extension in
-  directory '...dirtemplatesonly_templates'...
+  >>> print handler
+  grokcore.view WARNING
+      File 'invalid.txt' has an unrecognized extension in directory
+      '...dirtemplatesonly_templates'
 
 Files ending with '.cache' are generated on the fly by some template
 engines. Although they provide no valid template filename extension,
@@ -18,15 +18,16 @@
 There is a 'template' ``ignored.cache`` in our template dir, which
 emits no warning::
 
-  >>> 'ignored.cache' in lastwarning
+  >>> #'ignored.cache' in lastwarning
+  >>> 'ignored.cache' in handler.records[0].msg
   False
 
 The same applies to files and directories ending with '~' or starting
 with a dot ('.').
 
-Restore the warning machinery::
+Restore the logging machinery::
 
-  >>> warnings.warn = saved_warn
+  >>> handler.uninstall()
 
 """
 import grokcore.view as grok

Modified: grokcore.view/trunk/src/grokcore/view/tests/view/inline_unassociated.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/inline_unassociated.py	2010-05-21 12:08:35 UTC (rev 112604)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/inline_unassociated.py	2010-05-21 12:12:00 UTC (rev 112605)
@@ -1,20 +1,23 @@
 """
 Inline templates that are not associated with a view class will
-provoke an error:
+provoke a log message on warning level to ``grokcore.view`` logger:
 
-  >>> from grokcore.view.testing import warn
-  >>> import warnings
-  >>> saved_warn = warnings.warn
-  >>> warnings.warn = warn
+  >>> from zope.testing.loggingsupport import InstalledHandler
+  >>> handler = InstalledHandler('grokcore.view')
+  >>> handler.clear() # Make sure there are no old msgs stored...
 
   >>> grok.testing.grok(__name__)
-  From grok.testing's warn():
-  ...UserWarning: Found the following unassociated template(s) when grokking
-  'grokcore.view.tests.view.inline_unassociated': club. Define view classes inheriting
-  from grok.View to enable the template(s)...
+  >>> print handler
+  grokcore.view WARNING
+      Found the following unassociated template(s) when grokking
+      'grokcore.view.tests.view.inline_unassociated': club.  Define
+      view classes inheriting from grok.View to enable the
+      template(s).
 
-  >>> warnings.warn = saved_warn
+Restore logging machinery:
 
+  >>> handler.uninstall()
+
 """
 import grokcore.view as grok
 

Modified: grokcore.view/trunk/src/grokcore/view/tests/view/shared_template_dir.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/shared_template_dir.py	2010-05-21 12:08:35 UTC (rev 112604)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/shared_template_dir.py	2010-05-21 12:12:00 UTC (rev 112605)
@@ -1,25 +1,33 @@
 """
-When modules share a template directory, templates that have not been associated with any view class of a given module issue a UserWarning:
+When modules share a template directory, templates that have not been
+associated with any view class of a given module issue a log message
+with level ``logging.WARNING`` to a ``grokcore.view`` logger:
 
-  >>> from grokcore.view.testing import warn
-  >>> import warnings
-  >>> saved_warn = warnings.warn
-  >>> warnings.warn = warn
+  >>> from zope.testing.loggingsupport import InstalledHandler
+  >>> handler = InstalledHandler('grokcore.view')
 
   >>> import shared_template_dir_fixture
 
+  >>> handler.clear()  # Make sure no old log msgs are stored...
   >>> grok.testing.grok(__name__)
-  From grok.testing's warn():
-  ...UserWarning: Found the following unassociated template(s) when grokking
-  'grokcore.view.tests.view.shared_template_dir': food, unassociated.  Define view classes inheriting from
-  grok.View to enable the template(s)...
-
+  >>> print handler
+  grokcore.view WARNING
+      Found the following unassociated template(s) when grokking
+      'grokcore.view.tests.view.shared_template_dir': food,
+      unassociated.  Define view classes inheriting from grok.View to
+      enable the template(s).
+  
+  >>> handler.clear()  # Make sure no old log msgs are stored...
   >>> grok.testing.grok(shared_template_dir_fixture.__name__)
-  From grok.testing's warn():
-  ...UserWarning: Found the following unassociated template(s) when grokking
-  'grokcore.view.tests.view.shared_template_dir_fixture': cavepainting, unassociated.  Define view classes inheriting from
-  grok.View to enable the template(s)...
+  >>> print handler
+  grokcore.view WARNING
+        Found the following unassociated template(s) when grokking
+      'grokcore.view.tests.view.shared_template_dir_fixture':
+      cavepainting, unassociated.  Define view classes inheriting from
+      grok.View to enable the template(s).
 
+  >>> handler.uninstall()
+
 """
 import grokcore.view as grok
 

Modified: grokcore.view/trunk/src/grokcore/view/tests/view/unassociated.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/unassociated.py	2010-05-21 12:08:35 UTC (rev 112604)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/unassociated.py	2010-05-21 12:12:00 UTC (rev 112605)
@@ -2,29 +2,33 @@
 Templates that are not associated with a view class will provoke an
 error:
 
-  >>> from grokcore.view.testing import warn
-  >>> import warnings
-  >>> saved_warn = warnings.warn
-  >>> warnings.warn = warn
+  >>> from zope.testing.loggingsupport import InstalledHandler
+  >>> handler = InstalledHandler('grokcore.view')
 
   >>> grok.testing.grok(__name__)
-  From grok.testing's warn():
-  ...UserWarning: Found the following unassociated template(s) when grokking
-  'grokcore.view.tests.view.unassociated': index.  Define view classes inheriting from
-  grok.View to enable the template(s)...
+  >>> print handler
+  grokcore.view WARNING
+      Found the following unassociated template(s) when grokking
+      'grokcore.view.tests.view.unassociated': index.  Define view
+      classes inheriting from grok.View to enable the template(s).
 
 Also templates of modules named equally as the package name the module
 resides in, should be found without error or warning. We check this
 with the local package `modequalspkgname`::
 
-  >>> warnings.warn = warn
+  >>> handler.clear() # Make sure no old log msgs are stored...
 
   >>> pkg = __name__.rsplit('.', 1)[0] + '.modequalspkgname'
   >>> grok.testing.grok(pkg) is None
   True
 
-  >>> warnings.warn = saved_warn
+No log messages were emitted:
 
+  >>> handler.records
+  []
+
+  >>> handler.uninstall()
+
 """
 import grokcore.view as grok
 

Copied: grokcore.view/trunk/src/grokcore/view/tests/view/warning_msgs.py (from rev 112604, grokcore.view/branches/ulif-logwarnings/src/grokcore/view/tests/view/warning_msgs.py)
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/view/warning_msgs.py	                        (rev 0)
+++ grokcore.view/trunk/src/grokcore/view/tests/view/warning_msgs.py	2010-05-21 12:12:00 UTC (rev 112605)
@@ -0,0 +1,54 @@
+"""
+Warnings are sent on ``logging.WARNING`` level to a logger named
+``grokcore.view``. By default this messages will not be displayed, as
+the logger level is set to ``logging.ERROR`` immediately before the
+first warning happens (so apps have time to prepare the logger if they
+want to do so).
+
+The logger is initialized immediately before the first warning
+happens:
+
+  >>> import logging
+  >>> logger = logging.getLogger('grokcore.view')
+  >>> logger.level == logging.NOTSET
+  True
+
+  >>> grok.testing.grok(__name__)
+  >>> logger.level == logging.ERROR
+  True
+  
+If we set our own logging handler or tweak the logger level, this
+won't be overridden when the next warning happens:
+
+  >>> logger.level = logging.CRITICAL
+  >>> grok.testing.grok(__name__)
+  >>> logger.level == logging.CRITICAL
+  True
+
+The logger really gets messages:
+
+  >>> from zope.testing.loggingsupport import InstalledHandler
+  >>> handler = InstalledHandler('grokcore.view')
+  >>> handler.clear() # Make sure there are no old msgs stored...
+
+  >>> grok.testing.grok(__name__)
+  >>> print handler
+  grokcore.view WARNING
+      Found the following unassociated template(s) when grokking
+      'grokcore.view.tests.view.warning_msgs': club.  Define view
+      classes inheriting from grok.View to enable the template(s).
+
+Restore logging machinery:
+
+  >>> handler.uninstall()
+  >>> logger.level = logging.ERROR
+
+"""
+import grokcore.view as grok
+
+class Mammoth(grok.Context):
+    pass
+
+club = grok.PageTemplate("""\
+<html><body><h1>GROK CLUB MAMMOTH!</h1></body></html>
+""")



More information about the checkins mailing list