diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-09-20 02:54:46 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-09-20 02:54:46 +0000 |
| commit | 160f01439dc3e0d865b2e77bb4a9a7c9e7a16c1a (patch) | |
| tree | 5eb0dea7958a161806ffd6025e7cbb8db729e446 | |
| parent | e1205ca0f073ac6bbe992a507f8979f9ebcff5cf (diff) | |
| download | pyramid-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.txt | 10 | ||||
| -rw-r--r-- | repoze/bfg/includes/configure.zcml | 12 | ||||
| -rw-r--r-- | repoze/bfg/router.py | 13 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_router.py | 31 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_traversal.py | 9 | ||||
| -rw-r--r-- | repoze/bfg/traversal.py | 45 | ||||
| -rw-r--r-- | repoze/bfg/url.py | 1 |
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() |
