
    ѮhkZ                        d Z ddlZddlZddlm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      ZdZ ej4                  ed      Z	 dZdZej                  j<                  Zej@                  jB                  Z"d Z#d Z$d Z%d'dZ&d Z'd Z(d Z) G d de*      Z+d Z,d(dZ-d  Z.d! Z/d" Z0d# Z1d)d$Z2d% Z3	 	 	 d*d&Z4y)+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                  J    t         j                  j                  t        d       S N)osenvirongetSTORAGE_EMULATOR_ENV_VAR     o/home/www/academy-backend.kofcorporation.com/venv/lib/python3.12/site-packages/google/cloud/storage/_helpers.py_get_storage_emulator_overrider+   Q   s    ::>>2D99r)   c                  L    t        j                  t        t        t        z         S r#   )r$   getenv_API_ENDPOINT_OVERRIDE_ENV_VAR_DEFAULT_SCHEME_TRUE_DEFAULT_STORAGE_HOSTr(   r)   r*   _get_default_storage_base_urlr1   U   s    99&:T(T r)   c                  H    t               t        t        z   k7  r
t               S y)zIThis is an experimental configuration variable. Use api_endpoint instead.N)r1   r/   r0   r(   r)   r*   _get_api_endpoint_overrider3   [   s    $&/<V*VV,..r)   c                 z    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_urls         r*   _virtual_hosted_style_base_urlr@   b   sM     #J81Z../0J			J~2r2NH Or)   c                  2    t        j                  d      dk(  S )N!GOOGLE_API_USE_CLIENT_CERTIFICATEtrue)r$   r-   r(   r)   r*   _use_client_certrD   p   s    9989VCCr)   c                      t        j                  t        j                  t        j                  t        j                              S r#   )r$   r-   r   PROJECTLEGACY_PROJECTr(   r)   r*   _get_environ_projectrH   t   s/    99  
		"112 r)   c                     | yt        | d   j                         | d   j                         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)names    r*   _validate_namerO   {   sD     | Q!48#3#3#567STTKr)   c                       e Zd ZdZddZed        Zed        Zed        Zd Z	d Z
ed	        Zdd
ddddddeedfdZd Zd ZdddddeedfdZdddddeedfdZy)_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                 >    || _         i | _        t               | _        y r#   )rN   _propertiesset_changes)selfrN   s     r*   __init__z_PropertyMixin.__init__   s    	r)   c                     t         )z$Abstract getter for the object path.NotImplementedErrorrV   s    r*   pathz_PropertyMixin.path   
     "!r)   c                     t         )z&Abstract getter for the object client.rY   r[   s    r*   clientz_PropertyMixin.client   r]   r)   c                     t         )z,Abstract getter for the object user_project.rY   r[   s    r*   user_projectz_PropertyMixin.user_project   r]   r)   c                 "    || 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.
        )r_   )rV   r_   s     r*   _require_clientz_PropertyMixin._require_client   s     >[[Fr)   c                     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(   r[   s    r*   _encryption_headersz"_PropertyMixin._encryption_headers   s	     	r)   c                 @    i }| j                   | j                   |d<   |S )zDefault query parameters.userProject)ra   )rV   paramss     r*   _query_paramsz_PropertyMixin._query_params   s*     ($($5$5F=!r)   noAclc                 4   | j                  |      }| j                  }||d<   t        |||||       |||d<   | j                  |d<   | j	                         }t        |||       |j                  | j                  |||	|
|       }| j                  |       y)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)	rc   ri    _add_generation_match_parametersro   re   _add_etag_match_headers_get_resourcer\   _set_properties)rV   r_   rl   r   r   r   r   r   r   rr   rs   soft_deletedrp   rq   api_responses                  r*   reloadz_PropertyMixin.reload   s    D %%f-)) &0\"( 3$;$;(C	
 #*6L' *.L&**,=DU	
 ++II% , 
 	\*r)   c                 X    | j                   j                  |       || j                  |<   y)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)rU   addrS   )rV   rN   values      r*   _patch_propertyz_PropertyMixin._patch_property2  s&     	$!&r)   c                 0    || _         t               | _        y)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)rS   rT   rU   )rV   r~   s     r*   rx   z_PropertyMixin._set_propertiesD  s     !r)   Fc	                 2   | j                  |      }| j                  }	d|	d<   |r||	d<   t        |	||||       | j                  D 
ci c]  }
|
| j                  |
    }}
|j                  | j                  ||	| ||      }| j                  |       yc c}
w )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
        fullrl   overrideUnlockedRetentionrm   )rp   rt   rr   rs   N)rc   ri   ru   rU   rS   _patch_resourcer\   rx   )rV   r_   r   r   r   r   rr   rs   override_unlocked_retentionrp   keyupdate_propertiesrz   s                r*   patchz_PropertyMixin.patchN  s    l %%f-)) &,\"&8SL45( 3$;$;(C	
 DH==QCS$"2"23"77QQ --II% . 
 	\* Rs   Bc	                     | j                  |      }| j                  }	d|	d<   |r||	d<   t        |	||||       |j                  | j                  | j
                  |	|||       }
| j                  |
       y)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
        r   rl   r   rm   )rp   rr   rs   rt   N)rc   ri   ru   _put_resourcer\   rS   rx   )rV   r_   r   r   r   r   rr   rs   r   rp   rz   s              r*   updatez_PropertyMixin.update  s    l %%f-))%+\"&8SL45( 3$;$;(C	
 ++II% , 
 	\*r)   r#   )__name__
__module____qualname____doc__rW   propertyr\   r_   ra   rc   re   ri   r   r	   r{   r   rx   r   r
   r   r(   r)   r*   rQ   rQ      s    

 " " " " " "
     $ $$( _+B'$   $ $$( $)O+f   $ $$( 7$)L+r)   rQ   c                 0      fd} fd}t        ||      S )zHCreate a property descriptor around the :class:`_PropertyMixin` helpers.c                 :    | j                   j                        S )zScalar property getter.)rS   r&   )rV   	fieldnames    r*   _getterz!_scalar_property.<locals>._getter  s    ##I..r)   c                 *    | j                  |       y)zScalar property setter.N)r   )rV   r~   r   s     r*   _setterz!_scalar_property.<locals>._setter  s    Y.r)   )r   )r   r   r   s   `  r*   _scalar_propertyr     s    // GW%%r)   c                     | j                  |      }t        |      dkD  r2|j                  |       | j                  |      }t        |      dkD  r1yy)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blocks       r*   _write_buffer_to_hashr     sJ     01E
e*q.""#45 e*q.r)   c                 x    t               }t        | |       |j                         }t        j                  |      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.
    )r   r   digestbase64	b64encode)r   r   digest_bytess      r*   _base64_md5hashr     s2     uH-2??$LL))r)   c                     t         D ]@  \  }}|j                  |      }|t        |t              r|g}dj	                  |      | |<   B y)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)rq   match_parameterssnakecase_nameheader_namer~   s        r*   rv   rv   !  sR     (> 4# $$^4%%#'99U#3GK 4r)   c                     t         D ]]  \  }}|j                  |      }|t        | t              r| j	                  ||f       >t        | t
              r|| |<   Tt        d       y)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dictrM   )
parametersr   r   camelcase_namer~   s        r*   ru   ru   3  sr     +G & $$^4*d+!!>5"9:J--2
>* !K r)   c                      t        d | j                         D              dkD  rM| j                         D cg c]  }d| d
 }}dj                  |dd       }|d   }d| d| }t	        |      yc c}w )	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              3   $   K   | ]  }|d u 
 y wr#   r(   ).0args     r*   	<genexpr>z._raise_if_more_than_one_set.<locals>.<genexpr>W  s     
6s3d?
6s      'r   NrJ   zPass at most one of z and )sumvalueskeysr   rM   )kwargsrN   escaped_keyskeys_but_lastlast_keymsgs         r*   _raise_if_more_than_one_setr   O  s     
6fmmo
66:06>!D6>>		,s"34#$]O5
Co ;>s   A2c                 Z    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   r9   r8   )hostr9   	url_partss      r*   _bucket_bound_hostname_urlr   b  s4     II,,XSr)   c                  .    dt        t                     z   S )Nzgccl-invocation-id/)r   r   r(   r)   r*   _get_invocation_idr   v  s     3uw<//r)   c                 N    |  dt                }|r|d| z  }dd| |||xs |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_clients        r*   _get_default_headersr   z  sR    ( &,a(:(<'=>~gY77 %* .$!6!F, r)   )F)i    r#   )zapplication/json; charset=UTF-8NN)5r   r   datetimehashlibr   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formatr0   r/   r-   _API_VERSIONr   r   now_NOWtimezoneutc_UTCr+   r1   r3   r@   rD   rH   rO   objectrQ   r   r   r   rv   ru   r   r   r   r   r(   r)   r*   <module>r      s+  
    	 ! #  ( ; 4 P 3  >!8  O 6  O+ 4 3::, ;   ryy6= - 	   :D$^+V ^+B&6** 4$8& (0 3	 r)   