class_docstr: Class that manages dvc remotes.
  
  Args:
      repo (dvc.repo.Repo): repo instance that belongs to the repo that
          we are working on.
  
  Raises:
      config.ConfigError: thrown when config has invalid format.
class_docstr_tok: ["Class","that","manages","dvc","remotes",".","Args",":","repo","(","dvc.repo.Repo",")",":","repo","instance","that","belongs","to","the","repo","that","we","are","working","on",".","Raises",":","config.ConfigError",":","thrown","when","config","has","invalid","format","."]
docstr: Push data items in a cloud-agnostic way.
  
  Args:
      objs: objects to push to the cloud.
      jobs: number of jobs that can be running simultaneously.
      remote: optional name of remote to push to.
          By default remote from core.remote config option is used.
      odb: optional ODB to push to. Overrides remote.
docstr_tok: ["Push","data","items","in","a","cloud-agnostic","way",".","Args",":","objs",":","objects","to","push","to","the","cloud",".","jobs",":","number","of","jobs","that","can","be","running","simultaneously",".","remote",":","optional","name","of","remote","to","push","to",".","By","default","remote","from","core.remote","config","option","is","used",".","odb",":","optional","ODB","to","push","to",".","Overrides","remote","."]
code: def push(
      self,
      objs: Iterable["HashInfo"],
      jobs: Optional[int] = None,
      remote: Optional[str] = None,
      odb: Optional["HashFileDB"] = None,
  ) -> "TransferResult":
      """Push data items in a cloud-agnostic way.
  
      Args:
          objs: objects to push to the cloud.
          jobs: number of jobs that can be running simultaneously.
          remote: optional name of remote to push to.
              By default remote from core.remote config option is used.
          odb: optional ODB to push to. Overrides remote.
      """
      if odb is not None:
          return self._push(objs, jobs=jobs, odb=odb)
      legacy_objs, default_objs = _split_legacy_hash_infos(objs)
      result = TransferResult(set(), set())
      if legacy_objs:
          odb = self.get_remote_odb(
              remote, "push", hash_name="md5-dos2unix"
          )
          t, f = self._push(legacy_objs, jobs=jobs, odb=odb)
          result.transferred.update(t)
          result.failed.update(f)
      if default_objs:
          odb = self.get_remote_odb(remote, "push")
          t, f = self._push(default_objs, jobs=jobs, odb=odb)
          result.transferred.update(t)
          result.failed.update(f)
      return result
  
imports: from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple
  from dvc.config import NoRemoteError, RemoteConfigError
  from dvc.log import logger
  from dvc.utils.objects import cached_property
  from dvc_data.hashfile.db import get_index
  from dvc_data.hashfile.transfer import TransferResult
label_desc: Use image node_id 6 for calling the DataCloud obj's underlying member method code with example usage: obj.push(objs, jobs, remote, odb) and returns: result, self