>>> import os >>> import tempfile >>> import time Define some helper functions >>> def test_unique(items): ... return not [True for e in items if items.count(e) > 1] >>> def to_native(value): ... if isinstance(value, list): ... return [to_native(e) for e in value] ... elif isinstance(value, dict): ... return dict([(to_native(k), to_native(v)) for k, v in value.items()]) ... elif isinstance(value, unicode): ... return unicode(value) ... elif isinstance(value, str): ... return str(value) ... return value Connect to datastore using DBus and wait for it to get ready: >>> import dbus >>> DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore' >>> DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore' >>> DS_DBUS_PATH = '/org/laptop/sugar/DataStore' >>> bus = dbus.SessionBus() >>> ds = dbus.Interface(bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH), DS_DBUS_INTERFACE) Make sure we're starting from an empty datastore: >>> assert ds.find({}, [], byte_arrays=True) == ([], 0) Create something to play with: >>> o1_uid = ds.create({'title': 'DS test object 1', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest1'}, '', False) >>> assert isinstance(o1_uid, basestring) >>> o2_uid = ds.create({'title': 'DS test object 2', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest2'}, '', False) >>> assert isinstance(o2_uid, basestring) >>> o3_uid = ds.create({'title': 'DS test object 3', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest2'}, '', False) >>> assert isinstance(o3_uid, basestring) >>> assert test_unique([o1_uid, o2_uid, o3_uid]) Check everything is there: >>> assert sorted(to_native(ds.find({}, ['title', 'activity'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 1', u'activity': 'org.sugarlabs.DataStoreTest1'}, ... {u'title': 'DS test object 2', u'activity': 'org.sugarlabs.DataStoreTest2'}, ... {u'title': 'DS test object 3', u'activity': 'org.sugarlabs.DataStoreTest2'}] >>> ds.get_filename(o1_uid, byte_arrays=True) dbus.String(u'') >>> ds.get_filename(o2_uid, byte_arrays=True) dbus.String(u'') >>> ds.get_filename(o3_uid, byte_arrays=True) dbus.String(u'') Test get_uniquevaluesfor(). >>> sorted(ds.get_uniquevaluesfor('activity', {})) [dbus.String(u'org.sugarlabs.DataStoreTest1'), dbus.String(u'org.sugarlabs.DataStoreTest2')] Change some entries: >>> ds.update(o1_uid, {'title': 'DS test object 1 updated', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest1', 'tags': 'foo'}, '', False) >>> ds.update(o2_uid, {'title': 'DS test object 2', 'mime_type': 'text/plain', 'activity': 'org.sugarlabs.DataStoreTest1', 'tags': 'bar baz'}, '', False) >>> ds.update(o3_uid, {'title': 'DS test object 2', 'mime_type': 'text/html', 'activity': 'org.sugarlabs.DataStoreTest3', 'timestamp': 10000}, '', False) >>> assert sorted(to_native(ds.find({}, ['title', 'activity'], byte_arrays=True)[0])) == \ ... [{u'activity': 'org.sugarlabs.DataStoreTest1', u'title': 'DS test object 1 updated'}, ... {u'activity': 'org.sugarlabs.DataStoreTest1', u'title': 'DS test object 2'}, ... {u'activity': 'org.sugarlabs.DataStoreTest3', u'title': 'DS test object 2'}] Retrieve metadata for a single entry, ignoring variable data: >>> d=dict(ds.get_properties(o3_uid, byte_arrays=True)) >>> del d['uid'], d['timestamp'], d['creation_time'] >>> assert to_native(d) == {u'title': 'DS test object 2', u'mime_type': 'text/html', u'activity': 'org.sugarlabs.DataStoreTest3'} Find entries using "standard" metadata: >>> assert sorted(to_native(ds.find({'mime_type': ['text/plain']}, ['title', 'activity', 'mime_type', 'tags'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 2', u'activity': 'org.sugarlabs.DataStoreTest1', u'mime_type': 'text/plain', u'tags': 'bar baz'}, ... {u'title': 'DS test object 1 updated', u'activity': 'org.sugarlabs.DataStoreTest1', u'mime_type': 'text/plain', u'tags': 'foo'}] >>> assert sorted(to_native(ds.find({'mime_type': ['text/html']}, ['title', 'activity', 'mime_type', 'tags'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 2', u'mime_type': 'text/html', u'activity': 'org.sugarlabs.DataStoreTest3'}] >>> assert sorted(to_native(ds.find({'uid': o3_uid}, ['title', 'activity', 'mime_type'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 2', u'mime_type': 'text/html', u'activity': 'org.sugarlabs.DataStoreTest3'}] >>> assert sorted(to_native(ds.find({'timestamp': (9000, 11000)}, ['title', 'activity', 'mime_type'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 2', u'mime_type': 'text/html', u'activity': 'org.sugarlabs.DataStoreTest3'}] Find entries using "non-standard" metadata (only works with dict-based queries or prefixed Xapian query strings): >>> assert sorted(to_native(ds.find({'title': 'DS test object 2'}, ['title', 'activity', 'mime_type', 'tags'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 2', u'mime_type': 'text/html', u'activity': 'org.sugarlabs.DataStoreTest3'}, ... {u'title': 'DS test object 2', u'activity': 'org.sugarlabs.DataStoreTest1', u'mime_type': 'text/plain', u'tags': 'bar baz'}] You can specify a (primary) sort order. Please note that the secondary sort order is undefined / implementation-dependent. >>> assert to_native(ds.find({'order_by': ['+title']}, ['title', 'activity'], byte_arrays=True)[0]) == \ ... [{u'activity': 'org.sugarlabs.DataStoreTest3', u'title': 'DS test object 2'}, ... {u'activity': 'org.sugarlabs.DataStoreTest1', u'title': 'DS test object 2'}, ... {u'activity': 'org.sugarlabs.DataStoreTest1', u'title': 'DS test object 1 updated'}] >>> assert to_native(ds.find({'order_by': ['-title']}, ['title', 'activity'], byte_arrays=True)[0]) == \ ... [{u'activity': 'org.sugarlabs.DataStoreTest1', u'title': 'DS test object 1 updated'}, ... {u'activity': 'org.sugarlabs.DataStoreTest1', u'title': 'DS test object 2'}, ... {u'activity': 'org.sugarlabs.DataStoreTest3', u'title': 'DS test object 2'}] Delete an entry: >>> ds.delete(o1_uid) >>> assert sorted(to_native(ds.find({}, ['title', 'activity'], byte_arrays=True)[0])) == \ ... [{u'title': 'DS test object 2', u'activity': 'org.sugarlabs.DataStoreTest1'}, ... {u'title': 'DS test object 2', u'activity': 'org.sugarlabs.DataStoreTest3'}] Create an entry with content: >>> dog_content = 'The quick brown dog jumped over the lazy fox.' >>> dog_props = {'title': 'dog/fox story', 'mime_type': 'text/plain'} >>> dog_file = tempfile.NamedTemporaryFile() >>> dog_file.write(dog_content) >>> dog_file.flush() >>> dog_uid = ds.create(dog_props, dog_file.name, False) Retrieve and verify the entry with content: >>> dog_retrieved = ds.get_filename(dog_uid) >>> assert(file(dog_retrieved).read() == dog_content) >>> os.remove(dog_retrieved) Update the entry content: >>> dog_content = 'The quick brown fox jumped over the lazy dog.' >>> dog_file.seek(0) >>> dog_file.write(dog_content) >>> dog_file.flush() >>> ds.update(dog_uid, dog_props, dog_file.name, False) Verify updated content: >>> dog_retrieved = ds.get_filename(dog_uid) >>> assert(file(dog_retrieved).read() == dog_content) >>> os.remove(dog_retrieved) >>> dog_file.close()