mfc@s|dZddlmZeddd[dZdZdZd Zdd lZdd lZdd l Z dd l Z dd l Z dd l Z dd l m Z d d ddgZd efdYZd fdYZe jdZdZdfdYZde jfdYZdefdYZdfdYZddZddZdZedkrxend S(s MH interface -- purely object-oriented (well, almost) Executive summary: import mhlib mh = mhlib.MH() # use default mailbox directory and profile mh = mhlib.MH(mailbox) # override mailbox location (default from profile) mh = mhlib.MH(mailbox, profile) # override mailbox and profile mh.error(format, ...) # print error message -- can be overridden s = mh.getprofile(key) # profile entry (None if not set) path = mh.getpath() # mailbox pathname name = mh.getcontext() # name of current folder mh.setcontext(name) # set name of current folder list = mh.listfolders() # names of top-level folders list = mh.listallfolders() # names of all folders, including subfolders list = mh.listsubfolders(name) # direct subfolders of given folder list = mh.listallsubfolders(name) # all subfolders of given folder mh.makefolder(name) # create new folder mh.deletefolder(name) # delete folder -- must have no subfolders f = mh.openfolder(name) # new open folder object f.error(format, ...) # same as mh.error(format, ...) path = f.getfullname() # folder's full pathname path = f.getsequencesfilename() # full pathname of folder's sequences file path = f.getmessagefilename(n) # full pathname of message n in folder list = f.listmessages() # list of messages in folder (as numbers) n = f.getcurrent() # get current message f.setcurrent(n) # set current message list = f.parsesequence(seq) # parse msgs syntax into list of messages n = f.getlast() # get last message (0 if no messagse) f.setlast(n) # set last message (internal use only) dict = f.getsequences() # dictionary of sequences in folder {name: list} f.putsequences(dict) # write sequences back to folder f.createmessage(n, fp) # add message from file f as number n f.removemessages(list) # remove messages in list from folder f.refilemessages(list, tofolder) # move messages in list to other folder f.movemessage(n, tofolder, ton) # move one message to a given destination f.copymessage(n, tofolder, ton) # copy one message to a given destination m = f.openmessage(n) # new open message object (costs a file descriptor) m is a derived class of mimetools.Message(rfc822.Message), with: s = m.getheadertext() # text of message's headers s = m.getheadertext(pred) # text of message's headers, filtered by pred s = m.getbodytext() # text of message's body, decoded s = m.getbodytext(0) # text of message's body, not decoded i(twarnpy3ksOthe mhlib module has been removed in Python 3.0; use the mailbox module insteadt stacklevelis ~/.mh_profiles~/Mails .mh_sequencesiN(tbisecttMHtErrortFoldertMessagecBseZRS((t__name__t __module__(((s/usr/lib64/python2.7/mhlib.pyR[scBseZdZdddZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZRS(s<Class representing a particular collection of folders. Optional constructor arguments are the pathname for the directory containing the collection, and the MH profile to use. If either is omitted or empty a default is used; the default directory is taken from the MH profile if it is specified there.cCs|dkrt}ntjj||_|dkrH|jd}n|sWt}ntjj| r|ddkrtjj d|}ntjj|}tjj |st dn||_dS(s Constructor.tPathit~sMH() path not foundN( tNonet MH_PROFILEtostpatht expandusertprofilet getprofiletPATHtisabstjointisdirR(tselfRR((s/usr/lib64/python2.7/mhlib.pyt__init__fs   # cCsd|j|jfS(sString representation.s MH(%r, %r)(RR(R((s/usr/lib64/python2.7/mhlib.pyt__repr__rscGstjjd||dS(sARoutine to print an error. May be overridden by a derived class.s MH error: %s N(tsyststderrtwrite(Rtmsgtargs((s/usr/lib64/python2.7/mhlib.pyterrorvscCst|j|S(s*Return a profile entry, None if not found.(tpicklineR(Rtkey((s/usr/lib64/python2.7/mhlib.pyRzscCs|jS(s9Return the path (the name of the collection's directory).(R(R((s/usr/lib64/python2.7/mhlib.pytgetpath~scCs7ttjj|jdd}|s3d}n|S(s&Return the name of the current folder.tcontextsCurrent-Foldertinbox(RR RRR!(RR"((s/usr/lib64/python2.7/mhlib.pyt getcontexts   cCsItjj|jd}t|d}|jd||jdS(s#Set the name of the current folder.R"twsCurrent-Folder: %s N(R RRR!topenRtclose(RR"tfntf((s/usr/lib64/python2.7/mhlib.pyt setcontextscCsqg}|j}xNtj|D]=}tjj||}tjj|r"|j|q"q"W|j|S(s*Return the names of the top-level folders.(R!R tlistdirRRRtappendtsort(RtfoldersRtnametfullname((s/usr/lib64/python2.7/mhlib.pyt listfolderss  c Cstjj|j|}tj|j}|dkr:gSg}tj|}xt|D]l}tjj||}tjj|rVtjj||}|j||d}|dkrPqqVqVW|j|S(scReturn the names of the subfolders in a given folder (prefixed with the given folder name).ii( R RRtstattst_nlinkR+RR,R-( RR/R0tnlinkst subfolderstsubnamestsubnamet fullsubnamet name_subname((s/usr/lib64/python2.7/mhlib.pytlistsubfolderss        cCs |jdS(s<Return the names of all folders and subfolders, recursively.t(tlistallsubfolders(R((s/usr/lib64/python2.7/mhlib.pytlistallfolderssc Cs$tjj|j|}tj|j}|dkr:gSg}tj|}x|D]}|ddksVt|r~qVntjj||}tjj|rVtjj||}|j|tjj |s|j |} || }n|d}|dkrPqqVqVW|j |S(s>Return the names of subfolders in a given folder, recursively.iit,i( R RRR2R3R+t isnumericRR,tislinkR<R-( RR/R0R4R5R6R7R8R9t subsubfolders((s/usr/lib64/python2.7/mhlib.pyR<s,         cCs t||S(s0Return a new Folder object for the named folder.(R(RR/((s/usr/lib64/python2.7/mhlib.pyt openfolderscCset|jd}|r6t|r6t|d}nt}tjtjj|j ||dS(s@Create a new folder (or raise os.error if it cannot be created).sFolder-ProtectiN( RRR?tinttFOLDER_PROTECTR tmkdirRRR!(RR/tprotecttmode((s/usr/lib64/python2.7/mhlib.pyt makefolders cCstjj|j|}xetj|D]T}tjj||}ytj|Wq+tjk r~|jd|q+Xq+Wtj|dS(sDelete a folder. This removes files in the folder but not subdirectories. Raise os.error if deleting the folder itself fails.s%s not deleted, continuing...N(R RRR!R+tunlinkRtrmdir(RR/R0R7R8((s/usr/lib64/python2.7/mhlib.pyt deletefolders N(RRt__doc__R RRRRR!R$R*R1R:R=R<RBRHRK(((s/usr/lib64/python2.7/mhlib.pyR_s           s ^[1-9][0-9]*$cCstj|dk S(N(t numericprogtmatchR (tstr((s/usr/lib64/python2.7/mhlib.pyR?scBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZddZdZdZdZdZdZdZdZRS(s'Class representing a particular folder.cCs>||_||_tjj|js:td|ndS(s Constructor.s no folder %sN(tmhR/R RRt getfullnameR(RRPR/((s/usr/lib64/python2.7/mhlib.pyRs  cCsd|j|jfS(sString representation.sFolder(%r, %r)(RPR/(R((s/usr/lib64/python2.7/mhlib.pyRscGs|jj|dS(sError message handler.N(RPR(RR((s/usr/lib64/python2.7/mhlib.pyRscCstjj|jj|jS(s'Return the full pathname of the folder.(R RRRPR/(R((s/usr/lib64/python2.7/mhlib.pyRQscCstjj|jtS(s8Return the full pathname of the folder's sequences file.(R RRRQt MH_SEQUENCES(R((s/usr/lib64/python2.7/mhlib.pytgetsequencesfilenamescCstjj|jt|S(s4Return the full pathname of a message in the folder.(R RRRQRO(Rtn((s/usr/lib64/python2.7/mhlib.pytgetmessagefilename scCs|jj|jS(s!Return list of direct subfolders.(RPR:R/(R((s/usr/lib64/python2.7/mhlib.pyR:scCs|jj|jS(sReturn list of all subfolders.(RPR<R/(R((s/usr/lib64/python2.7/mhlib.pyR<scCsg}tj}|j}x6tj|jD]}||r.||q.q.Wtt|}|j|r|d|_ n d|_ |S(sReturn the list of messages currently present in the folder. As a side effect, set self.last to the last message (or 0).ii( RMRNR,R R+RQtmapRCR-tlast(RtmessagesRNR,R/((s/usr/lib64/python2.7/mhlib.pyt listmessagess     cCsi}|j}yt|d}Wntk r9|SXx|j}|sSPn|jd}t|dkr|jd||jfn|dj}t|djdj }|||iismultiple errors:N( RUROR RIRtrenameR,tremovefromallsequencesR`(RtlistterrorstdeletedRTRt commapathR((s/usr/lib64/python2.7/mhlib.pytremovemessagess( ic Csg}i}x|D]}|jd}|j|}|j|} ytj|| Wntjk ry!tj|| tj|Wqttjfk r} |j | ytj| Wqtjk rqXqqXnX|j ||||RxcCs5g|_||_||_|r1|j|ndS(N(tpairstseptrngt fromstring(RtdataRR((s/usr/lib64/python2.7/mhlib.pyRs    cCs g|_dS(N(R(R((s/usr/lib64/python2.7/mhlib.pytreset scCst|j|jS(N(tcmpR(Rtother((s/usr/lib64/python2.7/mhlib.pyt__cmp__#scCs t|jS(N(thashR(R((s/usr/lib64/python2.7/mhlib.pyt__hash__&scCsd|j|j|jfS(NsIntSet(%r, %r, %r)(RkRR(R((s/usr/lib64/python2.7/mhlib.pyR)scCs|jjd}x|t|jkr|j|d\}}|j|\}}||dkr|t||fg|j|d|d+q|d}qWdS(Ni(RR-R`Rp(RR~talotahitblotbhi((s/usr/lib64/python2.7/mhlib.pyt normalize,s -cCs|d}xo|jD]d\}}||kr7t|}nt||jt|}|rn||j|}q|}qW|S(NR;(RRRR(RRmtlothitt((s/usr/lib64/python2.7/mhlib.pyRk7s  cCsAg}x4|jD])\}}t||d}||}qW|S(Ni(Rtrange(RtlRRtm((s/usr/lib64/python2.7/mhlib.pyRc@s cCs"x|D]}|j|qWdS(N(R,(RRR~((s/usr/lib64/python2.7/mhlib.pyRjGs cCst}|j|_|S(N(RbR(RR((s/usr/lib64/python2.7/mhlib.pytcloneKs  cCs|jddS(Ni(R(R((s/usr/lib64/python2.7/mhlib.pytminPscCs|jddS(Ni(R(R((s/usr/lib64/python2.7/mhlib.pyRpSscCs>x7|jD],\}}||ko-|knr tSq WtS(N(RtTruetFalse(RtxRR((s/usr/lib64/python2.7/mhlib.pytcontainsVscCsqxtt|jD]}|j|\}}||kr|d|kra||f|j|/dev/nulls<-- picksf.listmessages()(sfirstslastscurRsprevsnextsfirst:3slast:3scur:3scur:-3sprev:3snext:3s1:3s1:-3s100:3s100:-3s10000:3s10000:-3sall(R tsystemRRPRBR)RhRbRcRntreversedR$RtpopenRRVRCR_( Rt testfoldersRRsR"RlRtstuffR((s/usr/lib64/python2.7/mhlib.pyttestsP                      t__main__(RLtwarningsRR RRRRDR RRRRRRt__all__t ExceptionRRRRMR?RRRRbRRuRR(((s/usr/lib64/python2.7/mhlib.pyt6s<         M  " *