summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyramid/config/views.py2
-rw-r--r--pyramid/tests/test_config/test_views.py4
-rw-r--r--pyramid/tests/test_integration.py26
-rw-r--r--pyramid/tests/test_tweens.py4
-rw-r--r--pyramid/tweens.py2
-rw-r--r--pyramid/util.py9
6 files changed, 41 insertions, 6 deletions
diff --git a/pyramid/config/views.py b/pyramid/config/views.py
index 65c9da585..b6996b6d2 100644
--- a/pyramid/config/views.py
+++ b/pyramid/config/views.py
@@ -933,7 +933,7 @@ class ViewsConfiguratorMixin(object):
if not exception_only and isexc:
derived_view = runtime_exc_view(derived_view, derived_exc_view)
- derived_view.__discriminator__ = lambda *arg: discriminator
+ derived_view.__discriminator__ = lambda *arg: view_intr.discriminator
# __discriminator__ is used by superdynamic systems
# that require it for introspection after manual view lookup;
# see also MultiView.__discriminator__
diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py
index 211632730..79631c6b8 100644
--- a/pyramid/tests/test_config/test_views.py
+++ b/pyramid/tests/test_config/test_views.py
@@ -13,6 +13,8 @@ from pyramid.compat import (
from pyramid.exceptions import ConfigurationError
from pyramid.exceptions import ConfigurationExecutionError
from pyramid.exceptions import ConfigurationConflictError
+from pyramid.registry import undefer
+
class TestViewsConfigurationMixin(unittest.TestCase):
def _makeOne(self, *arg, **kw):
@@ -148,7 +150,7 @@ class TestViewsConfigurationMixin(unittest.TestCase):
self.assertEqual(wrapper.__module__, view.__module__)
self.assertEqual(wrapper.__name__, view.__name__)
self.assertEqual(wrapper.__doc__, view.__doc__)
- self.assertEqual(wrapper.__discriminator__(None, None).resolve()[0],
+ self.assertEqual(undefer(wrapper.__discriminator__(None, None))[0],
'view')
def test_add_view_view_callable_dottedname(self):
diff --git a/pyramid/tests/test_integration.py b/pyramid/tests/test_integration.py
index 85c4466a4..09ea85e13 100644
--- a/pyramid/tests/test_integration.py
+++ b/pyramid/tests/test_integration.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import datetime
+import gc
import locale
import os
import unittest
@@ -741,3 +742,28 @@ def _assertBody(body, filename):
data = data.replace(b'\r', b'')
data = data.replace(b'\n', b'')
assert(body == data)
+
+
+class MemoryLeaksTest(unittest.TestCase):
+
+ def tearDown(self):
+ import pyramid.config
+ pyramid.config.global_registries.empty()
+
+ def get_gc_count(self):
+ last_collected = 0
+ while True:
+ collected = gc.collect()
+ if collected == last_collected:
+ break
+ last_collected = collected
+ return len(gc.get_objects())
+
+ def test_memory_leaks(self):
+ from pyramid.config import Configurator
+ Configurator().make_wsgi_app() # Initialize all global objects
+
+ initial_count = self.get_gc_count()
+ Configurator().make_wsgi_app()
+ current_count = self.get_gc_count()
+ self.assertEqual(current_count, initial_count)
diff --git a/pyramid/tests/test_tweens.py b/pyramid/tests/test_tweens.py
index c8eada34c..d2053e6b8 100644
--- a/pyramid/tests/test_tweens.py
+++ b/pyramid/tests/test_tweens.py
@@ -31,6 +31,7 @@ class Test_excview_tween_factory(unittest.TestCase):
raise HTTPNotFound
tween = self._makeOne(handler)
request = Request.blank('/')
+ request.registry = self.config.registry
result = tween(request)
self.assertEqual(result.status, '404 Not Found')
@@ -44,6 +45,7 @@ class Test_excview_tween_factory(unittest.TestCase):
raise ValueError
tween = self._makeOne(handler)
request = Request.blank('/')
+ request.registry = self.config.registry
result = tween(request)
self.assertTrue(b'foo' in result.body)
@@ -55,6 +57,7 @@ class Test_excview_tween_factory(unittest.TestCase):
raise ValueError
tween = self._makeOne(handler)
request = Request.blank('/')
+ request.registry = self.config.registry
request.method = 'POST'
self.assertRaises(ValueError, lambda: tween(request))
@@ -64,6 +67,7 @@ class Test_excview_tween_factory(unittest.TestCase):
raise ValueError
tween = self._makeOne(handler)
request = Request.blank('/')
+ request.registry = self.config.registry
self.assertRaises(ValueError, lambda: tween(request))
class DummyRequest:
diff --git a/pyramid/tweens.py b/pyramid/tweens.py
index a842b1133..19daf9e5e 100644
--- a/pyramid/tweens.py
+++ b/pyramid/tweens.py
@@ -42,7 +42,7 @@ def excview_tween_factory(handler, registry):
provides = providedBy(exc)
try:
response = _call_view(
- registry,
+ request.registry,
request,
exc,
provides,
diff --git a/pyramid/util.py b/pyramid/util.py
index 3337d410d..2827884a3 100644
--- a/pyramid/util.py
+++ b/pyramid/util.py
@@ -231,17 +231,20 @@ class WeakOrderedSet(object):
self._order.remove(oid)
self._order.append(oid)
return
- ref = weakref.ref(item, lambda x: self.remove(item))
+ ref = weakref.ref(item, lambda x: self._remove_by_id(oid))
self._items[oid] = ref
self._order.append(oid)
- def remove(self, item):
+ def _remove_by_id(self, oid):
""" Remove an item from the set."""
- oid = id(item)
if oid in self._items:
del self._items[oid]
self._order.remove(oid)
+ def remove(self, item):
+ """ Remove an item from the set."""
+ self._remove_by_id(id(item))
+
def empty(self):
""" Clear all objects from the set."""
self._items = {}