ó †/–Sc@s@dZddlZddlmZmZmZddlZdefd„ƒYZdefd„ƒYZ defd „ƒYZ d e d „Z d efd „ƒYZ defd„ƒYZdefd„ƒYZdefd„ƒYZdd„Zdejfd„ƒYZd„Zd„Zd„Zdejfd„ƒYZdS(sÚAccess and/or modify INI files * Compatiable with ConfigParser * Preserves order of sections & options * Preserves comments/blank lines/etc * More conveninet access to data Example: >>> from StringIO import StringIO >>> sio = StringIO('''# configure foo-application ... [foo] ... bar1 = qualia ... bar2 = 1977 ... [foo-ext] ... special = 1''') >>> cfg = INIConfig(sio) >>> print cfg.foo.bar1 qualia >>> print cfg['foo-ext'].special 1 >>> cfg.foo.newopt = 'hi!' >>> cfg.baz.enabled = 0 >>> print cfg # configure foo-application [foo] bar1 = qualia bar2 = 1977 newopt = hi! [foo-ext] special = 1 [baz] enabled = 0 iÿÿÿÿN(t DEFAULTSECTt ParsingErrortMissingSectionHeaderErrortLineTypecBs5eZdZdd„Zd„Zd„Zd„ZRS(cCs%|dk r!|jdƒ|_ndS(Ns (tNonetstriptline(tselfR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__init__4s cCs$|jdk r|jS|jƒSdS(N(RRt to_string(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__str__:scCs0t||ƒrd|jd[^]]+)\]\s*((?P;|#)(?P.*))?$iÿÿÿÿcCs>tt|ƒj|ƒ||_||_||_||_dS(N(tsuperRRR tcommenttcomment_separatortcomment_offset(RR RRRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRQs    cCsQd|jd}|jdk rM|dj|jƒ}||j|j}n|S(Nt[t]t (R RRtljustRR(Rtout((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR Ys cCsb|jj|jƒƒ}|dkr(dS||jdƒ|jdƒ|jdƒ|jdƒ|ƒS(NR Rtcsep(tregextmatchtrstripRtgrouptstart(tclsRtm((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytparseas  N( RRtretcompileRRRR R%t classmethod(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRKs   t OptionLinecBsMeZdddddd„Zd„ZejdƒZd„Ze eƒZRS(s = iÿÿÿÿcCsPtt|ƒj|ƒ||_||_||_||_||_||_dS(N( RR)RR Rt separatorRRR(RR RR*RRRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRls     cCs\d|j|j|jf}|jdk rX|dj|jƒ}||j|j}n|S(Ns%s%s%sR(R R*RRRRRR(RR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR vs s7^(?P[^:=\s[][^:=]*)(?P[:=]\s*)(?P.*)$c Cs |jj|jƒƒ}|dkr(dS|jdƒjƒ}|jdƒ}|jdƒt|ƒ|jdƒ}|jdƒ}|dkrß||djƒrß||d}||}|| jƒ}|jdƒ|}nd}d}d}||||||||ƒS(NR Rtsept;iÿÿÿÿi( RRR RR!tlentfindtisspaceR"( R#RR$R RR+tcoffRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%‚s  &   N( RRRRR R&R'RR%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR)ks   s%;#cCsRtjdd|ƒ}d|}|r2|d7}n|d7}tj|ƒt_dS(Ns ([\]\-\^])s\\\1s^(?P[%s]s |[rR][eE][mM]s)(?P.*)$(R&tsubR't CommentLineR(t comment_charst allow_remR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytchange_comment_syntax¥s    R2cBsGeZejdƒZdddd„Zd„Zd„Ze eƒZRS(s.^(?P[;#]|[rR][eE][mM] +)(?P.*)$tt#cCs,tt|ƒj|ƒ||_||_dS(N(RR2RRR*(RRR*R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR±s cCs|j|jS(N(R*R(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR ¶scCsJ|jj|jƒƒ}|dkr(dS||jdƒ|jdƒ|ƒS(NRR(RRR RR!(R#RR$((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%¹s N( RRR&R'RRRR R%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR2­s   t EmptyLinecBs5eZd„Zed„ƒZd„ZeeƒZRS(cCsdS(NR6((R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR ÃscCsdS(NR6((t_((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytÆscCs|jƒrdS||ƒS(N(RR(R#R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%Ès (RRR tpropertyRR%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR8Ás  tContinuationLinecBsDeZejdƒZddd„Zd„Zd„Ze eƒZRS(s^\s+(?P.*)$cCsAtt|ƒj|ƒ||_|dkr4d}n||_dS(Ni(RR<RRRt value_offset(RRR=R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRÑs    cCsd|j|jS(NR(R=R(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR ØscCsJ|jj|jƒƒ}|dkr(dS||jdƒ|jdƒ|ƒS(NR(RRR RR!R"(R#RR$((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%Ûs N( RRR&R'RRRR R%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR<Îs   t LineContainercBsƒeZd d„Zd„Zd„Zd„Zd„Zd„Zd„Z e eeƒZ e ee ƒZ d„Z d„Zd „ZRS( cCsKg|_d|_|rGt|tƒr7|j|ƒqG|j|ƒndS(N(tcontentsRtorgvaluet isinstancetlisttextendtadd(Rtd((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRäs   cCs|jj|ƒdS(N(R?tappend(Rtx((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRDëscCs"x|D]}|j|ƒqWdS(N(RD(RRGti((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRCîs cCs|jdjS(Ni(R?R (R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytget_nameñscCs||jd_dS(Ni(R?R (Rtdata((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytset_nameôscCsv|jdk r|jSt|jƒdkr9|jdjSdjg|jD]"}t|tƒsId|j^qIƒSdS(Niis s%s(R@RR-R?RtjoinRAR2(RRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt get_value÷s cCsÊ||_d|jdƒ}d}x-|jD]"}t|tƒr,|j}Pq,q,W|jdd!|_|d|jd_|d=xC|D];}|jƒr²|j t||ƒƒq‡|j t ƒƒq‡WdS(Ns%ss ii( R@tsplitRR?RAR<R=RRRDR8(RRJtlinesR=tvR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt set_values    cCs/g|jD]}|jƒ^q }dj|ƒS(Ns (R?R RL(RRGts((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR s"ccsKxD|jddd…D],}t|dƒr|j|kr|VqqWdS(NiÿÿÿÿR (R?R R (RtkeyRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytfinditerscCs+x|j|ƒD]}|SWt|ƒ‚dS(N(RTtKeyError(RRSRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR.!sN(RRRRRDRCRIRKRMRQR;R RR RTR.(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR>ãs        cs`|d‰|d‰ˆdkr)|‰n‡‡‡fd†}‡‡‡fd†}t||ƒS(NRtsourcecs9t|ˆƒ}|dk r(t|ˆƒSt|ˆƒSdS(N(tgetattrR(Rtsrcobj(tprivate_attrnametprivate_srcnamet srcattrname(s0/usr/lib/python2.7/site-packages/iniparse/ini.pytgetfn-s  csBt|ˆƒ}|dk r.t|ˆ|ƒnt|ˆ|ƒdS(N(RWRtsetattr(RRRX(RYRZR[(s0/usr/lib/python2.7/site-packages/iniparse/ini.pytsetfn4s (RR;(t myattrnameR[R\R^((RYRZR[s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_make_xform_property's    t INISectioncBsƒeZdZdZdZdZdZeƒZ dddd„Z e dƒZ d„Z d„Zd„Zd„Zd„Zd„ZRS( cCs4|g|_||_||_||_i|_dS(N(t_linest _defaultst_optionxformvaluet_optionxformsourcet_options(Rtlineobjtdefaultstoptionxformvaluetoptionxformsource((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyREs     t _optionxformcCsÔ|dkr|jdjS|jr5|j|ƒ}ny#|j|j}||jk}WnWtk r±|jr«||jjkr«|jj|j}||jjk}q²‚nX|rÐtj dd|ƒ}n|S(NRiÿÿÿÿs +s ( RbR RkRfRt_compat_skip_empty_linesRURcR&R1(RRSRt del_empty((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt _compat_getOs   cCsŽ|dkr|jdjS|jr5|j|ƒ}ny|j|jSWn@tk r‰|jrƒ||jjkrƒ|jj|jS‚nXdS(NRiÿÿÿÿ(RbR RkRfRRURc(RRS((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_getitembs   cCsŸ|jr|j|ƒ}n|}||jkrC|jj|ƒn||jkr‹tt|dƒƒ}|jdj|ƒ||j|R)RbRDR(RRSRtxkeytobj((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt __setitem__ns cCsá|jr|j|ƒ}n||jkr=|jj|ƒnx“|jD]ˆ}g}xp|jD]e}t|tƒrµ|j}|jr–|j|ƒ}n||krÂ|j|ƒqÂq]|j|ƒq]W||_qGW|j |=dS(N( RkRlRpRbR?RAR>R RFRf(RRStlt remainingtotn((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt __delitem__|s      ccsÐtƒ}x|jD]t}xk|jD]`}t|tƒr#|jrV|j|jƒ}n |j}||krƒ|V|j|ƒqƒq#q#WqW|jrÌx5|jD]'}||krž|V|j|ƒqžqžWndS(N( tsetRbR?RAR>RkR RDRc(RRERtRGtans((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__iter__Œs      cCstd|ƒ‚dS(NsNo sub-sections allowed(R(RR ((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_new_namespacežsN(RRRRbRfRcRdReRyRlRR`RkRnRoRsRxR{R|(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRa>s      cCst|jdƒƒS(Ns (R2R (R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt make_comment¢sccs^t}xQtrY|jƒ}|s3|r/dVndS|jdƒrKt}nt}|Vq WdS(sCiterate over a file by only using the file object's readline methodR6Ns (tFalsetTruetreadlinetendswith(tft have_newlineR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytreadline_iterator¦s   cCs |jƒS(N(tlower(RG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR…ºst INIConfigcBsÝeZd Zd Zd Zd Zd Zd Zd Z d Z e Z d d e ed d d d„ZeddƒZeddƒZd„Zd„Zd„Zd„Zd„Zd „ZeZeeeeegZd „Z d „Z!RS( c Cs¹tƒ|_||_||_||_||_||_i|_|dkrWi}nt tƒd|ƒ|_ x'|j ƒD]\}} | |j |t_datat _parse_excRdRet_sectionxformvaluet_sectionxformsourcet _sectionsRRaRct iteritemst_readfp( RtfpRht parse_excRiRjtsectionxformvaluetsectionxformsourceR R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRÈs         Rkt optionxformt _sectionxformcCs9|tkr|jS|jr.|j|ƒ}n|j|S(N(RRcR“R‹(RRS((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRoÜs   cCstd||ƒ‚dS(NsValues must be inside sections(R(RRSR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRsâscCsW|jr|j|ƒ}nx+|j|jD]}|jjj|ƒq,W|j|=dS(N(R“R‹RbR‡R?Rp(RRSR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRxås  ccsmtƒ}|jtƒxP|jjD]B}t|tƒr#|j|kre|jV|j|jƒqeq#q#WdS(N(RyRDRR‡R?RAR>R (RRERG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR{ës  cCsº|jjr"|jjtƒƒntt|ƒƒ}|jj|ƒ|jr_|j|ƒ}n||jkrŽ|j|}|jj |ƒn(t |d|j d|ƒ}||j|<|S(NRhRj( R‡R?RDR8R>RR“R‹RbRFRaRc(RR Rrtns((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR|ôs     cCs)|jrd}nd}||jjƒS(Nu%ss%s(t_bomR‡R (Rtfmt((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR s  cCs5x.|jD]}|j|ƒ}|r |Sq WdSdS(N(t _line_typesR%R(RRtlinetypeRg((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_parses c Cs;d}d}d}d}g}t}y |j}Wntk rJd}nXd} d} d} xŒt|ƒD]~} | dkr´t| tƒr´| ddkr´| d} t|_q´n|j | ƒ} | d7} | rt| t t t fƒ r|j r t|| | ƒ‚qt| ƒ} n| dkrl|j r]| dkrJt|ƒ} n| j| | ƒnt| ƒ} nt| tƒr|rÌ|r¼|j|ƒg}|r¼| jj|ƒt}q¼n|j| ƒq|j r| dkrðt|ƒ} n| j| | ƒnt| ƒ} nt| tƒr¸|rC|j|ƒg}t}nt| ƒ}|j|ƒ|jrz|j|jƒ}n |j}|tkr›|j} n |j|} || j|iuiRhRjiÿÿÿÿs (!RR~R tAttributeErrorR„RAtunicodeRR•R™R2R8RRˆRR}RRFR<RCRlRDR)R>RkRRcR‹RfR‡RbR“Ra(RRŽt cur_sectiont cur_optiontcur_section_nametcur_option_namet pending_linestpending_empty_linestfnamet linecounttexcRRgtoptobj((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs¬                            N("RRRR‡R‹RcRdReR‰RŠRˆR~R•RR…RR`RkR“RoRsRxR{R|R t __unicode__R8R2RR)R<R—R™R(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR†¾s4        (t__doc__R&t ConfigParserRRRtconfigtobjectRRR)R~R5R2R8R<R>RR`tConfigNamespaceRaR}R„R…R†(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt&s"   : D d