class_docstr: Stores artifacts on Google Cloud Storage.
  
  :param artifact_uri: URI of GCS bucket
  :param client: Optional. The client to use for GCS operations; a default
                     client object will be created if unspecified, using default
                     credentials as described in https://google-cloud.readthedocs.io/en/latest/core/auth.html
class_docstr_tok: ["Stores","artifacts","on","Google","Cloud","Storage",".",":","param","artifact_uri",":","URI","of","GCS","bucket",":","param","client",":","Optional",".","The","client","to","use","for","GCS","operations",";","a","default","client","object","will","be","created","if","unspecified",",","using","default","credentials","as","described","in","https",":","\/\/google-cloud.readthedocs.io\/en\/latest\/core\/auth.html"]
code: def log_artifacts(self, local_dir, artifact_path=None):
      (bucket, dest_path) = self.parse_gcs_uri(self.artifact_uri)
      if artifact_path:
          dest_path = posixpath.join(dest_path, artifact_path)
      gcs_bucket = self._get_bucket(bucket)
  
      local_dir = os.path.abspath(local_dir)
      for root, _, filenames in os.walk(local_dir):
          upload_path = dest_path
          if root != local_dir:
              rel_path = os.path.relpath(root, local_dir)
              rel_path = relative_path_to_artifact_path(rel_path)
              upload_path = posixpath.join(dest_path, rel_path)
          for f in filenames:
              path = posixpath.join(upload_path, f)
              gcs_bucket.blob(
                  path, chunk_size=self._GCS_UPLOAD_CHUNK_SIZE
              ).upload_from_filename(
                  os.path.join(root, f),
                  timeout=self._GCS_DEFAULT_TIMEOUT,
              )
  
imports: import datetime
  import importlib.metadata
  import os
  import posixpath
  import urllib.parse
  from collections import namedtuple
  from packaging.version import Version
  from mlflow.entities import FileInfo
  from mlflow.entities.multipart_upload import CreateMultipartUploadResponse, MultipartUploadCredential
  from mlflow.environment_variables import MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT, MLFLOW_GCS_DEFAULT_TIMEOUT, MLFLOW_GCS_DOWNLOAD_CHUNK_SIZE, MLFLOW_GCS_UPLOAD_CHUNK_SIZE
  from mlflow.exceptions import _UnsupportedMultipartUploadException
  from mlflow.store.artifact.artifact_repo import ArtifactRepository, MultipartUploadMixin
  from mlflow.utils.file_utils import relative_path_to_artifact_path
label_desc: Use image node_id 5 for calling the GCSArtifactRepository obj's underlying member method code with example usage: obj.log_artifacts(local_dir, artifact_path) without return types