Ϫf,dZddlZddlmZddlmZmZmZGddejZ GddejZ d Z d Z y) z] Persistently cached objects for PB. Maintainer: Glyph Lefkowitz Future Plans: None known. N)defer)bananaflavorsjellyc4eZdZdZdZdZdZdZdZdZ y) Publishablez6An object whose cached state persists across sessions.c2|j||_y)N) republish publishedID)selfr s 8/usr/lib/python3/dist-packages/twisted/spread/publish.py__init__zPublishable.__init__s &c6tj|_y)z=Set the timestamp to current and (TODO) update all observers.N)time timestampr s r r zPublishable.republishsrc$|j|S) (internal))getStateToPublishForr perspectives r view_getStateToPublishz"Publishable.view_getStateToPublishs((55rc"|jS)z:Implement me to special-case your state for a perspective.)getStateToPublishrs r rz Publishable.getStateToPublishFor#s%%''rc2td|jz)zBImplement me to return state to copy as part of the publish phase.z%s.getStateToPublishFor)NotImplementedError __class__rs r rzPublishable.getStateToPublish's!";dnn"LMMrc|r'|j}|jj}nd}d}tj|||j |||j dS)z6Get all necessary metadata to keep a clientside cache.None)remoter rservicer)perspectiveName getService serviceNamer ViewPointr r)r robserverpnamesnames r getStateToCacheAndObserveForz(Publishable.getStateToCacheAndObserveFor+s` //E**,88EEE'' T:++    rN) __name__ __module__ __qualname____doc__rr rrrr*rr rrs$@'%6(N rrc>eZdZdZdZdZd dZdZdZdZ dZ dZ y ) RemotePublishedz6The local representation of remote Publishable object.rcxdj|j|jt|j|S)Nz {}-{}-{}.{})formatr"rstrr )r exts r getFileNamezRemotePublished.getFileNameCs6## LL      !    rc|jj|g|_ t|j d5}|j }dddt jtj}|j|jk(}|r#|jjd|_ y|jjdj!|jy#1swYxYw#t$rd}YswxYw)Nrbrr)__dict__update_activationListenersopenr6readrunjellyrdecoderOSError _cbGotUpdate_wasCleanWhenLoadedr! callRemote addCallbacks)r statedataFiledatanewselfrecents r setCopyableStatez RemotePublished.setCopyableStateKs U#$&! 9d&&($/ '8}} ' mmFMM$$78G&&$..8F    g.. /'(D $ KK " "#6 7 D DTEVEV W ' ' F s(C>C2C>2C;7C>> D  D cX|jj}|d=|d=|d=|d=|d=|S)Nbrokerr!luidr< isActivated)r:copy)r others r __getstate__zRemotePublished.__getstate__\s? ""$ (O (O &M ( ) -  rct|jj|d|_|jD] }|| g|_|j t |j d5}|jtjtj|dddy#1swYyxYw)Nr9wb) r:r;rOr< activatedr=r6writerencoder)r newStatelistenerrGs r rBzRemotePublished._cbGotUpdategs X&11 H TN $&!  $""$d + =x NN6==T):; < = = =s -8B..B7cy)znImplement this method if you want to be notified when your publishable subclass is activated. Nr/rs r rUzRemotePublished.activatedrsrcd|jr ||y|jj|y)zZExternally register for notification when this publishable has received all relevant data.N)rOr<append)r callbacks r callWhenActivatedz!RemotePublished.callWhenActivatedws&    TN  % % , ,X 6rN)pub) r+r,r-r.rOrCr6rKrRrBrUr^r/rr r1r1=s/@K X"  = 7rr1cttj}|jt|j|f|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)rDeferredrE _pubReadyerrback)dd2s r whenReadyrgs-  BNN9bjjuN= Irc:|j|jy)rN)r^r])resultrfs r rcrcs R[[)r)r.rtwisted.internetrtwisted.spreadrrr Cacheabler RemoteCacher1rgrcr/rr rnsH  "11& '##& R?7g))?7D *r