From 1d5a99208aa912296cc4b320ea753c9156dff9df Mon Sep 17 00:00:00 2001 From: Amos Latteier Date: Wed, 15 Apr 2015 12:48:12 -0400 Subject: Store derivers in registry, not config, since new configs are created (losing state). --- pyramid/config/__init__.py | 2 -- pyramid/config/views.py | 11 +++++++++-- pyramid/interfaces.py | 3 +++ pyramid/tests/test_integration.py | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pyramid/config/__init__.py b/pyramid/config/__init__.py index b5cf35ff0..ad72c5614 100644 --- a/pyramid/config/__init__.py +++ b/pyramid/config/__init__.py @@ -63,7 +63,6 @@ from pyramid.util import ( WeakOrderedSet, action_method, object_description, - TopologicalSorter, ) from pyramid.config.adapters import AdaptersConfiguratorMixin @@ -312,7 +311,6 @@ class Configurator( self.autocommit = autocommit self.route_prefix = route_prefix self.introspection = introspection - self.derivationlist = TopologicalSorter() if registry is None: registry = Registry(self.package_name) self.registry = registry diff --git a/pyramid/config/views.py b/pyramid/config/views.py index ac3803712..b1a49f911 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -28,6 +28,7 @@ from pyramid.interfaces import ( IStaticURLInfo, IView, IViewClassifier, + IViewDerivers, IViewMapper, IViewMapperFactory, PHASE1_CONFIG, @@ -80,6 +81,7 @@ from pyramid.util import ( object_description, viewdefaults, action_method, + TopologicalSorter, ) import pyramid.config.predicates @@ -988,7 +990,8 @@ class ViewsConfiguratorMixin(object): inner_derivers = [('mapped_view', (d.mapped_view, None)), ('rendered_view', (d.rendered_view, None))] - for name, val in inner_derivers + self.derivationlist.sorted(): + derivers = self.registry.queryUtility(IViewDerivers, default=[]) + for name, val in inner_derivers + derivers.sorted(): derivation, default = val view = derivation(view, default, **kw) return view @@ -1056,7 +1059,11 @@ class ViewsConfiguratorMixin(object): intr['weighs_more_than'] = weighs_more_than intr['weighs_less_than'] = weighs_less_than def register(): - self.derivationlist.add(name, (factory, default), + derivers = self.registry.queryUtility(IViewDerivers) + if derivers is None: + derivers = TopologicalSorter() + self.registry.registerUtility(derivers, IViewDerivers) + derivers.add(name, (factory, default), after=weighs_more_than, before=weighs_less_than) self.action(discriminator, register, introspectables=(intr,), diff --git a/pyramid/interfaces.py b/pyramid/interfaces.py index bab91b0ee..7ac2663d1 100644 --- a/pyramid/interfaces.py +++ b/pyramid/interfaces.py @@ -1184,6 +1184,9 @@ class IJSONAdapter(Interface): class IPredicateList(Interface): """ Interface representing a predicate list """ +class IViewDerivers(Interface): + """ Interface for view derivers list """ + class ICacheBuster(Interface): """ Instances of ``ICacheBuster`` may be provided as arguments to diff --git a/pyramid/tests/test_integration.py b/pyramid/tests/test_integration.py index c2786c391..3b7af29a7 100644 --- a/pyramid/tests/test_integration.py +++ b/pyramid/tests/test_integration.py @@ -474,6 +474,7 @@ class TestConflictApp(unittest.TestCase): def _makeConfig(self): from pyramid.config import Configurator config = Configurator() + config.add_default_view_derivations() return config def test_autoresolved_view(self): -- cgit v1.2.3