def test_migrate_analysis_reg(self): tree = etree.fromstring(""" <regulation xmlns="eregs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eregs ../../eregs.xsd"> <fdsys> <date>2015-11-17</date> </fdsys> <preamble> <documentNumber>2015-12345</documentNumber> </preamble> <part label="1234"> <subpart> <section label="1234-1"> <analysis> <analysisSection>Some analysis</analysisSection> </analysis> </section> </subpart> </part> </regulation>""") validator = EregsValidator(settings.XSD_FILE) result = validator.migrate_analysis(tree) self.assertEqual(len(result.find('.//{eregs}analysis')), 1) analysis = result.find('.//{eregs}analysis') analysis_parent = analysis.getparent() analysis_section = analysis.find('{eregs}analysisSection') self.assertEqual(analysis_parent.tag, '{eregs}regulation') self.assertEqual(analysis_section.get('target'), '1234-1') self.assertEqual(analysis_section.get('notice'), '2015-12345')
def test_migrate_analysis_change_analysis_only(self): tree = etree.fromstring(""" <notice xmlns="eregs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eregs ../../eregs.xsd"> <fdsys> <date>2015-11-17</date> </fdsys> <preamble> <documentNumber>2015-12345</documentNumber> </preamble> <changeset> <change operation="added" label="1234-2-Analysis" parent="1234-2"> <analysis label="1234-Analysis"> <analysisSection>An added analysis</analysisSection> </analysis> </change> </changeset> </notice>""") validator = EregsValidator(settings.XSD_FILE) result = validator.migrate_analysis(tree) self.assertEqual(len(result.find('.//{eregs}analysis')), 1) analysis = result.find('.//{eregs}analysis') analysis_parent = analysis.getparent() analysis_section = analysis.find('{eregs}analysisSection') self.assertEqual(analysis_parent.tag, '{eregs}notice') self.assertEqual(analysis_section.get('target'), '1234-2') self.assertEqual(analysis_section.get('notice'), '2015-12345') # The empty change should've been deleted. self.assertEqual(len(result.findall('.//{eregs}change')), 0)
def test_migrate_analysis_notice(self): tree = etree.fromstring( """ <notice xmlns="eregs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eregs ../../eregs.xsd"> <fdsys> <date>2015-11-17</date> </fdsys> <preamble> <documentNumber>2015-12345</documentNumber> </preamble> <changeset> <change operation="added" label="1234-5"> <paragraph label="1234-5"> <content/> <analysis> <analysisSection>Some addedanalysis</analysisSection> </analysis> </paragraph> </change> </changeset> </notice>""" ) validator = EregsValidator(settings.XSD_FILE) result = validator.migrate_analysis(tree) self.assertEqual(len(result.find(".//{eregs}analysis")), 1) analysis = result.find(".//{eregs}analysis") analysis_parent = analysis.getparent() analysis_section = analysis.find("{eregs}analysisSection") self.assertEqual(analysis_parent.tag, "{eregs}notice") self.assertEqual(analysis_section.get("target"), "1234-5") self.assertEqual(analysis_section.get("notice"), "2015-12345")
def test_migrate_analysis_reg(self): tree = etree.fromstring( """ <regulation xmlns="eregs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="eregs ../../eregs.xsd"> <fdsys> <date>2015-11-17</date> </fdsys> <preamble> <documentNumber>2015-12345</documentNumber> </preamble> <part label="1234"> <subpart> <section label="1234-1"> <analysis> <analysisSection>Some analysis</analysisSection> </analysis> </section> </subpart> </part> </regulation>""" ) validator = EregsValidator(settings.XSD_FILE) result = validator.migrate_analysis(tree) self.assertEqual(len(result.find(".//{eregs}analysis")), 1) analysis = result.find(".//{eregs}analysis") analysis_parent = analysis.getparent() analysis_section = analysis.find("{eregs}analysisSection") self.assertEqual(analysis_parent.tag, "{eregs}regulation") self.assertEqual(analysis_section.get("target"), "1234-1") self.assertEqual(analysis_section.get("notice"), "2015-12345")
def migrate_analysis(cfr_title, cfr_part): """ Migrate analysis from its context to top-level """ # Prompt user to be sure they want to do this print(colored('This will irrevocably modify all regulation and notice files for this regulation. ' 'Is this ok?', 'red')) answer = None while answer not in ['y', 'n']: answer = raw_input('Migrate all analysis? y/n: ') if answer != 'y': return # Migrate regulation files regml_reg_files = find_all(cfr_part) for reg_file in regml_reg_files: print(reg_file) file_name = os.path.join(reg_file) with open(file_name, 'r') as f: reg_xml = f.read() parser = etree.XMLParser(huge_tree=True) xml_tree = etree.fromstring(reg_xml, parser) validator = EregsValidator(settings.XSD_FILE) validator.migrate_analysis(xml_tree, file_name) validator.validate_reg(xml_tree) # Migrate notices regml_notice_files = find_all(cfr_part, is_notice=True) regml_notices = [] for notice_file in regml_notice_files: print(notice_file) file_name = os.path.join(notice_file) with open(file_name, 'r') as f: reg_xml = f.read() parser = etree.XMLParser(huge_tree=True) xml_tree = etree.fromstring(reg_xml, parser) validator = EregsValidator(settings.XSD_FILE) validator.migrate_analysis(xml_tree, file_name) validator.validate_reg(xml_tree)