o
    ˷eh<                     @   s   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eeZeeZdZG dd deZdd ZdS )z*Support for bucket notification resources.    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                   @   s  e Zd ZdZdddddedfddZedd Zedd Z	ed	d
 Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zdd  Zd!d" Zdedfd#d$Zdeefd%d&Zdeefd'd(Zdeefd)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	           	      C   s   || _ || _|d u r|jj}|d u rtd|| _i | _|d ur%|| jd< |d ur.|| jd< |d ur7|| jd< |d ur@|| 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_id r   X/var/www/ideatree/venv/lib/python3.10/site-packages/google/cloud/storage/notification.py__init__T   s"   



zBucketNotification.__init__c                 C   s>   | d}|du rtdt|\}}| |||d}||_|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   instancer   r   r   from_api_reprz   s   
z BucketNotification.from_api_reprc                 C      | j S )z*Bucket to which the notification is bound.)r   r   r   r   r   r         zBucketNotification.bucketc                 C   r*   )z0Topic name to which notifications are published.)r   r+   r   r   r   r      r,   zBucketNotification.topic_namec                 C   r*   )z9Project ID of topic to which notifications are published.)r   r+   r   r   r   r      r,   z BucketNotification.topic_projectc                 C      | j dS )z2Custom attributes passed with notification events.r   r   r"   r+   r   r   r   r         z$BucketNotification.custom_attributesc                 C   r-   )z8Event types for which notification events are published.r   r.   r+   r   r   r   r      r/   zBucketNotification.event_typesc                 C   r-   )zAPrefix of blob names for which notification events are published.r   r.   r+   r   r   r   r      r/   z#BucketNotification.blob_name_prefixc                 C   r-   )z)Format of payload of notification events.r   r.   r+   r   r   r   r      r/   z!BucketNotification.payload_formatc                 C   r-   )z'Server-set ID of notification resource.r   r.   r+   r   r   r   r      r/   z"BucketNotification.notification_idc                 C   r-   ))Server-set ETag of notification resource.etagr.   r+   r   r   r   r1      r/   zBucketNotification.etagc                 C   r-   )r0   selfLinkr.   r+   r   r   r   	self_link   r/   zBucketNotification.self_linkc                 C   s   | j jS )z%The client bound to this notfication.)r   r   r+   r   r   r   r      s   zBucketNotification.clientc                 C   s   d| j j d| j S )z#The URL path for this notification./b/z/notificationConfigs/)r   r'   r   r+   r   r   r   path   s   zBucketNotification.pathc                 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.

        :rtype: :class:`google.cloud.storage.client.Client`
        :returns: The client passed in or the bucket's client.
        N)r   )r   r   r   r   r   _require_client   s   
z"BucketNotification._require_clientc                 C   s   | j   | j | dS )zwHelper for :meth:`reload`.

        :type response: dict
        :param response: resource mapping from server
        N)r   clearupdate)r   responser   r   r   _set_properties   s   
z"BucketNotification._set_propertiesc                 C   s   | j durtd| j  | |}i }| jjdur | jj|d< d| jj d}| j }| jdu r<t	
| jd|d< n
t	
| j| j|d< |j|||||d| _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.
        Nz#Notification already exists w/ id: userProjectr4   z/notificationConfigs r!   query_paramstimeoutretry)r   r   r6   r   user_projectr'   r   copyr   _TOPIC_REF_FMTformatr   _post_resource)r   r   r?   r@   r>   r5   
propertiesr   r   r   create   s,   




zBucketNotification.createc                 C   sh   | j du r	td| |}i }| jjdur| jj|d< z|j| j|||d W dS  ty3   Y dS 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.
        N%Notification not intialized by serverr;   r=   FT)r   r   r6   r   rA   _get_resourcer5   r   r   r   r?   r@   r>   r   r   r   exists  s"   

	zBucketNotification.existsc                 C   sZ   | j du r	td| |}i }| jjdur| jj|d< |j| j|||d}| | 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.
        NrH   r;   r=   )r   r   r6   r   rA   rI   r5   r:   )r   r   r?   r@   r>   r9   r   r   r   reloadI  s   

zBucketNotification.reloadc                 C   sP   | j du r	td| |}i }| jjdur| jj|d< |j| j|||d 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.
        NrH   r;   r=   )r   r   r6   r   rA   _delete_resourcer5   rJ   r   r   r   deletes  s   


zBucketNotification.delete)__name__
__module____qualname____doc__NONE_PAYLOAD_FORMATr    classmethodr)   propertyr   r   r   r   r   r   r   r   r1   r3   r   r5   r6   r:   r   rG   r   rK   rL   rN   r   r   r   r   r   -   sT    )
&












	4/*r   c                 C   s4   t | }|du rtt| |d|dfS )ai  Verify that a topic path is in the correct format.

    .. _resource manager docs: https://cloud.google.com/resource-manager/                               reference/rest/v1beta1/projects#                               Project.FIELDS.project_id
    .. _topic spec: https://cloud.google.com/storage/docs/json_api/v1/                    notifications/insert#topic

    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`_) 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`_).

    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_TOPICrD   group)r&   rW   r   r   r   r#     s   
r#   )rR   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_FORMATrS   rC   _PROJECT_PATTERN_TOPIC_NAME_PATTERNrD   _TOPIC_REF_PATTERNcompilerV   rX   objectr   r#   r   r   r   r   <module>   s,   
  s