[z3-checkins] r22067 - z3/Five/branch/rocky-products-less-product-loading

rocky at codespeak.net rocky at codespeak.net
Thu Jan 12 19:46:15 CET 2006


Author: rocky
Date: Thu Jan 12 19:43:34 2006
New Revision: 22067

Modified:
   z3/Five/branch/rocky-products-less-product-loading/   (props changed)
   z3/Five/branch/rocky-products-less-product-loading/__init__.py
   z3/Five/branch/rocky-products-less-product-loading/fivedirectives.py
   z3/Five/branch/rocky-products-less-product-loading/meta.zcml
   z3/Five/branch/rocky-products-less-product-loading/pythonproducts.py
Log:
Added a new five directive, 'registerProduct' that takes a package attribute and registers any given python package as a zope2 product.


Modified: z3/Five/branch/rocky-products-less-product-loading/__init__.py
==============================================================================
--- z3/Five/branch/rocky-products-less-product-loading/__init__.py	(original)
+++ z3/Five/branch/rocky-products-less-product-loading/__init__.py	Thu Jan 12 19:43:34 2006
@@ -19,6 +19,7 @@
 from Globals import INSTANCE_HOME
 
 import zcml
+import pythonproducts
 
 # public API provided by Five
 # usage: from Products.Five import <something>
@@ -26,4 +27,6 @@
 from skin.standardmacros import StandardMacros
 
 def initialize(context):
+    pythonproducts.setup_python_products(context)
+
     zcml.load_site()

Modified: z3/Five/branch/rocky-products-less-product-loading/fivedirectives.py
==============================================================================
--- z3/Five/branch/rocky-products-less-product-loading/fivedirectives.py	(original)
+++ z3/Five/branch/rocky-products-less-product-loading/fivedirectives.py	Thu Jan 12 19:43:34 2006
@@ -178,3 +178,10 @@
                     u'installed Product. If the file does not exist, for a '
                     u'particular product, no error is raised.',
         required=False)
+
+class IRegisterProductDirective(Interface):
+
+    package = GlobalObject(
+        title=u"Target package",
+        required=True
+        )

Modified: z3/Five/branch/rocky-products-less-product-loading/meta.zcml
==============================================================================
--- z3/Five/branch/rocky-products-less-product-loading/meta.zcml	(original)
+++ z3/Five/branch/rocky-products-less-product-loading/meta.zcml	Thu Jan 12 19:43:34 2006
@@ -157,6 +157,12 @@
        handler=".fiveconfigure.registerClass"
        />
 
+    <meta:directive
+       name="registerProduct"
+       schema=".fivedirectives.IRegisterProductDirective"
+       handler=".pythonproducts.registerProduct"
+       />
+
   </meta:directives>
 
   <meta:directive

Modified: z3/Five/branch/rocky-products-less-product-loading/pythonproducts.py
==============================================================================
--- z3/Five/branch/rocky-products-less-product-loading/pythonproducts.py	(original)
+++ z3/Five/branch/rocky-products-less-product-loading/pythonproducts.py	Thu Jan 12 19:43:34 2006
@@ -17,18 +17,68 @@
 $Id$
 """
 __author__ = "Rocky Burt"
-__all__ = ('setup_python_products',)
+__all__ = ('setup_python_products', 'register_python_product')
 
 import Products
 import os
+import types
 from types import ModuleType
 
+_zope_app = None
+
+def registerProduct(_context, package):
+    """ZCML directive function for registering a python package product
+    """
+    
+    _context.action(
+        discriminator = ('registerProduct',),
+        callable = register_python_product,
+        args = (package,)
+        )
+
+
+def register_python_product(package):
+    """Registers the given python package as a Zope 2 style product
+    """
+    
+    if isinstance(package, basestring):
+        module_ = __import__(package)
+    elif isinstance(package, types.ModuleType):
+        module_ = package
+    else:
+        raise TypeError("The package argument must either be an instance of " \
+                        +"basestring or types.ModuleType")
+
+    if not hasattr(module_, 'initialize'):
+        raise ValueError("The module '%s' requires a Zope 2 style " \
+                         +"initialize function" % module_.__name__)
+
+    product = initializeProduct(module_, 
+                                module_.__name__, 
+                                module_.__path__[0], 
+                                _zope_app)
+
+    product.package_name = module_.__name__
+
+    newContext = ProductContext(product, _zope_app, module_)
+    module_.initialize(newContext)
+
 def setup_python_products(context):
-    app = context._ProductContext__app
-    apply_patches(app)
+    """Initialize the python-packages-as-products logic
+    """
+    
+    _zope_app = context._ProductContext__app
+    global _zope_app
+    apply_patches(_zope_app)
 
 
 def apply_patches(app):
+    """Apply necessary monkey patches to force Zope 2 to be capable of
+    handling "products" that are not necessarily located under the Products
+    package.  Ultimately all functionality provided by these patches should
+    be folded into Zope 2 core.
+    """
+    
     patch_ProductDispatcher__bobo_traverse__(app)
     patch_listDefaultTypeInformation(app)
     patch_externalmethod(app)


More information about the z3-checkins mailing list