[Zope-Checkins] SVN: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ applying layers patch to 2.10-layer

david whitfield Morriss whit at longnow.org
Sun Aug 20 16:13:02 EDT 2006


Log message for revision 69707:
  applying layers patch to 2.10-layer
  

Changed:
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeLite.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeTestCase.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/__init__.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/base.py
  A   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/layer.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/placeless.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/sandbox.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/utils.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/__init__.py
  U   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py
  A   Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/tests.py

-=-
Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeLite.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeLite.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeLite.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -26,6 +26,7 @@
 """
 
 import os, sys, time
+from utils import hasProduct, _print
 
 # Allow code to tell it is run by the test framework
 os.environ['ZOPETESTCASE'] = '1'
@@ -36,11 +37,6 @@
 # Shut up if we are not in control of the import process
 _quiet = sys.modules.has_key('Zope2')
 
-def _print(msg):
-    '''Writes 'msg' to stderr and flushes the stream.'''
-    sys.stderr.write(msg)
-    sys.stderr.flush()
-
 def _write(msg):
     '''Writes 'msg' to stderr if not _quiet.'''
     if not _quiet:
@@ -139,10 +135,6 @@
 _theApp = Zope2.app()
 _installedProducts = {}
 
-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):
     '''Installs a Zope product.'''
     start = time.time()

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeTestCase.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeTestCase.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/ZopeTestCase.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -29,6 +29,7 @@
 import interfaces
 import utils
 import connections
+import layer
 
 from AccessControl import getSecurityManager
 from AccessControl.SecurityManagement import newSecurityManager
@@ -51,6 +52,8 @@
 
     _setup_fixture = 1
 
+    layer = layer.Zope2Layer
+
     def _setup(self):
         '''Sets up the fixture. Framework authors may
            override.

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/__init__.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/__init__.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/__init__.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -15,12 +15,12 @@
 $Id$
 """
 
-import ZopeLite as Zope2
 import utils
 
-from ZopeLite import hasProduct
-from ZopeLite import installProduct
-from ZopeLite import _print
+from utils import hasProduct
+from layer import installProduct
+from utils import _print
+from utils import setAllLayers
 
 from ZopeTestCase import folder_name
 from ZopeTestCase import user_name
@@ -49,9 +49,10 @@
 from zopedoctest import FunctionalDocTestSuite
 from zopedoctest import FunctionalDocFileSuite
 
+from layer import ZopeLiteLayer
+from layer import Zope2Layer
+
 import zopedoctest as doctest
 import transaction
 import placeless
 
-Zope = Zope2
-

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/base.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/base.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/base.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -15,7 +15,6 @@
 $Id$
 """
 
-import ZopeLite as Zope2
 import unittest
 import transaction
 import profiler
@@ -25,10 +24,9 @@
 
 from AccessControl.SecurityManagement import noSecurityManager
 
-
-
 def app():
     '''Opens a ZODB connection and returns the app object.'''
+    import ZopeLite as Zope2
     app = Zope2.app()
     app = utils.makerequest(app)
     connections.register(app)

Added: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/layer.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/layer.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/layer.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -0,0 +1,54 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""
+layer support for ZopeTestCase
+
+$Id: $
+"""
+import os
+from utils import setDebugMode
+
+class ZopeLiteLayer:
+    @classmethod
+    def setUp(cls):
+        import ZopeLite
+
+    @classmethod
+    def tearDown(cls):
+        raise NotImplementedError
+
+# products to install
+_products=[]
+
+# setup functions
+_z2_callables=[]
+class Zope2Layer(ZopeLiteLayer):
+    """ stacks upon ZopeLiteLayer and handles products installs """
+    @classmethod
+    def setUp(cls):
+        import ZopeLite as Zope2
+        install = Zope2.installProduct
+        
+        [install(name, quiet=quiet) \
+         for name, quiet in _products]
+
+        [func(*args, **kw) for func, args, kw in _z2_callables]
+
+    @classmethod
+    def tearDown(cls):
+        raise NotImplementedError
+
+
+def installProduct(name, quiet=0):
+    if not (name, quiet) in _products:
+        _products.append((name, quiet))

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/placeless.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/placeless.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/placeless.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -44,9 +44,6 @@
         creation.
         ''' % orig_func.__doc__
 
-        # Setup the placeless stuff that's needed to create a fixture
-        setUp()
-
         # Call any necessary callbacks for setting up ZCML
         callZCML(required_zcml)
         if kw.has_key('required_zcml'):

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/sandbox.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/sandbox.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/sandbox.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -14,14 +14,11 @@
 
 $Id$
 """
-
-import ZopeLite as Zope2
 import transaction
 import base
 import utils
 import connections
 
-
 class Sandboxed:
     '''Derive from this class and an xTestCase to make each test
        run in its own ZODB sandbox::
@@ -32,6 +29,7 @@
 
     def _app(self):
         '''Returns the app object for a test.'''
+        import ZopeLite as Zope2
         app = Zope2.app(Zope2.sandbox().open())
         AppZapper().set(app)
         app = utils.makerequest(app)

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/utils.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/utils.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/utils.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -24,15 +24,46 @@
 import random
 import transaction
 
+def appcall(function, *args, **kw):
+    '''Calls a function passing 'app' as first argument.'''
+    from base import app, close
+    app = app()
+    args = (app,) + args
+    try:
+        return function(*args, **kw)
+    finally:
+        transaction.abort()
+        close(app)
+        
 
+def deferToZ2Layer(function):
+    '''
+    decorator assumes following:
+
+    * function only takes one argument: app
+    
+    * if app is not passed in, function should be deferred 
+
+    deferral queues execution of the function to the setup call of
+    Testing.ZopeTestCase.layer.Zope2Layer
+    '''
+    def wrapped(*args, **kwargs):
+        if args or kwargs.get('app', None):
+            return function(*args, **kwargs)
+        else:
+            import layer
+            def curryAppCall(*args, **kwargs):
+                return appcall(function, *args, **kwargs)
+            return layer._z2_callables.append((curryAppCall, args, kwargs))
+    return wrapped
+
+
+ at deferToZ2Layer
 def setupCoreSessions(app=None):
     '''Sets up the session_data_manager e.a.'''
     from Acquisition import aq_base
     commit = 0
 
-    if app is None: 
-        return appcall(setupCoreSessions)
-
     if not hasattr(app, 'temp_folder'):
         from Products.TemporaryFolder.TemporaryFolder import MountedTemporaryFolder
         tf = MountedTemporaryFolder('temp_folder', 'Temporary Folder')
@@ -67,11 +98,9 @@
     if commit:
         transaction.commit()
 
-
+ at deferToZ2Layer
 def setupZGlobals(app=None):
     '''Sets up the ZGlobals BTree required by ZClasses.'''
-    if app is None: 
-        return appcall(setupZGlobals)
 
     root = app._p_jar.root()
     if not root.has_key('ZGlobals'):
@@ -79,11 +108,9 @@
         root['ZGlobals'] = OOBTree()
         transaction.commit()
 
-
+ at deferToZ2Layer
 def setupSiteErrorLog(app=None):
     '''Sets up the error_log object required by ZPublisher.'''
-    if app is None: 
-        return appcall(setupSiteErrorLog)
 
     if not hasattr(app, 'error_log'):
         try:
@@ -124,7 +151,6 @@
         time.sleep(0.1) # Sandor Palfy
     return _Z2HOST, _Z2PORT
 
-
 def makerequest(app, stdout=sys.stdout):
     '''Wraps the app into a fresh REQUEST.'''
     from Testing.makerequest import makerequest as _makerequest
@@ -134,19 +160,6 @@
     environ['REQUEST_METHOD'] = 'GET'
     return _makerequest(app, stdout=stdout, environ=environ)
 
-
-def appcall(function, *args, **kw):
-    '''Calls a function passing 'app' as first argument.'''
-    from base import app, close
-    app = app()
-    args = (app,) + args
-    try:
-        return function(*args, **kw)
-    finally:
-        transaction.abort()
-        close(app)
-
-
 def makelist(arg):
     '''Turns arg into a list. Where arg may be
        list, tuple, or string.
@@ -159,7 +172,33 @@
        return filter(None, [arg])
     raise ValueError('Argument must be list, tuple, or string')
 
+def hasProduct(name):
+    '''Checks if a product can be found along Products.__path__'''
+    from OFS.Application import get_products
+    return name in [n[1] for n in get_products()]
 
+def _print(msg):
+    '''Writes 'msg' to stderr and flushes the stream.'''
+    sys.stderr.write(msg)
+    sys.stderr.flush()
+
+def setDebugMode(mode):
+    '''
+    Allows manual setting of Five's inspection of debug mode to allow for
+    zcml to fail meaningfully
+    '''
+    import Products.Five.fiveconfigure as fc
+    fc.debug_mode=mode
+
+def setAllLayers(suite, newlayer):
+    '''
+    helper function that iterates through all the subsuites in a
+    suite, resetting their layer to @param layer: the desired layer
+    class
+    '''
+    [setattr(subsuite, 'layer', newlayer) for subsuite in suite]
+    return suite
+
 __all__ = [
     'setupCoreSessions',
     'setupSiteErrorLog',
@@ -169,5 +208,9 @@
     'appcall',
     'makerequest',
     'makelist',
+    'hasProduct',
+    'setDebugMode',
+    '_print',
+    'setAllLayers'
 ]
 

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/__init__.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/__init__.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/__init__.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -18,4 +18,3 @@
 from zope.testing.doctest import *
 from zope.testing.doctest import _normalize_module
 from functional import *
-

Modified: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/functional.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -298,23 +298,34 @@
                                        | doctest.REPORT_NDIFF
                                        | doctest.NORMALIZE_WHITESPACE)
 
+from Testing.ZopeTestCase.layer import Zope2Layer
 
+def setlayer(layer):
+    def wrapfactory(factory):
+        def wrapper(*args, **kwargs):
+            suite = factory(*args, **kwargs)
+            suite.layer=layer
+            return suite
+        return wrapper
+    return wrapfactory
+
+ at setlayer(Zope2Layer)
 def ZopeDocTestSuite(module=None, **kw):
     module = doctest._normalize_module(module)
     return ZopeSuiteFactory(module, **kw).doctestsuite()
 
-
+ at setlayer(Zope2Layer)
 def ZopeDocFileSuite(*paths, **kw):
     if kw.get('module_relative', True):
         kw['package'] = doctest._normalize_module(kw.get('package'))
     return ZopeSuiteFactory(*paths, **kw).docfilesuite()
 
-
+ at setlayer(Zope2Layer)
 def FunctionalDocTestSuite(module=None, **kw):
     module = doctest._normalize_module(module)
     return FunctionalSuiteFactory(module, **kw).doctestsuite()
 
-
+ at setlayer(Zope2Layer)
 def FunctionalDocFileSuite(*paths, **kw):
     if kw.get('module_relative', True):
         kw['package'] = doctest._normalize_module(kw.get('package'))

Added: Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/tests.py
===================================================================
--- Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/tests.py	2006-08-20 20:03:52 UTC (rev 69706)
+++ Zope/branches/whitmo-2.10-layers/lib/python/Testing/ZopeTestCase/zopedoctest/tests.py	2006-08-20 20:13:01 UTC (rev 69707)
@@ -0,0 +1,15 @@
+import os, sys
+import unittest
+suite = unittest.TestSuite()
+
+def test_suite():
+    names = os.listdir(os.path.dirname(__file__))
+    tests = [x for x in names \
+             if x.startswith('test') and x.endswith('.py') and not x == 'tests.py']
+
+    for test in tests:
+        Testing = __import__("Testing.ZopeTestCase.zopedoctest." + test[:-3])
+        testmodule = getattr(Testing.ZopeTestCase.zopedoctest, test[:-3])
+        if hasattr(testmodule, 'test_suite'):
+            suite.addTest(testmodule.test_suite())
+    return suite



More information about the Zope-Checkins mailing list