
    'wf<                         d Z ddl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j#                  ee      Z ej&                  e      ZdZ G d de      Zd Zy)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)_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y)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<   y )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	            u/home/panchajanya/Development/work/volatility3/venv/lib/python3.12/site-packages/google/cloud/storage/notification.py__init__zBucketNotification.__init__W   s     % "MM11M WXX+(4ED01".9D]+'5ED12&%4DT"-;)*    c                     |j                  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
        topiczResource has no topic)r   )getr   _parse_topic_pathr   )clsresourcer   
topic_pathnamer   instances          r!   from_api_reprz BucketNotification.from_api_repr}   sM     \\'*
455)*5gvt7;'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   r/   s    r!   r   zBucketNotification.topic_name   s     r#   c                     | j                   S )z9Project ID of topic to which notifications are published.)r   r/   s    r!   r   z BucketNotification.topic_project   s     """r#   c                 8    | j                   j                  d      S )z2Custom attributes passed with notification events.r   r   r&   r/   s    r!   r   z$BucketNotification.custom_attributes   s     ##$788r#   c                 8    | j                   j                  d      S )z8Event types for which notification events are published.r   r3   r/   s    r!   r   zBucketNotification.event_types   s     ##M22r#   c                 8    | j                   j                  d      S )zAPrefix of blob names for which notification events are published.r   r3   r/   s    r!   r   z#BucketNotification.blob_name_prefix   s     ##$899r#   c                 8    | j                   j                  d      S )z)Format of payload of notification events.r   r3   r/   s    r!   r   z!BucketNotification.payload_format   s     ##$455r#   c                 8    | j                   j                  d      S )z'Server-set ID of notification resource.r   r3   r/   s    r!   r    z"BucketNotification.notification_id   s     ##D))r#   c                 8    | j                   j                  d      S ))Server-set ETag of notification resource.etagr3   r/   s    r!   r:   zBucketNotification.etag   s     ##F++r#   c                 8    | j                   j                  d      S )r9   selfLinkr3   r/   s    r!   	self_linkzBucketNotification.self_link   s     ##J//r#   c                 .    | j                   j                  S )z%The client bound to this notfication.)r   r   r/   s    r!   r   zBucketNotification.client   s     {{!!!r#   c                 N    d| j                   j                   d| j                   S )z#The URL path for this notification./b/z/notificationConfigs/)r   r+   r    r/   s    r!   pathzBucketNotification.path   s*     T[[%%&&;D<P<P;Q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                 n    | j                   j                          | j                   j                  |       y)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   s*     	 )r#   c                 (   | j                   t        d| j                          | j                  |      }i }| j                  j                  | j                  j                  |d<   d| j                  j
                   d}| j                  j                         }| j                  $t        j                  | j                  d      |d<   n-t        j                  | j                  | j                        |d<   |j                  |||||      | _        y)	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.
        Nz#Notification already exists w/ id: userProjectr@   z/notificationConfigs r%   query_paramstimeoutretry)r    r   rC   r   user_projectr+   r   copyr   _TOPIC_REF_FMTformatr   _post_resource)r   r   rN   rO   rM   rA   
propertiess          r!   createzBucketNotification.create   s   . +5d6J6J5KL  %%f-;;##/*.++*B*BL'T[[%%&&:;%%**,
??""0"7"78J8JB"OJw"0"7"7""DOO#Jw "00% 1 
r#   c                    | j                   t        d      | j                  |      }i }| j                  j                  | j                  j                  |d<   	 |j                  | j                  |||       y# t        $ r Y yw xY w)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.
        8Notification ID not set: set an explicit notification_idrJ   rL   TF)r    r   rC   r   rP   _get_resourcerA   r   r   r   rN   rO   rM   s        r!   existszBucketNotification.exists  s    4 'WXX%%f-;;##/*.++*B*BL'
	  		)	 !    		s   A; ;	BBc                    | j                   t        d      | j                  |      }i }| j                  j                  | j                  j                  |d<   |j                  | j                  |||      }| j                  |       y)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.
        NrX   rJ   rL   )r    r   rC   r   rP   rY   rA   rH   )r   r   rN   rO   rM   rG   s         r!   reloadzBucketNotification.reloadL  s    2 'WXX%%f-;;##/*.++*B*BL'''II%	 ( 
 	X&r#   c                     | j                   t        d      | j                  |      }i }| j                  j                  | j                  j                  |d<   |j                  | j                  |||       y)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.
        NrX   rJ   rL   )r    r   rC   r   rP   _delete_resourcerA   rZ   s        r!   deletezBucketNotification.deletev  sx    4 'WXX%%f-;;##/*.++*B*BL'II%	 	  	
r#   )__name__
__module____qualname____doc__NONE_PAYLOAD_FORMATr"   classmethodr-   propertyr   r   r   r   r   r   r   r    r:   r=   r   rA   rC   rH   r   rV   r   r[   r]   r`    r#   r!   r   r   0   st   $R *$<L  0       # # 9 9 3 3 : : 6 6 * * , , 0 0 " " S S* !*:$ 2
h !*:- -^ !*:- ('T !*:- (
r#   r   c                     t         j                  |       }|t        t        j	                  |             |j                  d      |j                  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.
    r+   r   )_TOPIC_REF_REmatchr   
_BAD_TOPICrS   group)r*   rk   s     r!   r'   r'     sL    2 
+E}**:677;;vI 666r#   )rd   regoogle.api_core.exceptionsr   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_FORMATre   rR   _PROJECT_PATTERN_TOPIC_NAME_PATTERNrS   _TOPIC_REF_PATTERNcompilerj   rl   objectr   r'   rh   r#   r!   <module>r|      s   
 
 / ; 4 / $< !* , *  @? 9 #**+;=PQ 

-.! n
 n
b7r#   