Log message for revision 76966: Add hasPackage and installPackage functions for dealing with "products" registered via five:registerPackage.
Changed: U Zope/branches/2.10/lib/python/Testing/ZopeTestCase/ZopeLite.py U Zope/branches/2.10/lib/python/Testing/ZopeTestCase/__init__.py U Zope/branches/2.10/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt A Zope/branches/2.10/lib/python/Testing/ZopeTestCase/testpackage/ A Zope/branches/2.10/lib/python/Testing/ZopeTestCase/testpackage/__init__.py A Zope/branches/2.10/lib/python/Testing/ZopeTestCase/zopedoctest/testPackageAsProduct.py -=- Modified: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/ZopeLite.py =================================================================== --- Zope/branches/2.10/lib/python/Testing/ZopeTestCase/ZopeLite.py 2007-06-23 08:40:00 UTC (rev 76965) +++ Zope/branches/2.10/lib/python/Testing/ZopeTestCase/ZopeLite.py 2007-06-23 08:40:48 UTC (rev 76966) @@ -26,7 +26,6 @@ """ import os, sys, time -import transaction # Allow code to tell it is run by the test framework os.environ['ZOPETESTCASE'] = '1' @@ -133,62 +132,60 @@ # Allow test authors to install Zope products into the test environment. Note # that installProduct() must be called at module level -- never from tests. -from OFS.Application import get_folder_permissions, get_products, install_product +from OFS.Application import get_folder_permissions, get_products +from OFS.Application import install_product, install_package from OFS.Folder import Folder import Products _theApp = Zope2.app() _installedProducts = {} +_installedPackages = {} def hasProduct(name): '''Checks if a product can be found along Products.__path__''' return name in [n[1] for n in get_products()] -def installProduct(name, quiet=0, package=False): +def installProduct(name, quiet=0): '''Installs a Zope product.''' start = time.time() meta_types = [] if _patched and not _installedProducts.has_key(name): - if package: - # Processing of products-as-packages can be simpler; also check - # whether this has been registered with <five:registerPackage /> - # and has not been loaded. - for module_, init_func in getattr(Products, '_packages_to_initialize', []): - if module_.__name__ == name: - if not quiet: _print('Installing %s ... ' % name) - try: - product = App.Product.initializeProduct(module_, - module_.__name__, - module_.__path__[0], - _theApp) + for priority, product_name, index, product_dir in get_products(): + if product_name == name: + if not quiet: _print('Installing %s ... ' % product_name) + # We want to fail immediately if a product throws an exception + # during install, so we set the raise_exc flag. + install_product(_theApp, product_dir, product_name, meta_types, + get_folder_permissions(), raise_exc=1) + _installedProducts[product_name] = 1 + Products.meta_types = Products.meta_types + tuple(meta_types) + Globals.InitializeClass(Folder) + if not quiet: _print('done (%.3fs)\n' % (time.time() - start)) + break + else: + if name != 'SomeProduct': # Ignore the skeleton tests :-P + if not quiet: _print('Installing %s ... NOT FOUND\n' % name) - product.package_name = module_.__name__ +def hasPackage(name): + '''Checks if a package has been registered with five:registerPackage.''' + return name in [m.__name__ for m, f in Products._packages_to_initialize] - if init_func is not None: - newContext = App.ProductContext.ProductContext(product, app, module_) - init_func(newContext) - finally: - transaction.commit() - - Globals.InitializeClass(Folder) - if not quiet: _print('done (%.3fs)\n' % (time.time() - start)) - break +def installPackage(name, quiet=0): + '''Installs a registered Python package like a Zope product.''' + start = time.time() + if _patched and not _installedPackages.has_key(name): + for module, init_func in Products._packages_to_initialize: + if module.__name__ == name: + if not quiet: _print('Installing %s ... ' % module.__name__) + # We want to fail immediately if a package throws an exception + # during install, so we set the raise_exc flag. + install_package(_theApp, module, init_func, raise_exc=1) + _installedPackages[module.__name__] = 1 + Products._packages_to_initialize.remove((module, init_func)) + if not quiet: _print('done (%.3fs)\n' % (time.time() - start)) + break else: - for priority, product_name, index, product_dir in get_products(): - if product_name == name: - if not quiet: _print('Installing %s ... ' % product_name) - # We want to fail immediately if a product throws an exception - # during install, so we set the raise_exc flag. - install_product(_theApp, product_dir, product_name, meta_types, - get_folder_permissions(), raise_exc=1) - _installedProducts[product_name] = 1 - Products.meta_types = Products.meta_types + tuple(meta_types) - Globals.InitializeClass(Folder) - if not quiet: _print('done (%.3fs)\n' % (time.time() - start)) - break - else: - if name != 'SomeProduct': # Ignore the skeleton tests :-P - if not quiet: _print('Installing %s ... NOT FOUND\n' % name) + if not quiet: _print('Installing %s ... NOT FOUND\n' % name) def _load_control_panel(): # Loading the Control_Panel of an existing ZODB may take Modified: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/__init__.py =================================================================== --- Zope/branches/2.10/lib/python/Testing/ZopeTestCase/__init__.py 2007-06-23 08:40:00 UTC (rev 76965) +++ Zope/branches/2.10/lib/python/Testing/ZopeTestCase/__init__.py 2007-06-23 08:40:48 UTC (rev 76966) @@ -20,6 +20,8 @@ from ZopeLite import hasProduct from ZopeLite import installProduct +from ZopeLite import hasPackage +from ZopeLite import installPackage from ZopeLite import _print from ZopeTestCase import folder_name Modified: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt =================================================================== --- Zope/branches/2.10/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt 2007-06-23 08:40:00 UTC (rev 76965) +++ Zope/branches/2.10/lib/python/Testing/ZopeTestCase/doc/CHANGES.txt 2007-06-23 08:40:48 UTC (rev 76966) @@ -14,6 +14,8 @@ publish_module(). Thanks to Andreas Zeidler. - Fixed doctestsuite factory to copy layers from test_class to the suite. Thanks to Whit Morris. +- Added hasPackage and installPackage functions for dealing with "products" + registered via five:registerPackage. 0.9.8 (Zope 2.8 edition) - Renamed 'doctest' package to 'zopedoctest' because of name-shadowing Added: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/testpackage/__init__.py =================================================================== --- Zope/branches/2.10/lib/python/Testing/ZopeTestCase/testpackage/__init__.py (rev 0) +++ Zope/branches/2.10/lib/python/Testing/ZopeTestCase/testpackage/__init__.py 2007-06-23 08:40:48 UTC (rev 76966) @@ -0,0 +1,2 @@ +def initialize(context): + print 'testpackage.initialize called' Property changes on: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/testpackage/__init__.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native Added: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/zopedoctest/testPackageAsProduct.py =================================================================== --- Zope/branches/2.10/lib/python/Testing/ZopeTestCase/zopedoctest/testPackageAsProduct.py (rev 0) +++ Zope/branches/2.10/lib/python/Testing/ZopeTestCase/zopedoctest/testPackageAsProduct.py 2007-06-23 08:40:48 UTC (rev 76966) @@ -0,0 +1,103 @@ +############################################################################## +# +# Copyright (c) 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. +# +############################################################################## +"""Tests for installPackage + +$Id$ +""" + +import os, sys +if __name__ == '__main__': + execfile(os.path.join(sys.path[0], 'framework.py')) + +from unittest import TestSuite +from Testing.ZopeTestCase import FunctionalDocTestSuite +from Products.Five import zcml +from zope.testing import cleanup + + +def testInstallPackage(): + """ + Test if installPackage works. + + >>> from Testing import ZopeTestCase + >>> from Products.Five import zcml + >>> import sys, Products + + Rig sys.path so testpackage can be imported + + >>> saved = sys.path[:] + >>> sys.path.append(ZopeTestCase.__path__[0]) + + Register testpackage + + >>> config = ''' + ... <configure + ... xmlns:five="http://namespaces.zope.org/five"> + ... <five:registerPackage + ... package="testpackage" + ... initialize="testpackage.initialize" + ... /> + ... </configure>''' + + >>> ZopeTestCase.hasPackage('testpackage') + False + >>> zcml.load_string(config) + >>> ZopeTestCase.hasPackage('testpackage') + True + + Not yet installed + + >>> app = ZopeTestCase.app() + >>> 'testpackage' in app.Control_Panel.Products.objectIds() + False + >>> ZopeTestCase.close(app) + + Install it + + >>> ZopeTestCase.installPackage('testpackage', quiet=True) + testpackage.initialize called + + Now it shows up in Control_Panel + + >>> app = ZopeTestCase.app() + >>> 'testpackage' in app.Control_Panel.Products.objectIds() + True + >>> ZopeTestCase.close(app) + + Clean up + + >>> import testpackage + >>> Products._registered_packages.remove(testpackage) + >>> sys.path[:] = saved + """ + + +def setUp(self): + cleanup.cleanUp() + zcml._initialized = False + zcml.load_site() + +def tearDown(self): + cleanup.cleanUp() + zcml._initialized = False + + +def test_suite(): + return TestSuite(( + # Must use functional because installPackage commits + FunctionalDocTestSuite(setUp=setUp, tearDown=tearDown), + )) + +if __name__ == '__main__': + framework() + Property changes on: Zope/branches/2.10/lib/python/Testing/ZopeTestCase/zopedoctest/testPackageAsProduct.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins