o
     i\                     @   s  d Z ddlZddlZddlmZ ddlZddlZddlZddlm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ dZ	 dZ	 dZ	 dZdZejedZdZeedZ	 dZdZejj Z!ej"j#Z$dd Z%dd Z&dd Z'd<ddZ(dd Z)d d! Z*d"d# Z+G d$d% d%e,Z-d&d' Z.d=d)d*Z/d+d, Z0d-d. Z1d/d0 Z2d1d2 Z3d>d3d4Z4d5d6 Z5	7		d?d8d9Z6d:d; Z7dS )@zVHelper functions for Cloud Storage utility classes.

These are *not* part of the API.
    N)md5)urlsplit)
urlunsplit)uuid4)environment_vars)_DEFAULT_TIMEOUT)DEFAULT_RETRY))DEFAULT_RETRY_IF_METAGENERATION_SPECIFIEDSTORAGE_EMULATOR_HOSTAPI_ENDPOINT_OVERRIDEAPI_VERSION_OVERRIDEzgoogleapis.comzstorage.{universe_domain})universe_domainzhttps://v1))if_etag_matchzIf-Match)if_etag_not_matchzIf-None-Match))if_generation_matchifGenerationMatch)if_generation_not_matchifGenerationNotMatch)if_metageneration_matchifMetagenerationMatch)if_metageneration_not_matchifMetagenerationNotMatch)if_source_generation_matchifSourceGenerationMatch)if_source_generation_not_matchifSourceGenerationNotMatch)if_source_metageneration_matchifSourceMetagenerationMatch)"if_source_metageneration_not_matchifSourceMetagenerationNotMatchc                   C   s   t jtd S N)osenvirongetSTORAGE_EMULATOR_ENV_VAR r&   r&   }/var/www/snowflake_co_dev_github/snow_flake_back_end_deploy/env/lib/python3.10/site-packages/google/cloud/storage/_helpers.py_get_storage_emulator_overrideS      r(   c                   C   s   t ttt S r!   )r"   getenv_API_ENDPOINT_OVERRIDE_ENV_VAR_DEFAULT_SCHEME_TRUE_DEFAULT_STORAGE_HOSTr&   r&   r&   r'   _get_default_storage_base_urlW   s   r.   c                   C   s   t  tt kr
t  S dS )zIThis is an experimental configuration variable. Use api_endpoint instead.N)r.   r,   r-   r&   r&   r&   r'   _get_api_endpoint_override]   s   r/   Fc                 C   s8   t | }| d|j }t|j||rdndddf}|S )zReturns the scheme and netloc sections of the url, with the bucket
    prepended to the netloc.

    Not intended for use with netlocs which include a username and password.
    ./ )r   netlocr   scheme)urlbuckettrailing_slash
parsed_url
new_netlocbase_urlr&   r&   r'   _virtual_hosted_style_base_urld   s   r;   c                   C   s   t ddkS )N!GOOGLE_API_USE_CLIENT_CERTIFICATEtrue)r"   r*   r&   r&   r&   r'   _use_client_certr   r)   r>   c                   C   s   t tjt tjS r!   )r"   r*   r   PROJECTLEGACY_PROJECTr&   r&   r&   r'   _get_environ_projectv   s   
rA   c                 C   s4   | du rdS t | d  | d  gstd| S )zPre-flight ``Bucket`` name validation.

    :type name: str or :data:`NoneType`
    :param name: Proposed bucket name.

    :rtype: str or :data:`NoneType`
    :returns: ``name`` if valid.
    Nr   z8Bucket names must start and end with a number or letter.)allisalnum
ValueError)namer&   r&   r'   _validate_name}   s
   	rG   c                   @   s   e Zd ZdZdddZedd Zedd Zed	d
 Zdd Z	dd Z
edd ZddddddddeedfddZdd Zdd ZdddddeedfddZdddddeedfddZdS )_PropertyMixina1  Abstract mixin for cloud storage classes with associated properties.

    Non-abstract subclasses should implement:
      - path
      - client
      - user_project

    :type name: str
    :param name: The name of the object. Bucket names must start and end with a
                 number or letter.
    Nc                 C   s   || _ i | _t | _d S r!   )rF   _propertiesset_changes)selfrF   r&   r&   r'   __init__   s   z_PropertyMixin.__init__c                 C      t )z$Abstract getter for the object path.NotImplementedErrorrL   r&   r&   r'   path      z_PropertyMixin.pathc                 C   rN   )z&Abstract getter for the object client.rO   rQ   r&   r&   r'   client   rS   z_PropertyMixin.clientc                 C   rN   )z,Abstract getter for the object user_project.rO   rQ   r&   r&   r'   user_project   rS   z_PropertyMixin.user_projectc                 C   s   |du r| j }|S )a  Check client or verify over-ride.

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: the client to use.  If not passed, falls back to the
                       ``client`` stored on the current object.

        :rtype: :class:`google.cloud.storage.client.Client`
        :returns: The client passed in or the currently bound client.
        N)rT   )rL   rT   r&   r&   r'   _require_client   s   z_PropertyMixin._require_clientc                 C   s   i S )a@  Return any encryption headers needed to fetch the object.

        .. note::
           Defined here because :meth:`reload` calls it, but this method is
           really only relevant for :class:`~google.cloud.storage.blob.Blob`.

        :rtype: dict
        :returns: a mapping of encryption-related headers.
        r&   rQ   r&   r&   r'   _encryption_headers   s   
z"_PropertyMixin._encryption_headersc                 C   s   i }| j dur| j |d< |S )zDefault query parameters.NuserProject)rU   )rL   paramsr&   r&   r'   _query_params   s   

z_PropertyMixin._query_paramsnoAclc                 C   s   |  |}| j}||d< t|||||d |dur"||d< | j|d< |  }t|||d |j| j|||	|
| d}| | dS )a  Reload properties from Cloud Storage.

        If :attr:`user_project` is set, bills the API request to that project.

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: the client to use. If not passed, falls back to the
                       ``client`` stored on the current object.

        :type projection: str
        :param projection: (Optional) If used, must be 'full' or 'noAcl'.
                           Defaults to ``'noAcl'``. Specifies the set of
                           properties to return.

        :type if_etag_match: Union[str, Set[str]]
        :param if_etag_match: (Optional) See :ref:`using-if-etag-match`

        :type if_etag_not_match: Union[str, Set[str]])
        :param if_etag_not_match: (Optional) See :ref:`using-if-etag-not-match`

        :type if_generation_match: long
        :param if_generation_match:
            (Optional) See :ref:`using-if-generation-match`

        :type if_generation_not_match: long
        :param if_generation_not_match:
            (Optional) See :ref:`using-if-generation-not-match`

        :type if_metageneration_match: long
        :param if_metageneration_match:
            (Optional) See :ref:`using-if-metageneration-match`

        :type if_metageneration_not_match: long
        :param if_metageneration_not_match:
            (Optional) See :ref:`using-if-metageneration-not-match`

        :type timeout: float or tuple
        :param timeout:
            (Optional) The amount of time, in seconds, to wait
            for the server response.  See: :ref:`configuring_timeouts`

        :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy
        :param retry:
            (Optional) How to retry the RPC. See: :ref:`configuring_retries`

        :type soft_deleted: bool
        :param soft_deleted:
            (Optional) If True, looks for a soft-deleted object. Will only return
            the object metadata if the object exists and is in a soft-deleted state.
            :attr:`generation` is required to be set on the blob if ``soft_deleted`` is set to True.
            See: https://cloud.google.com/storage/docs/soft-delete
        
projectionr   r   r   r   NsoftDeleted
generation)r   r   )query_paramsheaderstimeoutretry_target_object)	rV   rZ    _add_generation_match_parametersr_   rW   _add_etag_match_headers_get_resourcerR   _set_properties)rL   rT   r\   r   r   r   r   r   r   rb   rc   soft_deletedr`   ra   api_responser&   r&   r'   reload   s4   
B
z_PropertyMixin.reloadc                 C   s   | j | || j|< dS )a  Update field of this object's properties.

        This method will only update the field provided and will not
        touch the other fields.

        It **will not** reload the properties from the server. The behavior is
        local only and syncing occurs via :meth:`patch`.

        :type name: str
        :param name: The field name to update.

        :type value: object
        :param value: The value being updated.
        N)rK   addrI   )rL   rF   valuer&   r&   r'   _patch_property4  s   z_PropertyMixin._patch_propertyc                 C   s   || _ t | _dS )zSet the properties for the current object.

        :type value: dict or :class:`google.cloud.storage.batch._FutureDict`
        :param value: The properties to be set.
        N)rI   rJ   rK   rL   rm   r&   r&   r'   rh   F  s   z_PropertyMixin._set_propertiesFc	                    sp     |} j}	d|	d< |r||	d< t|	||||d  fdd jD }
|j j|
|	 ||d} | dS )	aj  Sends all changed properties in a PATCH request.

        Updates the ``_properties`` with the response from the backend.

        If :attr:`user_project` is set, bills the API request to that project.

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: the client to use. If not passed, falls back to the
                       ``client`` stored on the current object.

        :type if_generation_match: long
        :param if_generation_match:
            (Optional) See :ref:`using-if-generation-match`

        :type if_generation_not_match: long
        :param if_generation_not_match:
            (Optional) See :ref:`using-if-generation-not-match`

        :type if_metageneration_match: long
        :param if_metageneration_match:
            (Optional) See :ref:`using-if-metageneration-match`

        :type if_metageneration_not_match: long
        :param if_metageneration_not_match:
            (Optional) See :ref:`using-if-metageneration-not-match`

        :type timeout: float or tuple
        :param timeout:
            (Optional) The amount of time, in seconds, to wait
            for the server response.  See: :ref:`configuring_timeouts`

        :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy
        :param retry:
            (Optional) How to retry the RPC. See: :ref:`configuring_retries`

        :type override_unlocked_retention: bool
        :param override_unlocked_retention:
            (Optional) override_unlocked_retention must be set to True if the operation includes
            a retention property that changes the mode from Unlocked to Locked, reduces the
            retainUntilTime, or removes the retention configuration from the object. See:
            https://cloud.google.com/storage/docs/json_api/v1/objects/patch
        fullr\   overrideUnlockedRetentionr]   c                    s   i | ]}| j | qS r&   )rI   ).0keyrQ   r&   r'   
<dictcomp>      z(_PropertyMixin.patch.<locals>.<dictcomp>)r`   rd   rb   rc   N)rV   rZ   re   rK   _patch_resourcerR   rh   )rL   rT   r   r   r   r   rb   rc   override_unlocked_retentionr`   update_propertiesrj   r&   rQ   r'   patchP  s,   
6z_PropertyMixin.patchc	                 C   s^   |  |}| j}	d|	d< |r||	d< t|	||||d |j| j| j|	||| d}
| |
 dS )a`  Sends all properties in a PUT request.

        Updates the ``_properties`` with the response from the backend.

        If :attr:`user_project` is set, bills the API request to that project.

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: the client to use. If not passed, falls back to the
                       ``client`` stored on the current object.

        :type if_generation_match: long
        :param if_generation_match:
            (Optional) See :ref:`using-if-generation-match`

        :type if_generation_not_match: long
        :param if_generation_not_match:
            (Optional) See :ref:`using-if-generation-not-match`

        :type if_metageneration_match: long
        :param if_metageneration_match:
            (Optional) See :ref:`using-if-metageneration-match`

        :type if_metageneration_not_match: long
        :param if_metageneration_not_match:
            (Optional) See :ref:`using-if-metageneration-not-match`

        :type timeout: float or tuple
        :param timeout:
            (Optional) The amount of time, in seconds, to wait
            for the server response.  See: :ref:`configuring_timeouts`

        :type retry: google.api_core.retry.Retry or google.cloud.storage.retry.ConditionalRetryPolicy
        :param retry:
            (Optional) How to retry the RPC. See: :ref:`configuring_retries`

        :type override_unlocked_retention: bool
        :param override_unlocked_retention:
            (Optional) override_unlocked_retention must be set to True if the operation includes
            a retention property that changes the mode from Unlocked to Locked, reduces the
            retainUntilTime, or removes the retention configuration from the object. See:
            https://cloud.google.com/storage/docs/json_api/v1/objects/patch
        rp   r\   rq   r]   )r`   rb   rc   rd   N)rV   rZ   re   _put_resourcerR   rI   rh   )rL   rT   r   r   r   r   rb   rc   rw   r`   rj   r&   r&   r'   update  s*   
6z_PropertyMixin.updater!   )__name__
__module____qualname____doc__rM   propertyrR   rT   rU   rV   rW   rZ   r   r   rk   rn   rh   ry   r	   r{   r&   r&   r&   r'   rH      sZ    




	
a
SrH   c                    s"    fdd} fdd}t ||S )zHCreate a property descriptor around the :class:`_PropertyMixin` helpers.c                    s   | j  S )zScalar property getter.)rI   r$   rQ   	fieldnamer&   r'   _getter  s   z!_scalar_property.<locals>._getterc                    s   |   | dS )zScalar property setter.N)rn   ro   r   r&   r'   _setter  s   z!_scalar_property.<locals>._setter)r   )r   r   r   r&   r   r'   _scalar_property  s   
r       c                 C   s>   |  |}t|dkr|| |  |}t|dksdS dS )a  Read blocks from a buffer and update a hash with them.

    :type buffer_object: bytes buffer
    :param buffer_object: Buffer containing bytes used to update a hash object.

    :type hash_obj: object that implements update
    :param hash_obj: A hash object (MD5 or CRC32-C).

    :type digest_block_size: int
    :param digest_block_size: The block size to write to the hash.
                              Defaults to 8192.
    r   N)readlenr{   )buffer_objecthash_objdigest_block_sizeblockr&   r&   r'   _write_buffer_to_hash  s
   


r   c                 C   s8   t jdkrtdd}nt }t| | | }t|S )a  Get MD5 hash of bytes (as base64).

    :type buffer_object: bytes buffer
    :param buffer_object: Buffer containing bytes used to compute an MD5
                          hash (as base64).

    :rtype: str
    :returns: A base64 encoded digest of the MD5 hash.
    )   	   F)usedforsecurity)sysversion_infor   r   digestbase64	b64encode)r   r   digest_bytesr&   r&   r'   _base64_md5hash  s   



r   c                 K   sB   t D ]\}}||}|durt|tr|g}d|| |< qdS )zAdd generation match parameters into the given parameters list.

    :type headers: dict
    :param headers: Headers dict.

    :type match_parameters: dict
    :param match_parameters: if*etag*match parameters to add.
    N, )_ETAG_MATCH_PARAMETERSr$   
isinstancestrjoin)ra   match_parameterssnakecase_nameheader_namerm   r&   r&   r'   rf   &  s   	

rf   c                 K   sZ   t D ](\}}||}|dur*t| tr| ||f qt| tr&|| |< qtdqdS )ab  Add generation match parameters into the given parameters list.

    :type parameters: list or dict
    :param parameters: Parameters list or dict.

    :type match_parameters: dict
    :param match_parameters: if*generation*match parameters to add.

    :raises: :exc:`ValueError` if ``parameters`` is not a ``list()``
             or a ``dict()``.
    Nz5`parameters` argument should be a dict() or a list().)_GENERATION_MATCH_PARAMETERSr$   r   listappenddictrE   )
parametersr   r   camelcase_namerm   r&   r&   r'   re   8  s   



re   c                  K   sb   t dd |  D dkr/dd |  D }d|dd }|d }d	| d
| }t|dS )zRaise ``ValueError`` exception if more than one parameter was set.

    :type error: :exc:`ValueError`
    :param error: Description of which fields were set

    :raises: :class:`~ValueError` containing the fields that were set
    c                 s   s    | ]}|d uV  qd S r!   r&   )rr   argr&   r&   r'   	<genexpr>\  s    z._raise_if_more_than_one_set.<locals>.<genexpr>   c                 S   s   g | ]}d | d qS )'r&   )rr   rF   r&   r&   r'   
<listcomp>]  ru   z/_raise_if_more_than_one_set.<locals>.<listcomp>r   NrB   zPass at most one of z and )sumvalueskeysr   rE   )kwargsescaped_keyskeys_but_lastlast_keymsgr&   r&   r'   _raise_if_more_than_one_setT  s   r   c                 C   s&   t | }|jr|jr| S | d|  S )a!  Helper to build bucket bound hostname URL.

    :type host: str
    :param host: Host name.

    :type scheme: str
    :param scheme: (Optional) Web scheme. If passed, use it
                   as a scheme in the result URL.

    :rtype: str
    :returns: A bucket bound hostname URL.
    z://)r   r4   r3   )hostr4   	url_partsr&   r&   r'   _bucket_bound_hostname_urlg  s   r   c                   C   s   dt t  S )Nzgccl-invocation-id/)r   r   r&   r&   r&   r'   _get_invocation_id{  r)   r   application/json; charset=UTF-8c                 C   s8   |  dt   }|r|d| 7 }dd| |||p|dS )a  Get the headers for a request.

    :type user_agent: str
    :param user_agent: The user-agent for requests.

    :type command: str
    :param command:
        (Optional) Information about which interface for the operation was
        used, to be included in the X-Goog-API-Client header. Please leave
        as None unless otherwise directed.

    :rtype: dict
    :returns: The headers to be used for the request.
     z gccl-gcs-cmd/zapplication/jsonzgzip, deflate)AcceptzAccept-Encodingz
User-AgentzX-Goog-API-Clientzcontent-typezx-upload-content-type)r   )
user_agentcontent_typex_upload_content_typecommandx_goog_api_clientr&   r&   r'   _get_default_headers  s   r   c                  C   s   t d} t| dS )a  Generates a secure 56 bit random integer.


    If 64 bit int is used, sometimes the random int generated is greater than
    max positive value of signed 64 bit int which is 2^63 -1 causing overflow
    issues.

    :rtype: int
    :returns: A secure random 56 bit integer.
       big)secretstoken_bytesint
from_bytes)random_bytesr&   r&   r'   generate_random_56_bit_integer  s   
r   )F)r   r!   )r   NN)8r   r   datetimehashlibr   r"   r   r   urllib.parser   r   uuidr   google.authr   google.cloud.storage.constantsr   google.cloud.storage.retryr   r	   r%   r+   _API_VERSION_OVERRIDE_ENV_VAR_DEFAULT_UNIVERSE_DOMAIN_STORAGE_HOST_TEMPLATEformatr-   r,   r*   _API_VERSIONr   r   now_NOWtimezoneutc_UTCr(   r.   r/   r;   r>   rA   rG   objectrH   r   r   r   rf   re   r   r   r   r   r   r&   r&   r&   r'   <module>   sn   
  c


#