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))
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
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))
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)
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)
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)