}BFj{"dZdZddlmZddlZddlZddlZ ddlmZ n#e $rddl Z YnwxYw ddl Z n#e $rddl Z YnwxYwddlZddlZdZeZGdde jZGdd ZdS) a] Vendoring of pickleshare, reduced to used functionalities. --- PickleShare - a small 'shelve' like datastore with concurrency support Like shelve, a PickleShareDB object acts like a normal dictionary. Unlike shelve, many processes can access the database simultaneously. Changing a value in database is immediately visible to other processes accessing the same database. Concurrency is possible because the values are stored in separate files. Hence the "database" is a directory where *all* files are governed by PickleShare. Example usage:: from pickleshare import * db = PickleShareDB('~/testpickleshare') db.clear() print "Should be empty:",db.items() db['hello'] = 15 db['aku ankka'] = [1,2,313] db['paths/are/ok/key'] = [1,(5,46)] print db.keys() del db['aku ankka'] This module is certainly not ZODB, but can be used for low-load (non-mission-critical) situations where tiny code size trumps the advanced features of a "real" object database. Installation guide: pip install pickleshare Author: Ville Vainio License: MIT open source license. z0.7.5)PathNcVdtt|dzzddS)Nz%02x)abshash)keys JC:\PYTHON\_runtimes\venv\Lib\site-packages\IPython/external/pickleshare.py gethashfiler :s( ScS)) )233 //c|eZdZdZdZdZdZdZedfdZ dZ d Z d Z d Z dd ZdZdZdZddZdZdZd S) PickleShareDBz5The main 'connection' object for PickleShare databasect|tst|}tjtj|}t ||_|jsJ |j dn-#t$r }|j tj krYd}~nd}~wwxYwi|_ dS)z9Return a db object that will manage the specied directoryTparentsN) isinstancestrospathabspath expanduserrrootis_dirmkdirOSErrorerrnoEEXISTcache)selfres r __init__zPickleShareDB.__init__Ds$$$ t99Dwrw11$7788JJ y!!   ----   7el**+****  sB++ C5CCc|j|z } |tj}n#t$rt |wxYw||jvr*||j|dkr|j|dS |d5}tj| }dddn #1swxYwYn#t |xYw||f|j|<|S)zdb['key'] readingrrbN) rstatST_MTIMErKeyErrorropenpickleloadsread)rr filmtimefobjs r __getitem__zPickleShareDB.__getitem__Us,i#o HHJJt}-EE   3--   $*  $*S/!* C CCCCC'c|j|z }|j}|r*|s|d|d5}t j||ddddn #1swxYwY ||jf|j |<dS#t$r!}|j tj krYd}~dSd}~wwxYw)z db['key'] = 5Trwb)protocolN) rparentrrr(r)dumpr%st_mtimerrrENOENT)rr valuer,r5r.r s r __setitem__zPickleShareDB.__setitem__is#i#o  '&--// ' LLL & & &XXd^^ .q Kq1 - - - - . . . . . . . . . . . . . . . $chhjj&9:DJsOOO   w%,&&'&&&&& s*A77A;>A;#B(( C2CCc|j|z }|s||t|z }||i}|||i|||<dS)z hashed setN)rrrr getupdate)rhashrootr r9hroothfileds r hsetzPickleShareDB.hsetyss H$||~~  KKMMM C((( HHUB   #uU r Tc|j|z }|t|z }||t}|tur1|r|turt ||S||}|||S)z hashed get)rr r< _sentinelr'hdict)rr>r default fast_onlyr?r@rAs r hgetzPickleShareDB.hgets H$ C((( HHUI & & >> i''"3--' 8$$AuuS'"""r c||dz}|t|r|dpd}|dr|g|ddz}i}|D]X} |||n$#t $rt d|d||=YnwxYw||Y|S)zhfileslastallr.s r rEzPickleShareDB.hdicts8d?++ 6{{)vbz/R ==   *VfSbSk)F  A  47####   i$GHHHGGG  LLOOOO s0B  B-,B-c||dz}i}|D]2}|||||3|||dz<|D],}|j|z }|jdkr|-dS)zCompress category 'hashroot', so hset is fast again hget will fail if fast_only is True for compressed items (that were hset before hcompress). rJz/xxrMN)rOr=rTrnameunlink)rr>rUrWr.ps r hcompresszPickleShareDB.hcompresss8d?++  A JJtAw    LLOOOO!$X   A A Av~~ HHJJJJ   r c|j|z }|j|d |dS#t$rYdSwxYw)z del db["key"]N)rrpoprZr)rr r,s r __delitem__zPickleShareDB.__delitem__s]i#o sD!!!  JJLLLLL    DD s= A  A cxt||jddS)z#Make a key suitable for user's eyes\/)r relative_torreplace)rr[s r _normalizedzPickleShareDB._normalizeds.1==++,,44T3???r Nc|jd}nj|}fd|DS)z+All keys in DB, or all keys matching a globN*cbg|]+}||,S)is_filere).0r[rs r z&PickleShareDB.keys..s4BBBaiikkB  ##BBBr )rrglobglob)rglobpatfiless` r rOzPickleShareDB.keyssL ?IOOC((EEINN7++EBBBBUBBBBr cDt|SN)iterrOrs r __iter__zPickleShareDB.__iter__sDIIKK   r cDt|Srr)rQrOrts r __len__zPickleShareDB.__len__s499;;r cX|si|_|D]}|j|ddS)zRemoves all, or specified items from cache Use this after reading a large amount of large objects to free up memory, when you won't be needing the objects for a while. N)rr^)ritemsits r rTzPickleShareDB.uncachesE DJ % %B JNN2t $ $ $ $ % %r <cdgdzdgdzzdgz}d}d} ||}|S#t$rYnwxYw||krt|tj|||||z }|t|dz kr|dz }q)a Wait (poll) for a key to get a value Will wait for `maxwaittime` seconds before raising a KeyError. The call exits normally if the `key` field in db gets a value within the timeout period. Use this for synchronizing different processes or for ensuring that an unfortunately timed "db['key'] = newvalue" operation in another process (which causes all 'get' operation to cause a KeyError for the duration of pickling) won't screw up your program logic. g?g?r3r#r)r'timesleeprQ)rr maxwaittimewtimestrieswaitedvals r waitgetzPickleShareDB.waitgetscUQY&!,  3i      ##smm# Jve} % % % fUm #Fs6{{Q&&  s " //c"t||S)z)Get a convenient link for accessing items)PickleShareLink)rfolders r getlinkzPickleShareDB.getlink stV,,,r cd|jzS)NzPickleShareDB('%s'))rrts r __repr__zPickleShareDB.__repr__s$ty00r rr)r{)__name__ __module__ __qualname____doc__r!r0r:rBrDrHrEr\r_rerOrurwrTrrrrir r rrAs(??"( +4t####&.*   @@@CCCC!!!    % % %@---11111r rc*eZdZdZdZdZdZdZdS)rzA shortdand for accessing nested PickleShare data conveniently. Created through PickleShareDB.getlink(), example:: lnk = db.getlink('myobjects/test') lnk.foo = 2 lnk.bar = lnk.foo + 5 cR|jtdSrr)__dict__r=locals)rdbkeydirs r r!zPickleShareLink.__init__ s" VXX&&&&&r cJ|jd|jddz|zS)Nrrrb)r)rr s r __getattr__zPickleShareLink.__getattr__#s%}T"4=#:S#@3#FGGr c0||j|jdz|z<dS)Nrb)rr)rr rs r __setattr__zPickleShareLink.__setattr__&s +. c!C'(((r c|jd}||jddz}d|jdddd|DdS) NrrrJz..s*777Qd1gg&&((777r >)rrOjoin)rrrOs r rzPickleShareLink.__repr__)sk ]4 wwt}X.566 M( # # # HH77$777 8 8 8 8  r N)rrrrr!rrrrir r rrs]'''HHH///     r r)r __version__pathlibrrr%r~collections.abcabccollections_abc ImportError collectionscPickler)rsysr objectrDMutableMappingrrrir r rsh$$L *-------***))))))*MMMMM 000 FHH Q1Q1Q1Q1Q1O2Q1Q1Q1h          s ++4 AA