summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2011-07-11 05:00:42 -0500
committerMichael Merickel <michael@merickel.org>2011-07-14 19:55:47 -0500
commit91cd7e3c00e659391ffc64b19126c1016749bdd5 (patch)
treea71266016459c47b8c1fa437055e1610d9758b3d
parent981c054d746e29f42ac16da48c838729537f2eea (diff)
downloadpyramid-91cd7e3c00e659391ffc64b19126c1016749bdd5.tar.gz
pyramid-91cd7e3c00e659391ffc64b19126c1016749bdd5.tar.bz2
pyramid-91cd7e3c00e659391ffc64b19126c1016749bdd5.zip
Moved the WeakOrderedSet into pyramid.util.
-rw-r--r--pyramid/config.py44
-rw-r--r--pyramid/tests/test_config.py64
-rw-r--r--pyramid/tests/test_util.py66
-rw-r--r--pyramid/util.py40
4 files changed, 107 insertions, 107 deletions
diff --git a/pyramid/config.py b/pyramid/config.py
index 93ef51163..0ba7fb995 100644
--- a/pyramid/config.py
+++ b/pyramid/config.py
@@ -1,4 +1,3 @@
-import collections
import inspect
import os
import re
@@ -6,7 +5,6 @@ import sys
import types
import traceback
import warnings
-import weakref
import venusian
@@ -84,6 +82,7 @@ from pyramid.traversal import find_interface
from pyramid.traversal import traversal_path
from pyramid.urldispatch import RoutesMapper
from pyramid.util import DottedNameResolver
+from pyramid.util import WeakOrderedSet
from pyramid.view import render_view_to_response
DEFAULT_RENDERERS = (
@@ -3322,45 +3321,4 @@ def isexception(o):
(inspect.isclass(o) and (issubclass(o, Exception)))
)
-class WeakOrderedSet(object):
- """ Maintain a set of items.
-
- Each item is stored as a weakref to avoid extending their lifetime.
-
- The values may be iterated over or the last item added may be
- accessed via the ``last`` property.
- """
-
- def __init__(self):
- self._items = {}
- self._order = []
-
- def add(self, item):
- """ Add a registry to the set."""
- oid = id(item)
- if oid in self._items:
- return
- def cleanup(ref):
- del self._items[oid]
- self._order.remove(oid)
- ref = weakref.ref(item, cleanup)
- self._items[oid] = ref
- self._order.append(oid)
-
- def __len__(self):
- return len(self._order)
-
- def __contains__(self, item):
- oid = id(item)
- return oid in self._items
-
- def __iter__(self):
- return (self._items[oid]() for oid in self._order)
-
- @property
- def last(self):
- if self._order:
- oid = self._order[-1]
- return self._items[oid]()
-
global_registries = WeakOrderedSet()
diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py
index 1e73573ae..9dd07a65b 100644
--- a/pyramid/tests/test_config.py
+++ b/pyramid/tests/test_config.py
@@ -5324,70 +5324,6 @@ class Test_isexception(unittest.TestCase):
pass
self.assertEqual(self._callFUT(ISubException), True)
-class Test_WeakOrderedSet(unittest.TestCase):
- def _makeOne(self):
- from pyramid.config import WeakOrderedSet
- return WeakOrderedSet()
-
- def test_empty(self):
- wos = self._makeOne()
- self.assertEqual(len(wos), 0)
- self.assertEqual(wos.last, None)
-
- def test_add_item(self):
- wos = self._makeOne()
- reg = DummyRegistry()
- wos.add(reg)
- self.assertEqual(list(wos), [reg])
- self.assert_(reg in wos)
- self.assertEqual(wos.last, reg)
-
- def test_add_multiple_items(self):
- wos = self._makeOne()
- reg1 = DummyRegistry()
- reg2 = DummyRegistry()
- wos.add(reg1)
- wos.add(reg2)
- self.assertEqual(len(wos), 2)
- self.assertEqual(list(wos), [reg1, reg2])
- self.assert_(reg1 in wos)
- self.assert_(reg2 in wos)
- self.assertEqual(wos.last, reg2)
-
- def test_add_duplicate_items(self):
- wos = self._makeOne()
- reg = DummyRegistry()
- wos.add(reg)
- wos.add(reg)
- self.assertEqual(len(wos), 1)
- self.assertEqual(list(wos), [reg])
- self.assert_(reg in wos)
- self.assertEqual(wos.last, reg)
-
- def test_weakref_removal(self):
- import gc
- wos = self._makeOne()
- reg = DummyRegistry()
- wos.add(reg)
- del reg
- gc.collect() # force gc
- self.assertEqual(len(wos), 0)
- self.assertEqual(list(wos), [])
- self.assertEqual(wos.last, None)
-
- def test_last_updated(self):
- import gc
- wos = self._makeOne()
- reg = DummyRegistry()
- reg2 = DummyRegistry()
- wos.add(reg)
- wos.add(reg2)
- del reg2
- gc.collect() # force gc
- self.assertEqual(len(wos), 1)
- self.assertEqual(list(wos), [reg])
- self.assertEqual(wos.last, reg)
-
class DummyRequest:
subpath = ()
matchdict = None
diff --git a/pyramid/tests/test_util.py b/pyramid/tests/test_util.py
index 47aab948a..65aca88b2 100644
--- a/pyramid/tests/test_util.py
+++ b/pyramid/tests/test_util.py
@@ -175,3 +175,69 @@ class TestDottedNameResolver(unittest.TestCase):
self.assertEqual(typ.package, None)
self.assertEqual(typ.package_name, None)
+class Test_WeakOrderedSet(unittest.TestCase):
+ def _makeOne(self):
+ from pyramid.config import WeakOrderedSet
+ return WeakOrderedSet()
+
+ def test_empty(self):
+ wos = self._makeOne()
+ self.assertEqual(len(wos), 0)
+ self.assertEqual(wos.last, None)
+
+ def test_add_item(self):
+ wos = self._makeOne()
+ reg = Dummy()
+ wos.add(reg)
+ self.assertEqual(list(wos), [reg])
+ self.assert_(reg in wos)
+ self.assertEqual(wos.last, reg)
+
+ def test_add_multiple_items(self):
+ wos = self._makeOne()
+ reg1 = Dummy()
+ reg2 = Dummy()
+ wos.add(reg1)
+ wos.add(reg2)
+ self.assertEqual(len(wos), 2)
+ self.assertEqual(list(wos), [reg1, reg2])
+ self.assert_(reg1 in wos)
+ self.assert_(reg2 in wos)
+ self.assertEqual(wos.last, reg2)
+
+ def test_add_duplicate_items(self):
+ wos = self._makeOne()
+ reg = Dummy()
+ wos.add(reg)
+ wos.add(reg)
+ self.assertEqual(len(wos), 1)
+ self.assertEqual(list(wos), [reg])
+ self.assert_(reg in wos)
+ self.assertEqual(wos.last, reg)
+
+ def test_weakref_removal(self):
+ import gc
+ wos = self._makeOne()
+ reg = Dummy()
+ wos.add(reg)
+ del reg
+ gc.collect() # force gc
+ self.assertEqual(len(wos), 0)
+ self.assertEqual(list(wos), [])
+ self.assertEqual(wos.last, None)
+
+ def test_last_updated(self):
+ import gc
+ wos = self._makeOne()
+ reg = Dummy()
+ reg2 = Dummy()
+ wos.add(reg)
+ wos.add(reg2)
+ del reg2
+ gc.collect() # force gc
+ self.assertEqual(len(wos), 1)
+ self.assertEqual(list(wos), [reg])
+ self.assertEqual(wos.last, reg)
+
+class Dummy(object):
+ pass
diff --git a/pyramid/util.py b/pyramid/util.py
index 3e6cd2e60..b3fda9016 100644
--- a/pyramid/util.py
+++ b/pyramid/util.py
@@ -1,5 +1,6 @@
import pkg_resources
import sys
+import weakref
from pyramid.exceptions import ConfigurationError
from pyramid.path import package_of
@@ -143,4 +144,43 @@ class DottedNameResolver(object):
return self._zope_dottedname_style(dotted)
return dotted
+class WeakOrderedSet(object):
+ """ Maintain a set of items.
+ Each item is stored as a weakref to avoid extending their lifetime.
+
+ The values may be iterated over or the last item added may be
+ accessed via the ``last`` property.
+ """
+
+ def __init__(self):
+ self._items = {}
+ self._order = []
+
+ def add(self, item):
+ """ Add a registry to the set."""
+ oid = id(item)
+ if oid in self._items:
+ return
+ def cleanup(ref):
+ del self._items[oid]
+ self._order.remove(oid)
+ ref = weakref.ref(item, cleanup)
+ self._items[oid] = ref
+ self._order.append(oid)
+
+ def __len__(self):
+ return len(self._order)
+
+ def __contains__(self, item):
+ oid = id(item)
+ return oid in self._items
+
+ def __iter__(self):
+ return (self._items[oid]() for oid in self._order)
+
+ @property
+ def last(self):
+ if self._order:
+ oid = self._order[-1]
+ return self._items[oid]()