[Zope-CVS] SVN: Sandbox/chrism/zodb/3.6.0/weakset/ zope_weakset egg
module.
Chris McDonough
chrism at plope.com
Fri Mar 3 13:12:44 EST 2006
Log message for revision 65769:
zope_weakset egg module.
Changed:
A Sandbox/chrism/zodb/3.6.0/weakset/
A Sandbox/chrism/zodb/3.6.0/weakset/setup.py
A Sandbox/chrism/zodb/3.6.0/weakset/src/
A Sandbox/chrism/zodb/3.6.0/weakset/src/zope/
A Sandbox/chrism/zodb/3.6.0/weakset/src/zope/__init__.py
A Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/
A Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/__init__.py
A Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/tests.py
-=-
Added: Sandbox/chrism/zodb/3.6.0/weakset/setup.py
===================================================================
--- Sandbox/chrism/zodb/3.6.0/weakset/setup.py 2006-03-03 15:16:45 UTC (rev 65768)
+++ Sandbox/chrism/zodb/3.6.0/weakset/setup.py 2006-03-03 18:12:44 UTC (rev 65769)
@@ -0,0 +1,66 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Zope Object Database: object database and persistence
+
+The Zope Object Database provides an object-oriented database for
+Python that provides a high-degree of transparency. Applications can
+take advantage of object database features with few, if any, changes
+to application logic. ZODB includes features such as a plugable storage
+interface, rich transaction support, and undo.
+
+This distribution includes the weakset module from ZODB.
+"""
+
+# The (non-obvious!) choices for the Trove Development Status line:
+# Development Status :: 5 - Production/Stable
+# Development Status :: 4 - Beta
+# Development Status :: 3 - Alpha
+
+import os
+from setuptools import setup
+
+classifiers = """\
+Development Status :: 5 - Production/Stable
+Intended Audience :: Developers
+License :: OSI Approved :: Zope Public License
+Programming Language :: Python
+Topic :: Database
+Topic :: Software Development :: Libraries :: Python Modules
+Operating System :: Microsoft :: Windows
+Operating System :: Unix
+"""
+
+setup(name='zope_weakset',
+ version='3.6.0',
+ url='http://svn.zope.org/ZODB',
+ download_url = "http://www.zope.org/Products/ZODB3.6",
+ license='ZPL 2.1',
+ description='ZODB weakset implementation',
+ author='Zope Corporation and Contributors',
+ maintainer='Zope Corporation and Contributors',
+ author_email='zodb-dev at zope.org',
+ maintainer_email='zodb-dev at zope.org',
+ platforms = ['any'],
+ classifiers = filter(None, classifiers.split("\n")),
+ long_description = __doc__,
+ packages=['zope', 'zope.weakset'],
+ package_dir = {'': 'src'},
+ namespace_packages = ['zope'],
+ tests_require = [],
+ install_requires=[],
+ include_package_data = True,
+ zip_safe = True,
+ )
+
+
Property changes on: Sandbox/chrism/zodb/3.6.0/weakset/setup.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: Sandbox/chrism/zodb/3.6.0/weakset/src/zope/__init__.py
===================================================================
--- Sandbox/chrism/zodb/3.6.0/weakset/src/zope/__init__.py 2006-03-03 15:16:45 UTC (rev 65768)
+++ Sandbox/chrism/zodb/3.6.0/weakset/src/zope/__init__.py 2006-03-03 18:12:44 UTC (rev 65769)
@@ -0,0 +1 @@
+# Package
Property changes on: Sandbox/chrism/zodb/3.6.0/weakset/src/zope/__init__.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/__init__.py
===================================================================
--- Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/__init__.py 2006-03-03 15:16:45 UTC (rev 65768)
+++ Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/__init__.py 2006-03-03 18:12:44 UTC (rev 65769)
@@ -0,0 +1,81 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+#
+##############################################################################
+
+import weakref
+
+# A simple implementation of weak sets, supplying just enough of Python's
+# sets.Set interface for our needs.
+
+class WeakSet(object):
+ """A set of objects that doesn't keep its elements alive.
+
+ The objects in the set must be weakly referencable.
+ The objects need not be hashable, and need not support comparison.
+ Two objects are considered to be the same iff their id()s are equal.
+
+ When the only references to an object are weak references (including
+ those from WeakSets), the object can be garbage-collected, and
+ will vanish from any WeakSets it may be a member of at that time.
+ """
+
+ def __init__(self):
+ # Map id(obj) to obj. By using ids as keys, we avoid requiring
+ # that the elements be hashable or comparable.
+ self.data = weakref.WeakValueDictionary()
+
+ def __len__(self):
+ return len(self.data)
+
+ def __contains__(self, obj):
+ return id(obj) in self.data
+
+ # Same as a Set, add obj to the collection.
+ def add(self, obj):
+ self.data[id(obj)] = obj
+
+ # Same as a Set, remove obj from the collection, and raise
+ # KeyError if obj not in the collection.
+ def remove(self, obj):
+ del self.data[id(obj)]
+
+ # f is a one-argument function. Execute f(elt) for each elt in the
+ # set. f's return value is ignored.
+ def map(self, f):
+ for wr in self.as_weakref_list():
+ elt = wr()
+ if elt is not None:
+ f(elt)
+
+ # Return a list of weakrefs to all the objects in the collection.
+ # Because a weak dict is used internally, iteration is dicey (the
+ # underlying dict may change size during iteration, due to gc or
+ # activity from other threads). as_weakef_list() is safe.
+ #
+ # Something like this should really be a method of Python's weak dicts.
+ # If we invoke self.data.values() instead, we get back a list of live
+ # objects instead of weakrefs. If gc occurs while this list is alive,
+ # all the objects move to an older generation (because they're strongly
+ # referenced by the list!). They can't get collected then, until a
+ # less frequent collection of the older generation. Before then, if we
+ # invoke self.data.values() again, they're still alive, and if gc occurs
+ # while that list is alive they're all moved to yet an older generation.
+ # And so on. Stress tests showed that it was easy to get into a state
+ # where a WeakSet grows without bounds, despite that almost all its
+ # elements are actually trash. By returning a list of weakrefs instead,
+ # we avoid that, although the decision to use weakrefs is now# very
+ # visible to our clients.
+ def as_weakref_list(self):
+ # We're cheating by breaking into the internals of Python's
+ # WeakValueDictionary here (accessing its .data attribute).
+ return self.data.data.values()
Property changes on: Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/__init__.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/tests.py
===================================================================
--- Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/tests.py 2006-03-03 15:16:45 UTC (rev 65768)
+++ Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/tests.py 2006-03-03 18:12:44 UTC (rev 65769)
@@ -0,0 +1,80 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE
+#
+##############################################################################
+
+import unittest
+from __init__ import WeakSet
+
+class Dummy:
+ pass
+
+class WeakSetTests(unittest.TestCase):
+ def test_contains(self):
+ w = WeakSet()
+ dummy = Dummy()
+ w.add(dummy)
+ self.assertEqual(dummy in w, True)
+ dummy2 = Dummy()
+ self.assertEqual(dummy2 in w, False)
+
+ def test_len(self):
+ w = WeakSet()
+ d1 = Dummy()
+ d2 = Dummy()
+ w.add(d1)
+ w.add(d2)
+ self.assertEqual(len(w), 2)
+ del d1
+ self.assertEqual(len(w), 1)
+
+ def test_remove(self):
+ w = WeakSet()
+ dummy = Dummy()
+ w.add(dummy)
+ self.assertEqual(dummy in w, True)
+ w.remove(dummy)
+ self.assertEqual(dummy in w, False)
+
+ def test_as_weakref_list(self):
+ w = WeakSet()
+ dummy = Dummy()
+ dummy2 = Dummy()
+ dummy3 = Dummy()
+ w.add(dummy)
+ w.add(dummy2)
+ w.add(dummy3)
+ del dummy3
+ L = [x() for x in w.as_weakref_list()]
+ self.assertEqual(L, [dummy, dummy2])
+
+ def test_map(self):
+ w = WeakSet()
+ dummy = Dummy()
+ dummy2 = Dummy()
+ dummy3 = Dummy()
+ w.add(dummy)
+ w.add(dummy2)
+ w.add(dummy3)
+ def poker(x):
+ x.poked = 1
+ w.map(poker)
+ for thing in dummy, dummy2, dummy3:
+ self.assertEqual(thing.poked, 1)
+
+
+def test_suite():
+ return unittest.makeSuite(WeakSetTests)
+
+if __name__ == '__main__':
+ unittest.main()
+
Property changes on: Sandbox/chrism/zodb/3.6.0/weakset/src/zope/weakset/tests.py
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the Zope-CVS
mailing list