diff --git a/CHANGES.rst b/CHANGES.rst index 5ab00d6..ffe9883 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. +0.12.4 (2013-06-01) +^^^^^^^^^^^^^^^^^^^ + +- Fixed ProxyDict contains method + + 0.12.3 (2013-05-30) ^^^^^^^^^^^^^^^^^^^ diff --git a/setup.py b/setup.py index f6735ec..c14e256 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ class PyTest(Command): setup( name='SQLAlchemy-Utils', - version='0.12.3', + version='0.12.4', url='https://github.com/kvesteri/sqlalchemy-utils', license='BSD', author='Konsta Vesterinen', diff --git a/sqlalchemy_utils/proxy_dict.py b/sqlalchemy_utils/proxy_dict.py index 6b33fef..df1bade 100644 --- a/sqlalchemy_utils/proxy_dict.py +++ b/sqlalchemy_utils/proxy_dict.py @@ -19,31 +19,33 @@ class ProxyDict(object): def __contains__(self, key): try: - return key in self.cache or self[key] + return key in self.cache or self.fetch(key) is not None except KeyError: return False + def has_key(self, key): + return self.__contains__(key) + def fetch(self, key): - return self.collection.filter_by(**{self.key_name: key}).first() + session = sa.orm.object_session(self.parent) + if session and sa.orm.util.has_identity(self.parent): + return self.collection.filter_by(**{self.key_name: key}).first() def create_new_instance(self, key): value = self.child_class(**{self.key_name: key}) self.collection.append(value) + self.cache[key] = value return value def __getitem__(self, key): if key in self.cache: return self.cache[key] - session = sa.orm.object_session(self.parent) - if not session or not sa.orm.util.has_identity(self.parent): - value = self.create_new_instance(key) - else: - value = self.fetch(key) - if not value: - value = self.create_new_instance(key) - self.cache[key] = value - return value + value = self.fetch(key) + if value: + return value + + return self.create_new_instance(key) def __setitem__(self, key, value): try: diff --git a/tests/test_proxy_dict.py b/tests/test_proxy_dict.py index fd60aee..13ebcd9 100644 --- a/tests/test_proxy_dict.py +++ b/tests/test_proxy_dict.py @@ -79,6 +79,12 @@ class TestProxyDict(TestCase): ) article.translations['en'] + def test_contains(self): + article = self.Article() + assert 'en' not in article.translations + # does not auto-append new translation + assert 'en' not in article.translations + def test_committing_session_empties_proxy_dict_cache(self): article = self.Article() (