diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-09-24 09:04:56 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-09-24 09:05:39 (GMT) |
commit | 5262575cb4acdfb931a5f658f9a047a14b176a47 (patch) | |
tree | 0e6468495f6d9f6cd0e8c194b8e2fdcfd1639100 | |
parent | aa4b0d8b0a0b29df0085eace476bb6526c54ab7d (diff) |
Remove needless caching in Document and return BLOBs meta
-rw-r--r-- | active_document/document.py | 24 | ||||
-rw-r--r-- | active_document/metadata.py | 23 | ||||
-rwxr-xr-x | tests/units/document.py | 4 | ||||
-rwxr-xr-x | tests/units/volume.py | 35 |
4 files changed, 37 insertions, 49 deletions
diff --git a/active_document/document.py b/active_document/document.py index b35e242..34e1090 100644 --- a/active_document/document.py +++ b/active_document/document.py @@ -18,7 +18,6 @@ import logging from active_document import env from active_document.metadata import StoredProperty from active_document.metadata import active_property -from active_toolkit import enforce _logger = logging.getLogger('active_document.document') @@ -61,19 +60,26 @@ class Document(dict): prop = self.metadata[prop] value = dict.get(self, prop.name) - if value is None: - enforce(isinstance(prop, StoredProperty), - 'No way to get %r property from %s[%s]', - prop.name, self.metadata.name, self.guid) + if value is None and self._record is not None: meta = self._record.get(prop.name) - value = prop.default if meta is None else meta['value'] - self[prop.name] = value + if meta is not None: + if isinstance(prop, StoredProperty): + value = meta.get('value') + else: + value = meta - if accept_language and prop.localized: - value = self._localize(value, accept_language) + if value is not None and accept_language: + if isinstance(prop, StoredProperty) and prop.localized: + value = self._localize(value, accept_language) return value + def properties(self, props, accept_language=None): + result = {} + for i in props: + result[i] = self.get(i, accept_language) + return result + def meta(self, prop): return self._record.get(prop) diff --git a/active_document/metadata.py b/active_document/metadata.py index 8bc59dc..e712663 100644 --- a/active_document/metadata.py +++ b/active_document/metadata.py @@ -119,19 +119,30 @@ class PropertyMeta(dict): meta['mtime'] = os.stat(path_).st_mtime dict.__init__(self, meta) - def url(self, part=None): + def url(self, part=None, default=None, prefix=None): + + def compose_url(url): + if url is None: + url = default + if prefix and url.startswith('/'): + url = prefix + url + return url + url = self.get('url') if url is None or isinstance(url, basestring): - return url + return compose_url(url) - if part: + if part is not None: file_meta = url.get(part) enforce(file_meta and 'url' in file_meta, env.NotFound, 'No BLOB for %r', part) - return file_meta['url'] + return compose_url(file_meta['url']) - return sorted(url.values(), - cmp=lambda x, y: cmp(x.get('order'), y.get('order'))) + result = [] + for i in sorted(url.values(), cmp=lambda x, y: + cmp(x.get('order'), y.get('order'))): + result.append(compose_url(i['url'])) + return result @classmethod def is_blob(cls, blob): diff --git a/tests/units/document.py b/tests/units/document.py index 883a20f..d2e8492 100755 --- a/tests/units/document.py +++ b/tests/units/document.py @@ -172,7 +172,7 @@ class DocumentTest(tests.Test): guid = directory.create({}) blob_path = join(tests.tmpdir, guid[:2], guid, 'blob') - self.assertRaises(RuntimeError, lambda: directory.get(guid).blob) + self.assertEqual(None, directory.get(guid).blob) self.assertRaises(RuntimeError, directory.update, guid, {'blob': 'foo'}) data = 'payload' @@ -625,7 +625,7 @@ class DocumentTest(tests.Test): [(1, 1, '1', '1')], [(i['ctime'], i['mtime'], i['guid'], i['prop']) for i in directory2.find(0, 1024)[0]]) doc = directory2.get('1') - self.assertEqual(0, doc.get('seqno')) + self.assertEqual(None, doc.get('seqno')) self.assertEqual(0, doc.meta('guid')['seqno']) self.assertEqual(0, doc.meta('prop')['seqno']) diff --git a/tests/units/volume.py b/tests/units/volume.py index d8ee5b0..14a5744 100755 --- a/tests/units/volume.py +++ b/tests/units/volume.py @@ -64,35 +64,6 @@ class VolumeTest(tests.Test): sorted(['1', '2']), sorted([i.guid for i in volume['document'].find()[0]])) - def test_UpdatedSchemeOnReindex(self): - self.touch( - ('document/1/1/guid', '{"value": "1"}'), - ('document/1/1/ctime', '{"value": 1}'), - ('document/1/1/mtime', '{"value": 1}'), - ('document/1/1/seqno', '{"value": 0}'), - ) - - class Document(document.Document): - pass - - with SingleVolume(tests.tmpdir, [Document]) as volume: - for cls in volume.values(): - for __ in cls.populate(): - pass - self.assertRaises(RuntimeError, lambda: volume['document'].get('1')['prop']) - - class Document(document.Document): - - @active_property(slot=1, default='default') - def prop(self, value): - return value - - with SingleVolume(tests.tmpdir, [Document]) as volume: - for cls in volume.values(): - for __ in cls.populate(): - pass - self.assertEqual('default', volume['document'].get('1')['prop']) - def test_Commands(self): class TestDocument(Document): @@ -540,9 +511,9 @@ class VolumeTest(tests.Test): }) self.assertEqual([ - {'order': 1, 'url': 'url1'}, - {'order': 2, 'url': 'url2', 'probe': None}, - {'order': 3, 'url': 'url3', 'foo': 'bar'}, + 'url1', + 'url2', + 'url3', ], self.call('GET', document='testdocument', guid=guid, prop='blob')) self.assertRaises(env.NotFound, |