
    h?                         d 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Z
dZd	Zd
ZdZdZdZdZdZe                    ee          Z ej        e          ZdZ G d de          Zd ZdS )zConfigure bucket notification resources to interact with Google Cloud Pub/Sub.

See [Cloud Pub/Sub Notifications for Google Cloud Storage](https://cloud.google.com/storage/docs/pubsub-notifications)
    N)NotFound)create_trace_span)_DEFAULT_TIMEOUT)DEFAULT_RETRYOBJECT_FINALIZEOBJECT_METADATA_UPDATEOBJECT_DELETEOBJECT_ARCHIVEJSON_API_V1NONEz-//pubsub.googleapis.com/projects/{}/topics/{}z)(?P<project>[a-z][a-z0-9-]{4,28}[a-z0-9])z (?P<name>[A-Za-z](\w|[-_.~+%])+)zpResource has invalid topic: {}; see https://cloud.google.com/storage/docs/json_api/v1/notifications/insert#topicc                      e Zd ZdZdddddedfdZed             Zed             Z	ed             Z
ed             Zed             Zed	             Zed
             Zed             Zed             Zed             Zed             Zed             Zed             Zd Zd ZdedfdZdeefdZdeefdZdeefdZdS )BucketNotificationa  Represent a single notification resource for a bucket.

    See: https://cloud.google.com/storage/docs/json_api/v1/notifications

    :type bucket: :class:`google.cloud.storage.bucket.Bucket`
    :param bucket: Bucket to which the notification is bound.

    :type topic_name: str
    :param topic_name:
        (Optional) Topic name to which notifications are published.

    :type topic_project: str
    :param topic_project:
        (Optional) Project ID of topic to which notifications are published.
        If not passed, uses the project ID of the bucket's client.

    :type custom_attributes: dict
    :param custom_attributes:
        (Optional) Additional attributes passed with notification events.

    :type event_types: list(str)
    :param event_types:
        (Optional) Event types for which notification events are published.

    :type blob_name_prefix: str
    :param blob_name_prefix:
        (Optional) Prefix of blob names for which notification events are
        published.

    :type payload_format: str
    :param payload_format:
        (Optional) Format of payload for notification events.

    :type notification_id: str
    :param notification_id:
        (Optional) The ID of the notification.
    Nc	                     || _         || _        ||j        j        }|t	          d          || _        i | _        |
|| j        d<   |
|| j        d<   |
|| j        d<   |
|| j        d<   || j        d<   d S )Nz8Client project not set:  pass an explicit topic_project.custom_attributesevent_typesobject_name_prefixidpayload_format)_bucket_topic_nameclientproject
ValueError_topic_project_properties)	selfbucket
topic_nametopic_projectr   r   blob_name_prefixr   notification_ids	            e/var/www/html/e360mart/e360mart_env/lib/python3.11/site-packages/google/cloud/storage/notification.py__init__zBucketNotification.__init__X   s     % "M1M WXXX+(4ED01".9D]+'5ED12&%4DT"-;)***    c                     |                     d          }|t          d          t          |          \  }} | |||          }||_        |S )a  Construct an instance from the JSON repr returned by the server.

        See: https://cloud.google.com/storage/docs/json_api/v1/notifications

        :type resource: dict
        :param resource: JSON repr of the notification

        :type bucket: :class:`google.cloud.storage.bucket.Bucket`
        :param bucket: Bucket to which the notification is bound.

        :rtype: :class:`BucketNotification`
        :returns: the new notification instance
        topicNzResource has no topic)r   )getr   _parse_topic_pathr   )clsresourcer   
topic_pathnamer   instances          r"   from_api_reprz BucketNotification.from_api_repr~   s^     \\'**
4555)*55g3vt7;;;'r$   c                     | j         S )z*Bucket to which the notification is bound.)r   r   s    r"   r   zBucketNotification.bucket   s     |r$   c                     | j         S )z0Topic name to which notifications are published.)r   r0   s    r"   r   zBucketNotification.topic_name   s     r$   c                     | j         S )z9Project ID of topic to which notifications are published.)r   r0   s    r"   r   z BucketNotification.topic_project   s     ""r$   c                 6    | j                             d          S )z2Custom attributes passed with notification events.r   r   r'   r0   s    r"   r   z$BucketNotification.custom_attributes   s     ##$7888r$   c                 6    | j                             d          S )z8Event types for which notification events are published.r   r4   r0   s    r"   r   zBucketNotification.event_types   s     ##M222r$   c                 6    | j                             d          S )zAPrefix of blob names for which notification events are published.r   r4   r0   s    r"   r    z#BucketNotification.blob_name_prefix   s     ##$8999r$   c                 6    | j                             d          S )z)Format of payload of notification events.r   r4   r0   s    r"   r   z!BucketNotification.payload_format   s     ##$4555r$   c                 6    | j                             d          S )z'Server-set ID of notification resource.r   r4   r0   s    r"   r!   z"BucketNotification.notification_id   s     ##D)))r$   c                 6    | j                             d          S ))Server-set ETag of notification resource.etagr4   r0   s    r"   r;   zBucketNotification.etag   s     ##F+++r$   c                 6    | j                             d          S )r:   selfLinkr4   r0   s    r"   	self_linkzBucketNotification.self_link   s     ##J///r$   c                     | j         j        S )z%The client bound to this notfication.)r   r   r0   s    r"   r   zBucketNotification.client   s     {!!r$   c                 0    d| j         j         d| j         S )z#The URL path for this notification./b/z/notificationConfigs/)r   r,   r!   r0   s    r"   pathzBucketNotification.path   s#     ST[%RRD<PRRRr$   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.

        :rtype: :class:`google.cloud.storage.client.Client`
        :returns: The client passed in or the bucket's client.
        )r   )r   r   s     r"   _require_clientz"BucketNotification._require_client   s     >[Fr$   c                 l    | j                                          | j                             |           dS )zwHelper for :meth:`reload`.

        :type response: dict
        :param response: resource mapping from server
        N)r   clearupdate)r   responses     r"   _set_propertiesz"BucketNotification._set_properties   s6     	   )))))r$   c                 0   t          d          5  | j        t          d| j         d          |                     |          }i }| j        j        | j        j        |d<   d| j        j         d}| j                                        }| j	        $t                              | j        d	          |d
<   n(t                              | j        | j	                  |d
<   |                    |||||          | _        ddd           dS # 1 swxY w Y   dS )a  API wrapper: create the notification.

        See:
        https://cloud.google.com/storage/docs/json_api/v1/notifications/insert

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

        :type client: :class:`~google.cloud.storage.client.Client`
        :param client: (Optional) The client to use.  If not passed, falls back
                       to the ``client`` stored on the notification's bucket.
        :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`

        :raises ValueError: if the notification already exists.
        z!Storage.BucketNotification.creater,   Nznotification_id already set to z(; must be None to create a Notification.userProjectrA   z/notificationConfigs r&   query_paramstimeoutretry)r   r!   r   rD   r   user_projectr,   r   copyr   _TOPIC_REF_FMTformatr   _post_resource)r   r   rP   rQ   rO   rB   
propertiess          r"   createzBucketNotification.create   s~   . $GHHH 	 	#/ td6Jttt   ))&11FL{'3.2k.F]+?)???D)..00J&&4&;&;D<NPR&S&S
7##&4&;&;&' '
7#  &44)  5    D-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   C-DDDc                 `   t          d          5  | j        t          d          |                     |          }i }| j        j        | j        j        |d<   	 |                    | j        |||           	 ddd           dS # t          $ r Y ddd           dS w xY w# 1 swxY w Y   dS )	a  Test whether this notification exists.

        See:
        https://cloud.google.com/storage/docs/json_api/v1/notifications/get

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

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: (Optional) The client to use.  If not passed, falls back
                       to the ``client`` stored on the current bucket.
        :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`

        :rtype: bool
        :returns: True, if the notification exists, else False.
        :raises ValueError: if the notification has no ID.
        z!Storage.BucketNotification.existsrK   N8Notification ID not set: set an explicit notification_idrL   rN   TF)	r   r!   r   rD   r   rR   _get_resourcerB   r   r   r   rP   rQ   rO   s        r"   existszBucketNotification.exists  sI   4 $GHHH 	 	#+ N   ))&11FL{'3.2k.F]+
$$I!-#	 %    -	 	 	 	 	 	 	 	&    )	 	 	 	 	 	 	 	&'	 	 	 	 	 	 	 	 	 	s6   A	B#B9B#
B B#B  B##B'*B'c                 N   t          d          5  | j        t          d          |                     |          }i }| j        j        | j        j        |d<   |                    | j        |||          }|                     |           ddd           dS # 1 swxY w Y   dS )a  Update this notification from the server configuration.

        See:
        https://cloud.google.com/storage/docs/json_api/v1/notifications/get

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

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: (Optional) The client to use.  If not passed, falls back
                       to the ``client`` stored on the current bucket.
        :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`


        :raises ValueError: if the notification has no ID.
        z!Storage.BucketNotification.reloadrK   NrZ   rL   rN   )	r   r!   r   rD   r   rR   r[   rB   rI   )r   r   rP   rQ   rO   rH   s         r"   reloadzBucketNotification.reloadQ  s
   2 $GHHH 	+ 	+#+ N   ))&11FL{'3.2k.F]+++	)	 ,  H   ***%	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   A<BB!Bc                 $   t          d          5  | j        t          d          |                     |          }i }| j        j        | j        j        |d<   |                    | j        |||           ddd           dS # 1 swxY w Y   dS )a  Delete this notification.

        See:
        https://cloud.google.com/storage/docs/json_api/v1/notifications/delete

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

        :type client: :class:`~google.cloud.storage.client.Client` or
                      ``NoneType``
        :param client: (Optional) The client to use.  If not passed, falls back
                       to the ``client`` stored on the current bucket.
        :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`

        :raises: :class:`google.api_core.exceptions.NotFound`:
            if the notification does not exist.
        :raises ValueError: if the notification has no ID.
        z!Storage.BucketNotification.deleterK   NrZ   rL   rN   )r   r!   r   rD   r   rR   _delete_resourcerB   r\   s        r"   deletezBucketNotification.delete~  s    4 $GHHH 	 	#+ N   ))&11FL{'3.2k.F]+##	)	 $   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A'BB	B	)__name__
__module____qualname____doc__NONE_PAYLOAD_FORMATr#   classmethodr.   propertyr   r   r   r   r   r    r   r!   r;   r>   r   rB   rD   rI   r   rX   r   r]   r_   rb    r$   r"   r   r   1   sF       $ $R *$< $< $< $<L   [0   X     X  # # X# 9 9 X9 3 3 X3 : : X: 6 6 X6 * * X* , , X, 0 0 X0 " " X" S S XS  * * * !*:$ 3 3 3 3j !*:- 0 0 0 0d !*:- ++ ++ ++ ++Z !*:- + + + + + +r$   r   c                     t                               |           }|'t          t                              |                     |                    d          |                    d          fS )a  Verify that a topic path is in the correct format.

    Expected to be of the form:

        //pubsub.googleapis.com/projects/{project}/topics/{topic}

    where the ``project`` value must be "6 to 30 lowercase letters, digits,
    or hyphens. It must start with a letter. Trailing hyphens are prohibited."
    (see [`resource manager docs`](https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects#Project.FIELDS.project_id))
    and ``topic`` must have length at least two,
    must start with a letter and may only contain alphanumeric characters or
    ``-``, ``_``, ``.``, ``~``, ``+`` or ``%`` (i.e characters used for URL
    encoding, see [`topic spec`](https://cloud.google.com/storage/docs/json_api/v1/notifications/insert#topic)).

    Args:
        topic_path (str): The topic path to be verified.

    Returns:
        Tuple[str, str]: The ``project`` and ``topic`` parsed from the
        ``topic_path``.

    Raises:
        ValueError: If the topic path is invalid.
    Nr,   r   )_TOPIC_REF_REmatchr   
_BAD_TOPICrU   group)r+   rm   s     r"   r(   r(     s[    2 
++E}**:66777;;vI 6 666r$   )rf   regoogle.api_core.exceptionsr   +google.cloud.storage._opentelemetry_tracingr   google.cloud.storage.constantsr   google.cloud.storage.retryr   OBJECT_FINALIZE_EVENT_TYPE!OBJECT_METADATA_UPDATE_EVENT_TYPEOBJECT_DELETE_EVENT_TYPEOBJECT_ARCHIVE_EVENT_TYPEJSON_API_V1_PAYLOAD_FORMATrg   rT   _PROJECT_PATTERN_TOPIC_NAME_PATTERNrU   _TOPIC_REF_PATTERNcompilerl   rn   objectr   r(   rj   r$   r"   <module>r      s   
 
			 / / / / / / I I I I I I ; ; ; ; ; ; 4 4 4 4 4 4 / $< !* , *  @? 9 #**+;=PQQ 
-..! x x x x x x x xv7 7 7 7 7r$   