[Zope3-checkins] SVN: Zope3/trunk/src/zope/app/ fix duplication of code that resulted in new request utility lookup not

Benji York benji at zope.com
Mon Aug 15 16:41:40 EDT 2005


Log message for revision 37945:
  fix duplication of code that resulted in new request utility lookup not
  happening during tests
  

Changed:
  U   Zope3/trunk/src/zope/app/publication/httpfactory.py
  U   Zope3/trunk/src/zope/app/testing/functional.py

-=-
Modified: Zope3/trunk/src/zope/app/publication/httpfactory.py
===================================================================
--- Zope3/trunk/src/zope/app/publication/httpfactory.py	2005-08-15 19:27:16 UTC (rev 37944)
+++ Zope3/trunk/src/zope/app/publication/httpfactory.py	2005-08-15 20:41:09 UTC (rev 37945)
@@ -21,6 +21,7 @@
 
 from zope.publisher.http import HTTPRequest
 from zope.publisher.browser import BrowserRequest
+from zope.publisher.interfaces.browser import IBrowserRequest
 from zope.publisher.xmlrpc import XMLRPCRequest
 
 from zope.app.publication import interfaces
@@ -29,47 +30,47 @@
 from zope.app.publication.xmlrpc import XMLRPCPublication
 from zope.app.publication.soap import SOAPPublication
 
-_browser_methods = 'GET', 'POST', 'HEAD'
 
+def chooseClasses(method, environment):
+    if method in ('GET', 'POST', 'HEAD'):
+        content_type = environment.get('CONTENT_TYPE', '')
+        is_xml = content_type.startswith('text/xml')
+
+        soap_request = component.queryUtility(interfaces.ISOAPRequestFactory)
+        if (method == 'POST' and is_xml and environment.get('HTTP_SOAPACTION')
+        and soap_request is not None):
+            request_class = soap_request
+            publication_class = SOAPPublication
+        elif (method == 'POST' and is_xml):
+            request_class = component.queryUtility(
+                interfaces.IXMLRPCRequestFactory, default=XMLRPCRequest)
+            publication_class = XMLRPCPublication
+        else:
+            request_class = component.queryUtility(
+                interfaces.IBrowserRequestFactory, default=BrowserRequest)
+            publication_class = BrowserPublication
+    else:
+        request_class = component.queryUtility(
+            interfaces.IHTTPRequestFactory, default=HTTPRequest)
+        publication_class = HTTPPublication
+
+    return request_class, publication_class
+
+
 class HTTPPublicationRequestFactory(object):
     interface.implements(interfaces.IPublicationRequestFactory)
 
     def __init__(self, db):
         """See `zope.app.publication.interfaces.IPublicationRequestFactory`"""
-        self._http = HTTPPublication(db)
-        self._brower = BrowserPublication(db)
-        self._xmlrpc = XMLRPCPublication(db)
-        self._soappub = SOAPPublication(db)
-        self._soapreq = component.queryUtility(interfaces.ISOAPRequestFactory)
-        self._httpreq = component.queryUtility(
-            interfaces.IHTTPRequestFactory, default=HTTPRequest)
-        self._xmlrpcreq = component.queryUtility(
-            interfaces.IXMLRPCRequestFactory, default=XMLRPCRequest)
-        self._browserrequest = component.queryUtility(
-            interfaces.IBrowserRequestFactory, default=BrowserRequest)
+        self._db = db
 
     def __call__(self, input_stream, output_steam, env):
         """See `zope.app.publication.interfaces.IPublicationRequestFactory`"""
         method = env.get('REQUEST_METHOD', 'GET').upper()
-
-        if method in _browser_methods:
-            content_type = env.get('CONTENT_TYPE', '')
-            is_xml = content_type.startswith('text/xml')
-
-            if (method == 'POST' and is_xml and
-                env.get('HTTP_SOAPACTION', None)
-                and self._soapreq is not None):
-                request = self._soapreq(input_stream, output_steam, env)
-                request.setPublication(self._soappub)
-            elif (method == 'POST' and is_xml):
-                request = self._xmlrpcreq(input_stream, output_steam, env)
-                request.setPublication(self._xmlrpc)
-            else:
-                request = self._browserrequest(input_stream, output_steam, env)
-                request.setPublication(self._brower)
-                setDefaultSkin(request)
-        else:
-            request = self._httpreq(input_stream, output_steam, env)
-            request.setPublication(self._http)
-
+        request_class, publication_class = chooseClasses(method, env)
+        request = request_class(input_stream, output_steam, env)
+        request.setPublication(publication_class(self._db))
+        if IBrowserRequest.providedBy(request):
+            # only browser requests have skins
+            setDefaultSkin(request)
         return request

Modified: Zope3/trunk/src/zope/app/testing/functional.py
===================================================================
--- Zope3/trunk/src/zope/app/testing/functional.py	2005-08-15 19:27:16 UTC (rev 37944)
+++ Zope3/trunk/src/zope/app/testing/functional.py	2005-08-15 20:41:09 UTC (rev 37945)
@@ -44,12 +44,13 @@
 from zope.app import zapi
 from zope.app.debug import Debugger
 from zope.app.publication.http import HTTPPublication
-from zope.app.publication.browser import BrowserPublication
+from zope.app.publication.browser import BrowserPublication, setDefaultSkin
 from zope.app.publication.xmlrpc import XMLRPCPublication
 from zope.app.publication.soap import SOAPPublication
 from zope.app.publication.interfaces import ISOAPRequestFactory
 from zope.app.publication.zopepublication import ZopePublication
 from zope.app.publication.http import HTTPPublication
+from zope.app.publication.httpfactory import chooseClasses
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 from zope.publisher.interfaces.browser import IDefaultSkin
 from zope.publisher.interfaces.browser import IBrowserRequest
@@ -87,12 +88,6 @@
         return getattr(self._response, attr)
 
 
-def _getDefaultSkin():
-    """Returns the current default skin as an interface."""
-    adapters = zapi.getSiteManager().adapters
-    skin = adapters.lookup((IBrowserRequest,), IDefaultSkin, '')
-    return skin or IDefaultBrowserLayer
-
 class IManagerSetup(zope.interface.Interface):
     """Utility for enabling up a functional testing manager with needed grants
 
@@ -270,7 +265,7 @@
                                environment=environment,
                                basic=basic, form=form,
                                request=BrowserRequest)
-        interface.directlyProvides(request, _getDefaultSkin())
+        setDefaultSkin(request)
         return request
 
     def publish(self, path, basic=None, form=None, env={},
@@ -582,8 +577,7 @@
         old_site = getSite()
         setSite(None)
 
-        request_cls, publication_cls = self.chooseRequestClass(method, path,
-                                                               environment)
+        request_cls, publication_cls = chooseClasses(method, environment)
 
         app = FunctionalTestSetup().getApplication()
 
@@ -591,9 +585,9 @@
             path, instream, outstream,
             environment=environment,
             request=request_cls, publication=publication_cls)
-        if request_cls is BrowserRequest:
-            # Only browser requests have skins
-            interface.directlyProvides(request, _getDefaultSkin())
+        if IBrowserRequest.providedBy(request):
+            # only browser requests have skins
+            setDefaultSkin(request)
 
         if form is not None:
             if request.form:
@@ -615,36 +609,7 @@
 
         return response
 
-    def chooseRequestClass(self, method, path, environment):
-        """Choose and return a request class and a publication class"""
 
-        content_type = environment.get('CONTENT_TYPE', '')
-        is_xml = content_type.startswith('text/xml')
-
-        if method in ('GET', 'POST', 'HEAD'):
-            if (method == 'POST' and environment.get('HTTP_SOAPACTION')
-                and is_xml):
-                factory = zapi.queryUtility(ISOAPRequestFactory)
-                if factory is not None:
-                    request_cls = factory(StringIO(), StringIO(), {}).__class__
-                    publication_cls = SOAPPublication
-                else:
-                    request_cls = BrowserRequest
-                    publication_cls = BrowserPublication
-            elif (method == 'POST' and is_xml):
-                request_cls = XMLRPCRequest
-                publication_cls = XMLRPCPublication
-            else:
-                request_cls = BrowserRequest
-                publication_cls = BrowserPublication
-
-        else:
-            request_cls = HTTPRequest
-            publication_cls = HTTPPublication
-
-        return request_cls, publication_cls
-
-
 def FunctionalDocFileSuite(*paths, **kw):
     globs = kw.setdefault('globs', {})
     globs['http'] = HTTPCaller()



More information about the Zope3-Checkins mailing list