docs: def make_table(headers, lines, prefix=None):
          """
          Generates an ASCII table according to the given headers and lines
  
          :param headers: List of table headers (N-tuple)
          :param lines: List of table lines (N-tuples)
          :param prefix: Optional prefix for each line
          :return: The ASCII representation of the table
          :raise ValueError: Different number of columns between headers and
                             lines
          """
          # Normalize the prefix
          prefix = str(prefix or "")
  
          # Maximum lengths
          lengths = [len(title) for title in headers]
  
          # Store the number of columns (0-based)
          nb_columns = len(lengths) - 1
  
          # Lines
          str_lines = []
          for idx, line in enumerate(lines):
              # Recompute lengths
              str_line = []
              str_lines.append(str_line)
              column = -1
  
              try:
                  for column, entry in enumerate(line):
                      str_entry = str(entry)
                      str_line.append(str_entry)
  
                      if len(str_entry) > lengths[column]:
                          lengths[column] = len(str_entry)
  
              except IndexError:
                  # Line too small/big
                  raise ValueError(
                      "Different sizes for header and lines "
                      "(line {0})".format(idx + 1)
                  )
  
              except (TypeError, AttributeError):
                  # Invalid type of line
                  raise ValueError(
                      "Invalid type of line: %s", type(line).__name__
                  )
  
              else:
                  if column != nb_columns:
                      # Check if all lines have the same number of columns
                      raise ValueError(
                          "Different sizes for header and lines "
                          "(line {0})".format(idx + 1)
                      )
  
          # Prepare the head (centered text)
          format_str = "{0}|".format(prefix)
          for column, length in enumerate(lengths):
              format_str += " {%d:^%d} |" % (column, length)
  
          head_str = format_str.format(*headers)
  
          # Prepare the separator, according the length of the headers string
          separator = "{0}{1}".format(prefix, "-" * (len(head_str) - len(prefix)))
          idx = head_str.find("|")
          while idx != -1:
              separator = "+".join((separator[:idx], separator[idx + 1 :]))
              idx = head_str.find("|", idx + 1)
  
          # Prepare the output
          output = [separator, head_str, separator.replace("-", "=")]
  
          # Compute the lines
          format_str = format_str.replace("^", "<")
          for line in str_lines:
              output.append(format_str.format(*line))
              output.append(separator)
  
          # Force the last end of line
          output.append("")
  
          # Join'em
          return "\n".join(output)