예제 #1
0
def test_factory():
    smartobject.define_storage(smartobject.JSONStorage())
    smartobject.define_storage(smartobject.DummyStorage(), 'db1')
    factory = smartobject.SmartObjectFactory(Employee)
    employee = factory.create(opts={'name': 'John Doe'})
    pk = employee.id
    factory.set_prop(pk, {'personal_code': '0xFF'})
    factory.save()
    factory.save(pk, force=True)
    factory.serialize(pk)
    s = employee.serialize('salary')
    assert len(s) == 2
    with pytest.raises(RuntimeError):
        employee = factory.create({'name': 'John Doe'})
    employee = factory.create({'name': 'John Doe'}, override=True, load=False)
    assert employee.personal_code is None
    factory.load(pk)
    assert employee.personal_code == 255
    factory.delete(pk)
    employee = factory.create({'name': 'John Doe'}, override=True, load=False)
    employee.delete()
    with pytest.raises(KeyError):
        factory.get(employee.id)
    employee = Employee(name='Jane Doe')
    factory.append(employee)
예제 #2
0
def test_file_cleanup():
    clean()
    smartobject.define_storage(smartobject.JSONStorage())
    smartobject.define_storage(smartobject.DummyStorage(), 'db1')
    factory = smartobject.SmartObjectFactory(Employee)
    names = ['Mike', 'Betty', 'Kate', 'John', 'Boris', 'Ivan']
    for n in names:
        factory.create(opts={'name': n})
    factory.save()
    for n in names:
        p = Path(f'test_data/coders___{n.lower()}.json')
        assert p.exists() and p.is_file()
    factory.clear()
    factory.load_all()
    factory.get('coders/mike')
    factory.get('coders/betty')
    factory.remove('coders/mike')
    factory.remove('coders/betty')
    with pytest.raises(KeyError):
        factory.get('coders/mike')
        factory.get('coders/betty')
    factory.cleanup_storage()
    factory.clear()
    factory.load_all()
    with pytest.raises(KeyError):
        factory.get('coders/mike')
        factory.get('coders/betty')
    factory.clear()
예제 #3
0
def test_t2_save_to_file():
    clean()
    smartobject.define_storage(smartobject.JSONStorage())
    factory = smartobject.SmartObjectFactory(T2, autosave=True)
    i = factory.create().id
    assert i is not None
    factory.clear()
    factory.load_all()
    factory.get(i)
예제 #4
0
def test_t2_save_to_db():
    clean()
    db = _prepare_t2_db()
    storage = smartobject.SQLAStorage(db, 't2')
    smartobject.define_storage(storage)
    factory = smartobject.SmartObjectFactory(T2, autosave=True)
    obj = factory.create()
    obj.set_prop({'login': '******', 'password': '******'}, save=True)
    i = obj.id
    assert i is not None
    factory.clear()
    factory.create(opts={'id': i}, load=True)
    obj = factory.get(i)
    assert obj.login == 'test'
    assert obj.password == '123'
예제 #5
0
def test_load_from_dir():
    clean()
    smartobject.define_storage(smartobject.JSONStorage())
    smartobject.define_storage(smartobject.DummyStorage(), 'db1')
    factory = smartobject.SmartObjectFactory(Employee)
    factory.create(opts={'name': 'John Doe'})
    factory.create(opts={'name': 'Jane Doe'})
    e = factory.create(opts={'name': 'Jack Daniels'})
    e.set_prop('salary', 150)
    key = e.id
    factory.save()
    factory.clear()
    with pytest.raises(KeyError):
        factory.get(key)
    factory.load_all()
    assert len(factory.get()) == 3
    assert factory.get(key).salary == 150 * 100
예제 #6
0
def test_t2_load_from_db():
    clean()
    db = _prepare_t2_db()
    storage = smartobject.SQLAStorage(db, 't2')
    smartobject.define_storage(storage)
    factory = smartobject.SmartObjectFactory(T2, autosave=True)
    ids = []
    for i in range(3):
        obj = factory.create()
        obj.set_prop({'login': f'test{obj.id}', 'password': '******'}, save=True)
        ids.append(obj.id)
    assert len(ids) == 3
    factory.clear()
    factory.load_all()
    for i in ids:
        o = factory.get(i)
        assert o.password == '123'
        assert o.login == f'test{o.id}'
예제 #7
0
def test_factory_lru():
    clean()
    smartobject.define_storage(smartobject.JSONStorage())
    factory = smartobject.SmartObjectFactory(T2,
                                             autoload=True,
                                             autosave=True,
                                             maxsize=2)
    o1 = factory.create()
    o2 = factory.create()
    o3 = factory.create()
    assert len(factory._objects) == 2
    factory.get(o3.id)
    assert len(factory._objects) == 2
    factory.get(o2.id)
    assert len(factory._objects) == 2
    factory.get(o1.id)
    assert len(factory._objects) == 2
    with pytest.raises(RuntimeError):
        factory.cleanup_storage()
예제 #8
0
def test_factory_indexes():
    clean()
    smartobject.define_storage(smartobject.JSONStorage())
    factory = smartobject.SmartObjectFactory(T2, autosave=True)
    factory.add_index('login')
    o1 = factory.create()
    o2 = factory.create()
    o3 = factory.create()
    o1.set_prop('login', 'test')
    o2.set_prop('login', 'test2')
    o3.set_prop('login', 'test')
    factory.reindex(o1.id)
    factory.reindex(o2.id)
    factory.reindex(o3.id)
    factory.reindex(o3.id)
    assert len(factory.get('test', prop='login')) == 2
    factory.remove(o1)
    assert len(factory.get('test', prop='login')) == 1
    factory.remove(o3)
    assert len(factory.get('test', prop='login')) == 0
예제 #9
0
def test_db_cleanup():
    clean()
    db = _prepare_t2_db()
    storage = smartobject.SQLAStorage(db, 't2')
    smartobject.define_storage(storage)
    factory = smartobject.SmartObjectFactory(T2, autosave=True)
    o1 = factory.create()
    o2 = factory.create()
    o3 = factory.create()
    o4 = factory.create()
    o1.load()
    o2.load()
    o3.load()
    o4.load()
    factory.remove(o3.id)
    o3.load()
    factory.cleanup_storage()
    o1.load()
    o2.load()
    with pytest.raises(LookupError):
        o3.load()
    o4.load()
예제 #10
0
def test_factory_load_by_secondary():
    db = _prepare_t2_db()
    storage = smartobject.SQLAStorage(db, 't2')
    smartobject.define_storage(storage)
    factory = smartobject.SmartObjectFactory(T2, autoload=True, autosave=True)
    factory.add_index('login')
    o1 = factory.create()
    o2 = factory.create()
    o3 = factory.create()
    o4 = factory.create()
    o1.set_prop('login', 'test')
    o2.set_prop('login', 'test')
    o3.set_prop('login', 'test2')
    o4.set_prop('login', 'test3')
    factory.save()
    factory.clear()
    test1 = factory.get(o1.id)
    tests = factory.get('test', prop='login')
    assert len(tests) == 1
    tests = factory.get('test', prop='login', get_all=True)
    assert len(tests) == 2
    tests = factory.get('test2', prop='login', get_all=True)
    assert len(tests) == 1
예제 #11
0
def test_factory_autoload():
    clean()
    storage = smartobject.JSONStorage()
    storage.allow_empty = False
    smartobject.define_storage(storage)
    factory = smartobject.SmartObjectFactory(T2, autoload=True, autosave=True)
    o1 = factory.create()
    o2 = factory.create()
    o3 = factory.create()
    o1.set_prop('login', 'test1')
    o2.set_prop('login', 'test2')
    o3.set_prop('login', 'test3')
    factory.save()
    pk1 = o1.id
    pk2 = o2.id
    pk3 = o3.id
    factory.clear()
    import os
    os.unlink(f'test_data/{pk3}.json')
    assert factory.get(pk1).serialize()['login'] == 'test1'
    assert factory.get(pk2).serialize()['login'] == 'test2'
    with pytest.raises(FileNotFoundError):
        assert factory.get(pk3)
예제 #12
0
import smartobject


class Person(smartobject.SmartObject):
    def __init__(self, name):
        self.name = name
        self.load_property_map('person.yml')
        self.apply_property_map()


smartobject.config.storage_dir = 'data'

smartobject.define_storage(smartobject.JSONStorage())
smartobject.define_storage(smartobject.RedisStorage(), 'r1')

people = smartobject.SmartObjectFactory(Person)

# create objects with factory
people.create(opts={'name': 'John'})
people.create(opts={'name': 'Jane'})

# create object manually
jack = Person('Jack')

# you can set a single prop
people.set_prop('John', 'sex', 'male')
people.set_prop('Jane', 'sex', 'female')
# or multiple props with dict
# heartbeat value is automatically written to Redis
jack.set_prop({'sex': 'male', 'heartbeat': 100})