o b,@sddZddlZddlmZddlmZmZmZGdddejZ Gdddej Z d d Z d d Z dS) z] Persistently cached objects for PB. Maintainer: Glyph Lefkowitz Future Plans: None known. N)defer)bananaflavorsjellyc@s@eZdZdZddZddZddZdd Zd d Zd d Z dS) Publishablez6An object whose cached state persists across sessions.cCs|||_dS)N) republish publishedID)selfrr 8/usr/lib/python3/dist-packages/twisted/spread/publish.py__init__s zPublishable.__init__cCst|_dS)z=Set the timestamp to current and (TODO) update all observers.N)time timestampr r r r rzPublishable.republishcCs ||S) (internal))getStateToPublishForr perspectiver r r view_getStateToPublishs z"Publishable.view_getStateToPublishcCs|S)z:Implement me to special-case your state for a perspective.)getStateToPublishrr r r r#sz Publishable.getStateToPublishForcCstd|j)zBImplement me to return state to copy as part of the publish phase.z%s.getStateToPublishFor)NotImplementedError __class__rr r r r'rzPublishable.getStateToPublishcCs:|r |j}|j}nd}d}t|||j|||jdS)z6Get all necessary metadata to keep a clientside cache.None)remoterrservicer)perspectiveName getService serviceNamer ViewPointrr)r robserverpnamesnamer r r getStateToCacheAndObserveFor+s  z(Publishable.getStateToCacheAndObserveForN) __name__ __module__ __qualname____doc__r rrrrr#r r r r rs rc@sJeZdZdZdZdZdddZddZdd Zd d Z d d Z ddZ dS)RemotePublishedz6The local representation of remote Publishable object.rpubcCsd|j|jt|j|S)Nz {}-{}-{}.{})formatrrstrr)r extr r r getFileNameCs zRemotePublished.getFileNamecCs|j|g|_zt|d }|}Wdn1s wYWn ty1d}Ynwtt |}|j |j k}|rM| |jd|_ dS|jd|j dS)Nrbrr)__dict__update_activationListenersopenr-readOSErrorrunjellyrdecoder _cbGotUpdate_wasCleanWhenLoadedr callRemote addCallbacks)r statedataFiledatarecentnewselfr r r setCopyableStateKs      z RemotePublished.setCopyableStatecCs,|j}|d=|d=|d=|d=|d=|S)Nbrokerrluidr2 isActivated)r0copy)r otherr r r __getstate__\s zRemotePublished.__getstate__cCs~|j|d|_|jD]}||q g|_|t|d}|t t |WddS1s8wYdS)Nr/wb) r0r1rDr2 activatedr3r-writerencoder)r newStatelistenerr=r r r r8gs   "zRemotePublished._cbGotUpdatecCsdS)znImplement this method if you want to be notified when your publishable subclass is activated. Nr rr r r rIrszRemotePublished.activatedcCs"|jr ||dS|j|dS)zZExternally register for notification when this publishable has received all relevant data.N)rDr2append)r callbackr r r callWhenActivatedws z!RemotePublished.callWhenActivatedN)r)) r$r%r&r'rDr9r-rArGr8rIrPr r r r r(=s   r(cCs t}|jt|j|fd|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)rDeferredr; _pubReadyerrback)dd2r r r whenReadys rWcCs||jdS)rN)rPrO)resultrVr r r rSsrS)r'r twisted.internetrtwisted.spreadrrr Cacheabler RemoteCacher(rWrSr r r r s )B