class_docstr: Report the status of a Job to the console using click
code: def show(
      self, outstream, asset_callback=None, validate_patterns=True
  ):
      echo = functools.partial(click.echo, file=outstream)
  
      # write table's header
      echo(self.header())
  
      # write table's body
      for task_name, task in self.tasks.items():
          # write summary of the uploaded vs total assets
          status = task.status()
          assets = task.assets(validate_patterns=validate_patterns)
  
          # mapping of artifact pattern to asset or None of not uploaded
          n_expected = len(task.artifacts)
          n_uploaded = len(assets.uploaded_assets())
          echo(
              self.lead(
                  status.combined_state,
                  task_name,
                  n_uploaded,
                  n_expected,
              )
          )
  
          # show link to the actual build, some of the CI providers implement
          # the statuses API others implement the checks API, so display both
          for link in status.build_links:
              echo(self.DETAILS.format(url=link))
  
          # write per asset status
          for artifact_pattern, asset in assets.items():
              if asset_callback is not None:
                  asset_callback(task_name, task, asset)
              echo(
                  self.artifact(
                      status.combined_state, artifact_pattern, asset
                  )
              )
  
imports: import collections
  import csv
  import operator
  import fnmatch
  import functools
  import time
  import click
  import requests
  from archery.utils.report import JinjaReport
label_desc: Use image node_id 4 for calling the ConsoleReport obj's underlying member method code with example usage: obj.show(outstream, asset_callback, validate_patterns) without return types