def test_data_update_non_dict_source(self): edge = BGEdge( vertex1=TaggedBlockVertex("v1"), vertex2=TaggedBlockVertex("v2"), multicolor=Multicolor(self.genome1, self.genome2), data={"fragment": { "name": "scaffold2", "origin": "test" }}) for source in [1, "2", Multicolor(), (1, ), [ 2, ]]: with self.assertRaises(ValueError): edge.update_data(source=source)
def test_data_update_empty_source(self): edge = BGEdge( vertex1=TaggedBlockVertex("v1"), vertex2=TaggedBlockVertex("v2"), multicolor=Multicolor(self.genome1, self.genome2), data={"fragment": { "name": "scaffold2", "origin": "test" }}) update_source = {} edge.update_data(source=update_source) self.assertTrue( dicts_are_equal( edge.data, {"fragment": { "name": "scaffold2", "origin": "test" }}))
def test_data_update(self): update_source = {"fragment": {"name": "scaffold11"}} edge = BGEdge( vertex1=TaggedBlockVertex("v1"), vertex2=TaggedBlockVertex("v2"), multicolor=Multicolor(self.genome1, self.genome2), data={"fragment": { "name": "scaffold2", "origin": "test" }}) edge.update_data(source=update_source) self.assertIsInstance(edge.data, dict) self.assertIn("fragment", edge.data) self.assertIsInstance(edge.data["fragment"], dict) self.assertIn("name", edge.data["fragment"]) self.assertIn("origin", edge.data["fragment"]) self.assertEqual(edge.data["fragment"]["name"], "scaffold11") self.assertEqual(edge.data["fragment"]["origin"], "test")
def get_breakpoint_graph(stream, merge_edges=True): """ Taking a file-like object transforms supplied gene order data into the language of :param merge_edges: a flag that indicates if parallel edges in produced breakpoint graph shall be merged or not :type merge_edges: ``bool`` :param stream: any iterable object where each iteration produces a ``str`` object :type stream: ``iterable`` ver ``str`` :return: an instance of a BreakpointGraph that contains information about adjacencies in genome specified in GRIMM formatted input :rtype: :class:`bg.breakpoint_graph.BreakpointGraph` """ result = BreakpointGraph() current_genome = None fragment_data = {} for line in stream: line = line.strip() if len(line) == 0: ############################################################################################### # # empty lines are omitted # ############################################################################################### continue if GRIMMReader.is_genome_declaration_string(data_string=line): ############################################################################################### # # is we have a genome declaration, we must update current genome # all following gene order data (before EOF or next genome declaration) will be attributed to current genome # ############################################################################################### current_genome = GRIMMReader.parse_genome_declaration_string( data_string=line) fragment_data = {} elif GRIMMReader.is_comment_string(data_string=line): if GRIMMReader.is_comment_data_string(string=line): path, (key, value) = GRIMMReader.parse_comment_data_string( comment_data_string=line) if len(path) > 0 and path[0] == "fragment": add_to_dict_with_path(destination_dict=fragment_data, key=key, value=value, path=path) else: continue elif current_genome is not None: ############################################################################################### # # gene order information that is specified before the first genome is specified can not be attributed to anything # and thus omitted # ############################################################################################### parsed_data = GRIMMReader.parse_data_string(data_string=line) edges = GRIMMReader.get_edges_from_parsed_data( parsed_data=parsed_data) for v1, v2 in edges: edge_specific_data = { "fragment": { "forward_orientation": (v1, v2) } } edge = BGEdge(vertex1=v1, vertex2=v2, multicolor=Multicolor(current_genome), data=deepcopy(fragment_data)) edge.update_data(source=edge_specific_data) result.add_bgedge(bgedge=edge, merge=merge_edges) return result