ó ÿgdSc@s—dZddlZddlmZddlmZddlmZddlm Z ddl m Z m Z m Z mZmZddlmZmZdd lmZmZmZmZdd lmZmZejed d ejd ƒZe jeƒZe j ede j!ƒZ"ddd„ƒYZ#x-ej$j%ƒD]\Z&Z'e(e#e&e'ƒq2Wx-e j)j%ƒD]\Z&Z'e(e#e'e&ƒqbWej*j+ƒZ,e,j-e j)ƒe j.e j/dƒZ0de j1fd„ƒYZ2de3fd„ƒYZ4e5dkr“ddl6Z6ddl7Z7e6j6ƒZ8e4j9ddƒZ:e:j ƒe6j6ƒZ;e:jƒe6j6ƒZ<e7j7e:j=ƒƒe6j6ƒZ>de;e8e<e;e>e<fGHndS(sÉ sphinx.pycode ~~~~~~~~~~~~~ Utilities parsing and analyzing Python code. :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. iÿÿÿÿN(tpath(t package_dir(t PycodeError(tnodes(tdriverttokenttokenizetparsetliterals(tget_module_sourcetdetect_encoding(tnexttStringIOtBytesIOt TextIOWrapper(tprepare_docstringtprepare_commentdoctpycodesGrammar-py%d.txtitconverttsymcBseZRS((t__name__t __module__(((ssphinx/pycode/__init__.pyRst=tAttrDocVisitorcBsMeZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z RS(s Visitor that collects docstrings for attribute assignments on toplevel and in classes (class attributes and attributes set in __init__). The docstrings can either be in special '#:' comments before the assignment or in a docstring after it. cCsC||_d|_||_g|_i|_d|_i|_dS(Ni(tscopetin_inittencodingt namespacet collectedt tagnumberttagorder(tselfRR((ssphinx/pycode/__init__.pytinit4s      cCs<dj|j|gƒ}|j|j|<|jd7_dS(Nt.i(tjoinRRR(Rtname((ssphinx/pycode/__init__.pytadd_tag=scCsI|j|djƒ|jj|djƒ|j|ƒ|jjƒdS(sVisit a class.iN(R$tvalueRtappendt generic_visittpop(Rtnode((ssphinx/pycode/__init__.pytvisit_classdefBs cCsY|j|djƒ|djdkrU|jd7_|j|ƒ|jd8_ndS(sVisit a function (or method).it__init__N(R$R%RR'(RR)((ssphinx/pycode/__init__.pyt visit_funcdefIs  cCsŠt|jkrdS|j}|jj|ƒd}x°|t|ƒkrä||jtjkrm|d7}q5n||jtjkrà||j ƒ}t |t ƒs·|j |j ƒ}nt|ƒ}|rà|j||ƒdSnPq5W|d}|j ƒ}xH|sE|jƒ}| s2|jtjtjfkr6Pn|j ƒ}qþWt |t ƒsj|j |j ƒ}nt|ƒ}|j||ƒdS(s[Visit an assignment which may have a special comment before (or after) it. Nii(t_eqtchildrentparenttindextlenttypeRtSEMItNEWLINEt get_prefixt isinstancetunicodetdecodeRRt add_docstringt get_prev_leafRtINDENTtDEDENT(RR)R/tidxtprefixt docstringtpnode((ssphinx/pycode/__init__.pytvisit_expr_stmtSs8       " cCs·|djtjkr#|j|ƒS|jƒ}|s9dS|jtjkr³|djtjkr³t|dj kr³t j |dj |j ƒ}t|ƒ}|j|d|ƒndS(s@Visit a docstring statement which may have an assignment before.iN(R2RtSTRINGR'tget_prev_siblingRt simple_stmtt expr_stmtR-R.Rt evalStringR%RRR9(RR)tprevR?((ssphinx/pycode/__init__.pytvisit_simple_stmt{s  ) cCs~xwtdt|ƒddƒD]Y}||}|jr|j|jdkrt|ƒdks|djtjks|djdks|j|djdkst|dƒdks|ddjtjks|ddjtjkrñqn|ddj}n!|jtjkrqn |j}|j |ƒ|rdj |j ƒ}|j |j ƒrv||j||fcCsAt|tƒr%|t|ƒ||ƒS|t|ƒ||dtƒS(Ntdecoded(R6tbytesR R tTrue(tclststringtmodnametsrcname((ssphinx/pycode/__init__.pyt for_string­scCs‹d|f|jkr&|jd|fSyt|dƒ}Wn&tk ra}td||ƒ‚nX||||ƒ}||jd|f<|S(Ntfiletrbserror opening %r(tcachetopent ExceptionR(RWtfilenameRYtfileobjterrtobj((ssphinx/pycode/__init__.pytfor_file³scCsÐd|f|jkrD|jd|f}t|tƒr@|‚n|SyIt|ƒ\}}|dkrz|j||ƒ}n|j||ƒ}Wn)tk r¸}||jd|f<‚nX||jd|f<|S(NtmoduleRX(R^R6RR R[Re(RWRYtentryR2tsourceRdRc((ssphinx/pycode/__init__.pyt for_module¿s  cCsú||_||_||_|jjƒ}|sžt|jjƒ|_|jj|ƒ|jjƒj |jƒ|_ |jj|ƒt |j|jƒ|_n+d|_|jjƒ|_ |jj|ƒd|_ d|_d|_d|_d|_dS(N(RYRZRhttellR treadlineRtseektreadR8tcodeRtNonettokenst parsetreet attr_docsRttags(RRhRYRZRTtpos((ssphinx/pycode/__init__.pyR+Ós$        cCsn|jdk rdSy"ttj|jjƒƒ|_Wn%tjk r\}td|ƒ‚nX|jj ƒdS(s Generate tokens from the source.Nstokenizing failed( RpRotlistRtgenerate_tokensRhRkt TokenErrorRtclose(RRc((ssphinx/pycode/__init__.pyRòs"cCsb|jdk rdS|jƒytj|jƒ|_Wn%tjk r]}td|ƒ‚nXdS(s"Parse the generated source tokens.Nsparsing failed( RqRoRtpydrivert parse_tokensRpRt ParseErrorR(RRc((ssphinx/pycode/__init__.pyRüs tcCsm|jdk r|jS|jƒtt||jƒ}|j|jƒ|j|_|j |_ d|_|jS(s?Find class and module-level attributes and their documentation.N( RrRoRRRLRtvisitRqRR(RRt attr_visitor((ssphinx/pycode/__init__.pytfind_attr_docss    cs#ˆjd k rˆjSˆjƒi}g}g}d}t}t}tjtjf‡fd†}|ƒ}x¨|D] \}} } } } |ró|tjkrê|s¨t‚|j ƒ\} }}}| d}|j ƒ| ||f|| sF (" }¢