[Zope-Checkins] SVN: Zope/branches/elro-parent-pointers/ Merge elro-remove-request-container branch into elro-parent-pointers branch

Laurence Rowe l at lrowe.co.uk
Mon Oct 31 21:16:48 UTC 2011


Log message for revision 123206:
  Merge elro-remove-request-container branch into elro-parent-pointers branch

Changed:
  U   Zope/branches/elro-parent-pointers/setup.py
  U   Zope/branches/elro-parent-pointers/sources.cfg
  U   Zope/branches/elro-parent-pointers/src/OFS/Application.py
  U   Zope/branches/elro-parent-pointers/src/Products/Five/browser/tests/aqlegacy_ftest.txt
  U   Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/base.py
  U   Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/connections.py
  U   Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/functional.py
  U   Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/sandbox.py
  U   Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/utils.py
  U   Zope/branches/elro-parent-pointers/src/Testing/makerequest.py
  U   Zope/branches/elro-parent-pointers/src/ZPublisher/BaseRequest.py
  U   Zope/branches/elro-parent-pointers/src/ZPublisher/Publish.py
  U   Zope/branches/elro-parent-pointers/versions.cfg

-=-
Modified: Zope/branches/elro-parent-pointers/setup.py
===================================================================
--- Zope/branches/elro-parent-pointers/setup.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/setup.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -82,6 +82,7 @@
       'zope.deferredimport',
       'zope.event',
       'zope.exceptions',
+      'zope.globalrequest',
       'zope.i18n [zcml]',
       'zope.i18nmessageid',
       'zope.interface',

Modified: Zope/branches/elro-parent-pointers/sources.cfg
===================================================================
--- Zope/branches/elro-parent-pointers/sources.cfg	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/sources.cfg	2011-10-31 21:16:48 UTC (rev 123206)
@@ -22,6 +22,7 @@
 zExceptions = svn ${buildout:svn-zope-org}/zExceptions/trunk
 zLOG = svn ${buildout:svn-zope-org}/zLOG/trunk
 ZopeUndo = svn ${buildout:svn-zope-org}/ZopeUndo/trunk
+zope.globalrequest = svn ^/zope.globalrequest/trunk
 
 # Deprecated / CMF dependencies
 Products.BTreeFolder2 = svn ${buildout:svn-zope-org}/Products.BTreeFolder2/trunk

Modified: Zope/branches/elro-parent-pointers/src/OFS/Application.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/OFS/Application.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/OFS/Application.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -31,6 +31,7 @@
 from webdav.NullResource import NullResource
 from zExceptions import Redirect as RedirectException, Forbidden
 
+from zope.globalrequest import getRequest
 from zope.interface import implements
 
 import Folder
@@ -85,7 +86,7 @@
     def getId(self):
         try:
             return self.REQUEST['SCRIPT_NAME'][1:]
-        except (KeyError, TypeError):
+        except (KeyError, TypeError, AttributeError):
             return self.title
 
     def title_and_id(self):
@@ -184,6 +185,33 @@
         # We're at the base of the path.
         return ('', )
 
+    @property
+    def REQUEST(self):
+        # Return the current request
+        request = self.__dict__.get('REQUEST', None)
+        if request is None:
+            request = getRequest()
+        if request is None:
+            raise AttributeError('REQUEST')
+        return request
+    
+    @REQUEST.setter
+    def REQUEST(self, value):
+        # Set the current request as an attribute (used in tests)
+        self.__dict__['REQUEST'] = value
+
+    @REQUEST.deleter
+    def REQUEST(self):
+        del self.__dict__['REQUEST']
+
+    @property
+    def aq_explicit(self):
+        # aq_explict is a property of acquisition wrappers. As the Application
+        # object is no longer wrapped in a RequestContainer, it must be
+        # supported directly.
+        return self
+
+
 InitializeClass(Application)
 
 

Modified: Zope/branches/elro-parent-pointers/src/Products/Five/browser/tests/aqlegacy_ftest.txt
===================================================================
--- Zope/branches/elro-parent-pointers/src/Products/Five/browser/tests/aqlegacy_ftest.txt	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Products/Five/browser/tests/aqlegacy_ftest.txt	2011-10-31 21:16:48 UTC (rev 123206)
@@ -23,8 +23,7 @@
   >>> print browser.contents
   [<Products.Five.metaclass.LegacyAttributes object at ...>,
    <Folder at /test_folder_1_>,
-   <Application at >,
-   <ZPublisher.BaseRequest.RequestContainer object at ...>]
+   <Application at >]
 
 The same goes for browser views that just mix in Acquisition.Explicit:
 
@@ -32,8 +31,7 @@
   >>> print browser.contents
   [<Products.Five.metaclass.ExplicitLegacyAttributes object at ...>,
    <Folder at /test_folder_1_>,
-   <Application at >,
-   <ZPublisher.BaseRequest.RequestContainer object at ...>]
+   <Application at >]
 
 Let's do some more manual tests with the view object.  But first we
 must get it:

Modified: Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/base.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/base.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/base.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -21,6 +21,7 @@
 import connections
 import layer
 
+from zope.globalrequest import setRequest, clearRequest
 from zope.interface import implements
 from AccessControl.SecurityManagement import noSecurityManager
 
@@ -106,7 +107,11 @@
 
     def _app(self):
         '''Returns the app object for a test.'''
-        return app()
+        app = Zope2.app()
+        req = utils.newrequest()
+        setRequest(req)
+        connections.register(app)
+        return app
 
     def _setup(self):
         '''Sets up the fixture. Framework authors may
@@ -120,6 +125,7 @@
             self.beforeClose()
         self._close()
         self.logout()
+        clearRequest()
         self.afterClear()
 
     def _close(self):

Modified: Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/connections.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/connections.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/connections.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -25,10 +25,12 @@
         self._conns = []
 
     def register(self, conn):
-        self._conns.append(conn)
+        connset = self._getConnSet(conn)
+        self._conns.append(connset)
 
     def contains(self, conn):
-        return conn in self._conns
+        connset = self._getConnSet(conn)
+        return connset in self._conns
 
     def __len__(self):
         return len(self._conns)
@@ -37,23 +39,26 @@
         return len(self)
 
     def close(self, conn):
+        connset = self._getConnSet(conn)
         if self.contains(conn):
-            self._conns.remove(conn)
-        self._do_close(conn)
+            self._conns.remove(connset)
+        self._do_close(connset)
 
     def closeAll(self):
-        for conn in self._conns:
-            self._do_close(conn)
+        for connset in self._conns:
+            self._do_close(connset)
         self._conns = []
 
-    def _do_close(self, conn):
-        if hasattr(conn, 'close'):
+    def _do_close(self, connset):
+        for conn in connset:
             conn.close()
+
+    def _getConnSet(self, conn):
+        if hasattr(conn, '_p_jar'):
+            return (conn.REQUEST, conn._p_jar)
         else:
-            conn.REQUEST.close()
-            conn._p_jar.close()
+            return (conn,)
 
-
 registry = ConnectionRegistry()
 register = registry.register
 contains = registry.contains

Modified: Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/functional.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/functional.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/functional.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -31,14 +31,16 @@
     from AccessControl.SecurityManagement import setSecurityManager
     from zope.site.hooks import getSite
     from zope.site.hooks import setSite
+    from zope.globalrequest import getRequest, setRequest
 
     def wrapped_func(*args, **kw):
-        sm, site = getSecurityManager(), getSite()
+        sm, site, request = getSecurityManager(), getSite(), getRequest()
         try:
             return func(*args, **kw)
         finally:
             setSecurityManager(sm)
             setSite(site)
+            setRequest(request)
     return wrapped_func
 
 

Modified: Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/sandbox.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/sandbox.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/sandbox.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -19,7 +19,9 @@
 import utils
 import connections
 
+from zope.globalrequest import setRequest, clearRequest
 
+
 class Sandboxed:
     '''Derive from this class and an xTestCase to make each test
        run in its own ZODB sandbox::
@@ -32,7 +34,8 @@
         '''Returns the app object for a test.'''
         app = Zope2.app(Zope2.sandbox().open())
         AppZapper().set(app)
-        app = utils.makerequest(app)
+        req = utils.newrequest()
+        setRequest(req)
         connections.register(app)
         return app
 
@@ -41,6 +44,7 @@
         AppZapper().clear()
         transaction.abort()
         connections.closeAll()
+        clearRequest()
 
 
 class AppZapper:

Modified: Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/utils.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/utils.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Testing/ZopeTestCase/utils.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -118,6 +118,16 @@
     return _makerequest(app, stdout=stdout, environ=environ)
 
 
+def newrequest(stdout=sys.stdout):
+    '''Creates a new request for testing'''
+    from Testing.makerequest import newrequest as _newrequest
+    environ = {}
+    environ['SERVER_NAME'] = _Z2HOST or 'nohost'
+    environ['SERVER_PORT'] = '%d' % (_Z2PORT or 80)
+    environ['REQUEST_METHOD'] = 'GET'
+    return _newrequest(stdout=stdout, environ=environ)
+
+
 def appcall(func, *args, **kw):
     '''Calls a function passing 'app' as first argument.'''
     from base import app, close
@@ -150,6 +160,7 @@
     'importObjectFromFile',
     'appcall',
     'makerequest',
+    'newrequest',
     'makelist',
 ]
 

Modified: Zope/branches/elro-parent-pointers/src/Testing/makerequest.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/Testing/makerequest.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/Testing/makerequest.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -19,8 +19,41 @@
 from sys import stdin, stdout
 from ZPublisher.HTTPRequest import HTTPRequest
 from ZPublisher.HTTPResponse import HTTPResponse
-from ZPublisher.BaseRequest import RequestContainer
+from ExtensionClass import Base 
 
+class RequestContainer(Base): 
+    __roles__=None 
+    def __init__(self,**kw): 
+        for k,v in kw.items(): self.__dict__[k]=v 
+
+
+def newrequest(stdout=stdout, environ=None):
+    """
+    Creates a new request for testing.
+
+    *stdout* is an optional file-like object and is used by
+    REQUEST.RESPONSE. The default is sys.stdout.
+
+    *environ* is an optional mapping to be used in the request.
+    Default is a fresh dictionary. Passing os.environ is not
+    recommended; tests should not pollute the real os.environ.
+    """
+    if environ is None:
+        environ = {}
+    resp = HTTPResponse(stdout=stdout)
+    environ.setdefault('SERVER_NAME', 'foo')
+    environ.setdefault('SERVER_PORT', '80')
+    environ.setdefault('REQUEST_METHOD',  'GET')
+    req = HTTPRequest(stdin, environ, resp)
+    req._steps = ['noobject']  # Fake a published object.
+    req['ACTUAL_URL'] = req.get('URL') # Zope 2.7.4
+    
+    # set Zope3-style default skin so that the request is usable for
+    # Zope3-style view look-ups.
+    from zope.publisher.browser import setDefaultSkin
+    setDefaultSkin(req)
+    return req
+
 def makerequest(app, stdout=stdout, environ=None):
     """
     Adds an HTTPRequest at app.REQUEST, and returns
@@ -47,20 +80,6 @@
     Default is a fresh dictionary. Passing os.environ is not
     recommended; tests should not pollute the real os.environ.
     """
-    if environ is None:
-        environ = {}
-    resp = HTTPResponse(stdout=stdout)
-    environ.setdefault('SERVER_NAME', 'foo')
-    environ.setdefault('SERVER_PORT', '80')
-    environ.setdefault('REQUEST_METHOD',  'GET')
-    req = HTTPRequest(stdin, environ, resp)
-    req._steps = ['noobject']  # Fake a published object.
-    req['ACTUAL_URL'] = req.get('URL') # Zope 2.7.4
-    
-    # set Zope3-style default skin so that the request is usable for
-    # Zope3-style view look-ups.
-    from zope.publisher.browser import setDefaultSkin
-    setDefaultSkin(req)
-
+    req = newrequest(stdout, environ)
     requestcontainer = RequestContainer(REQUEST = req)
     return app.__of__(requestcontainer)

Modified: Zope/branches/elro-parent-pointers/src/ZPublisher/BaseRequest.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/ZPublisher/BaseRequest.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/ZPublisher/BaseRequest.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -41,23 +41,6 @@
     return urllib_quote(text, '/+@')
 
 try:
-    from ExtensionClass import Base
-    from ZPublisher.Converters import type_converters
-    class RequestContainer(Base):
-        __roles__=None
-        def __init__(self,**kw):
-            for k,v in kw.items(): self.__dict__[k]=v
-
-        def manage_property_types(self):
-            return type_converters.keys()
-
-except ImportError:
-    class RequestContainer:
-        __roles__=None
-        def __init__(self,**kw):
-            for k,v in kw.items(): self.__dict__[k]=v
-
-try:
     from AccessControl.ZopeSecurityPolicy import getRoles
 except ImportError:
     def getRoles(container, name, value, default):
@@ -411,10 +394,6 @@
             return response.forbiddenError(self['URL'])
 
         # Traverse the URL to find the object:
-        if hasattr(object, '__of__'):
-            # Try to bind the top-level object to the request
-            # This is how you get 'self.REQUEST'
-            object=object.__of__(RequestContainer(REQUEST=request))
         parents.append(object)
 
         steps=self.steps

Modified: Zope/branches/elro-parent-pointers/src/ZPublisher/Publish.py
===================================================================
--- Zope/branches/elro-parent-pointers/src/ZPublisher/Publish.py	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/src/ZPublisher/Publish.py	2011-10-31 21:16:48 UTC (rev 123206)
@@ -22,6 +22,7 @@
 from zope.publisher.interfaces.browser import IBrowserPage
 from zope.publisher.skinnable import setDefaultSkin
 from zope.security.management import newInteraction, endInteraction
+from zope.globalrequest import setRequest, clearRequest
 
 from .mapply import mapply
 from .maybe_lock import allocate_lock
@@ -237,13 +238,14 @@
 
             if request is None:
                 request=Request(stdin, environ, response)
-
+            
             # make sure that the request we hand over has the
             # default layer/skin set on it; subsequent code that
             # wants to look up views will likely depend on it
             if ISkinnable.providedBy(request):
                 setDefaultSkin(request)
 
+            setRequest(request)
             response = publish(request, module_name, after_list, debug=debug)
         except (SystemExit, ImportError):
             # XXX: Rendered ImportErrors were never caught here because they
@@ -271,6 +273,7 @@
         if after_list[0] is not None: after_list[0]()
 
     finally:
+        clearRequest()
         if request is not None: request.close()
 
     if must_die:

Modified: Zope/branches/elro-parent-pointers/versions.cfg
===================================================================
--- Zope/branches/elro-parent-pointers/versions.cfg	2011-10-31 21:12:18 UTC (rev 123205)
+++ Zope/branches/elro-parent-pointers/versions.cfg	2011-10-31 21:16:48 UTC (rev 123206)
@@ -40,4 +40,5 @@
 repoze.retry = 1.0
 repoze.tm2 = 1.0b1
 repoze.who = 2.0b1
+zope.globalrequest = 1.0
 zope.testbrowser = 3.11.1



More information about the Zope-Checkins mailing list