code: def print_info(self, buf=sys.stdout, verbose=False):
          
          _pr = Printer(buf)
  
          if not self.contexts:
              _pr("Suite is empty.")
              return
  
          context_names = sorted(self.contexts.iterkeys())
          _pr("Suite contains %d contexts:" % len(context_names))
  
          if not verbose:
              _pr(' '.join(context_names))
              return
  
          tools = self.get_tools().values()
          context_tools = defaultdict(set)
          context_variants = defaultdict(set)
          for entry in tools:
              context_name = entry["context_name"]
              context_tools[context_name].add(entry["tool_name"])
              context_variants[context_name].add(str(entry["variant"]))
  
          _pr()
          rows = [["NAME", "VISIBLE TOOLS", "PATH"],
                  ["----", "-------------", "----"]]
  
          for context_name in context_names:
              context_path = self._context_path(context_name) or '-'
              ntools = len(context_tools.get(context_name, []))
              if ntools:
                  nvariants = len(context_variants[context_name])
                  short_desc = "%d tools from %d packages" % (ntools, nvariants)
              else:
                  short_desc = "no tools"
              rows.append((context_name, short_desc, context_path))
  
          _pr("\n".join(columnise(rows)))
docs: Prints a message summarising the contents of the suite.