def test_replace_node_and_subtree(self): n1 = Node('n1', label=['205', '1']) n2 = Node('n2', label=['205', '2']) n4 = Node('n4', label=['205', '4']) n2a = Node('n2a', label=['205', '2', 'a']) n2b = Node('n2b', label=['205', '2', 'b']) n2.children = [n2a, n2b] root = Node('', label=['205']) root.children = [n1, n2, n4] reg_tree = compiler.RegulationTree(root) a2 = Node('a2', label=['205', '2']) a2e = Node('a2e', label=['205', '2', 'e']) a2f = Node('a2f', label=['205', '2', 'f']) a2.children = [a2e, a2f] reg_tree.replace_node_and_subtree(a2) new_tree = Node('', label=[205]) new_tree.children = [n1, a2, n4] self.assertEqual(new_tree, reg_tree.tree) self.assertEqual(None, find(reg_tree.tree, '205-2-a'))
def test_replace_node_and_subtree(self): n1 = Node("n1", label=["205", "1"]) n2 = Node("n2", label=["205", "2"]) n4 = Node("n4", label=["205", "4"]) n2a = Node("n2a", label=["205", "2", "a"]) n2b = Node("n2b", label=["205", "2", "b"]) n2.children = [n2a, n2b] root = Node("", label=["205"]) root.children = [n1, n2, n4] reg_tree = compiler.RegulationTree(root) a2 = Node("a2", label=["205", "2"]) a2e = Node("a2e", label=["205", "2", "e"]) a2f = Node("a2f", label=["205", "2", "f"]) a2.children = [a2e, a2f] reg_tree.replace_node_and_subtree(a2) new_tree = Node("", label=[205]) new_tree.children = [n1, a2, n4] self.assertEqual(new_tree, reg_tree.tree) self.assertEqual(None, find(reg_tree.tree, "205-2-a"))
def test_move_interps(self): n1 = Node('n1', label=['205', '1', 'Interp'], node_type=Node.INTERP) n2 = Node('n2', label=['205', '2', 'Interp'], node_type=Node.INTERP) n4 = Node('n4', label=['205', '4', 'Interp'], node_type=Node.INTERP) n4c = Node( 'n4c', label=['205', '4', 'c', 'Interp'], node_type=Node.INTERP) n4.children = [n4c] n2a = Node( 'n2a', label=['205', '2', 'a', 'Interp'], node_type=Node.INTERP) n2b = Node( 'n2b', label=['205', '2', 'b', 'Interp'], node_type=Node.INTERP) n2a1 = Node( '1. First', label=['205', '2', 'a', 'Interp', '1'], node_type=Node.INTERP) n2a.children = [n2a1] n2.children = [n2a, n2b] root = Node('', label=['205', 'Interp'], node_type=Node.INTERP) root.children = [n1, n2, n4] reg_tree = compiler.RegulationTree(root) reg_tree.move('205-2-a-Interp-1', ['205', '4', 'c', 'Interp', '5'])
def build_tree(reg_xml): doc = etree.fromstring(reg_xml) preprocess_xml(doc) reg_part = get_reg_part(doc) title = get_title(doc) tree = Node("", [], [reg_part], title) part = doc.xpath('//PART')[0] subpart_xmls = [c for c in part.getchildren() if c.tag == 'SUBPART'] if len(subpart_xmls) > 0: subparts = [build_subpart(reg_part, s) for s in subpart_xmls] tree.children = subparts else: section_xmls = [c for c in part.getchildren() if c.tag == 'SECTION'] sections = [] for section_xml in section_xmls: sections.extend(build_from_section(reg_part, section_xml)) empty_part = reg_text.build_empty_part(reg_part) empty_part.children = sections tree.children = [empty_part] non_reg_sections = build_non_reg_text(doc, reg_part) tree.children += non_reg_sections return tree
def build_tree(self): n1 = Node('n1', label=['200', '1']) n2 = Node('n1i', label=['200', 1, 'i']) n3 = Node('n2', label=['200', '2']) n4 = Node('n3', label=['200', '3']) n5 = Node('n3a', label=['200', '3', 'a']) n1.children = [n2] n4.children = [n5] root = Node('root', label=['200'], children=[n1, n3, n4]) return root
def build_tree(self): n1 = Node("n1", label=["200", "1"]) n2 = Node("n1i", label=["200", 1, "i"]) n3 = Node("n2", label=["200", "2"]) n4 = Node("n3", label=["200", "3"]) n5 = Node("n3a", label=["200", "3", "a"]) n1.children = [n2] n4.children = [n5] root = Node("root", label=["200"], children=[n1, n3, n4]) return root
def tree_with_paragraphs(self): n1 = Node('n1', label=['205', '1']) n2 = Node('n2', label=['205', '2']) n4 = Node('n4', label=['205', '4']) n2a = Node('n2a', label=['205', '2', 'a']) n2b = Node('n2b', label=['205', '2', 'b']) n2.children = [n2a, n2b] root = Node('', label=['205']) root.children = [n1, n2, n4] return root
def tree_with_paragraphs(self): n1 = Node("n1", label=["205", "1"]) n2 = Node("n2", label=["205", "2"]) n4 = Node("n4", label=["205", "4"]) n2a = Node("n2a", label=["205", "2", "a"]) n2b = Node("n2b", label=["205", "2", "b"]) n2.children = [n2a, n2b] root = Node("", label=["205"]) root.children = [n1, n2, n4] return root
def test_add_section(self): nsa = Node("nsa", label=["205", "Subpart", "A"], node_type=Node.SUBPART) nappa = Node("nappa", label=["205", "Appendix", "C"], node_type=Node.APPENDIX) root = Node("", label=["205"]) root.children = [nsa, nappa] n1 = Node("", label=["205", "1"]) reg_tree = compiler.RegulationTree(root) reg_tree.add_section(n1, ["205", "Subpart", "A"]) nsa.children = [n1] self.assertEqual(reg_tree.tree, root)
def test_find_candidate_impossible_label(self): n1 = Node("", label=["200", "1"]) n1a = Node("", label=["200", "1", "a"]) n1a1i = Node("", label=["200", "1", "a", "1", "i"]) n1a.children = [n1a1i] n1b = Node("", label=["200", "1", "b"]) n1i = Node("", label=["200", "1", "i"]) n1.children = [n1a, n1b, n1i] root = Node("root", label=["200"], children=[n1]) candidate = changes.find_candidate(root, "i", ["200-1-a", "200-1-b"])[0] self.assertEqual(candidate.label, ["200", "1", "i"])
def test_add_node_dummy_subpart(self): """If the tree consists only of the empty subpart, adding a new section should insert into the empty subpart""" root = Node(label=['1']) empty = Node(label=['1', 'Subpart'], node_type='emptypart') n1 = Node('n1', label=['1', '1']) n2 = Node('n2', label=['1', '2']) empty.children = [n1, n2] root.children = [empty] reg_tree = compiler.RegulationTree(root) node = Node('n3', label=['1', '3'], node_type=Node.REGTEXT) reg_tree.add_node(node) self.assertEqual(len(reg_tree.tree.children), 1) self.assertEqual(len(reg_tree.tree.children[0].children), 3)
def test_add_node_dummy_subpart(self): """If the tree consists only of the empty subpart, adding a new section should insert into the empty subpart""" root = Node(label=["1"]) empty = Node(label=["1", "Subpart"], node_type="emptypart") n1 = Node("n1", label=["1", "1"]) n2 = Node("n2", label=["1", "2"]) empty.children = [n1, n2] root.children = [empty] reg_tree = compiler.RegulationTree(root) node = Node("n3", label=["1", "3"], node_type=Node.REGTEXT) reg_tree.add_node(node) self.assertEqual(len(reg_tree.tree.children), 1) self.assertEqual(len(reg_tree.tree.children[0].children), 3)
def test_add_to_root(self): nsa = Node("nsa", label=["205", "Subpart", "A"], node_type=Node.SUBPART) nappa = Node("nappa", label=["205", "Appendix", "C"], node_type=Node.APPENDIX) root = Node("", label=["205"]) root.children = [nsa, nappa] reg_tree = compiler.RegulationTree(root) nappb = Node("nappb", label=["205", "Appendix", "B"], node_type=Node.APPENDIX) reg_tree.add_to_root(nappb) root.children = [nsa, nappb, nappa] self.assertEqual(reg_tree.tree, root)
def section_node(self): n1 = Node("n2", label=["200", "2"]) n2 = Node("n2a", label=["200", "2", "a"]) n1.children = [n2] root = Node("root", label=["200"], children=[n1]) return root
def section_node(self): n1 = Node('n2', label=['200', '2']) n2 = Node('n2a', label=['200', '2', 'a']) n1.children = [n2] root = Node('root', label=['200'], children=[n1]) return root
def test_find_candidate_impossible_label(self): n1 = Node('', label=['200', '1']) n1a = Node('', label=['200', '1', 'a']) n1a1i = Node('', label=['200', '1', 'a', '1', 'i']) n1a.children = [n1a1i] n1b = Node('', label=['200', '1', 'b']) n1i = Node('', label=['200', '1', 'i']) n1.children = [n1a, n1b, n1i] root = Node('root', label=['200'], children=[n1]) candidate = changes.find_candidate( root, 'i', ['200-1-a', '200-1-b'])[0] self.assertEqual(candidate.label, ['200', '1', 'i'])
def test_find_candidate_impossible_label(self): n1 = Node('', label=['200', '1']) n1a = Node('', label=['200', '1', 'a']) n1a1i = Node('', label=['200', '1', 'a', '1', 'i']) n1a.children = [n1a1i] n1b = Node('', label=['200', '1', 'b']) n1i = Node('', label=['200', '1', 'i']) n1.children = [n1a, n1b, n1i] root = Node('root', label=['200'], children=[n1]) candidate = changes.find_candidate(root, 'i', ['200-1-a', '200-1-b'])[0] self.assertEqual(candidate.label, ['200', '1', 'i'])
def build_tree(reg_xml): logger.info("Build tree %s", reg_xml) preprocess_xml(reg_xml) reg_part = get_reg_part(reg_xml) title = get_title(reg_xml) tree = Node("", [], [reg_part], title) part = reg_xml.xpath('//PART')[0] # Build a list of SUBPARTs, then pull SUBJGRPs into that list: subpart_and_subjgrp_xmls = [] for subpart in part.xpath('./SUBPART|./SUBJGRP'): subpart_and_subjgrp_xmls.append(subpart) # SUBJGRPS can be nested, particularly inside SUBPARTs for subjgrp in subpart.xpath('./SUBJGRP'): subpart_and_subjgrp_xmls.append(subjgrp) if len(subpart_and_subjgrp_xmls) > 0: subthings = [] letter_list = [] for subthing in subpart_and_subjgrp_xmls: if subthing.tag == "SUBPART": subthings.append(build_subpart(reg_part, subthing)) elif subthing.tag == "SUBJGRP": built_subjgrp = build_subjgrp(reg_part, subthing, letter_list) letter_list.append(built_subjgrp.label[-1]) subthings.append(built_subjgrp) tree.children = subthings else: section_xmls = [c for c in part.getchildren() if c.tag == 'SECTION'] sections = [] for section_xml in section_xmls: sections.extend(build_from_section(reg_part, section_xml)) empty_part = reg_text.build_empty_part(reg_part) empty_part.children = sections tree.children = [empty_part] non_reg_sections = build_non_reg_text(reg_xml, reg_part) tree.children += non_reg_sections return tree
def test_add_section(self): nsa = Node('nsa', label=['205', 'Subpart', 'A'], node_type=Node.SUBPART) nappa = Node('nappa', label=['205', 'Appendix', 'C'], node_type=Node.APPENDIX) root = Node('', label=['205']) root.children = [nsa, nappa] n1 = Node('', label=['205', '1']) reg_tree = compiler.RegulationTree(root) reg_tree.add_section(n1, ['205', 'Subpart', 'A']) nsa.children = [n1] self.assertEqual(reg_tree.tree, root)
def tree_with_subparts(self): nsa = Node("nsa", label=["205", "Subpart", "A"], node_type=Node.SUBPART) nsb = Node("nsb", label=["205", "Subpart", "B"], node_type=Node.SUBPART) nappa = Node("nappa", label=["205", "Appendix", "C"], node_type=Node.APPENDIX) root = Node("", label=["205"]) root.children = [nsa, nsb, nappa] return root
def test_move_interps(self): n1 = Node("n1", label=["205", "1", "Interp"], node_type=Node.INTERP) n2 = Node("n2", label=["205", "2", "Interp"], node_type=Node.INTERP) n4 = Node("n4", label=["205", "4", "Interp"], node_type=Node.INTERP) n4c = Node("n4c", label=["205", "4", "c", "Interp"], node_type=Node.INTERP) n4.children = [n4c] n2a = Node("n2a", label=["205", "2", "a", "Interp"], node_type=Node.INTERP) n2b = Node("n2b", label=["205", "2", "b", "Interp"], node_type=Node.INTERP) n2a1 = Node("1. First", label=["205", "2", "a", "Interp", "1"], node_type=Node.INTERP) n2a.children = [n2a1] n2.children = [n2a, n2b] root = Node("", label=["205", "Interp"], node_type=Node.INTERP) root.children = [n1, n2, n4] reg_tree = compiler.RegulationTree(root) reg_tree.move("205-2-a-Interp-1", ["205", "4", "c", "Interp", "5"])
def tree_with_paragraphs(self): n1 = Node('n1', label=['205', '1']) n2 = Node('n2', label=['205', '2']) n4 = Node('n4', label=['205', '4']) n2a = Node('n2a', label=['205', '2', 'a']) n2b = Node('n2b', label=['205', '2', 'b']) n2.children = [n2a, n2b] subpart = Node(node_type=Node.EMPTYPART, label=['205', 'Subpart'], children=[n1, n2, n4]) return Node('', label=['205'], children=[subpart])
def test_add_section(self): nsa = Node( 'nsa', label=['205', 'Subpart', 'A'], node_type=Node.SUBPART) nappa = Node( 'nappa', label=['205', 'Appendix', 'C'], node_type=Node.APPENDIX) root = Node('', label=['205']) root.children = [nsa, nappa] n1 = Node('', label=['205', '1']) reg_tree = compiler.RegulationTree(root) reg_tree.add_section(n1, ['205', 'Subpart', 'A']) nsa.children = [n1] self.assertEqual(reg_tree.tree, root)
def test_move_regtext(self): n1 = Node('n1', label=['205', '1']) n2 = Node('n2', label=['205', '2']) n4 = Node('n4', label=['205', '4']) n2a = Node('(a) n2a', label=['205', '2', 'a']) n2b = Node('(b) n2b', label=['205', '2', 'b']) n2.children = [n2a, n2b] root = Node('', label=['205']) root.children = [n1, n2, n4] reg_tree = compiler.RegulationTree(root) reg_tree.move('205-2-b', ['205', '4', 'c']) moved = find(reg_tree.tree, '205-4-c') self.assertNotEqual(None, moved) self.assertTrue('(c)' in moved.text) self.assertFalse('(b)' in moved.text) no_more = find(reg_tree.tree, '204-2-b') self.assertEqual(None, no_more)
def test_add_to_root(self): nsa = Node('nsa', label=['205', 'Subpart', 'A'], node_type=Node.SUBPART) nappa = Node('nappa', label=['205', 'Appendix', 'C'], node_type=Node.APPENDIX) root = Node('', label=['205']) root.children = [nsa, nappa] reg_tree = compiler.RegulationTree(root) nappb = Node('nappb', label=['205', 'Appendix', 'B'], node_type=Node.APPENDIX) reg_tree.add_to_root(nappb) root.children = [nsa, nappb, nappa] self.assertEqual(reg_tree.tree, root)
def test_move_regtext(self): n1 = Node("n1", label=["205", "1"]) n2 = Node("n2", label=["205", "2"]) n4 = Node("n4", label=["205", "4"]) n2a = Node("(a) n2a", label=["205", "2", "a"]) n2b = Node("(b) n2b", label=["205", "2", "b"]) n2.children = [n2a, n2b] root = Node("", label=["205"]) root.children = [n1, n2, n4] reg_tree = compiler.RegulationTree(root) reg_tree.move("205-2-b", ["205", "4", "c"]) moved = find(reg_tree.tree, "205-4-c") self.assertNotEqual(None, moved) self.assertTrue("(c)" in moved.text) self.assertFalse("(b)" in moved.text) no_more = find(reg_tree.tree, "204-2-b") self.assertEqual(None, no_more)
def test_match_labels_and_changes_candidate(self): labels_amended = [Amendment("POST", "200-2"), Amendment("PUT", "200-2-a-1-i")] n1 = Node("n2", label=["200", "2"]) n2 = Node("n2a", label=["200", "2", "i"]) n1.children = [n2] root = Node("root", label=["200"], children=[n1]) amend_map = changes.match_labels_and_changes(labels_amended, root) self.assertTrue(amend_map["200-2-a-1-i"][0]["candidate"]) self.assertTrue(amend_map["200-2-a-1-i"][0]["node"].label_id(), "200-2-a-1-i")
def test_pre_process_subpart(self): root = Node("", label=['1212']) subpartA = Node("", label=['1212', 'Subpart', 'A'], title='Subpart A') section2 = Node("", label=['1212', '2'], title='1212.2') def1 = Node(u"“totes” means in total", label=['1212', '2', 'a']) subpartB = Node("", label=['1212', 'Subpart', 'B'], title='Subpart B') section22 = Node("\nFor the purposes of this subpart", label=['1212', '22'], title='1212.22') def2 = Node(u"“totes” means in extremely", label=['1212', '22', 'a']) root.children = [subpartA, subpartB] subpartA.children, subpartB.children = [section2], [section22] section2.children, section22.children = [def1], [def2] t = Terms(root) t.pre_process() self.assertTrue(('1212',) in t.scoped_terms) self.assertEqual(len(t.scoped_terms[('1212',)]), 1) self.assertEqual('1212-2-a', t.scoped_terms[('1212',)][0].label) self.assertTrue(('1212', '22') in t.scoped_terms) self.assertEqual(len(t.scoped_terms[('1212', '22')]), 1) self.assertEqual('1212-22-a', t.scoped_terms[('1212', '22')][0].label)
def test_get_subparts(self): nsa = Node("nsa", label=["205", "Subpart", "A"], node_type=Node.SUBPART) nsb = Node("nsb", label=["205", "Subpart", "B"], node_type=Node.SUBPART) nappa = Node("nappa", label=["205", "Appendix", "C"], node_type=Node.APPENDIX) root = Node("", label=["205"]) root.children = [nsa, nsb, nappa] reg_tree = compiler.RegulationTree(root) subparts = reg_tree.get_subparts() labels = [s.label_id() for s in subparts] self.assertEqual(labels, ["205-Subpart-A", "205-Subpart-B"])
def test_add_to_root(self): nsa = Node( 'nsa', label=['205', 'Subpart', 'A'], node_type=Node.SUBPART) nappa = Node( 'nappa', label=['205', 'Appendix', 'C'], node_type=Node.APPENDIX) root = Node('', label=['205']) root.children = [nsa, nappa] reg_tree = compiler.RegulationTree(root) nappb = Node( 'nappb', label=['205', 'Appendix', 'B'], node_type=Node.APPENDIX) reg_tree.add_to_root(nappb) root.children = [nsa, nappb, nappa] self.assertEqual(reg_tree.tree, root)
def test_match_labels_and_changes_candidate(): labels_amended = [ Amendment('POST', '200-?-2'), Amendment('PUT', '200-?-2-a-1-i')] n1 = Node('n2', label=['200', '2']) n2 = Node('n2a', label=['200', '2', 'i']) n1.children = [n2] root = Node('root', label=['200'], children=[n1]) amend_map = changes.match_labels_and_changes( labels_amended, root) assert amend_map['200-2-a-1-i'][0]['candidate'] assert amend_map['200-2-a-1-i'][0]['node'].label_id() == '200-2-a-1-i'
def tree_with_subparts(self): nsa = Node('nsa', label=['205', 'Subpart', 'A'], node_type=Node.SUBPART) nsb = Node('nsb', label=['205', 'Subpart', 'B'], node_type=Node.SUBPART) nappa = Node('nappa', label=['205', 'Appendix', 'C'], node_type=Node.APPENDIX) root = Node('', label=['205']) root.children = [nsa, nsb, nappa] return root
def test_get_subparts(self): nsa = Node( 'nsa', label=['205', 'Subpart', 'A'], node_type=Node.SUBPART) nsb = Node('nsb', label=['205', 'Subpart', 'B'], node_type=Node.SUBPART) nappa = Node('nappa', label=['205', 'Appendix', 'C'], node_type=Node.APPENDIX) root = Node('', label=['205']) root.children = [nsa, nsb, nappa] reg_tree = compiler.RegulationTree(root) subparts = reg_tree.get_subparts() labels = [s.label_id() for s in subparts] self.assertEqual(labels, ['205-Subpart-A', '205-Subpart-B'])