[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