class_docstr: Checker for PEP 257, NumPy and Google conventions.
  
  D10x: Missing docstrings
  D20x: Whitespace issues
  D30x: Docstring formatting
  D40x: Docstring content issues
class_docstr_tok: ["Checker","for","PEP","257",",","NumPy","and","Google","conventions",".","D10x",":","Missing","docstrings","D20x",":","Whitespace","issues","D30x",":","Docstring","formatting","D40x",":","Docstring","content","issues"]
docstr: D4{07,08,09,12,14}, D215: Section underline checks.
  
  Check for correct formatting for docstring sections. Checks that:
      * The line that follows the section name contains
        dashes (D40{7,8}).
      * The amount of dashes is equal to the length of the section
        name (D409).
      * The section's content does not begin in the line that follows
        the section header (D412).
      * The section has no content (D414).
      * The indentation of the dashed line is equal to the docstring's
        indentation (D215).
docstr_tok: ["D4","{","07,08,09,12,14","}",",","D215",":","Section","underline","checks",".","Check","for","correct","formatting","for","docstring","sections",".","Checks","that",":","*","The","line","that","follows","the","section","name","contains","dashes","(","D40","{","7,8","}",")",".","*","The","amount","of","dashes","is","equal","to","the","length","of","the","section","name","(","D409",")",".","*","The","section","'s","content","does","not","begin","in","the","line","that","follows","the","section","header","(","D412",")",".","*","The","section","has","no","content","(","D414",")",".","*","The","indentation","of","the","dashed","line","is","equal","to","the","docstring's","indentation","(","D215",")","."]
code: def _check_blanks_and_section_underline(
      cls, section_name, context, indentation
  ):
      """D4{07,08,09,12,14}, D215: Section underline checks.
  
      Check for correct formatting for docstring sections. Checks that:
          * The line that follows the section name contains
            dashes (D40{7,8}).
          * The amount of dashes is equal to the length of the section
            name (D409).
          * The section's content does not begin in the line that follows
            the section header (D412).
          * The section has no content (D414).
          * The indentation of the dashed line is equal to the docstring's
            indentation (D215).
      """
      blank_lines_after_header = 0
  
      for line in context.following_lines:
          if not is_blank(line):
              break
          blank_lines_after_header += 1
      else:
          # There are only blank lines after the header.
          yield violations.D407(section_name)
          yield violations.D414(section_name)
          return
  
      non_empty_line = context.following_lines[blank_lines_after_header]
      dash_line_found = "".join(set(non_empty_line.strip())) == "-"
  
      if not dash_line_found:
          yield violations.D407(section_name)
          if blank_lines_after_header > 0:
              yield violations.D412(section_name)
      else:
          if blank_lines_after_header > 0:
              yield violations.D408(section_name)
  
          if non_empty_line.strip() != "-" * len(section_name):
              yield violations.D409(
                  len(section_name),
                  section_name,
                  len(non_empty_line.strip()),
              )
  
          if leading_space(non_empty_line) > indentation:
              yield violations.D215(section_name)
  
          line_after_dashes_index = blank_lines_after_header + 1
          # If the line index after the dashes is in range (perhaps we have
          # a header + underline followed by another section header).
          if line_after_dashes_index < len(context.following_lines):
              line_after_dashes = context.following_lines[
                  line_after_dashes_index
              ]
              if is_blank(line_after_dashes):
                  rest_of_lines = context.following_lines[
                      line_after_dashes_index:
                  ]
                  if not is_blank("".join(rest_of_lines)):
                      yield violations.D412(section_name)
                  else:
                      yield violations.D414(section_name)
          else:
              yield violations.D414(section_name)
  
imports: import ast
  import string
  import tokenize
  from collections import namedtuple
  from itertools import chain, takewhile
  from re import compile
  from textwrap import dedent
  from .None import violations
  from .config import IllegalConfiguration
  from .parser import AllError, Class, Definition, Function, Method, Module, NestedClass, NestedFunction, Package, ParseError, Parser, StringIO
  from .utils import common_prefix_length, is_blank, log, pairwise, strip_non_alphanumeric
  from .wordlists import IMPERATIVE_BLACKLIST, IMPERATIVE_VERBS, stem
label_desc: Use image node_id 25 for calling the ConventionChecker obj's underlying member method code with example usage: obj._check_blanks_and_section_underline(cls, section_name, context, indentation) without return types