a
    )(b,                     @   sd   d Z ddlZddlmZ ddlmZmZmZ G dd dejZ	G dd dej
Zd	d
 Zdd ZdS )z]
Persistently cached objects for PB.

Maintainer: Glyph Lefkowitz

Future Plans: None known.
    N)defer)bananaflavorsjellyc                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )Publishablez6An object whose cached state persists across sessions.c                 C   s   |    || _d S )N)	republishpublishedID)selfr    r
   5lib/python3.9/site-packages/twisted/spread/publish.py__init__   s    zPublishable.__init__c                 C   s   t   | _dS )z=Set the timestamp to current and (TODO) update all observers.N)time	timestampr	   r
   r
   r   r      s    zPublishable.republishc                 C   s
   |  |S )
(internal))getStateToPublishForr	   perspectiver
   r
   r   view_getStateToPublish   s    z"Publishable.view_getStateToPublishc                 C   s   |   S )z:Implement me to special-case your state for a perspective.)getStateToPublishr   r
   r
   r   r   #   s    z Publishable.getStateToPublishForc                 C   s   t d| j dS )zBImplement me to return state to copy as part of the publish phase.z%s.getStateToPublishForN)NotImplementedError	__class__r   r
   r
   r   r   '   s    zPublishable.getStateToPublishc                 C   s:   |r|j }| j}nd}d}t|| | j||| jdS )z6Get all necessary metadata to keep a clientside cache.None)remoter   r   servicer   )ZperspectiveNameZ
getServiceZserviceNamer   Z	ViewPointr   r   )r	   r   ZobserverZpnameZsnamer
   r
   r   getStateToCacheAndObserveFor+   s    
z(Publishable.getStateToCacheAndObserveForN)
__name__
__module____qualname____doc__r   r   r   r   r   r   r
   r
   r
   r   r      s   r   c                   @   sJ   e Zd ZdZdZdZdddZdd Zdd	 Zd
d Z	dd Z
dd ZdS )RemotePublishedz6The local representation of remote Publishable object.r   pubc                 C   s   d | j| jt| j|S )Nz{}-{}-{}.{})formatr   r   strr   )r	   Zextr
   r
   r   getFileNameC   s    zRemotePublished.getFileNamec                 C   s   | j | g | _z:t|  d}| }W d    n1 s@0    Y  W n tyb   d}Y n0 tt	
|}|j| jk}|r| |j  d| _n| jd| j d S )Nrbr      r   )__dict__update_activationListenersopenr$   readOSErrorr   Zunjellyr   decoder   _cbGotUpdate_wasCleanWhenLoadedr   Z
callRemoteaddCallbacks)r	   statedataFiledataZrecentZnewselfr
   r
   r   setCopyableStateK   s    *
z RemotePublished.setCopyableStatec                 C   s,   | j  }|d= |d= |d= |d= |d= |S )NZbrokerr   Zluidr)   isActivated)r'   copy)r	   otherr
   r
   r   __getstate__\   s    
zRemotePublished.__getstate__c                 C   s|   | j | d| _| jD ]}||  qg | _|   t|  d&}|t	t

|  W d    n1 sn0    Y  d S )Nr&   wb)r'   r(   r5   r)   	activatedr*   r$   writer   encoder   )r	   ZnewStateZlistenerr2   r
   r
   r   r.   g   s    

zRemotePublished._cbGotUpdatec                 C   s   dS )znImplement this method if you want to be notified when your
        publishable subclass is activated.
        Nr
   r   r
   r
   r   r:   r   s    zRemotePublished.activatedc                 C   s    | j r||  n| j| dS )zZExternally register for notification when this publishable has received all relevant data.N)r5   r)   append)r	   callbackr
   r
   r   callWhenActivatedw   s    
z!RemotePublished.callWhenActivatedN)r!   )r   r   r   r   r5   r/   r$   r4   r8   r.   r:   r?   r
   r
   r
   r   r    =   s   
r    c                 C   s    t  }| jt|j|fd |S )aD  
    Wrap a deferred returned from a pb method in another deferred that
    expects a RemotePublished as a result.  This will allow you to wait until
    the result is really available.

    Idiomatic usage would look like::

        publish.whenReady(serverObject.getMeAPublishable()).addCallback(lookAtThePublishable)
    )ZcallbackArgs)r   ZDeferredr0   	_pubReadyZerrback)dd2r
   r
   r   	whenReady   s    
rC   c                 C   s   |  |j dS )r   N)r?   r>   )resultrB   r
   r
   r   r@      s    r@   )r   r   Ztwisted.internetr   Ztwisted.spreadr   r   r   Z	Cacheabler   ZRemoteCacher    rC   r@   r
   r
   r
   r   <module>   s   	)B