CVS: Products/Basket - __init__.py:1.15

Chris McDonough <[email protected]>
Newsgroups gmane.comp.web.zope.public-cvs
Message-ID <[email protected]>
Update of /cvs-repository/Products/Basket
In directory cvs.zope.org:/tmp/cvs-serv30091

Modified Files:
	__init__.py 
Log Message:
Wrap the initializer import in a function which catches errors (emulating Zope's current behavior when a product can't be imported).  Condition exception raising on debug-mode.



=== Products/Basket/__init__.py 1.14 => 1.15 ===
--- Products/Basket/__init__.py:1.14	Wed Nov  9 14:39:24 2005
+++ Products/Basket/__init__.py	Wed Nov  9 16:45:45 2005
@@ -1,8 +1,12 @@
 import sys
 import os
 import pkg_resources
-from utils import EggProductContext
-from utils import EggProduct
+import traceback
+
+from Products.Basket.utils import EggProductContext
+from Products.Basket.utils import EggProduct
+import zLOG
+import App
 
 entrypoint_group = 'zope2.initialize'
 
@@ -25,6 +29,9 @@
     def initialize(self, context):
         context.registerClass(EggProduct, constructors = (('dummy',None),),
                               visibility=None, icon='icon_egg.gif')
+        app = context._ProductContext__app
+        debug_mode = App.config.getConfiguration().debug_mode
+
         if not self.pre_initialized:
             try:
                 home = INSTANCE_HOME
@@ -33,23 +40,22 @@
                 etc = ''
             pdist_fname = os.path.join(etc, 'PRODUCT_DISTRIBUTIONS.txt')
             self.preinitialize(pdist_fname)
+
         data = []
         points = pkg_resources.iter_entry_points(entrypoint_group)
         # Grab app from Zope product context
         # It's a "protected" attribute, hence the name mangling
-        app = context._ProductContext__app
         meta_types = []
         for point in points:
             # XXX deal with duplicate product names by raising an exception
             # somewhere in here.
-            # XXX test by creating a broken product and see what happens
             product_pkg = get_containing_package(point.module_name)
             productname = product_pkg.__name__.split('.')[-1]
-            initializer = point.load()
+            initializer = get_initializer(point, productname, debug_mode)
             context = EggProductContext(productname, initializer, app,
                                         product_pkg)
             # XXX debug mode conditions raise_exc, log_exc
-            returned = context.install()
+            returned = context.install(debug_mode)
             data.append(returned)
         return data
 
@@ -94,6 +100,23 @@
     if new == module_name:
         return None
     return get_containing_package(new)
+
+def get_initializer(point, productname, debug_mode):
+    initializer = None
+    try:
+        # this will raise an import error if the initializer can't
+        # be imported (presumably because of a module-scope error)
+        initializer = point.load()
+    except:
+        exc = sys.exc_info()
+        zLOG.LOG('Zope', zLOG.ERROR, 'Could not import %s' % productname,
+                 error=exc)
+        f = StringIO()
+        traceback.print_exc(100, f)
+        product_pkg.__import_error__ = f.getvalue()
+        if debug_mode:
+            raise exc[0], exc[1], exc[2]
+    return initializer
 
 basket = Basket()
 initialize = basket.initialize

_______________________________________________
Zope-CVS maillist  -  [email protected]
http://mail.zope.org/mailman/listinfo/zope-cvs

Zope CVS instructions: http://dev.zope.org/CVS
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.