Log message for revision 67874: Enabled ability to declare a regular python package as an official Zope2 product via zcml five:registerPackage.
Changed: U Products.Five/trunk/fiveconfigure.py U Products.Five/trunk/fivedirectives.py U Products.Five/trunk/meta.zcml A Products.Five/trunk/tests/test_registerpackage.py A Products.Five/trunk/tests/testing/pythonproduct1.py A Products.Five/trunk/tests/testing/pythonproduct2/ A Products.Five/trunk/tests/testing/pythonproduct2/Extensions/ A Products.Five/trunk/tests/testing/pythonproduct2/Extensions/__init__.py A Products.Five/trunk/tests/testing/pythonproduct2/Extensions/somemodule.py A Products.Five/trunk/tests/testing/pythonproduct2/__init__.py -=- Modified: Products.Five/trunk/fiveconfigure.py =================================================================== --- Products.Five/trunk/fiveconfigure.py 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/fiveconfigure.py 2006-05-02 23:22:01 UTC (rev 67874) @@ -24,7 +24,10 @@ import logging import App.config +from App.Product import initializeProduct +from App.ProductContext import ProductContext import Products +import Zope2 from zope.interface import classImplements, classImplementsOnly, implementedBy from zope.interface.interface import InterfaceClass @@ -199,6 +202,37 @@ args = (class_, meta_type, permission, addview, icon, global_) ) +def _registerPackage(module_, init_func=None): + """Registers the given python package as a Zope 2 style product + """ + + if not hasattr(module_, '__path__'): + raise ValueError("Must be a package and the " \ + "package must be filesystem based") + + app = Zope2.app() + product = initializeProduct(module_, + module_.__name__, + module_.__path__[0], + app) + + product.package_name = module_.__name__ + + if init_func is not None: + newContext = ProductContext(product, app, module_) + init_func(newContext) + + +def registerPackage(_context, package, initialize=None): + """ZCML directive function for registering a python package product + """ + + _context.action( + discriminator = ('registerPackage', package), + callable = _registerPackage, + args = (package,initialize) + ) + # clean up code def killMonkey(class_, name, fallback, attr=None): Modified: Products.Five/trunk/fivedirectives.py =================================================================== --- Products.Five/trunk/fivedirectives.py 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/fivedirectives.py 2006-05-02 23:22:01 UTC (rev 67874) @@ -170,6 +170,8 @@ required=False ) + + class IInclude(Interface): file = BytesLine( @@ -178,3 +180,20 @@ u'installed Product. If the file does not exist, for a ' u'particular product, no error is raised.', required=False) + +class IRegisterPackageDirective(Interface): + """Registers the given python package which at a minimum fools zope2 into + thinking of it as a zope2 product. + """ + + package = GlobalObject( + title=u'Target package', + required=True + ) + + initialize = GlobalObject( + title=u'Initialization function to invoke', + description=u'The dotted name of a function that will get invoked ' + u'with a ProductContext instance', + required=False + ) Modified: Products.Five/trunk/meta.zcml =================================================================== --- Products.Five/trunk/meta.zcml 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/meta.zcml 2006-05-02 23:22:01 UTC (rev 67874) @@ -160,6 +160,12 @@ handler=".fiveconfigure.registerClass" /> + <meta:directive + name="registerPackage" + schema=".fivedirectives.IRegisterPackageDirective" + handler=".fiveconfigure.registerPackage" + /> + </meta:directives> </configure> Added: Products.Five/trunk/tests/test_registerpackage.py =================================================================== --- Products.Five/trunk/tests/test_registerpackage.py 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/tests/test_registerpackage.py 2006-05-02 23:22:01 UTC (rev 67874) @@ -0,0 +1,91 @@ +############################################################################## +# +# Copyright (c) 2006 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Unit tests for the registerPackage directive. + +$Id$ +""" +import os, sys +if __name__ == '__main__': + execfile(os.path.join(sys.path[0], 'framework.py')) + +# need to add the testing package to the pythonpath in order to +# test python-packages-as-products +from Products.Five.tests import testing +sys.path.append(testing.__path__[0]) + +def test_registerPackage(): + """ + Testing registerPackage + + >>> from zope.app.testing.placelesssetup import setUp, tearDown + >>> setUp() + >>> import Products + >>> import Products.Five + >>> from Products.Five import zcml + >>> zcml.load_config('meta.zcml', Products.Five) + + Make sure a python package with no initialize (even though one + is specified) will fail:: + + >>> configure_zcml = ''' + ... <configure + ... xmlns="http://namespaces.zope.org/zope" + ... xmlns:five="http://namespaces.zope.org/five" + ... i18n_domain="foo"> + ... <five:registerPackage + ... package="pythonproduct1" + ... initialize="pythonproduct1.initialize" + ... /> + ... </configure>''' + >>> zcml.load_string(configure_zcml) + Traceback (most recent call last): + ... + ZopeXMLConfigurationError: ... + ConfigurationError: ('...pythonproduct1 has no global initialize') + + Make sure a python package with a valid initialize gets its + initialize function called:: + + >>> configure_zcml = ''' + ... <configure + ... xmlns="http://namespaces.zope.org/zope" + ... xmlns:five="http://namespaces.zope.org/five" + ... i18n_domain="foo"> + ... <five:registerPackage + ... package="pythonproduct2" + ... initialize="pythonproduct2.initialize" + ... /> + ... </configure>''' + >>> zcml.load_string(configure_zcml) + pythonproduct2 initialized + + Test to see if the pythonproduct2 python package actually gets setup + as a zope2 product in the Control Panel. + + >>> product_listing = app.Control_Panel.Products.objectIds() + >>> 'pythonproduct2' in product_listing + True + + Clean up: + + >>> tearDown() + """ + + +def test_suite(): + from Testing.ZopeTestCase import ZopeDocTestSuite + return ZopeDocTestSuite() + +if __name__ == '__main__': + framework() Added: Products.Five/trunk/tests/testing/pythonproduct1.py =================================================================== --- Products.Five/trunk/tests/testing/pythonproduct1.py 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/tests/testing/pythonproduct1.py 2006-05-02 23:22:01 UTC (rev 67874) @@ -0,0 +1,18 @@ +############################################################################## +# +# Copyright (c) 2004, 2005 Zope Corporation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Python + +$Id$ +""" + Added: Products.Five/trunk/tests/testing/pythonproduct2/Extensions/__init__.py =================================================================== Added: Products.Five/trunk/tests/testing/pythonproduct2/Extensions/somemodule.py =================================================================== --- Products.Five/trunk/tests/testing/pythonproduct2/Extensions/somemodule.py 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/tests/testing/pythonproduct2/Extensions/somemodule.py 2006-05-02 23:22:01 UTC (rev 67874) @@ -0,0 +1,4 @@ + + +def somemethod(self): + print "Executed somemethod" Added: Products.Five/trunk/tests/testing/pythonproduct2/__init__.py =================================================================== --- Products.Five/trunk/tests/testing/pythonproduct2/__init__.py 2006-05-02 22:48:25 UTC (rev 67873) +++ Products.Five/trunk/tests/testing/pythonproduct2/__init__.py 2006-05-02 23:22:01 UTC (rev 67874) @@ -0,0 +1,4 @@ + + +def initialize(context): + print "pythonproduct2 initialized" _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins