zoom.store module

zoom.store

key value store

class zoom.store.EntityStore(db, klass=<class 'dict'>, kind=None)

Bases: zoom.store.Store

stores entities

>>> db = setup_test()
>>> stuff = EntityStore(db)
>>> stuff.put(dict(name='Joe', age=14))
1
>>> stuff.put(dict(name='Sally', age=34))
2
>>> stuff.put(dict(name='Sam', age=34))
3
>>> print(zoom.utils.RecordList(stuff.find(name='Joe')))
dict
_id name age
--- ---- ---
  1 Joe   14
1 dict records
>>> s = stuff.find(age=34)
>>> print(s)
dict
_id name  age
--- ----- ---
  2 Sally  34
  3 Sam    34
2 dict records
>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> people.kind
'person'
>>> joe = Person(name='Joe', age=20, birthdate=datetime.date(1992,5,5))
>>> joe
<Person {'name': 'Joe', 'age': 20, 'birthdate': datetime.date(1992, 5, 5)}>
>>> people.put(joe)
1
>>> person = people.get(1)
>>> person
<Person {'name': 'Joe', 'age': 20, 'birthdate': datetime.date(1992, 5, 5)}>
>>> sally = Person(name='Sally', kids=0, birthdate=datetime.date(1992,5,5))
>>> people.put(sally)
2
>>> sally = people.find(name='Sally')
>>> sally
[<Person {'name': 'Sally', 'kids': 0, 'birthdate': datetime.date(1992, 5, 5)}>]
>>> sally = people.first(name='Sally')
>>> sally
<Person {'name': 'Sally', 'kids': 0, 'birthdate': datetime.date(1992, 5, 5)}>
>>> sally.kids += 1
>>> people.put(sally)
2
>>> people.first(name='Sally')
<Person {'name': 'Sally', 'kids': 1, 'birthdate': datetime.date(1992, 5, 5)}>
>>> sally = people.first(name='Sally')
>>> sally.kids += 1
>>> people.put(sally)
2
>>> people.first(name='Sally')
<Person {'name': 'Sally', 'kids': 2, 'birthdate': datetime.date(1992, 5, 5)}>
>>> sally = people.first(name='Sally')
>>> sally.kids += 1
>>> people.put(sally)
2
>>> people.first(name='Sally')
<Person {'name': 'Sally', 'kids': 3, 'birthdate': datetime.date(1992, 5, 5)}>
>>> class Misc(EntityStore): pass
>>> misc = Misc(db, dict)
>>> config_info = dict(host='database', name='somename')
>>> id = misc.put(config_info)
>>> x = misc.put(dict(other='this', stuff='that'))
>>> my_info = misc.get(id)
>>> Record(my_info)
<Record {'name': 'somename', 'host': 'database'}>
>>> Record(misc.get(x))
<Record {'other': 'this', 'stuff': 'that'}>
>>> people = EntityStore(db, 'person')
>>> people.klass
<class 'dict'>
>>> people.kind
'person'
>>> print(sorted(people.first(name='Sally').items()))
[('__store', <EntityStore(dict)>), ('_id', 2), ('birthdate', datetime.date(1992, 5, 5)), ('kids', 3), ('name', 'Sally')]
>>> print(Person(people.first(name='Sally')))
Person
  name ................: 'Sally'
  kids ................: 3
  birthdate ...........: datetime.date(1992, 5, 5)
>>> EntityStore(db, 'person').first(name='Joe')['age']
20
>>>
>>> name = 'somename'
>>> id = misc.put(dict(host='database', name=name))
>>> my_info = misc.get(id)
>>> assert type(my_info['name'])==type(name)
all()

Retrieves all entities

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sally', age=25))
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Joe', age=25))
>>> people.all()
[<Person {'name': 'Sally', 'age': 25}>, <Person {'name': 'Sam', 'age': 25}>, <Person {'name': 'Joe', 'age': 25}>]
>>> db.close()
delete(*args, **kwargs)

delete entities

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sally', age=25))
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Joe', age=25))
>>> joe = people.get(id)
>>> id
3
>>> bool(joe)
True
>>> joe
<Person {'name': 'Joe', 'age': 25}>
>>> people.delete(id)
[3]
>>> joe = people.get(id)
>>> joe
>>> bool(joe)
False
>>> bool(people.find(name='Sally'))
True
>>> people.delete(name='Sallie')
>>> bool(people.find(name='Sally'))
True
>>> people.delete()
>>> people.delete(name='Sally')
[1]
>>> bool(people.find(name='Sally'))
False
>>> db.close()
exists(keys=None)

tests for existence of an entity

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sally', age=25))
>>> sally = people.get(id)
>>> sally
<Person {'name': 'Sally', 'age': 25}>
>>> people.exists(1)
True
>>> people.exists(2)
False
>>> people.exists([1, 2])
[True, False]
>>> id = people.put(Person(name='Sam', age=25))
>>> people.exists([1, 2])
[True, True]
>>> db.close()
find(**kv)

finds entities that meet search criteria

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Sally', age=55))
>>> id = people.put(Person(name='Bob', age=25))
>>> print(people.find(age=25))
person
_id name age
--- ---- ---
  1 Sam   25
  3 Bob   25
2 person records
>>> len(people.find(name='Sam'))
1
>>> db.close()
first(**kv)

finds the first entity that meet search criteria

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Sally', age=55))
>>> id = people.put(Person(name='Bob', age=25))
>>> people.first(age=5)
>>> people.first(age=55)
<Person {'name': 'Sally', 'age': 55}>
>>> people.first()
<Person {'name': 'Sam', 'age': 25}>
>>> db.close()
get(keys)

retrives entities

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(**{'name': 'Sam', 'age':15,
...     'salary': decimal.Decimal('100.00')}))
>>> sam = people.get(id)
>>> sam
<Person {'name': 'Sam', 'age': 15, 'salary': Decimal('100.00')}>
>>> people.put(Person(name='Jim', age=21,
...    salary=decimal.Decimal('50')))
2
>>> people.put(Person(name='Alice', age=29))
3
>>> print(people)
person
_id name  age salary
--- ----- --- ------
  1 Sam    15 100.00
  2 Jim    21 50
  3 Alice  29 None
3 person records
>>> print(people.get([1, '3']))
person
_id name  age salary
--- ----- --- ------
  1 Sam    15 100.00
  3 Alice  29 None
2 person records
>>> db.close()
get_attributes()

get complete set of attributes for the entity type

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> sam = Person(**{'name': 'Sam', 'age':15})
>>> sorted(sam.keys())
['age', 'name']
>>> id = people.put(sam)
>>> sorted(people.get_attributes())
['age', 'name']
>>> db.close()
last(**kv)

finds the last entity that meet search criteria

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Sally', age=55))
>>> id = people.put(Person(name='Bob', age=25))
>>> people.last(age=5)
>>> people.last(age=25)
<Person {'name': 'Bob', 'age': 25}>
>>> db.close()
put(entity)

stores an entity

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> sally = Person(name='Sally', age=25)
>>> sally
<Person {'name': 'Sally', 'age': 25}>
>>> id = people.put(Person(name='Sally', age=25))
>>> id
1
>>> sally
<Person {'name': 'Sally', 'age': 25}>
>>> sally = people.get(id)
>>> sally
<Person {'name': 'Sally', 'age': 25}>
>>> sally.age = 35
>>> people.put(sally)
1
>>> person = people.get(id)
>>> person
<Person {'name': 'Sally', 'age': 35}>
>>> id = people.put({'name':'James', 'age':15})
>>> id
2
>>> people.get(id)
<Person {'name': 'James', 'age': 15}>
>>> classes = ['one', 'Not this one']
>>> grades = (('one', 'A'), ('Not this one', 'C+'), )
>>> id = people.put({'name':'James', 'classes':classes, 'grades': grades})
>>> assert classes == people.get(id).classes
>>> assert len(people.get(id).grades) == 2  # json dump/load will bring back all tuples as lists
>>> db.close()
search(text)

search for entities that match text

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Sally', age=55))
>>> id = people.put(Person(name='Bob', age=25))
>>> list(people.search('bob'))
[<Person {'name': 'Bob', 'age': 25}>]
>>> for r in list(people.search(25)): print(r)
Person
  name ................: 'Sam'
  age .................: 25
Person
  name ................: 'Bob'
  age .................: 25
>>> list(people.search('Bill'))
[]
>>> db.close()
zap()

deletes all entities of the given kind

>>> db = setup_test()
>>> class Person(Entity): pass
>>> class People(EntityStore): pass
>>> people = People(db, Person)
>>> id = people.put(Person(name='Sally', age=25))
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Joe', age=25))
>>> people.all()
[<Person {'name': 'Sally', 'age': 25}>, <Person {'name': 'Sam', 'age': 25}>, <Person {'name': 'Joe', 'age': 25}>]
>>> people.zap()
>>> people.all()
[]
>>> db.close()
class zoom.store.Store

Bases: object

after_delete(record)
after_insert(record)
after_update(record)
before_delete(record)
before_insert(record)
before_update(record)
zoom.store.entify(rs, storage)

converts query result into an EntityList

zoom.store.store_of(klass, db=None)

Returns a store of the given entity class

The klass parameter can be a subclass of zoom.Model or an entity kind. If a zoom.Model is provided the actual entity kind is derived from the class name. If the entity kind is provivded as a string then it’s taken as-is.

Uses the current site database if none is provided.

>>> site = zoom.sites.Site()
>>> class Person(Entity): pass
>>> people = store_of(Person, site.db)
>>> id = people.put(Person(name='Sam', age=25))
>>> id = people.put(Person(name='Sally', age=55))
>>> id = people.put(Person(name='Bob', age=25))
>>> person = people.first(name='Sally')
>>> person['age']
55