Beispiel #1
0
def test_reparent_diamond(manager):
    """
                 -[:ISA]- (Flavouring) <-[:ISA]-
               /                                \
    (Edible) <-                                  - (Beetroot) <-[:ISA]-
               \                               /                       |
                 -[:ISA]- (Colouring) <-[:ISA]-                   (GoldenBeet)
    becomes:
    (Edible) <-[:ISA]- (Vegetable) <-[:ISA]- (Beetroot) <-[:ISA]- (GoldenBeet)
    """
    Edible = type("Edible", (Entity,), {})
    XFlavouring = type("XFlavouring", (Edible,), {})
    XColouring = type("XColouring", (Edible,), {})

    XBeetroot = manager.create_type("XBeetroot", (XFlavouring, XColouring), {})
    GoldenBeet = manager.create_type("GoldenBeet", (XBeetroot,), {})

    Vegetable = type("Vegetable", (Edible,), {})

    manager.save(GoldenBeet)
    manager.save(Vegetable)
    manager.update_type(XBeetroot, (Vegetable,))

    UpdatedBeetroot = manager.type_registry.get_class_by_id(
        get_type_id(XBeetroot))
    UpdatedGoldenBeet = manager.type_registry.get_class_by_id(
        get_type_id(GoldenBeet))
    assert issubclass(UpdatedBeetroot, Vegetable)
    assert issubclass(UpdatedGoldenBeet, UpdatedBeetroot)
    assert not issubclass(UpdatedBeetroot, (XFlavouring, XFlavouring))
    assert not issubclass(UpdatedGoldenBeet, (XFlavouring, XFlavouring))
Beispiel #2
0
def test_reparent_with_declared_attributes(manager, static_types):
    """
        (Mammal) <-[:ISA]- (Whale) <-[:ISA]- (Orca) <-[:DECLAREDON]- (name)
    becomes:
        (Mammal) <-[:ISA]- (Cetacean) <-[:ISA]- (Whale) <-[:ISA]- (Orca)
                                                                     ^
                                              (name) -[:DECLAREDON] -'
    """
    Cetacean = static_types['Cetacean']
    Mammal = static_types['Mammal']

    Whale = manager.create_type('Whale', (Mammal,), {})
    Orca = manager.create_type('Orca', (Whale,), {'name': String()})
    manager.save(Orca)

    manager.save(Cetacean)
    manager.update_type(Whale, (Cetacean,))

    UpdatedWhale = manager.type_registry.get_class_by_id(get_type_id(Whale))
    UpdatedOrca = manager.type_registry.get_class_by_id(get_type_id(Orca))
    assert UpdatedOrca.__bases__ == (UpdatedWhale,)
    assert issubclass(UpdatedOrca, Cetacean)

    descriptor = manager.type_registry.get_descriptor(UpdatedOrca)
    assert "name" in descriptor.declared_attributes
Beispiel #3
0
def test_reparent_multiple_inheritance(manager):
    """
        (Noun) <-[:ISA]-                      (Verb) <-[:ISA]-
                         \                                     \
                          (Mop)    becomes:                     (Mop)
                         /                                     /
    (Physical) <-[:ISA]-                    (Action) <-[:ISA]-
    """
    Physical = type("Pysical", (Entity,), {})
    Action = type("Action", (Entity,), {})
    Word = type("Word", (Entity,), {})
    Noun = type("Noun", (Word,), {})
    Verb = type("Verb", (Word,), {})

    Mop = manager.create_type('Mop', (Physical, Noun), {})
    manager.save(Mop)

    manager.save(Action)
    manager.save(Verb)
    manager.update_type(Mop, (Action, Verb,))

    UpdatedMop = manager.type_registry.get_class_by_id(get_type_id(Mop))
    assert UpdatedMop.__bases__ == (Action, Verb,)
    assert issubclass(UpdatedMop, Action)
    assert issubclass(UpdatedMop, Verb)
    assert not issubclass(UpdatedMop, (Physical, Noun))
Beispiel #4
0
def test_reparent_with_instances(manager, static_types):
    """
        (Mammal) <-[:ISA]- (Whale) <-[:ISA]- (Orca) <-[:INSTANCEOF]- (willy)
    becomes:
        (Mammal) <-[:ISA]- (Cetacean) <-[:ISA]- (Orca) <-[:INSTANCEOF]- (willy)
    """
    Cetacean = static_types['Cetacean']
    Mammal = static_types['Mammal']

    Whale = manager.create_type('Whale', (Mammal,), {})
    Orca = manager.create_type('Orca', (Whale,), {})
    willy = Orca(name="willy")

    manager.save(Orca)
    manager.save(willy)

    manager.save(Cetacean)
    manager.update_type(Orca, (Cetacean,))

    UpdatedOrca = manager.type_registry.get_class_by_id(get_type_id(Orca))
    assert UpdatedOrca.__bases__ == (Cetacean,)
    assert issubclass(UpdatedOrca, Cetacean)

    updated_willy = manager.get(Orca, name="willy")
    assert updated_willy.__class__ == UpdatedOrca
    assert isinstance(updated_willy, Cetacean)
Beispiel #5
0
def test_reparent_with_matching_attributes(manager):
    """ Reparenting with different but identical attributes is allowed.
    """
    with collector() as collected:
        class C(Entity):
            foo = String()

        class D(Entity):
            foo = String()
    manager.save_collected_classes(collected)

    E = manager.create_type('E', (C,), {})
    manager.save(E)

    manager.update_type(E, (D,))

    UpdatedD = manager.type_registry.get_class_by_id(get_type_id(D))
    UpdatedE = manager.type_registry.get_class_by_id(get_type_id(E))
    assert UpdatedE.__bases__ == (UpdatedD,)
    assert issubclass(UpdatedE, UpdatedD)
Beispiel #6
0
def test_reparent_with_subtypes(manager, static_types):
    """
        (Mammal) <-[:ISA]- (Whale) <-[:ISA]- (Orca)
    becomes:
        (Mammal) <-[:ISA]- (Cetacean) <-[:ISA]- (Whale) <-[:ISA]- (Orca)
    """
    Cetacean = static_types['Cetacean']
    Mammal = static_types['Mammal']

    Whale = manager.create_type('Whale', (Mammal,), {})
    Orca = manager.create_type('Orca', (Whale,), {})
    manager.save(Orca)

    manager.save(Cetacean)
    manager.update_type(Whale, (Cetacean,))

    UpdatedWhale = manager.type_registry.get_class_by_id(get_type_id(Whale))
    UpdatedOrca = manager.type_registry.get_class_by_id(get_type_id(Orca))
    assert UpdatedOrca.__bases__ == (UpdatedWhale,)
    assert issubclass(UpdatedOrca, Cetacean)