def remove(self, entity): trv = SourceTargetDataTreeTraverser.make_traverser( None, entity, RELATION_OPERATIONS.REMOVE, accessor=self) trv.run(self.__visitor)
def add(self, entity): trv = SourceTargetDataTreeTraverser.make_traverser( entity, None, RELATION_OPERATIONS.ADD, accessor=self) trv.run(self.__visitor)
def update(self, entity, target=None): trv = SourceTargetDataTreeTraverser.make_traverser( entity, target, RELATION_OPERATIONS.UPDATE, accessor=self) trv.run(self.__visitor) return self.__visitor.root
def test_make_traverser_update(self): ent0 = create_entity(entity_id=0) ent1 = create_entity(entity_id=None) agg = create_staging_collection(IMyEntity).get_aggregate() agg.add(ent0) agg.add(ent1) ent01 = create_entity(entity_id=0) ent11 = create_entity(entity_id=None) # With many as source and one as target. with self.assert_raises(ValueError) as cm: SourceTargetDataTreeTraverser.make_traverser( [ent01, ent1], ent0, RELATION_OPERATIONS.UPDATE, accessor=agg) self.assert_true( cm.exception.args[0].endswith('or both not be sequences.')) # Without target. trv = SourceTargetDataTreeTraverser.make_traverser( [ent01, ent11], None, RELATION_OPERATIONS.UPDATE, accessor=agg) self.assert_is_not_none(getattr(trv, '_tgt_prx'))
def test_traverse_with_remove_sequence(self): ent0 = create_entity(entity_id=0) ent1 = create_entity(entity_id=None) cache = EntityCacheMap() agg = StagingAggregate(MyEntity, cache=cache) agg.add(ent0) agg.add(ent1) trv = SourceTargetDataTreeTraverser.make_traverser( None, [ent0, ent1], RELATION_OPERATIONS.REMOVE) vst = AruVisitor(MyEntity, remove_callback=agg.remove) trv.run(vst) self.assert_equal(len(list(iter(agg))), 0)
def __traverse(self, entity_class, source_data, target_data, rel_op): agg = self.__repository.get_aggregate(entity_class) trv = SourceTargetDataTreeTraverser.make_traverser(source_data, target_data, rel_op, accessor=agg) vst = AruVisitor(entity_class, self.__add, self.__remove, self.__update) trv.run(vst) # Indicate that we need to flush the changes. self.__needs_flushing = True return vst.root
def __run_traversal(self, entity_class, source_data, target_data, rel_op): agg = self.__repository.get_aggregate(entity_class) trv = SourceTargetDataTreeTraverser.make_traverser( source_data, target_data, rel_op, accessor=agg, manage_back_references=False) vst = AruVisitor(entity_class, add_callback=self.__add, remove_callback=self.__remove, update_callback=self.__update, pass_path_to_callbacks=True) trv.run(vst) return vst.root
def test_traverse_with_add(self): mock_vst = MagicMock() ent = create_entity(entity_id=None) trv = SourceTargetDataTreeTraverser.make_traverser( ent, None, RELATION_OPERATIONS.ADD) trv.run(mock_vst) parent_attr = get_domain_class_attribute(MyEntity, 'parent') children_attr = get_domain_class_attribute(MyEntity, 'children') grandchildren_attr = get_domain_class_attribute( MyEntityChild, 'children') # Check the visiting sequence and args (depth first). for idx, (meth_name, attr) \ in enumerate([('visit', parent_attr), ('visit', grandchildren_attr), ('visit', children_attr), ]): meth_call = mock_vst.method_calls[idx + 1] self.assert_equal(meth_call[0], meth_name) self.assert_equal(meth_call[1][1], attr) prx = meth_call[1][2] self.assert_true(isinstance(prx, DomainDataTraversalProxy)) self.assert_true(isinstance(prx.get_entity(), Entity)) self.assert_is_none(meth_call[1][3])
def test_traverse_with_add(self): mock_vst = MagicMock() ent = create_entity(entity_id=None) trv = SourceTargetDataTreeTraverser.make_traverser( ent, None, RELATION_OPERATIONS.ADD) trv.run(mock_vst) parent_attr = get_domain_class_attribute(MyEntity, 'parent') children_attr = get_domain_class_attribute(MyEntity, 'children') grandchildren_attr = get_domain_class_attribute(MyEntityChild, 'children') # Check the visiting sequence and args (depth first). for idx, (meth_name, attr) \ in enumerate([('visit', parent_attr), ('visit', grandchildren_attr), ('visit', children_attr), ]): meth_call = mock_vst.method_calls[idx + 1] self.assert_equal(meth_call[0], meth_name) self.assert_equal(meth_call[1][1], attr) prx = meth_call[1][2] self.assert_true(isinstance(prx, DomainDataTraversalProxy)) self.assert_true(isinstance(prx.get_entity(), Entity)) self.assert_is_none(meth_call[1][3])