o
    ¯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
   ú8/usr/lib/python3/dist-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      ó   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 ƒ‚)zBImplement me to return state to copy as part of the publish phase.z%s.getStateToPublishFor)ÚNotImplementedErrorÚ	__class__r   r
   r
   r   r   '   r   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   )ÚperspectiveNameÚ
getServiceÚserviceNamer   Ú	ViewPointr   r   )r	   r   ÚobserverÚpnameÚ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	   Úextr
   r
   r   ÚgetFileNameC   s   üzRemotePublished.getFileNamec                 C   s²   | j  |¡ g | _zt|  ¡ dƒ�}| ¡ }W d   ƒ n1 s w   Y  W n ty1   d}Y nw t t	 
|¡¡}|j| jk}|rM|  |j ¡ d| _d S | j d¡ | j¡ d S )NÚrbr   é   r   )Ú__dict__ÚupdateÚ_activationListenersÚopenr-   ÚreadÚOSErrorr   Úunjellyr   Údecoder   Ú_cbGotUpdateÚ_wasCleanWhenLoadedr   Ú
callRemoteÚaddCallbacks)r	   ÚstateÚdataFileÚdataÚrecentÚnewselfr
   r
   r   ÚsetCopyableStateK   s    
ÿ€ÿ
z RemotePublished.setCopyableStatec                 C   s,   | j  ¡ }|d= |d= |d= |d= |d= |S )NÚbrokerr   Úluidr2   ÚisActivated)r0   Ú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   ƒ d S 1 s8w   Y  d S )Nr/   Úwb)r0   r1   rD   r2   Ú	activatedr3   r-   Úwriter   Úencoder   )r	   ÚnewStateÚlistenerr=   r
   r
   r   r8   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   rI   r   s    zRemotePublished.activatedc                 C   s"   | j r	|| ƒ dS | j |¡ dS )zZExternally register for notification when this publishable has received all relevant data.N)rD   r2   Úappend)r	   Úcallbackr
   r
   r   ÚcallWhenActivatedw   s   z!RemotePublished.callWhenActivatedN)r)   )r$   r%   r&   r'   rD   r9   r-   rA   rG   r8   rI   rP   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)
    )ÚcallbackArgs)r   ÚDeferredr;   Ú	_pubReadyÚerrback)ÚdÚd2r
   r
   r   Ú	whenReady   s   
rW   c                 C   s   |   |j¡ dS )r   N)rP   rO   )ÚresultrV   r
   r
   r   rS   Ž   s   rS   )r'   r   Útwisted.internetr   Útwisted.spreadr   r   r   Ú	Cacheabler   ÚRemoteCacher(   rW   rS   r
   r
   r
   r   Ú<module>   s   	)B