code: def print_pipe_analysis(
      analysis: Dict[str, Dict[str, Union[List[str], Dict]]],
      *,
      keys: List[str] = DEFAULT_KEYS,
  ) -> None:
      """Print a formatted version of the pipe analysis produced by analyze_pipes.
  
      analysis (Dict[str, Union[List[str], Dict[str, List[str]]]]): The analysis.
      keys (List[str]): The meta keys to show in the table.
      """
      msg.divider("Pipeline Overview")
      header = ["#", "Component", *[key.capitalize() for key in keys]]
      summary: ItemsView = analysis["summary"].items()
      body = [
          [i, n, *[v for v in m.values()]]
          for i, (n, m) in enumerate(summary)
      ]
      msg.table(body, header=header, divider=True, multiline=True)
      n_problems = sum(len(p) for p in analysis["problems"].values())
      if any(p for p in analysis["problems"].values()):
          msg.divider(f"Problems ({n_problems})")
          for name, problem in analysis["problems"].items():
              if problem:
                  msg.warn(
                      f"'{name}' requirements not met: {', '.join(problem)}"
                  )
      else:
          msg.good("No problems found.")
  
file_path: spacy/spacy/pipe_analysis.py
imports: from typing import TYPE_CHECKING, Dict, ItemsView, Iterable, List, Set, Union
  from wasabi import msg
  from .errors import Errors
  from .tokens import Doc, Span, Token
  from .util import dot_to_dict
label_desc: Use image node_id 4 for calling a global function with example usage: print_pipe_analysis(analysis) without return types