From: Mike Bayer Date: Sat, 27 Oct 2007 00:24:43 +0000 (+0000) Subject: - fixed clear_mappers() behavior to better clean up after itself X-Git-Tag: rel_0_4_1~108 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4127d2219660362f8664165e5e381b003a22dad2;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - fixed clear_mappers() behavior to better clean up after itself --- diff --git a/CHANGES b/CHANGES index a403602145..cbc67819f9 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,8 @@ CHANGES - improved behavior of add_property() etc., fixed [ticket:831] involving synonym/deferred + +- fixed clear_mappers() behavior to better clean up after itself - Made access dao dection more reliable [ticket:828] diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py index 222bd75fbf..12cc1316ee 100644 --- a/lib/sqlalchemy/orm/__init__.py +++ b/lib/sqlalchemy/orm/__init__.py @@ -546,7 +546,7 @@ def clear_mappers(): for mapper in mapper_registry.values(): mapper.dispose() mapper_registry.clear() - mapperlib.ClassKey.dispose() + mapperlib.ClassKey.dispose(mapperlib.ClassKey) finally: mapperlib._COMPILE_MUTEX.release() diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 6fd3a81ef2..ad3b30e8dd 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -123,10 +123,10 @@ class ArgSingleton(type): instances = {} def dispose(cls): - for key in ArgSingleton.instances: + for key in list(ArgSingleton.instances): if key[0] is cls: del ArgSingleton.instances[key] - dispose = classmethod(dispose) + dispose = staticmethod(dispose) def __call__(self, *args): hashkey = (self, args) diff --git a/test/base/utils.py b/test/base/utils.py index 8df3a2b97d..28258e9c3d 100644 --- a/test/base/utils.py +++ b/test/base/utils.py @@ -1,4 +1,5 @@ import testbase +import unittest from sqlalchemy import util, sql, exceptions from testlib import * @@ -61,6 +62,27 @@ class ColumnCollectionTest(PersistTest): cc3.add(c3) assert (cc1==cc2).compare(c1 == c2) assert not (cc1==cc3).compare(c2 == c3) + +class ArgSingletonTest(unittest.TestCase): + def test_cleanout(self): + util.ArgSingleton.instances.clear() + + class MyClass(object): + __metaclass__ = util.ArgSingleton + def __init__(self, x, y): + self.x = x + self.y = y + + m1 = MyClass(3, 4) + m2 = MyClass(1, 5) + m3 = MyClass(3, 4) + assert m1 is m3 + assert m2 is not m3 + assert len(util.ArgSingleton.instances) == 2 + + m1 = m2 = m3 = None + MyClass.dispose(MyClass) + assert len(util.ArgSingleton.instances) == 0 if __name__ == "__main__":