Fixed proxy dict contains method

This commit is contained in:
Konsta Vesterinen
2013-06-01 13:07:49 +03:00
parent b8b4785cde
commit 46b19bfdbd
4 changed files with 26 additions and 12 deletions

View File

@@ -4,6 +4,12 @@ Changelog
Here you can see the full list of changes between each SQLAlchemy-Utils release. 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) 0.12.3 (2013-05-30)
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^

View File

@@ -24,7 +24,7 @@ class PyTest(Command):
setup( setup(
name='SQLAlchemy-Utils', name='SQLAlchemy-Utils',
version='0.12.3', version='0.12.4',
url='https://github.com/kvesteri/sqlalchemy-utils', url='https://github.com/kvesteri/sqlalchemy-utils',
license='BSD', license='BSD',
author='Konsta Vesterinen', author='Konsta Vesterinen',

View File

@@ -19,31 +19,33 @@ class ProxyDict(object):
def __contains__(self, key): def __contains__(self, key):
try: try:
return key in self.cache or self[key] return key in self.cache or self.fetch(key) is not None
except KeyError: except KeyError:
return False return False
def has_key(self, key):
return self.__contains__(key)
def fetch(self, 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): def create_new_instance(self, key):
value = self.child_class(**{self.key_name: key}) value = self.child_class(**{self.key_name: key})
self.collection.append(value) self.collection.append(value)
self.cache[key] = value
return value return value
def __getitem__(self, key): def __getitem__(self, key):
if key in self.cache: if key in self.cache:
return self.cache[key] return self.cache[key]
session = sa.orm.object_session(self.parent) value = self.fetch(key)
if not session or not sa.orm.util.has_identity(self.parent): if value:
value = self.create_new_instance(key) return value
else:
value = self.fetch(key) return self.create_new_instance(key)
if not value:
value = self.create_new_instance(key)
self.cache[key] = value
return value
def __setitem__(self, key, value): def __setitem__(self, key, value):
try: try:

View File

@@ -79,6 +79,12 @@ class TestProxyDict(TestCase):
) )
article.translations['en'] 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): def test_committing_session_empties_proxy_dict_cache(self):
article = self.Article() article = self.Article()
( (