eaiovnaovbqoebvqoeavibavo 3 C]Q@sdZddlZddlmZmZmZddlZddlmZGddde Z Gdd d e Z Gd d d e Z d$ddZ Gddde ZGddde ZGddde ZGddde Zd%ddZGdddejZddZddZd d!ZGd"d#d#ejZdS)&aAccess 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 six 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 N) DEFAULTSECT ParsingErrorMissingSectionHeaderError)configc@s2eZdZdZd ddZddZddZdd ZdS) LineTypeNcCs|dk r|jd|_dS)N )stripline)selfr r /usr/lib/python3.6/ini.py__init__6szLineType.__init__cCs|jdk r|jS|jSdS)N)r to_string)r r r r __str__<s zLineType.__str__cCs"t||rd|jd<||j|<dS)Nr )hasattr__dict__)r namevaluer r r __setattr__Ds  zLineType.__setattr__cCs tddS)Nz1This method must be overridden in derived classes) Exception)r r r r rIszLineType.to_string)N)__name__ __module__ __qualname__r rrrrr r r r r3s  rcs@eZdZejdZd fdd ZddZdd Ze eZZ S) SectionLinez7^\[(?P[^]]+)\]\s*((?P;|#)(?P.*))?$Nrcs,tt|j|||_||_||_||_dS)N)superrrrcommentcomment_separatorcomment_offset)r rrrrr ) __class__r r rSs zSectionLine.__init__cCs<d|jd}|jdk r8|dj|j}||j|j}|S)N[] )rrljustrr)r outr r r r[s  zSectionLine.to_stringcCsD|jj|j}|dkrdS||jd|jd|jd|jd|S)Nrrcsep)regexmatchrstripgroupstart)clsr mr r r parsecs zSectionLine.parse)NNr.N) rrrrecompiler&rrr- classmethod __classcell__r r )rr rMs  rcs@eZdZd fdd ZddZejdZd d Ze eZZ S) OptionLine = Nrcs8tt|j|||_||_||_||_||_||_dS)N) rr3rrr separatorrrr)r rrr5rrrr )rr r rnszOptionLine.__init__cCsBd|j|j|jf}|jdk r>|dj|j}||j|j}|S)Nz%s%s%sr")rr5rrr#rr)r r$r r r rxs  zOptionLine.to_stringz7^(?P[^:=\s[][^:=]*)(?P[:=]\s*)(?P.*)$c Cs|jj|j}|dkrdS|jdj}|jd}|jdt|d|jd}|jd}|dkr||djr||dd}||}|d|j}|jd|}n d}d}d}||||||||S)Nrrsep;rr.r.)r&r'r(r)lenfindisspacer*) r+r r,rrr6Zcoffrr%r r r r-s   zOptionLine.parser.)r4NNr.N) rrrrrr/r0r&r-r1r2r r )rr r3ms    r3%;#FcCs:tjdd|}d|}|r"|d7}|d7}tj|t_dS)Nz ([\]\-\^])z\\\1z^(?P[%s]z |[rR][eE][mM]z)(?P.*)$)r/subr0 CommentLiner&)Z comment_charsZ allow_remr&r r r change_comment_syntaxs r>cs@eZdZejdZd fdd ZddZd d Ze eZZ S) r=z,^(?P[;#]|[rR][eE][mM])(?P.*)$#Ncs tt|j|||_||_dS)N)rr=rrr5)r rr5r )rr r rszCommentLine.__init__cCs |j|jS)N)r5r)r r r r rszCommentLine.to_stringcCs4|jj|j}|dkrdS||jd|jd|S)Nrr%)r&r'r(r))r+r r,r r r r-szCommentLine.parse)r?r@N) rrrr/r0r&rrr-r1r2r r )rr r=s  r=c@s0eZdZddZeddZddZeeZdS) EmptyLinecCsdS)Nr?r )r r r r rszEmptyLine.to_stringcCsdS)Nr?r )_r r r szEmptyLine.cCs|jr dS||S)N)r )r+r r r r r-szEmptyLine.parseN)rrrrpropertyrr-r1r r r r rAs rAcs@eZdZejdZd fdd ZddZddZe eZZ S) ContinuationLinez^\s+(?P.*)$Ncs,tt|j|||_|dkr"d}||_dS)N)rrErr value_offset)r rrGr )rr r rs zContinuationLine.__init__cCsd|j|jS)Nr")rGr)r r r r rszContinuationLine.to_stringcCs4|jj|j}|dkrdS||jd|jd|S)Nr)r&r'r(r)r*)r+r r,r r r r-szContinuationLine.parse)NN) rrrr/r0r&rrr-r1r2r r )rr rEs  rEc@sreZdZdddZddZddZdd Zd d Zd d ZddZ e eeZ e ee Z ddZ ddZddZdS) LineContainerNcCs4g|_d|_|r0t|tr&|j|n |j|dS)N)contentsorgvalue isinstancelistextendadd)r dr r r rs  zLineContainer.__init__cCs|jj|dS)N)rIappend)r xr r r rNszLineContainer.addcCsx|D]}|j|qWdS)N)rN)r rQir r r rMs zLineContainer.extendcCs |jdjS)Nr)rIr)r r r r get_nameszLineContainer.get_namecCs||jd_dS)Nr)rIr)r datar r r set_nameszLineContainer.set_namecCsD|jdk r|jSt|jdkr*|jdjSdjdd|jDSdS)NrrrcSs g|]}t|tsd|jqS)z%s)rKr=r).0rQr r r sz+LineContainer.get_value..)rJr8rIrjoin)r r r r get_values   zLineContainer.get_valuecCs||_d|jd}d}x |jD]}t|tr |j}Pq W|jdd|_|d|jd_|d=x2|D]*}|jr|jt||qf|jt qfWdS)Nz%srrr) rJsplitrIrKrErGrr rNrA)r rTlinesrGvr r r r set_values   zLineContainer.set_valuecCs*x|jD]}qWdd|jD}dj|S)NcSsg|] }|jqSr )r)rVrQr r r rWsz)LineContainer.__str__..r)rIrX)r csr r r rs zLineContainer.__str__ccs8x2|jdddD]}t|dr|j|kr|VqWdS)Nrrr.)rIrr)r keyrQr r r finditer szLineContainer.finditercCs"x|j|D]}|SWt|dS)N)raKeyError)r r`rQr r r r9%szLineContainer.find)N)rrrrrNrMrSrUrYr]rDrrrrar9r r r r rHs    rHcsF|d|ddkr|fdd}fdd}t||S)Nrsourcecs*t|}|dk rt|St|SdS)N)getattr)r srcobj)private_attrnameprivate_srcname srcattrnamer r getfn1s  z#_make_xform_property..getfncs0t|}|dk r t||n t||dS)N)rdsetattr)r rre)rfrgrhr r setfn8s z#_make_xform_property..setfn)rD)Z myattrnamerhrirkr )rfrgrhr _make_xform_property+srlc@sheZdZdZdZdZdZdZeZ dddZ e dZ ddZ ddZd d Zd d Zd dZddZdS) INISectionNcCs$|g|_||_||_||_i|_dS)N)_lines _defaults_optionxformvalue_optionxformsource_options)r lineobjdefaultsoptionxformvalueoptionxformsourcer r r rIs zINISection.__init__ _optionxformc Cs|dkr|jdjS|jr$|j|}y|j|j}||jk}WnDtk r|jr|||jjkr||jj|j}||jjk}nYnX|rtj dd|}|S)Nrrz +rr.) rnrrwrrr_compat_skip_empty_linesrbror/r<)r r`rZ del_emptyr r r _compat_getSs   zINISection._compat_getc Csl|dkr|jdjS|jr$|j|}y |j|jStk rf|jr`||jjkr`|jj|jSYnXdS)Nrrr.)rnrrwrrrrbro)r r`r r r _getitemfs   zINISection._getitemcCsn|jr|j|}n|}||jkr,|jj|||jkr^tt|d}|jdj|||j|<||j|_dS)Nr?rr.) rwrxremoverrrHr3rnrNr)r r`rZxkeyobjr r r __setitem__rs     zINISection.__setitem__cCs|jr|j|}||jkr&|jj|xf|jD]\}g}xL|jD]B}t|trv|j}|jrb|j|}||kr|j|q>|j|q>W||_q.W|j |=dS)N) rwrxr{rnrIrKrHrrPrr)r r`lZ remainingonr r r __delitem__s          zINISection.__delitem__ccst}xZ|jD]P}xJ|jD]@}t|tr|jr<|j|j}n|j}||kr|V|j|qWqW|jrx&|jD]}||krp|V|j|qpWdS)N) setrnrIrKrHrwrrNro)r rOr~rQZansr r r __iter__s    zINISection.__iter__cCstd|dS)NzNo sub-sections allowed)r)r rr r r _new_namespaceszINISection._new_namespace)NNN)rrrrnrrrorprqrrxrrlrwryrzr}rrrr r r r rmBs  rmcCst|jdS)Nr)r=r()r r r r make_commentsrccsBd}x8|j}|s |rdVdS|jdr0d}nd}|VqWdS)zCiterate over a file by only using the file object's readline methodFr?NrT)readlineendswith)fZ have_newliner r r r readline_iterators rcCs|jS)N)lower)rQr r r rsrc@seZdZdZdZdZdZdZdZdZ dZ dZ ddde dddfddZ eddZeddZd d Zd d Zd dZddZddZddZeZeeeeegZddZddZdS) INIConfigNFTc Cs~t|_||_||_||_||_||_i|_|dkr8i}tt|d|_ x|j D]\}} | |j |<qRW|dk rz|j |dS)N)rv) rH_data _parse_excrprq_sectionxformvalue_sectionxformsource _sectionsrmroitems_readfp) r fprtZ parse_excrurvZsectionxformvalueZsectionxformsourcerrr r r rszINIConfig.__init__rwZ optionxform _sectionxformcCs(|tkr|jS|jr|j|}|j|S)N)rrorr)r r`r r r rzs  zINIConfig._getitemcCstd||dS)NzValues must be inside sections)r)r r`rr r r r}szINIConfig.__setitem__cCs@|jr|j|}x"|j|jD]}|jjj|qW|j|=dS)N)rrrnrrIr{)r r`r r r r rs  zINIConfig.__delitem__ccsNt}|jtx8|jjD],}t|tr|j|kr|jV|j|jqWdS)N)rrNrrrIrKrHr)r rOrQr r r rs   zINIConfig.__iter__cCs~|jjr|jjttt|}|jj||jr>|j|}||jkr`|j|}|jj |nt ||j |d}||j|<|S)N)rtrv) rrIrNrArHrrrrnrPrmro)r rr|nsr r r rs      zINIConfig._new_namespacecCs|jr d}nd}||jjS)Nu%sz%s)_bomrr)r Zfmtr r r rszINIConfig.__str__cCs*x$|jD]}|j|}|r|SqWdSdS)N) _line_typesr-)r r Zlinetypersr r r _parses   zINIConfig._parsecCsd}d}d}d}g}d}y |j}Wntk r:d}YnXd} d} d} xt|D]r} | dkrt| tjr| ddkr| dd} d|_|j| } | d7} | rt| tt t f r|j rt || | nt | } | dkr|j r| dkrt|} | j| | t | } t| tr||rN|rB|j|g}|rB| jj|d}|j| n.|j rt| dkrht|} | j| | t | } t| tr|r|j|g}d}t| }|j||jr|j|j}n|j}|tkr|j} n |j|} || j|<t| t r|jj|g}d}t| }|jj|d}d}|jtkrP|jjj|t}nR|jrf|j|j}n|j}||jkrt||j|d|j|<n|j|jj|t| tt frT|j| t| t rTd}qTW|jj|| r| d dkr|jjt | r| dS) NFzrurT)rtrvrr.)rAttributeErrorrrKsixZ text_typerrr=rArrrrrrPrErMrxrNr3rHrwrrorrrrrnrrm)r rZ cur_sectionZ cur_optionZcur_section_nameZcur_option_nameZ pending_linesZpending_empty_linesZfnameZ linecountexcr rsZoptobjr r r rs                            zINIConfig._readfp) rrrrrrorprqrrrrrrrlrwrrzr}rrrrZ __unicode__rAr=rr3rErrrr r r r rs4    r)r;F)N)__doc__r/Z configparserrrrrr?robjectrrr3r>r=rArErHrlZConfigNamespacermrrrrr r r r &s$  :  F d