docs: def from_storage(source, source_format='csv', csv_options=None, ignore_unknown_values=False,
                     max_bad_records=0, compressed=False, schema=None):
  
      """ Create an external table for a GCS object.
  
      Args:
        source: the URL of the source objects(s). Can include a wildcard '*' at the end of the item
           name. Can be a single source or a list.
        source_format: the format of the data, 'csv' or 'json'; default 'csv'.
        csv_options: For CSV files, the options such as quote character and delimiter.
        ignore_unknown_values: If True, accept rows that contain values that do not match the schema;
            the unknown values are ignored (default False).
        max_bad_records: The maximum number of bad records that are allowed (and ignored) before
            returning an 'invalid' error in the Job result (default 0).
        compressed: whether the data is GZ compressed or not (default False). Note that compressed
            data can be used as a federated table but cannot be loaded into a BQ Table.
        schema: the schema of the data. This is required for this table to be used as a federated
            table or to be loaded using a Table object that itself has no schema (default None).
  
    """
      result = FederatedTable()
      # Do some sanity checking and concert some params from friendly form to form used by BQ.
      if source_format == 'csv':
        result._bq_source_format = 'CSV'
        if csv_options is None:
          csv_options = _csv_options.CSVOptions()  # use defaults
      elif source_format == 'json':
        if csv_options:
          raise Exception('CSV options are not support for JSON tables')
        result._bq_source_format = 'NEWLINE_DELIMITED_JSON'
      else:
        raise Exception("Invalid source format %s" % source_format)
  
      result._source = source if isinstance(source, list) else [source]
      result._source_format = source_format
      result._csv_options = csv_options
      result._ignore_unknown_values = ignore_unknown_values
      result._max_bad_records = max_bad_records
      result._compressed = compressed
      result._schema = schema
      return result