From 91cd7e3c00e659391ffc64b19126c1016749bdd5 Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Mon, 11 Jul 2011 05:00:42 -0500 Subject: Moved the WeakOrderedSet into pyramid.util. --- pyramid/config.py | 44 +---------------------------- pyramid/tests/test_config.py | 64 ------------------------------------------ pyramid/tests/test_util.py | 66 ++++++++++++++++++++++++++++++++++++++++++++ pyramid/util.py | 40 +++++++++++++++++++++++++++ 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]() -- cgit v1.2.3