def _validate_section_heading_order(self, ast_node=None, headings=None): """Verify that section headings appear, and in the order expected""" # TODO: Refactor into individual tests in the future if ast_node is None: ast_node = self.ast.data headings = self.HEADINGS heading_nodes = self.ast.get_section_headings(ast_node) # All headings should be exactly level 2 correct_level = True for n in heading_nodes: if n.level != 2: logging.error("In {0}: " "Heading at line {1} should be level 2".format( self.filename, n.start_line)) correct_level = False heading_labels = [vh.strip_attrs(n.strings[0]) for n in heading_nodes] # Check for missing and extra headings missing_headings = [ expected_heading for expected_heading in headings if expected_heading not in heading_labels ] extra_headings = [ found_heading for found_heading in heading_labels if found_heading not in headings ] for h in missing_headings: logging.error("In {0}: " "Document is missing expected heading: {1}".format( self.filename, h)) if self.WARN_ON_EXTRA_HEADINGS is True: for h in extra_headings: logging.error("In {0}: " "Document contains heading " "not specified in the template: {1}".format( self.filename, h)) no_extra = (len(extra_headings) == 0) else: no_extra = True # Check that the subset of headings # in the template spec matches order in the document valid_order = True headings_overlap = [h for h in heading_labels if h in headings] if len(missing_headings) == 0 and headings_overlap != headings: valid_order = False logging.error("In {0}: " "Document headings do not match " "the order specified by the template".format( self.filename)) return (len(missing_headings) == 0) and \ valid_order and no_extra and correct_level
def _validate_section_heading_order(self, ast_node=None, headings=None): """Verify that section headings appear, and in the order expected""" if ast_node is None: ast_node = self.ast.data headings = self.HEADINGS heading_nodes = self.ast.get_section_headings(ast_node) # All headings should be exactly level 2 correct_level = True for n in heading_nodes: if n.level != 2: logging.error( "In {0}: " "Heading at line {1} should be level 2".format( self.filename, n.start_line)) correct_level = False heading_labels = [vh.strip_attrs(n.strings[0]) for n in heading_nodes] # Check for missing and extra headings missing_headings = [expected_heading for expected_heading in headings if expected_heading not in heading_labels] extra_headings = [found_heading for found_heading in heading_labels if found_heading not in headings] for h in missing_headings: logging.error( "In {0}: " "Document is missing expected heading: {1}".format( self.filename, h)) if self.WARN_ON_EXTRA_HEADINGS is True: for h in extra_headings: logging.error( "In {0}: " "Document contains heading " "not specified in the template: {1}".format( self.filename, h)) no_extra = (len(extra_headings) == 0) else: no_extra = True # Check that the subset of headings # in the template spec matches order in the document valid_order = True headings_overlap = [h for h in heading_labels if h in headings] if len(missing_headings) == 0 and headings_overlap != headings: valid_order = False logging.error( "In {0}: " "Document headings do not match " "the order specified by the template".format(self.filename)) return (len(missing_headings) == 0) and \ valid_order and no_extra and correct_level