示例#1
0
class TestSavedTypes(unittest.TestCase):
    def setUp(self):

        class MyTestEntity(Entity):
            declared_params = { "some_param": "string" }

        self.MyTestEntity = MyTestEntity

        self.connection = Connection.test()
        self.connection.create_tables()
        self.m = Mapper(self.connection)
        
        self.m.register(self.MyTestEntity)
        
    def tearDown(self):
        self.connection.drop_tables()
        # need to dispose manually to avoid too many connections error
        self.connection.engine.dispose()


    def test_entity_type_is_correct(self):
        ent = self.MyTestEntity(some_param = "a short string")
        self.assertEqual(ent.type, "MyTestEntity")
        self.assertEqual(ent._type, "MyTestEntity_0b97eed8bcd1ab0ceb7370dd2f9d8cb9")

        self.m.save(ent)
        self.assertEqual(ent.type, "MyTestEntity")
        self.assertEqual(ent._type, "MyTestEntity_0b97eed8bcd1ab0ceb7370dd2f9d8cb9")

        found = self.m.find(Entity).one()
        self.assertEqual(found.type, "MyTestEntity")
        self.assertEqual(found._type, "MyTestEntity_0b97eed8bcd1ab0ceb7370dd2f9d8cb9")

    def test_entity_type_is_class_name(self):
        ent = self.MyTestEntity(some_param = "a short string")
        self.assertEqual(ent._type, ent.__class__.__name__)

    def test_polymorphic_id_is_type(self):
        ent = self.MyTestEntity(some_param = "a short string")
        self.assertEqual(ent._type, ent.__mapper_args__["polymorphic_identity"])
示例#2
0
class TestTypeMagic(unittest.TestCase):
    def setUp(self):
        self.connection = Connection.test()
        self.connection.create_tables()
        self.m = Mapper(self.connection)

    def tearDown(self):
        self.connection.drop_tables()
        # need to dispose manually to avoid too many connections error
        self.connection.engine.dispose()

    def test_rebrand(self):
        class E0(Entity):
            declared_params = {
                "q": "integer"
            }

        class E1(Entity):
            declared_params = {
                "q": "integer",
                "q1": "integer"
            }

        e0 = E0(q=100)
        self.m.save(e0)

        self.m.rebrand(E0, E1)

        # trying to load something from e0 now raises
        self.assertRaises(DetachedInstanceError, lambda: e0.type)
        self.assertRaises(DetachedInstanceError, lambda: dict(e0.params)) # lazy, so we call dict

        e1 = self.m.find_roots()[0]

        #self.m.session.expunge(e1)

        import pdb
        #pdb.set_trace()

        self.assertEqual(e1._type, E1.__name__)
        self.assertEqual(e1.params["q"], 100)

        e1.params["q"] = 0
        e1.params["q1"] = 0

    def test_multi_step_rebrand(self):
        class MyEntity1(Entity):
            declared_params = {
                "name": "string",
                "version": "integer"
            }

        class MyEntity2a(Entity):
            declared_params = {
                "name": "string",
                "version": "integer",
                "version_string": "string",
                "release_date": "date"
            }

        class MyEntity2b(Entity):
            declared_params = {
                "name": "string",
                "version_string": "string",
                "release_date": "date"
            }

        class MyEntity3(Entity):
            declared_params = {
                "name": "string",
                "version": "string",
                "release_date": "date"
            }

        orig_entities = [
            MyEntity1(name="abc", version=1),
            MyEntity1(name="def", version=2),
            MyEntity1(name="ghi", version=3),
            MyEntity1(name="jkl", version=4),
            MyEntity1(name="mno", version=5),
            MyEntity1(name="pqr", version=6),
            MyEntity1(name="stu", version=7)
        ]

        self.m.save(*orig_entities)

        def change_version_string_add_date(e, params):
            params["version_string"] = str(params["version"])
            del params["version"]
            params["release_date"] = datetime.date.today()
            return params

        def change_version_string(e, params):
            params["version"] = params["version_string"]
            del params["version_string"]
            return params

        self.assertEqual(len(self.m.find(MyEntity1).all()), 7)
        self.assertEqual(len(self.m.find(MyEntity3).all()), 0)

        version_1 = [e.params["version"] for e in self.m.find(MyEntity1)]
        self.assertEqual(len(version_1), 7)
        self.assertTrue(all(type(v)==int for v in version_1))

        # we cannot rebrand directly:
        self.assertRaises(ValueError, self.m.rebrand, MyEntity1, MyEntity3)

        # do the rebranding
        self.m.rebrand(MyEntity1, MyEntity2a, after=change_version_string_add_date)

        # still won’t work to do this directly
        self.assertRaises(ValueError, self.m.rebrand, MyEntity2a, MyEntity3)
        self.m.rebrand(MyEntity2a, MyEntity2b)

        self.m.rebrand(MyEntity2b, MyEntity3, after=change_version_string)

        self.assertEqual(len(self.m.find(MyEntity1).all()), 0)
        self.assertEqual(len(self.m.find(MyEntity3).all()), 7)

        version_3 = [e.params["version"] for e in self.m.find(MyEntity3)]
        self.assertEqual(len(version_3), 7)
        self.assertTrue(all(isinstance(v, basestring) for v in version_3))
示例#3
0
from xdapy import Mapper, Connection, Entity

connection = Connection.default()

m = Mapper(connection)

from objects import Experiment, Observer, Trial, Session

m.register(Experiment, Observer, Trial, Session)

print set(str(o.parent) for o in m.find_all("Session"))

obs = m.find("Observer", {"name": "%Frank%"}).all()

print obs[0].data

import pdb
pdb.set_trace()

#print m.find_with("Session").parent(m.find("Observer", {"name": ["%Alex%", "%Frank%"]})).all()

from xdapy.operators import gt, lt
#trials = m.find_with("Trial", {"_id": lambda id: id*id < 300}).parent(m.find_with("Session", {"_id": lt(300)}).parent(m.find("Observer", {"name": "%Alex%"}))).all()


trials = m.find_with("Trial", {"_id": lambda id: id*id < 300,
    "_parent": ("Session", {"_id": lt(300), "_parent": ("Observer", {"name": "%Alex%"})}),
    "_with": lambda entity: entity.id != 10})


# find_complex is more powerful but does not use SQLAlchemy
示例#4
0
class TestAll(unittest.TestCase):

    def setUp(self):
        self.connection = Connection.test()
        self.connection.create_tables()
        self.mapper = Mapper(self.connection)

        #register params
        self.mapper.register(Observer, Experiment, Session, Trial)
        #_register_parameter('Observer', 'name', 'string')
        #self.p._register_parameter('Observer', 'age', 'integer')
        #self.p._register_parameter('Observer', 'handedness', 'string')
        #self.p._register_parameter('Experiment', 'project', 'string')
        #self.p._register_parameter('Experiment', 'experimenter', 'string')
        #self.p._register_parameter('Session', 'date', 'string')
        #self.p._register_parameter('Trial', 'time', 'string')
        #self.p._register_parameter('Trial', 'rt', 'integer')
        #self.p._register_parameter('Trial', 'valid', 'integer')
        #self.p._register_parameter('Trial', 'response', 'string')

        #create hierarchy
        self.e1 = Experiment(project='MyProject', experimenter="John Doe")
        self.e2 = Experiment(project='YourProject', experimenter="Jeanne Done")

        self.o3 = Observer(name="Max Mustermann", handedness="right", age=26)
        self.o4 = Observer(name="Susanne Sorgenfrei", handedness='left', age=38)
        self.o5 = Observer(name="Susi Sorgen", handedness='left', age=40)

        self.s6 = Session(date='2009-08-20')
        self.s7 = Session(date='2009-09-21')
        self.s8 = Session(date='2009-09-22')
        self.s9 = Session(date='2009-09-23')
        self.s10 = Session(date='2009-09-24')

        self.t11 = Trial(rt=int(randint(100, 3000)), valid=True, response='left')
        self.t12 = Trial(rt=randint(100, 3000), valid=True, response='right')
        self.t13 = Trial(rt=randint(100, 3000), valid=True, response='left')
        self.t14 = Trial(rt=randint(100, 3000), valid=True, response='right')
        self.t15 = Trial(rt=randint(100, 3000), valid=True, response='left')
        self.t16 = Trial(rt=randint(100, 3000), valid=True, response='right')
        self.t17 = Trial(rt=randint(100, 3000), valid=True, response='left')
        self.t18 = Trial(rt=randint(100, 3000), valid=False, response='right')
        self.t19 = Trial(rt=randint(100, 3000), valid=False, response='left')
        self.t20 = Trial(rt=randint(100, 3000), valid=False, response='right')
        self.t21 = Trial(rt=randint(100, 3000), valid=False, response='left')
        self.t22 = Trial(rt=randint(100, 3000), valid=False, response='right')
        self.t23 = Trial(rt=randint(100, 3000), valid=False, response='left')
        self.t24 = Trial(rt=randint(100, 3000), valid=False, response='right')

        self.mapper.save(self.e1, self.e2, self.o3, self.o4, self.o5, self.s6,
                    self.s7, self.s8, self.s9, self.s10, self.t11, self.t12,
                    self.t13, self.t14, self.t15, self.t16, self.t17, self.t18,
                    self.t19, self.t20, self.t21, self.t22, self.t23, self.t24)

        self.e1.children.append(self.o3)
        self.e1.children.append(self.o4)
        self.e2.children.append(self.o4)
        self.o3.children.append(self.s6)
        self.o3.children.append(self.s7)
        self.o4.children.append(self.s8)#, self.e1) # TODO: Children can be saved twice
        #self.o4.children.append(self.s8)#, self.e2)
        self.o4.children.append(self.s9)#, self.e2)
        self.o4.children.append(self.s10)#, self.e2)
        self.s6.children.append(self.t11)
        self.s6.children.append(self.t12)
        self.s7.children.append(self.t13)
        self.s7.children.append(self.t14)
        #self.s8.children.append(self.t15, self.e1)
        #self.s8.children.append(self.t16, self.e1)
        #self.s8.children.append(self.t17, self.e2)
        self.s9.children.append(self.t18)
        self.s9.children.append(self.t19)
        self.s9.children.append(self.t20)
        self.s10.children.append(self.t21)
        self.s10.children.append(self.t22)
        self.s10.children.append(self.t23)
        self.s10.children.append(self.t24)

        self.mapper.save(self.e1, self.e2, self.o3, self.o4, self.o5, self.s6,
                    self.s7, self.s8, self.s9, self.s10, self.t11, self.t12,
                    self.t13, self.t14, self.t15, self.t16, self.t17, self.t18,
                    self.t19, self.t20, self.t21, self.t22, self.t23, self.t24)

    def tearDown(self):
        self.connection.drop_tables()
        # need to dispose manually to avoid too many connections error
        self.connection.engine.dispose()

    def testReturn(self):
        self.assertEqual(self.mapper.find_first(Observer(name="Susanne Sorgenfrei")).children, [self.s8, self.s9, self.s10])
        self.assertEqual(self.mapper.find_first(Observer(name="Susi Sorgen")).children, [])
        self.assertEqual(self.mapper.find_first(Observer(name="Max Mustermann")).children, [self.s6, self.s7])
        self.assertEqual(self.mapper.find_first("Observer", {"name": "Max Mustermann"}).children, [self.s6, self.s7])

        self.assertEqual(self.mapper.find("Trial").count(), 14)
        self.assertEqual(self.mapper.find_first("Observer", {"name": "Max"}, {"strict": False}).children, [self.s6, self.s7])
        self.assertEqual(self.mapper.find_first(Observer(name="Max"), options={"strict": False}).children, [self.s6, self.s7])

        self.assertEqual(self.mapper.find_first(Session(date='2009-09-24')), self.s10)
        self.assertEqual(self.mapper.find_all(Session, {"date": "2009"}, options={"strict": False, "convert_string": True}), [self.s6, self.s7, self.s8, self.s9, self.s10])
#        self.assertEqual(self.mapper.find_all(Session, {"date": "2009-09"}, options={"strict": False, "convert_string": True}), [self.s7, self.s8, self.s9, self.s10])
        self.assertEqual(self.mapper.find_all(Session, {"date": "2009-08"}, options={"strict": False, "convert_string": True}), [self.s6])
示例#5
0
experiment1 = Experiment(project="Fake Experiment", experimenter="Aaron Duindam")
experiment2 = Experiment(project="Complex Experiment", experimenter="Yasmin J. Winter")

observer1 = Observer(name=u"Irena Albertsdóttir", age=44)
observer2 = Observer(name="Semrawit Welde", age=28)
observer3 = Observer(name="Giraldo Ortega Rico", age=18)
observer4 = Observer(name="Isabel Blomqvist", age=47)

m.save(experiment1, experiment2, observer1, observer2, observer3, observer4)

#print m.toXML()

# find an object…
from xdapy.operators import *
print m.find_all(Experiment, {'experimenter': "John Do"})
print m.find(Experiment, {'experimenter': "John Do"}).all()
print m.find(Experiment, {'experimenter': "John Do"}).first()
print m.find_all(Experiment(experimenter="John Do"))
print m.find_all(Experiment, {'experimenter': "%J%"})


print m.find_all(Observer, filter={"name": "%Blom%"})
print m.find_all(Observer, filter={"name": ["%"]})
print m.find_all(Observer, filter={"age": range(30, 50), "name": ["%Alb%"]})
print m.find_all(Observer, filter={"age": between(30, 50)})
print m.find_all(Observer, filter={"age": 18})
print m.find_all(Observer, filter={"age": gt(20)})
#print m.find_all(Session, filter={"date": ge(datetime.date.today())})


# Example for sqlalchemy query syntax