Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-09-24 09:04:56 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-09-24 09:05:39 (GMT)
commit5262575cb4acdfb931a5f658f9a047a14b176a47 (patch)
tree0e6468495f6d9f6cd0e8c194b8e2fdcfd1639100
parentaa4b0d8b0a0b29df0085eace476bb6526c54ab7d (diff)
Remove needless caching in Document and return BLOBs meta
-rw-r--r--active_document/document.py24
-rw-r--r--active_document/metadata.py23
-rwxr-xr-xtests/units/document.py4
-rwxr-xr-xtests/units/volume.py35
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,