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")
Example #5
0
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)