Пример #1
0
def load():
    ds.flushdb()

    c1 = create_city('Reixte', True)
    c2 = create_city('Damtoo', True)
    c3 = create_city('Toynbe', False)
    create_connection(c1, c2)
    create_connection(c1, c3)

    f1 = create_fighter('Alice', 20, 107.44, 1400000002)
    f2 = create_fighter('Bob', 23, 102.923, 1400000001)

    g1 = create_gang('Ghetto Warriors', f1)
    add_member(g1, f1)
    add_member(g1, f2)
    add_gang_city(g1, c1)
    add_gang_city(g1, c3)
    g2 = create_gang('Midnight Club', Fighter.by_id(0))

    # add weapons to fighter; weapons are owned (owned = True on the
    # SortedSetField), so we attach weapon writer to fighter weapons writer
    weapon_writer = ModelWriter(Weapon)
    fighter_weapons_writer = SortedSetFieldWriter(Fighter.weapons, weapon_writer)
    w1 = Weapon(description = 'second', power = 50.5)
    w2 = Weapon(description = 'third', power = 34.2)
    w3 = Weapon(description = 'first', power = 50.7)
    for w in w1, w2, w3:
        fighter_weapons_writer.append(f1.weapons, w)

    # skills
    skill_writer = ModelWriter(Skill)
    sk1 = Skill(category = 1, name = 'Strength', description = 'Strength...')
    sk2 = Skill(category = 3, name = 'Karate', description = 'Karate...')
    map(skill_writer.create, [sk1, sk2])

    fighter_skill_list_writer = ModelWriter(FighterSkillList)
    f1skills = FighterSkillList()
    f2skills = FighterSkillList()
    fighter_skill_list_writer.create(f1skills, f1)
    fighter_skill_list_writer.create(f2skills, f2)

    # can do this if and only if owned = True in the ListField
    skill_instance_writer = ModelWriter(SkillInstance)
    fighter_skills_writer = ListFieldWriter(FighterSkillList.skills, element_writer = skill_instance_writer)
    ski1 = SkillInstance(skill = sk1.handle(), value = 21)
    ski2 = SkillInstance(skill = sk2, value = 15)
    fighter_skills_writer.append(f1skills.skills, ski1)
    fighter_skills_writer.append(f1skills.skills, ski2)

    ski1 = SkillInstance(skill = sk1, value = 27)
    ski2 = SkillInstance(skill = sk2, value = 91)
    fighter_skills_writer.append(f2skills.skills, ski1)
    fighter_skills_writer.append(f2skills.skills, ski2)
Пример #2
0
def increase_age(name_):
    h = Fighter.find(name = name_)
    ds.hincrby(h.key, 'age')
Пример #3
0
    def test_delete(self):
        example_data.load()

        # delete object updates indexes
        fighter_writer = ModelWriter(Fighter)
        self.assertEqual(ds.hgetall('u:Fighter:name'), {'Alice': '1', 'Bob': '2'})
        self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1', '2']))
        self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2', '1'])
        fighter1 = Fighter(Fighter.by_id(1))
        fighter_writer.delete(fighter1)
        self.assertRaises(NotFoundError, Fighter, Fighter.by_id(1))
        self.assertTrue(fighter1.oid is None)
        self.assertEqual(ds.hgetall('u:Fighter:name'), {'Bob': '2'})
        self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['2']))
        self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2'])

        # delete container item updates indexes
        gang_members_writer = SetFieldWriter(Gang.members)
        self.assertEqual(ds.smembers('Gang:1:members'), set(['1', '2']))
        self.assertEqual(ds.hgetall('u:Gang:members'), {'1': '1', '2': '1'})
        gang1 = Gang(Gang.by_id(1))
        gang_members_writer.remove(gang1.members, Fighter.by_id(1))
        self.assertEqual(ds.smembers('Gang:1:members'), set(['2']))
        self.assertEqual(ds.hgetall('u:Gang:members'), {'2': '1'})

        gang_cities_writer = SetFieldWriter(Gang.cities)
        self.assertEqual(ds.smembers('Gang:1:cities'), set(['1', '3']))
        self.assertEqual(ds.smembers('i:Gang:cities:1'), set(['1']))
        self.assertEqual(ds.smembers('i:Gang:cities:3'), set(['1']))
        gang1 = Gang(Gang.by_id(1))
        gang_cities_writer.remove(gang1.cities, City.by_id(1))
        self.assertEqual(ds.smembers('Gang:1:cities'), set(['3']))
        self.assertFalse(ds.exists('i:Gang:cities:1'))
        self.assertEqual(ds.smembers('i:Gang:cities:3'), set(['1']))

        # delete object updates lists of listed attributes
        self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['1', '2'])
        gang_writer = ModelWriter(Gang)
        gang_writer.delete(gang1)
        self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['2'])

        # autodelete owned item
        fighter_skill_list_writer = ModelWriter(FighterSkillList)
        skill_instance_writer = ModelWriter(SkillInstance)
        fighter_skills_writer = ListFieldWriter(FighterSkillList.skills, element_writer = skill_instance_writer)

        self.assertEqual(ds.lrange('FighterSkillList:1:skills', 0, -1), ['1', '2'])
        self.assertEqual(ds.lrange('FighterSkillList:2:skills', 0, -1), ['3', '4'])
        for i in range(1, 5):
            self.assertTrue(ds.exists('SkillInstance:{0}'.format(i)))

        handle = FighterSkillList.by_owner(Fighter.by_id(2))
        fsl = FighterSkillList(handle)
        ski = SkillInstance(SkillInstance.by_id(3))
        fighter_skills_writer.remove(fsl.skills, ski)

        self.assertTrue(ski.oid is None)
        self.assertEqual(ds.lrange('FighterSkillList:2:skills', 0, -1), ['4'])
        self.assertFalse(ds.exists('SkillInstance:3'))
        self.assertTrue(ds.exists('SkillInstance:4'))

        # don't allow removing not owned object
        ski = SkillInstance(SkillInstance.by_id(1))
        self.assertRaises(NotFoundError, fighter_skills_writer.remove, fsl.skills, ski)
        self.assertTrue(ds.exists('SkillInstance:1'))
Пример #4
0
    def test_read(self):
        handle = Gang.by_id(1)
        gang = Gang(handle)
        self.assertEqual(gang.name, 'Ghetto Warriors')

        members = Set(gang.members)
        self.assertEqual(members, set([Fighter.by_id(1), Fighter.by_id(2)]))

        hfighter1 = Fighter.by_id(1)
        hfighter2 = Fighter.by_id(2)
        fighter1 = Fighter(hfighter1)
        fighter2 = Fighter(hfighter2)
        self.assertEqual(fighter1.name, 'Alice')
        self.assertEqual(fighter2.name, 'Bob')

        dtime = datetime.utcfromtimestamp(1400000001)
        self.assertEqual(fighter2.joined, dtime)

        handle1 = Fighter.by_id(1)
        handle2 = Fighter.by_id(2)
        handle3 = Fighter.by_id(1)
        self.assertEqual(handle1, handle3)
        self.assertFalse(handle1 != handle3)
        self.assertFalse(handle1 == handle2)
        self.assertTrue(handle1 != handle2)

        city = City(fighter1.city)
        self.assertEqual(city.name, 'Reixte')
        self.assertEqual(city.coast, True)
        conns = List(city.connections)
        self.assertEqual(len(conns), 2)
        city2 = City(conns[1])
        self.assertEqual(city2.name, 'Toynbe')
        self.assertEqual(city2.coast, False)

        handle = Gang.by_id(999)
        self.assertRaises(NotFoundError, Gang, handle)

        handle = Fighter.find(name = 'Bob')
        self.assertEqual(handle, fighter2.handle())

        handle = Fighter.find(name = 'NoPlayer')
        self.assertFalse(handle)
        self.assertRaises(NotFoundError, Fighter, handle)

        city_fighters = Fighter.multifind(city = City.by_id(1))
        self.assertEqual(city_fighters, set([hfighter1, hfighter2]))

        handle = Gang.find(leader = hfighter1)
        self.assertEqual(handle, Gang.by_id(1))

        self.assertTrue(not Gang.find(members__contains = Fighter.by_id(3)))
        handle = Gang.find(members__contains = Fighter(hfighter2))
        self.assertEqual(handle, Gang.by_id(1))

        city3 = City(City.by_id(3))
        city_gangs = Gang.multifind(cities__contains = city3)
        self.assertEqual(city_gangs, set([Gang.by_id(1)]))

        handle = FighterSkillList.by_owner(fighter1)
        fsl = FighterSkillList(handle)
        fsl_skills = List(fsl.skills)
        skills = map(SkillInstance, fsl_skills)
        self.assertEqual(skills[0].skill, Skill.by_id(1))
        self.assertEqual(skills[0].value, 21)
        self.assertEqual(skills[1].skill, Skill.by_id(2))
        self.assertEqual(skills[1].value, 15)

        handle = FighterSkillList.by_owner(hfighter2)
        fsl = FighterSkillList(handle)
        fsl_skills = List(fsl.skills)
        skills = map(SkillInstance, fsl_skills)
        self.assertEqual(skills[0].skill, Skill.by_id(1))
        self.assertEqual(skills[0].value, 27)
        self.assertEqual(skills[1].skill, Skill.by_id(2))
        self.assertEqual(skills[1].value, 91)

        sorted_by_weight_1 = Fighter.zrange('weight')
        self.assertEqual(sorted_by_weight_1, [hfighter2, hfighter1])

        sorted_by_weight_2 = Fighter.zrange('weight', 0, 0)
        self.assertEqual(sorted_by_weight_2, [hfighter2])

        sorted_by_weight_3 = Fighter.zrange('weight', 1, -1)
        self.assertEqual(sorted_by_weight_3, [hfighter1])

        sorted_by_weight_4 = Fighter.zrevrange('weight')
        self.assertEqual(sorted_by_weight_4, [hfighter1, hfighter2])

        sorted_by_weight_5 = Fighter.zrevrange('weight', 0, 0)
        self.assertEqual(sorted_by_weight_5, [hfighter1])

        le24a = Fighter.zfind(age__lte = 24)
        le24b = Fighter.zrangebyscore('age', '-inf', 24)
        self.assertEqual(le24a, [hfighter1, hfighter2])
        self.assertEqual(le24a, le24b)

        le23a = Fighter.zfind(age__lte = 23)
        le23b = Fighter.zrangebyscore('age', '-inf', 23)
        self.assertEqual(le23a, [hfighter1, hfighter2])
        self.assertEqual(le23a, le23b)

        lt23a = Fighter.zfind(age__lt = 23)
        lt23b = Fighter.zrangebyscore('age', '-inf', '(23')
        self.assertEqual(lt23a, [hfighter1])
        self.assertEqual(lt23a, lt23b)

        ge24a = Fighter.zfind(age__gte = 24)
        ge24b = Fighter.zrangebyscore('age', 24, '+inf')
        self.assertEqual(ge24a, [])
        self.assertEqual(ge24a, ge24b)

        ge23a = Fighter.zfind(age__gte = 23)
        ge23b = Fighter.zrangebyscore('age', 23, '+inf')
        self.assertEqual(ge23a, [hfighter2])
        self.assertEqual(ge23a, ge23b)

        gt23a = Fighter.zfind(age__gt = 20)
        gt23b = Fighter.zrangebyscore('age', '(20', '+inf')
        self.assertEqual(gt23a, [hfighter2])
        self.assertEqual(gt23a, gt23b)

        age_in_a = Fighter.zfind(age__in = (20, 23))
        age_in_b = Fighter.zrangebyscore('age', 20, 23)
        age_in_c = Fighter.zrangebyscore('age', 20, 23, 0, 2)
        self.assertEqual(age_in_a, [hfighter1, hfighter2])
        self.assertEqual(age_in_a, age_in_b)
        self.assertEqual(age_in_a, age_in_c)

        age_eq_a = Fighter.zfind(age = 20)
        age_eq_b = Fighter.zrangebyscore('age', 20, 20)
        self.assertEqual(age_eq_a, [hfighter1])
        self.assertEqual(age_eq_a, age_eq_b)

        joined_before_2014 = Fighter.zfind(joined__lt = datetime(2014, 1, 1))
        self.assertEqual(joined_before_2014, [])
        joined_before_2020 = Fighter.zfind(joined__lt = datetime(2020, 1, 1))
        self.assertEqual(joined_before_2020, [hfighter2, hfighter1])
        joined_in_201x = Fighter.zfind(joined__in = (datetime(2010, 1, 1), datetime(2020, 1, 1)))
        self.assertEqual(joined_in_201x, [hfighter2, hfighter1])

        rev_age_in_a = Fighter.zrevrangebyscore('age', 23, 20)
        rev_age_in_b = Fighter.zrevrangebyscore('age', 23, 20, 0, 2)
        self.assertEqual(rev_age_in_a, [hfighter2, hfighter1])
        self.assertEqual(rev_age_in_a, rev_age_in_b)

        self.assertEqual(Fighter.zcount('age', 20, 23), 2)
        self.assertEqual(Fighter.zrank('weight', fighter1), 1)
        self.assertEqual(Fighter.zrank('weight', hfighter2), 0)
        self.assertEqual(Fighter.zrevrank('weight', hfighter1), 0)
        self.assertEqual(Fighter.zrevrank('weight', hfighter2), 1)

        hweapon1 = Weapon.by_id(1)
        hweapon2 = Weapon.by_id(2)
        hweapon3 = Weapon.by_id(3)

        sorted_weapons = SortedSet.zrange(fighter1.weapons)
        self.assertEqual(sorted_weapons, (hweapon2, hweapon1, hweapon3))

        top_weapons = SortedSet.zrevrange(fighter1.weapons, 0, 1)
        self.assertEqual(top_weapons, (hweapon3, hweapon1))

        powerful_weapons1 = SortedSet.zfind(fighter1.weapons, gt = 50)
        powerful_weapons2 = SortedSet(fighter1.weapons, gt = 50)
        self.assertEqual(powerful_weapons1, (hweapon1, hweapon3))
        self.assertEqual(powerful_weapons1, powerful_weapons2)

        gangs_by_hqcity = Gang.getlist(hqcity = city3)
        self.assertEqual(gangs_by_hqcity, [Gang.by_id(1), Gang.by_id(2)])

        first_gang_by_hqcity = Gang.getlist(0, 0, hqcity = city3)
        self.assertEqual(first_gang_by_hqcity, [Gang.by_id(1)])
Пример #5
0
    def test_update(self):
        example_data.load()
        fighter_writer = ModelWriter(Fighter)

        # update unique attribute
        fighter = Fighter(Fighter.by_id(2))
        fighter.name = 'Bobby'
        fighter.age = 41
        fighter_writer.update_all(fighter)
        self.assertEqual(ds.hgetall('u:Fighter:name'), {'Alice': '1', 'Bobby': '2'})
        fighter2 = Fighter(Fighter.by_id(2))
        self.assertEqual(fighter2.name, 'Bobby')
        self.assertEqual(fighter2.age, 41)
        fighter_writer.update(fighter2, name = 'Robert', weight = 99.9)
        self.assertEqual(ds.hgetall('u:Fighter:name'), {'Alice': '1', 'Robert': '2'})
        self.assertEqual(fighter2.name, 'Robert')
        self.assertEqual(fighter2.weight, 99.9)
        fighter3 = Fighter(Fighter.by_id(2))
        self.assertEqual(fighter3.name, 'Robert')
        self.assertEqual(fighter3.weight, 99.9)

        # update indexed attribute
        self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1', '2']))
        self.assertEqual(ds.smembers('i:Fighter:city:2'), set())
        fighter1 = Fighter(Fighter.by_id(1))
        fighter2 = Fighter(Fighter.by_id(2))
        fighter2.city = City.by_id(2)
        fighter_writer.update_all(fighter2)
        self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1']))
        self.assertEqual(ds.smembers('i:Fighter:city:2'), set(['2']))
        fighter_writer.update(fighter1, city = City.by_id(2))
        self.assertEqual(ds.smembers('i:Fighter:city:1'), set())
        self.assertEqual(ds.smembers('i:Fighter:city:2'), set(['1', '2']))
        city1 = City(City.by_id(1))
        fighter_writer.update(fighter1, city = city1)
        self.assertEqual(ds.smembers('i:Fighter:city:1'), set(['1']))
        self.assertEqual(ds.smembers('i:Fighter:city:2'), set(['2']))

        # update zindexed attribute
        self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2', '1'])
        fighter_writer.update(fighter1, weight = 99.91)
        self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['2', '1'])
        fighter_writer.update(fighter1, weight = 99.89)
        self.assertEqual(ds.zrange('z:Fighter:weight', 0, -1), ['1', '2'])

        # update listed attribute
        self.assertEqual(ds.lrange('l:Gang:hqcity:1', 0, -1), [])
        self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['1', '2'])
        gang2 = Gang(Gang.by_id(2))
        gang_writer = ModelWriter(Gang)
        gang_writer.update(gang2, hqcity = city1)
        self.assertEqual(ds.lrange('l:Gang:hqcity:1', 0, -1), ['2'])
        self.assertEqual(ds.lrange('l:Gang:hqcity:3', 0, -1), ['1'])

        # update object and sorted set atomically
        self.assertEqual(ds.zrange('Fighter:1:weapons', 0, -1), ['2', '1', '3'])
        self.assertEqual(ds.hgetall('Weapon:2'), {'description': 'third', 'power': '34.2'})
        weapon_writer = ModelWriter(Weapon)
        fighter_weapons_writer = SortedSetFieldWriter(Fighter.weapons, weapon_writer)
        w2 = Weapon(Weapon.by_id(2))
        fighter_weapons_writer.update(fighter1.weapons, w2,
                                      power = 70, description = 'improved')
        self.assertEqual(ds.zrange('Fighter:1:weapons', 0, -1), ['1', '3', '2'])
        self.assertEqual(ds.hgetall('Weapon:2'), {'description': 'improved', 'power': '70'})
        self.assertEqual(w2.power, 70)
        self.assertEqual(w2.description, 'improved')
        w2.power -= 60
        w2.description = 'degraded'
        fighter_weapons_writer.update_all(fighter1.weapons, w2)
        self.assertEqual(ds.zrange('Fighter:1:weapons', 0, -1), ['2', '1', '3'])
        self.assertEqual(ds.hgetall('Weapon:2'), {'description': 'degraded', 'power': '10'})