summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-09-20 02:54:46 +0000
committerChris McDonough <chrism@agendaless.com>2009-09-20 02:54:46 +0000
commit160f01439dc3e0d865b2e77bb4a9a7c9e7a16c1a (patch)
tree5eb0dea7958a161806ffd6025e7cbb8db729e446
parente1205ca0f073ac6bbe992a507f8979f9ebcff5cf (diff)
downloadpyramid-160f01439dc3e0d865b2e77bb4a9a7c9e7a16c1a.tar.gz
pyramid-160f01439dc3e0d865b2e77bb4a9a7c9e7a16c1a.tar.bz2
pyramid-160f01439dc3e0d865b2e77bb4a9a7c9e7a16c1a.zip
- Speed: do not register an ITraverserFactory in configure.zcml;
instead rely on queryAdapter and a manual default to ModelGraphTraverser. - Speed: do not register an IContextURL in configure.zcml; instead rely on queryAdapter and a manual default to TraversalContextURL. - General speed microimprovements for helloworld benchmark: replace try/excepts with statements which use 'in' keyword.
-rw-r--r--CHANGES.txt10
-rw-r--r--repoze/bfg/includes/configure.zcml12
-rw-r--r--repoze/bfg/router.py13
-rw-r--r--repoze/bfg/tests/test_router.py31
-rw-r--r--repoze/bfg/tests/test_traversal.py9
-rw-r--r--repoze/bfg/traversal.py45
-rw-r--r--repoze/bfg/url.py1
7 files changed, 81 insertions, 40 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index ae98067d9..1de84f7d0 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -31,6 +31,16 @@ Features
``view_renderer`` parameters (bring up to speed with 1.1a3
features). These can also be spelled as ``attr`` and ``renderer``.
+- Speed: do not register an ITraverserFactory in configure.zcml;
+ instead rely on queryAdapter and a manual default to
+ ModelGraphTraverser.
+
+- Speed: do not register an IContextURL in configure.zcml; instead
+ rely on queryAdapter and a manual default to TraversalContextURL.
+
+- General speed microimprovements for helloworld benchmark: replace
+ try/excepts with statements which use 'in' keyword.
+
1.1a3 (2009-09-16)
==================
diff --git a/repoze/bfg/includes/configure.zcml b/repoze/bfg/includes/configure.zcml
index 9a110d143..db369dd2d 100644
--- a/repoze/bfg/includes/configure.zcml
+++ b/repoze/bfg/includes/configure.zcml
@@ -6,18 +6,6 @@
<include file="meta.zcml" />
- <adapter
- provides="repoze.bfg.interfaces.ITraverserFactory"
- factory="repoze.bfg.traversal.ModelGraphTraverser"
- for="*"
- />
-
- <adapter
- provides="repoze.bfg.interfaces.IContextURL"
- factory="repoze.bfg.traversal.TraversalContextURL"
- for="* repoze.bfg.interfaces.IRequest"
- />
-
<renderer
factory="repoze.bfg.chameleon_zpt.renderer_factory"
name=".pt"
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index 4ee0f5215..f9ecd427d 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -31,6 +31,7 @@ from repoze.bfg.security import Unauthorized
from repoze.bfg.settings import Settings
from repoze.bfg.settings import get_options
from repoze.bfg.threadlocal import manager
+from repoze.bfg.traversal import ModelGraphTraverser
from repoze.bfg.traversal import _traverse
from repoze.bfg.urldispatch import RoutesRootFactory
from repoze.bfg.view import NotFound
@@ -79,7 +80,9 @@ class Router(object):
request = request_factory(environ)
threadlocals['request'] = request
registry.has_listeners and registry.notify(NewRequest(request))
- traverser = registry.getAdapter(root, ITraverserFactory)
+ traverser = registry.queryAdapter(root, ITraverserFactory)
+ if traverser is None:
+ traverser = ModelGraphTraverser(root)
tdict = _traverse(root, environ, traverser=traverser)
if '_deprecation_warning' in tdict:
warning = tdict.pop('_deprecation_warning')
@@ -94,8 +97,11 @@ class Router(object):
# bottleneck; since we're sure we're using a
# webob.Request, we can go around its back and set stuff
# into the environ directly
- attrs = environ.setdefault('webob.adhoc_attrs', {})
- attrs.update(tdict)
+ if 'webob.adhoc_attrs' in environ:
+ attrs = environ.setdefault('webob.adhoc_attrs', {})
+ attrs.update(tdict)
+ else:
+ environ['webob.adhoc_attrs'] = tdict
def respond(response, view_name):
registry.has_listeners and registry.notify(
@@ -111,7 +117,6 @@ class Router(object):
provides = map(providedBy, (context, request))
view_callable = registry.adapters.lookup(
provides, IView, name=view_name, default=None)
-
if view_callable is None:
if self.debug_notfound:
diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py
index a96765a01..9f82ab4d3 100644
--- a/repoze/bfg/tests/test_router.py
+++ b/repoze/bfg/tests/test_router.py
@@ -137,6 +137,37 @@ class RouterTests(unittest.TestCase):
from repoze.bfg.view import default_notfound_view
self.assertEqual(router.notfound_view, default_notfound_view)
+ def test_call_traverser_default(self):
+ environ = self._makeEnviron()
+ context = DummyContext()
+ logger = self._registerLogger()
+ router = self._makeOne()
+ start_response = DummyStartResponse()
+ result = router(environ, start_response)
+ headers = start_response.headers
+ self.assertEqual(len(headers), 2)
+ status = start_response.status
+ self.assertEqual(status, '404 Not Found')
+ self.failUnless('<code>/</code>' in result[0], result)
+ self.failIf('debug_notfound' in result[0])
+ self.assertEqual(len(logger.messages), 0)
+
+ def test_has_webob_adhoc_attrs(self):
+ environ = self._makeEnviron()
+ environ['webob.adhoc_attrs'] = {}
+ context = DummyContext()
+ logger = self._registerLogger()
+ router = self._makeOne()
+ start_response = DummyStartResponse()
+ result = router(environ, start_response)
+ headers = start_response.headers
+ self.assertEqual(len(headers), 2)
+ status = start_response.status
+ self.assertEqual(status, '404 Not Found')
+ self.failUnless('<code>/</code>' in result[0], result)
+ self.failIf('debug_notfound' in result[0])
+ self.assertEqual(len(logger.messages), 0)
+
def test_call_no_view_registered_no_isettings(self):
environ = self._makeEnviron()
context = DummyContext()
diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py
index 7c1acdacd..0fb0becfd 100644
--- a/repoze/bfg/tests/test_traversal.py
+++ b/repoze/bfg/tests/test_traversal.py
@@ -848,7 +848,7 @@ class TestVirtualRoot(unittest.TestCase):
from repoze.bfg.traversal import virtual_root
return virtual_root(model, request)
- def test_it(self):
+ def test_registered(self):
from zope.component import getGlobalSiteManager
from repoze.bfg.interfaces import IContextURL
from zope.interface import Interface
@@ -860,6 +860,13 @@ class TestVirtualRoot(unittest.TestCase):
result = self._callFUT(context, request)
self.assertEqual(result, '123')
+ def test_default(self):
+ context = DummyContext()
+ request = DummyRequest()
+ request.environ['PATH_INFO'] = '/'
+ result = self._callFUT(context, request)
+ self.assertEqual(result, context)
+
class TraverseTests(unittest.TestCase):
def setUp(self):
cleanUp()
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py
index 157a9aac7..16c1cc764 100644
--- a/repoze/bfg/traversal.py
+++ b/repoze/bfg/traversal.py
@@ -1,7 +1,7 @@
import re
import urllib
-from zope.component import getMultiAdapter
+from zope.component import queryMultiAdapter
from zope.interface import classProvides
from zope.interface import implements
@@ -372,7 +372,9 @@ def virtual_root(model, request):
is called with a ``model`` argument which is a context obtained
via URL dispatch, the model passed in will be returned
unconditonally."""
- urlgenerator = getMultiAdapter((model, request), IContextURL)
+ urlgenerator = queryMultiAdapter((model, request), IContextURL)
+ if urlgenerator is None:
+ urlgenerator = TraversalContextURL(model, request)
return urlgenerator.virtual_root()
@lru_cache(1000)
@@ -519,16 +521,15 @@ class ModelGraphTraverser(object):
except KeyError:
path = '/'
- try:
+ if VH_ROOT_KEY in environ:
vroot_path = environ[VH_ROOT_KEY]
- except KeyError:
- vroot_tuple = ()
- vpath = path
- vroot_idx = -1
- else:
vroot_tuple = traversal_path(vroot_path)
vpath = vroot_path + path
vroot_idx = len(vroot_tuple) -1
+ else:
+ vroot_tuple = ()
+ vpath = path
+ vroot_idx = -1
ob = vroot = self.root
@@ -590,16 +591,16 @@ class TraversalContextURL(object):
self.request = request
def virtual_root(self):
+ environ = self.request.environ
+ vroot_varname = self.vroot_varname
+ if vroot_varname in environ:
+ return find_model(self.context, environ[vroot_varname])
+ # shortcut instead of using find_root; we probably already
+ # have it on the request
try:
- vroot_path = self.request.environ[self.vroot_varname]
- except KeyError:
- # shortcut instead of using find_root; we probably already
- # have it on the request
- try:
- return self.request.root
- except AttributeError:
- return find_root(self.context)
- return find_model(self.context, vroot_path)
+ return self.request.root
+ except AttributeError:
+ return find_root(self.context)
def __call__(self):
""" Generate a URL based on the lineage of a model obtained
@@ -614,17 +615,17 @@ class TraversalContextURL(object):
if path != '/':
path = path + '/'
request = self.request
+ environ = request.environ
+ vroot_varname = self.vroot_varname
# if the path starts with the virtual root path, trim it out
- try:
- vroot_path = request.environ[self.vroot_varname]
- except KeyError:
- pass
- else:
+ if vroot_varname in environ:
+ vroot_path = environ[vroot_varname]
if path.startswith(vroot_path):
path = path[len(vroot_path):]
environ = request.environ
+
if 'bfg.routes.route' in environ:
route = environ['bfg.routes.route']
matchdict = environ['bfg.routes.matchdict'].copy()
diff --git a/repoze/bfg/url.py b/repoze/bfg/url.py
index b507e9432..5d1f08faa 100644
--- a/repoze/bfg/url.py
+++ b/repoze/bfg/url.py
@@ -178,7 +178,6 @@ def model_url(model, request, *elements, **kw):
context_url = queryMultiAdapter((model, request), IContextURL)
if context_url is None:
- # b/w compat for unit tests
context_url = TraversalContextURL(model, request)
model_url = context_url()