docs: def prepare_framework(estimator, s3_operations):
      """Prepare S3 operations (specify where to upload `source_dir`) and environment variables
      related to framework.
  
      Args:
          estimator (sagemaker.estimator.Estimator): The framework estimator to get information from and update.
          s3_operations (dict): The dict to specify s3 operations (upload `source_dir`).
      """
      if estimator.code_location is not None:
          bucket, key = fw_utils.parse_s3_url(estimator.code_location)
          key = os.path.join(key, estimator._current_job_name, 'source', 'sourcedir.tar.gz')
      else:
          bucket = estimator.sagemaker_session._default_bucket
          key = os.path.join(estimator._current_job_name, 'source', 'sourcedir.tar.gz')
      script = os.path.basename(estimator.entry_point)
      if estimator.source_dir and estimator.source_dir.lower().startswith('s3://'):
          code_dir = estimator.source_dir
          estimator.uploaded_code = fw_utils.UploadedCode(s3_prefix=code_dir, script_name=script)
      else:
          code_dir = 's3://{}/{}'.format(bucket, key)
          estimator.uploaded_code = fw_utils.UploadedCode(s3_prefix=code_dir, script_name=script)
          s3_operations['S3Upload'] = [{
              'Path': estimator.source_dir or script,
              'Bucket': bucket,
              'Key': key,
              'Tar': True
          }]
      estimator._hyperparameters[sagemaker.model.DIR_PARAM_NAME] = code_dir
      estimator._hyperparameters[sagemaker.model.SCRIPT_PARAM_NAME] = script
      estimator._hyperparameters[sagemaker.model.CLOUDWATCH_METRICS_PARAM_NAME] = \
          estimator.enable_cloudwatch_metrics
      estimator._hyperparameters[sagemaker.model.CONTAINER_LOG_LEVEL_PARAM_NAME] = estimator.container_log_level
      estimator._hyperparameters[sagemaker.model.JOB_NAME_PARAM_NAME] = estimator._current_job_name
      estimator._hyperparameters[sagemaker.model.SAGEMAKER_REGION_PARAM_NAME] = \
          estimator.sagemaker_session.boto_region_name