[Zope-Checkins] SVN: Products.Five/branches/1.4/ Removed awful
_zope_app usage which was causing ConnectionStateError problems.
Rocky Burt
rocky at serverzen.com
Mon Aug 21 09:53:14 EDT 2006
Log message for revision 69719:
Removed awful _zope_app usage which was causing ConnectionStateError problems.
Changed:
U Products.Five/branches/1.4/CHANGES.txt
U Products.Five/branches/1.4/fiveconfigure.py
U Products.Five/branches/1.4/pythonproducts.py
U Products.Five/branches/1.4/tests/test_pythonproducts.py
-=-
Modified: Products.Five/branches/1.4/CHANGES.txt
===================================================================
--- Products.Five/branches/1.4/CHANGES.txt 2006-08-21 12:27:47 UTC (rev 69718)
+++ Products.Five/branches/1.4/CHANGES.txt 2006-08-21 13:53:13 UTC (rev 69719)
@@ -2,6 +2,16 @@
Five Changes
============
+Five 1.4.x
+==========
+
+Bugfixes
+--------
+
+* Backported Zope 2.10's pythonproducts zope app handling to help resolve
+ an issue with ConnectionStateError's.
+
+
Five 1.4.1 (2006-08-13)
=======================
Modified: Products.Five/branches/1.4/fiveconfigure.py
===================================================================
--- Products.Five/branches/1.4/fiveconfigure.py 2006-08-21 12:27:47 UTC (rev 69718)
+++ Products.Five/branches/1.4/fiveconfigure.py 2006-08-21 13:53:13 UTC (rev 69719)
@@ -27,6 +27,7 @@
from App.ProductContext import ProductContext
import Products
from zLOG import LOG, ERROR
+import Zope2
from zope.interface import classImplements, classImplementsOnly, implementedBy
from zope.interface.interface import InterfaceClass
@@ -266,18 +267,25 @@
raise ValueError("Must be a package and the " \
"package must be filesystem based")
- product = initializeProduct(module_,
- module_.__name__,
- module_.__path__[0],
- pythonproducts._zope_app)
+ app = Zope2.app()
+ try:
+ product = initializeProduct(module_,
+ module_.__name__,
+ module_.__path__[0],
+ app)
- product.package_name = module_.__name__
+ product.package_name = module_.__name__
- if initFunc is not None:
- newContext = ProductContext(product, pythonproducts._zope_app, module_)
- initFunc(newContext)
+ if initFunc is not None:
+ newContext = ProductContext(product, app, module_)
+ initFunc(newContext)
+ finally:
+ try:
+ import transaction
+ transaction.commit()
+ finally:
+ app._p_jar.close()
-
def registerPackage(_context, package, initialize=None):
"""ZCML directive function for registering a python package product
"""
Modified: Products.Five/branches/1.4/pythonproducts.py
===================================================================
--- Products.Five/branches/1.4/pythonproducts.py 2006-08-21 12:27:47 UTC (rev 69718)
+++ Products.Five/branches/1.4/pythonproducts.py 2006-08-21 13:53:13 UTC (rev 69719)
@@ -25,9 +25,8 @@
from App.Product import initializeProduct
from App.ProductContext import ProductContext
from zope.testing import cleanup
+import Zope2
-_zope_app = None
-
def isMonkeyPatched(m):
return hasattr(m, '__five_method__')
@@ -35,26 +34,18 @@
"""Initialize the python-packages-as-products logic
"""
- from OFS.Application import Application
-
- global _zope_app
- if isinstance(appOrContext, Application):
- _zope_app = appOrContext
- else:
- _zope_app = appOrContext._ProductContext__app
-
- applyPatches(_zope_app)
+ applyPatches()
-def applyPatches(app):
+def applyPatches():
"""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_externalmethod(app)
+ patch_ProductDispatcher__bobo_traverse__()
+ patch_externalmethod()
def removePatches():
"""Remove all monkey patches.
@@ -77,11 +68,11 @@
# Most of these monkey patches were repurposed from the code I
# wrote for Basket - Rocky
-def product_packages(app):
+def product_packages():
"""Returns all product packages including the regularly defined
zope2 packages and those without the Products namespace package.
"""
-
+
old_product_packages = {}
for x in dir(Products):
m = getattr(Products, x)
@@ -89,23 +80,27 @@
old_product_packages[x] = m
packages = {}
- products = app.Control_Panel.Products
- for product_id in products.objectIds():
- product = products[product_id]
- if hasattr(product, 'package_name'):
- pos = product.package_name.rfind('.')
- if pos > -1:
- packages[product_id] = __import__(product.package_name,
- globals(), {},
- product.package_name[pos+1:])
- else:
- packages[product_id] = __import__(product.package_name)
- elif old_product_packages.has_key(product_id):
- packages[product_id] = old_product_packages[product_id]
+ app = Zope2.app()
+ try:
+ products = app.Control_Panel.Products
+ for product_id in products.objectIds():
+ product = products[product_id]
+ if hasattr(product, 'package_name'):
+ pos = product.package_name.rfind('.')
+ if pos > -1:
+ packages[product_id] = __import__(product.package_name,
+ globals(), {},
+ product.package_name[pos+1:])
+ else:
+ packages[product_id] = __import__(product.package_name)
+ elif old_product_packages.has_key(product_id):
+ packages[product_id] = old_product_packages[product_id]
+ finally:
+ app._p_jar.close()
return packages
-def patch_ProductDispatcher__bobo_traverse__(app):
+def patch_ProductDispatcher__bobo_traverse__():
"""Currently, z2's App.FactoryDispatcher.ProductDispatcher only checks
the Products module for products to look up existing factory dispatchers
on. This needs to be fixed to look in all enabled product packages
@@ -124,7 +119,7 @@
product=self.aq_acquire('_getProducts')()._product(name)
# Try to get a custom dispatcher from a Python product
- productPkgs = product_packages(app)
+ productPkgs = product_packages()
dispatcher_class=getattr(
productPkgs.get(name, None),
'__FactoryDispatcher__',
@@ -137,7 +132,7 @@
ProductDispatcher.__bobo_traverse__ = __bobo_traverse__
-def patch_externalmethod(app):
+def patch_externalmethod():
"""In an effort to make External Methods work with regular python
packages, this function replaces App.Extensions.getPath with a custom
getPath function. See the getPath doc string for extra details.
Modified: Products.Five/branches/1.4/tests/test_pythonproducts.py
===================================================================
--- Products.Five/branches/1.4/tests/test_pythonproducts.py 2006-08-21 12:27:47 UTC (rev 69718)
+++ Products.Five/branches/1.4/tests/test_pythonproducts.py 2006-08-21 13:53:13 UTC (rev 69719)
@@ -24,39 +24,17 @@
from Products.Five.tests import testing
sys.path.append(testing.__path__[0])
-def test_aRegisterPackageCall():
+def test_registerPackage():
"""
- Testing registerPackage. Recently renamed method to something to
- would produce an out of order issue that breaks the test.
+ Testing registerPackage
>>> from zope.app.testing.placelesssetup import setUp, tearDown
>>> setUp()
>>> import Products
>>> import Products.Five
>>> from Products.Five import zcml
- >>> from Products.Five import pythonproducts
>>> zcml.load_config('meta.zcml', Products.Five)
- >>> pythonproducts.setupPythonProducts(app)
- 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::
@@ -76,61 +54,25 @@
Test to see if the pythonproduct2 python package actually gets setup
as a zope2 product in the Control Panel.
- >>> productListing = app.Control_Panel.Products.objectIds()
- >>> 'pythonproduct2' in productListing
+ >>> product_listing = []
+ >>> import Zope2
+ >>> app = Zope2.app()
+ >>> try:
+ ... product_listing = app.Control_Panel.Products.objectIds()
+ ... finally:
+ ... app._p_jar.close()
+ >>> 'pythonproduct2' in product_listing
True
- Clean up:
- >>> tearDown()
- """
-
-def test_externalmethods():
- """
- Testing registerPackage
-
- >>> from zope.app.testing.placelesssetup import setUp, tearDown
- >>> setUp()
- >>> import Products
- >>> import Products.Five
- >>> from Products.Five import zcml
- >>> from Products.Five import pythonproducts
- >>> zcml.load_config('meta.zcml', Products.Five)
- >>> pythonproducts.setupPythonProducts(app)
-
- >>> 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
-
- Lets go ahead and try setting up an external method from the
- pythonproduct2 product.
-
- >>> from Products.ExternalMethod.ExternalMethod import manage_addExternalMethod
- >>> manage_addExternalMethod(app, 'testexternal', '', 'pythonproduct2.somemodule', 'somemethod')
-
- Now lets actually execute the external method.
-
- >>> app.testexternal()
- Executed somemethod
-
Clean up:
>>> tearDown()
"""
-
def test_suite():
- from Testing.ZopeTestCase import ZopeDocTestSuite
- return ZopeDocTestSuite()
+ from zope.testing.doctest import DocTestSuite
+ return DocTestSuite()
if __name__ == '__main__':
framework()
More information about the Zope-Checkins
mailing list