Current File : /home/mmdealscpanel/yummmdeals.com/parser.tar
docstring.py000064400000000033150374071010007104 0ustar00"""Some documentation.
"""
unparse.pyo000064400000056556150374071010006771 0ustar00�
��^c@s�dZddlZddlZddlZddlZdeejjd�Zd�Z	dfd��YZ
ejd�Zd	�Z
d
�Zedkr�eejd�ndS(s'Usage: unparse.py <path to source file>i����Nt1eicCsZt|�}y|t|��Wntk
r3n#Xx|D]}|�||�q;WdS(s<Call f on each item in seq, calling inter() in between.
    N(titertnextt
StopIteration(tintertftseqtx((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
interleaves

tUnparsercBseZdZejd�Zdd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z!d�Z"d �Z#d!�Z$d"�Z%d#�Z&d$�Z'd%�Z(d&�Z)d'�Z*d(�Z+d)�Z,d*�Z-d+�Z.d,�Z/d-�Z0d.�Z1d/�Z2id0d16d2d36d4d56d6d76Z3d8�Z4id4d96d6d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6Z5dO�Z6i
dPdQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6d^d_6d`da6dbdc6Z7dd�Z8idee9j:6dfe9j;6Z<dg�Z=dh�Z>di�Z?dj�Z@dk�ZAdl�ZBdm�ZCdn�ZDdo�ZEdp�ZFdq�ZGdr�ZHRS(ss�Methods in this class recursively traverse an AST and
    output source code for the abstract syntax; original formatting
    is disregarded. cCsI||_g|_d|_|j|�|jjd�|jj�dS(sTUnparser(tree, file=sys.stdout) -> None.
         Print the source for tree to file.itN(Rtfuture_importst_indenttdispatchtwritetflush(tselfttreetfile((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt__init__s			
R
cCs#|jjdd|j|�dS(sBIndent a piece of text, according to the current indentation levels
s    N(RRR(Rttext((s+/usr/lib64/python2.7/Demo/parser/unparse.pytfill'scCs|jj|�dS(s+Append a piece of text to the current line.N(RR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR+scCs |jd�|jd7_dS(s(Print ':', and increase the indentation.t:iN(RR(R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytenter/s
cCs|jd8_dS(sDecrease the indentation level.iN(R(R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytleave4scCsXt|t�r1x|D]}|j|�qWdSt|d|jj�}||�dS(s:Dispatcher function, dispatching tree type T to method _T.Nt_(t
isinstancetlistR
tgetattrt	__class__t__name__(RRtttmeth((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR
8s
cCs%x|jD]}|j|�q
WdS(N(tbodyR
(RRtstmt((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ModuleIscCs|j�|j|j�dS(N(RR
tvalue(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExprNs
cs0�jd�t�fd��j|j�dS(Nsimport cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyt<lambda>TR
(RRR
tnames(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ImportRs
cs�|jr8|jdkr8�jjd�|jD��n�jd��jd|j�|jru�j|j�n�jd�t�fd��j|j�dS(Nt
__future__css|]}|jVqdS(N(tname(t.0tn((s+/usr/lib64/python2.7/Demo/parser/unparse.pys	<genexpr>Yssfrom t.s import cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&`R
(	tmoduleRtextendR'RRtlevelRR
(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ImportFromVs 
	
cCsL|j�x+|jD] }|j|�|jd�qW|j|j�dS(Ns = (RttargetsR
RR$(RRttarget((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Assignbs


cCsS|j�|j|j�|jd|j|jjjd�|j|j�dS(Nt s= (	RR
R3RtbinoptopRRR$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_AugAssignis
%cCs:|jd�|jr6|jd�|j|j�ndS(NtreturnR5(RR$RR
(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Returnos
	
cCs|jd�dS(Ntpass(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_PassuscCs|jd�dS(Ntbreak(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BreakxscCs|jd�dS(Ntcontinue(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_Continue{scs0�jd�t�fd��j|j�dS(Nsdel cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
(RRR
R2(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Delete~s
cCsJ|jd�|j|j�|jrF|jd�|j|j�ndS(Nsassert s, (RR
ttesttmsgR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Assert�s

	
cCss|jd�|j|j�|jrF|jd�|j|j�n|jro|jd�|j|j�ndS(Nsexec s in s, (RR
R!tglobalsRtlocals(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Exec�s
	
	
cCs�|jd�t}|jrB|jd�|j|j�t}nx:|jD]/}|rh|jd�nt}|j|�qLW|js�|jd�ndS(Nsprint s>>s, t,(RtFalsetdestRR
tTruetvaluestnl(RRtdo_commate((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Print�s
	
		cs0�jd�t�fd��j|j�dS(Nsglobal cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
(RRRR'(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Global�s
cCsT|jd�|jd�|jrC|jd�|j|j�n|jd�dS(Nt(tyieldR5t)(RR$R
(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Yield�s

	
cCs|jd�|jr)|j|j�n|jrR|jd�|j|j�n|jr{|jd�|j|j�ndS(Nsraise s, (RttypeR
tinstRttback(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Raise�s
		
	
cCs�|jd�|j�|j|j�|j�x|jD]}|j|�q;W|jr�|jd�|j�|j|j�|j�ndS(Nttrytelse(RRR
R!Rthandlerstorelse(RRtex((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_TryExcept�s


	

cCs�t|j�dkrAt|jdtj�rA|j|j�n1|jd�|j�|j|j�|j�|jd�|j�|j|j	�|j�dS(NiiRZtfinally(
tlenR!Rtastt	TryExceptR
RRRt	finalbody(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_TryFinally�s.




cCs�|jd�|jr6|jd�|j|j�n|jr_|jd�|j|j�n|j�|j|j�|j�dS(NtexceptR5s as (RRVRR
R*RR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExceptHandler�s
	
	

cCs�|jd�x+|jD] }|jd�|j|�qW|jd|j�|jr�|jd�x+|jD] }|j|�|jd�qoW|jd�n|j�|j|j�|j�dS(Ns
t@sclass RRs, RT(	Rtdecorator_listRR
R*tbasesRR!R(RRtdecota((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_ClassDef�s

	


cCs�|jd�x+|jD] }|jd�|j|�qW|jd|jd�|j|j�|jd�|j�|j|j�|j�dS(Ns
Rhsdef RRRT(	RRiRR
R*targsRR!R(RRRk((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_FunctionDef�s



cCs�|jd�|j|j�|jd�|j|j�|j�|j|j�|j�|jr�|jd�|j�|j|j�|j�ndS(Nsfor s in R[(	RR
R3RRRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_For�s



	

cCs|jd�|j|j�|j�|j|j�|j�x�|jr�t|j�dkr�t|jdt	j
�r�|jd}|jd�|j|j�|j�|j|j�|j�qDW|jr
|jd�|j�|j|j�|j�ndS(Nsif iiselif R[(RR
RBRR!RR]RaRRbtIf(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Ifs$


!


	

cCs�|jd�|j|j�|j�|j|j�|j�|jr~|jd�|j�|j|j�|j�ndS(Nswhile R[(RR
RBRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_While!s


	

cCsn|jd�|j|j�|jrF|jd�|j|j�n|j�|j|j�|j�dS(Nswith s as (RR
tcontext_exprt
optional_varsRRR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_With-s
	

cCs�d|jkr(|jt|j��nct|jt�rW|jdt|j��n4t|jt�r�|jt|j�jd��ndS(Ntunicode_literalstbtu(RRtreprtsRtstrtunicodetlstrip(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Str8s"cCs|j|j�dS(N(Rtid(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NameEscCs.|jd�|j|j�|jd�dS(Nt`(RR
R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ReprHs
cCsjt|j�}|jd�r.|jd�n|j|jdt��|jd�rf|jd�ndS(Nt-RRtinfRT(RzR,t
startswithRtreplacetINFSTR(RRtrepr_n((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NumMscs=�jd�t�fd��j|j��jd�dS(Nt[cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&YR
t](RRR
telts(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ListWs
cCsO|jd�|j|j�x|jD]}|j|�q'W|jd�dS(NR�R�(RR
teltt
generators(RRtgen((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_ListComp\s

cCsO|jd�|j|j�x|jD]}|j|�q'W|jd�dS(NRRRT(RR
R�R�(RRR�((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_GeneratorExpcs

cCsO|jd�|j|j�x|jD]}|j|�q'W|jd�dS(Nt{t}(RR
R�R�(RRR�((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_SetCompjs

cCsl|jd�|j|j�|jd�|j|j�x|jD]}|j|�qDW|jd�dS(NR�s: R�(RR
tkeyR$R�(RRR�((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_DictCompqs

cCsl|jd�|j|j�|jd�|j|j�x+|jD] }|jd�|j|�qDWdS(Ns for s in s if (RR
R3Rtifs(RRt	if_clause((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_comprehensionzs


cCsh|jd�|j|j�|jd�|j|j�|jd�|j|j�|jd�dS(NRRs if s else RT(RR
R!RBR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_IfExp�s


cs=�jd�t�fd��j|j��jd�dS(NR�cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
R�(RRR
R�(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Set�s
csU�jd��fd�}t�fd�|t|j|j���jd�dS(NR�cs7|\}}�j|��jd��j|�dS(Ns: (R
R(tpairtktv(R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
write_pair�s

cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
R�(RRtziptkeysRL(RRR�((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Dict�s
(cs{�jd�t|j�dkrK|j\}�j|��jd�nt�fd��j|j��jd�dS(NRRiRHcs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
RT(RRaR�R
R(RRR�((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Tuple�s

t~tInverttnottNott+tUAddR�tUSubcCs�|jd�|j|j|jjj�|jd�t|jtj�r�t|jtj	�r�|jd�|j
|j�|jd�n|j
|j�|jd�dS(NRRR5RT(RtunopR7RRRRbR�toperandtNumR
(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_UnaryOp�s

*
tAddtSubt*tMultt/tDivt%tMods<<tLShifts>>tRShiftt|tBitOrt^tBitXort&tBitAnds//tFloorDivs**tPowcCsc|jd�|j|j�|jd|j|jjjd�|j|j�|jd�dS(NRRR5RT(RR
tleftR6R7RRtright(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BinOp�s

%s==tEqs!=tNotEqt<tLts<=tLtEt>tGts>=tGtEtistIssis nottIsNottintInsnot intNotIncCs�|jd�|j|j�xRt|j|j�D];\}}|jd|j|jjd�|j|�q3W|jd�dS(NRRR5RT(	RR
R�R�topstcomparatorstcmpopsRR(RRtoRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Compare�s
""tandtorcsW�jd�d�j|jj�t��fd��j|j��jd�dS(NRRs %s cs
�j��S(N(R((R{R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
RT(RtboolopsR7RRR
RL(RR((R{Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BoolOp�s
"cCsk|j|j�t|jtj�rJt|jjt�rJ|jd�n|jd�|j|j�dS(NR5R-(	R
R$RRbR�R,tintRtattr(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_Attribute�s
*
cCs8|j|j�|jd�t}x:|jD]/}|rI|jd�nt}|j|�q-Wx:|jD]/}|r�|jd�nt}|j|�qjW|jr�|r�|jd�nt}|jd�|j|j�n|jr'|r|jd�nt}|jd�|j|j�n|jd�dS(NRRs, R�s**RT(	R
tfuncRRIRnRKtkeywordststarargstkwargs(RRtcommaRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Call�s4
	
	
cCs>|j|j�|jd�|j|j�|jd�dS(NR�R�(R
R$Rtslice(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_Subscript�s
cCs|jd�dS(Ns...(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_Ellipsis�scCs|j|j�dS(N(R
R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Index�scCsr|jr|j|j�n|jd�|jrE|j|j�n|jrn|jd�|j|j�ndS(NR(tlowerR
Rtuppertstep(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Slices	
		
cs#t�fd��j|j�dS(Ncs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&
R
(RR
tdims(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_ExtSlicescCs't}dgt|j�t|j�|j}xot|j|�D][\}}|r^t}n
|jd�|j|�f|rC|jd�|j|�qCqCW|j	r�|r�t}n
|jd�|jd�|j|j	�n|j
r#|r�t}n
|jd�|jd|j
�ndS(Ns, t=R�s**(RKtNoneRaRntdefaultsR�RIRR
tvarargtkwarg(RRtfirstR�Rltd((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_argumentss**	

		

		
cCs1|j|j�|jd�|j|j�dS(NR�(RtargR
R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_keyword)s
cCsX|jd�|jd�|j|j�|jd�|j|j�|jd�dS(NRRslambda s: RT(RR
RnR!(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Lambda.s


cCs4|j|j�|jr0|jd|j�ndS(Ns as (RR*tasname(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_alias6s	(IRt
__module__t__doc__tsyststdoutRRRRRR
R#R%R(R1R4R8R:R<R>R@RARDRGRPRQRURYR_ReRgRmRoRpRrRsRvRR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R6R�R�R�RbtAndtOrR�R�R�R�R�R�R�R�R�R�R�R�R�(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR	s�
																	
														
			
												
	
"	&#	-			
					
				cCsMt|d��}|j�}WdQXt||dtj�}t||�dS(Ntrtexec(topentreadtcompileRbt
PyCF_ONLY_ASTR	(tfilenametoutputtpyfiletsourceR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	roundtrip;scCsy5gtj|�D]}|jd�r|^q}Wn%tk
r\tjjd|�n�Xx�|D]�}tjj||�}tjj	|�r�t
j�}d|GHyt||�Wq�t
k
r�}dt|�GHq�Xqdtjj|�rdt|�qdqdWdS(Ns.pysDirectory not readable: %ss
Testing %ss$  Failed to compile, exception is %s(tostlistdirtendswithtOSErrorR�tstderrRtpathtjointisfilet	cStringIOtStringIOR
t	ExceptionRztisdirttestdir(RlR,R'tfullnameR
RO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyRCs5

	cCsQ|ddkr2x:|dD]}t|�qWnx|D]}t|�q9WdS(Nis	--testdiri(RR
(RnRl((s+/usr/lib64/python2.7/Demo/parser/unparse.pytmainUs

t__main__(R�R�RbRRRzt
float_infot
max_10_expR�RR	RR
RRRtargv(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt<module>s	
��%		example.py000064400000013132150374071010006547 0ustar00"""Simple code to extract class & function docstrings from a module.

This code is used as an example in the library reference manual in the
section on using the parser module.  Refer to the manual for a thorough
discussion of the operation of this code.
"""

import os
import parser
import symbol
import token
import types

from types import ListType, TupleType


def get_docs(fileName):
    """Retrieve information from the parse tree of a source file.

    fileName
        Name of the file to read Python source code from.
    """
    source = open(fileName).read()
    basename = os.path.basename(os.path.splitext(fileName)[0])
    ast = parser.suite(source)
    return ModuleInfo(ast.totuple(), basename)


class SuiteInfoBase:
    _docstring = ''
    _name = ''

    def __init__(self, tree = None):
        self._class_info = {}
        self._function_info = {}
        if tree:
            self._extract_info(tree)

    def _extract_info(self, tree):
        # extract docstring
        if len(tree) == 2:
            found, vars = match(DOCSTRING_STMT_PATTERN[1], tree[1])
        else:
            found, vars = match(DOCSTRING_STMT_PATTERN, tree[3])
        if found:
            self._docstring = eval(vars['docstring'])
        # discover inner definitions
        for node in tree[1:]:
            found, vars = match(COMPOUND_STMT_PATTERN, node)
            if found:
                cstmt = vars['compound']
                if cstmt[0] == symbol.funcdef:
                    name = cstmt[2][1]
                    self._function_info[name] = FunctionInfo(cstmt)
                elif cstmt[0] == symbol.classdef:
                    name = cstmt[2][1]
                    self._class_info[name] = ClassInfo(cstmt)

    def get_docstring(self):
        return self._docstring

    def get_name(self):
        return self._name

    def get_class_names(self):
        return self._class_info.keys()

    def get_class_info(self, name):
        return self._class_info[name]

    def __getitem__(self, name):
        try:
            return self._class_info[name]
        except KeyError:
            return self._function_info[name]


class SuiteFuncInfo:
    #  Mixin class providing access to function names and info.

    def get_function_names(self):
        return self._function_info.keys()

    def get_function_info(self, name):
        return self._function_info[name]


class FunctionInfo(SuiteInfoBase, SuiteFuncInfo):
    def __init__(self, tree = None):
        self._name = tree[2][1]
        SuiteInfoBase.__init__(self, tree and tree[-1] or None)


class ClassInfo(SuiteInfoBase):
    def __init__(self, tree = None):
        self._name = tree[2][1]
        SuiteInfoBase.__init__(self, tree and tree[-1] or None)

    def get_method_names(self):
        return self._function_info.keys()

    def get_method_info(self, name):
        return self._function_info[name]


class ModuleInfo(SuiteInfoBase, SuiteFuncInfo):
    def __init__(self, tree = None, name = "<string>"):
        self._name = name
        SuiteInfoBase.__init__(self, tree)
        if tree:
            found, vars = match(DOCSTRING_STMT_PATTERN, tree[1])
            if found:
                self._docstring = vars["docstring"]


def match(pattern, data, vars=None):
    """Match `data' to `pattern', with variable extraction.

    pattern
        Pattern to match against, possibly containing variables.

    data
        Data to be checked and against which variables are extracted.

    vars
        Dictionary of variables which have already been found.  If not
        provided, an empty dictionary is created.

    The `pattern' value may contain variables of the form ['varname'] which
    are allowed to match anything.  The value that is matched is returned as
    part of a dictionary which maps 'varname' to the matched value.  'varname'
    is not required to be a string object, but using strings makes patterns
    and the code which uses them more readable.

    This function returns two values: a boolean indicating whether a match
    was found and a dictionary mapping variable names to their associated
    values.
    """
    if vars is None:
        vars = {}
    if type(pattern) is ListType:       # 'variables' are ['varname']
        vars[pattern[0]] = data
        return 1, vars
    if type(pattern) is not TupleType:
        return (pattern == data), vars
    if len(data) != len(pattern):
        return 0, vars
    for pattern, data in map(None, pattern, data):
        same, vars = match(pattern, data, vars)
        if not same:
            break
    return same, vars


#  This pattern identifies compound statements, allowing them to be readily
#  differentiated from simple statements.
#
COMPOUND_STMT_PATTERN = (
    symbol.stmt,
    (symbol.compound_stmt, ['compound'])
    )


#  This pattern will match a 'stmt' node which *might* represent a docstring;
#  docstrings require that the statement which provides the docstring be the
#  first statement in the class or function, which this pattern does not check.
#
DOCSTRING_STMT_PATTERN = (
    symbol.stmt,
    (symbol.simple_stmt,
     (symbol.small_stmt,
      (symbol.expr_stmt,
       (symbol.testlist,
        (symbol.test,
         (symbol.and_test,
          (symbol.not_test,
           (symbol.comparison,
            (symbol.expr,
             (symbol.xor_expr,
              (symbol.and_expr,
               (symbol.shift_expr,
                (symbol.arith_expr,
                 (symbol.term,
                  (symbol.factor,
                   (symbol.power,
                    (symbol.atom,
                     (token.STRING, ['docstring'])
                     )))))))))))))))),
     (token.NEWLINE, '')
     ))
test_parser.pyo000064400000002643150374071010007633 0ustar00�
Afc@sSddlZddlZdad�Zd�Zd�ZedkrOe�ndS(i����NicCs�dG|Gy7tj|�}tj|�}d}tj|�}Wn8tjk
ry}HdG|dGHtj�tdan2X|tj|�kr�HdG|GHtdandGHdS(Ns----s,parser module raised exception on input filet:is"parser module failed on input fileso.k.(	tparsertsuitetst2tupletNonettuple2sttParserErrort	tracebackt	print_exct
_numFailed(tttfileNametstttuptnewterr((s//usr/lib64/python2.7/Demo/parser/test_parser.pyt	testChunk
s 

	
cCs#t|�j�}t||�dS(N(topentreadR(RR
((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttestFile!scCskddl}|jd}|sGddl}|jd�}|j�ntt|�|jtdk�dS(Ni����is*.pyi(tsystargvtglobtsorttmapRtexitR	(RtargsR((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttest%s


t__main__(RRR	RRRt__name__(((s//usr/lib64/python2.7/Demo/parser/test_parser.pyt<module>s			
simple.pyo000064400000000427150374071010006567 0ustar00�
��^c@s
d�ZdS(cCsdS(smaybe a docstringN((((s*/usr/lib64/python2.7/Demo/parser/simple.pytftN(R(((s*/usr/lib64/python2.7/Demo/parser/simple.pyt<module>Rtest_parser.pyc000064400000002643150374071010007617 0ustar00�
Afc@sSddlZddlZdad�Zd�Zd�ZedkrOe�ndS(i����NicCs�dG|Gy7tj|�}tj|�}d}tj|�}Wn8tjk
ry}HdG|dGHtj�tdan2X|tj|�kr�HdG|GHtdandGHdS(Ns----s,parser module raised exception on input filet:is"parser module failed on input fileso.k.(	tparsertsuitetst2tupletNonettuple2sttParserErrort	tracebackt	print_exct
_numFailed(tttfileNametstttuptnewterr((s//usr/lib64/python2.7/Demo/parser/test_parser.pyt	testChunk
s 

	
cCs#t|�j�}t||�dS(N(topentreadR(RR
((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttestFile!scCskddl}|jd}|sGddl}|jd�}|j�ntt|�|jtdk�dS(Ni����is*.pyi(tsystargvtglobtsorttmapRtexitR	(RtargsR((s//usr/lib64/python2.7/Demo/parser/test_parser.pyttest%s


t__main__(RRR	RRRt__name__(((s//usr/lib64/python2.7/Demo/parser/test_parser.pyt<module>s			
source.py000064400000001345150374071010006417 0ustar00"""Exmaple file to be parsed for the parsermodule example.

The classes and functions in this module exist only to exhibit the ability
of the handling information extraction from nested definitions using parse
trees.  They shouldn't interest you otherwise!
"""

class Simple:
    "This class does very little."

    def method(self):
        "This method does almost nothing."
        return 1

    class Nested:
        "This is a nested class."

        def nested_method(self):
            "Method of Nested class."
            def nested_function():
                "Function in method of Nested class."
                pass
            return nested_function

def function():
    "This function lives at the module level."
    return 0
FILES000064400000000133150374071010005324 0ustar00Demo/parser
Doc/libparser.tex
Lib/AST.py
Lib/symbol.py
Lib/token.py
Modules/parsermodule.c
source.pyo000064400000003060150374071010006572 0ustar00�
��^c@s&dZddd��YZd�ZdS(s�Exmaple file to be parsed for the parsermodule example.

The classes and functions in this module exist only to exhibit the ability
of the handling information extraction from nested definitions using parse
trees.  They shouldn't interest you otherwise!
tSimplecBs*eZdZd�Zddd��YZRS(sThis class does very little.cCsdS(s This method does almost nothing.i((tself((s*/usr/lib64/python2.7/Demo/parser/source.pytmethodstNestedcBseZdZd�ZRS(sThis is a nested class.cCs
d�}|S(sMethod of Nested class.cSsdS(s#Function in method of Nested class.N((((s*/usr/lib64/python2.7/Demo/parser/source.pytnested_functions((RR((s*/usr/lib64/python2.7/Demo/parser/source.pyt
nested_methods	(t__name__t
__module__t__doc__R(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs((RRRRR(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs	cCsdS(s(This function lives at the module level.i((((s*/usr/lib64/python2.7/Demo/parser/source.pytfunctionsN((RRR	(((s*/usr/lib64/python2.7/Demo/parser/source.pyt<module>sdocstring.pyc000064400000000257150374071010007257 0ustar00�
��^c@s
dZdS(sSome documentation.
N(t__doc__(((s-/usr/lib64/python2.7/Demo/parser/docstring.pyt<module>texample.pyo000064400000016044150374071010006733 0ustar00�
��^c@s�dZddlZddlZddlZddlZddlZddlmZmZd�Zddd��YZ	ddd��YZ
d	e	e
fd
��YZde	fd��YZd
e	e
fd��YZ
dd�ZejejdgffZejejejejejejejejejejejejejejej ej!ej"ej#ej$dgfffffffffffffffffej%dfffZ&dS(s�Simple code to extract class & function docstrings from a module.

This code is used as an example in the library reference manual in the
section on using the parser module.  Refer to the manual for a thorough
discussion of the operation of this code.
i����N(tListTypet	TupleTypecCsVt|�j�}tjjtjj|�d�}tj|�}t|j	�|�S(s�Retrieve information from the parse tree of a source file.

    fileName
        Name of the file to read Python source code from.
    i(
topentreadtostpathtbasenametsplitexttparsertsuitet
ModuleInfottotuple(tfileNametsourceRtast((s+/usr/lib64/python2.7/Demo/parser/example.pytget_docss"t
SuiteInfoBasecBsVeZdZdZdd�Zd�Zd�Zd�Zd�Z	d�Z
d�ZRS(	tcCs,i|_i|_|r(|j|�ndS(N(t_class_infot_function_infot
_extract_info(tselfttree((s+/usr/lib64/python2.7/Demo/parser/example.pyt__init__!s		cCst|�dkr2ttd|d�\}}ntt|d�\}}|rgt|d�|_nx�|dD]�}tt|�\}}|rr|d}|dtjkr�|dd}t|�|j	|<q|dtj
kr|dd}t|�|j|<qqrqrWdS(Niiit	docstringtcompoundi(
tlentmatchtDOCSTRING_STMT_PATTERNtevalt
_docstringtCOMPOUND_STMT_PATTERNtsymboltfuncdeftFunctionInfoRtclassdeft	ClassInfoR(RRtfoundtvarstnodetcstmttname((s+/usr/lib64/python2.7/Demo/parser/example.pyR's 
cCs|jS(N(R(R((s+/usr/lib64/python2.7/Demo/parser/example.pyt
get_docstring;scCs|jS(N(t_name(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_name>scCs
|jj�S(N(Rtkeys(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_namesAscCs|j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_infoDscCs/y|j|SWntk
r*|j|SXdS(N(RtKeyErrorR(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pyt__getitem__Gs
N(t__name__t
__module__RR+tNoneRRR*R,R.R/R1(((s+/usr/lib64/python2.7/Demo/parser/example.pyRs					t
SuiteFuncInfocBseZd�Zd�ZRS(cCs
|jj�S(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_namesQscCs|j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_infoTs(R2R3R6R7(((s+/usr/lib64/python2.7/Demo/parser/example.pyR5Ns	R"cBseZdd�ZRS(cCs5|dd|_tj||r*|dp-d�dS(Niii����(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyRYsN(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR"XsR$cBs&eZdd�Zd�Zd�ZRS(cCs5|dd|_tj||r*|dp-d�dS(Niii����(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyR_scCs
|jj�S(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_namescscCs|j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_infofsN(R2R3R4RR8R9(((s+/usr/lib64/python2.7/Demo/parser/example.pyR$^s	R
cBseZddd�ZRS(s<string>cCsU||_tj||�|rQtt|d�\}}|rQ|d|_qQndS(NiR(R+RRRRR(RRR)R%R&((s+/usr/lib64/python2.7/Demo/parser/example.pyRks	N(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR
jscCs�|dkri}nt|�tkr?|||d<d|fSt|�tk	ra||k|fSt|�t|�kr�d|fSxBtd||�D].\}}t|||�\}}|s�Pq�q�W||fS(saMatch `data' to `pattern', with variable extraction.

    pattern
        Pattern to match against, possibly containing variables.

    data
        Data to be checked and against which variables are extracted.

    vars
        Dictionary of variables which have already been found.  If not
        provided, an empty dictionary is created.

    The `pattern' value may contain variables of the form ['varname'] which
    are allowed to match anything.  The value that is matched is returned as
    part of a dictionary which maps 'varname' to the matched value.  'varname'
    is not required to be a string object, but using strings makes patterns
    and the code which uses them more readable.

    This function returns two values: a boolean indicating whether a match
    was found and a dictionary mapping variable names to their associated
    values.
    iiN(R4ttypeRRRtmapR(tpatterntdataR&tsame((s+/usr/lib64/python2.7/Demo/parser/example.pyRts	

RRR((('t__doc__RRR ttokenttypesRRRRR5R"R$R
R4Rtstmtt
compound_stmtRtsimple_stmtt
small_stmtt	expr_stmtttestlistttesttand_testtnot_testt
comparisontexprtxor_exprtand_exprt
shift_exprt
arith_exprttermtfactortpowertatomtSTRINGtNEWLINER(((s+/usr/lib64/python2.7/Demo/parser/example.pyt<module>sF	1

+	?README000064400000002006150374071010005420 0ustar00These files are from the large example of using the `parser' module.  Refer
to the Python Library Reference for more information.

It also contains examples for the AST parser.

Files:
------

    FILES        -- list of files associated with the parser module.

    README       -- this file.

    docstring.py -- sample source file containing only a module docstring.

    example.py   -- module that uses the `parser' module to extract
                    information from the parse tree of Python source
                    code.

    simple.py    -- sample source containing a "short form" definition.

    source.py    -- sample source code used to demonstrate ability to
                    handle nested constructs easily using the functions
                    and classes in example.py.

    test_parser.py  program to put the parser module through its paces.

    test_unparse.py tests for the unparse module

    unparse.py      AST (2.7) based example to recreate source code
                    from an AST.

Enjoy!
example.pyc000064400000016044150374071010006717 0ustar00�
��^c@s�dZddlZddlZddlZddlZddlZddlmZmZd�Zddd��YZ	ddd��YZ
d	e	e
fd
��YZde	fd��YZd
e	e
fd��YZ
dd�ZejejdgffZejejejejejejejejejejejejejejej ej!ej"ej#ej$dgfffffffffffffffffej%dfffZ&dS(s�Simple code to extract class & function docstrings from a module.

This code is used as an example in the library reference manual in the
section on using the parser module.  Refer to the manual for a thorough
discussion of the operation of this code.
i����N(tListTypet	TupleTypecCsVt|�j�}tjjtjj|�d�}tj|�}t|j	�|�S(s�Retrieve information from the parse tree of a source file.

    fileName
        Name of the file to read Python source code from.
    i(
topentreadtostpathtbasenametsplitexttparsertsuitet
ModuleInfottotuple(tfileNametsourceRtast((s+/usr/lib64/python2.7/Demo/parser/example.pytget_docss"t
SuiteInfoBasecBsVeZdZdZdd�Zd�Zd�Zd�Zd�Z	d�Z
d�ZRS(	tcCs,i|_i|_|r(|j|�ndS(N(t_class_infot_function_infot
_extract_info(tselfttree((s+/usr/lib64/python2.7/Demo/parser/example.pyt__init__!s		cCst|�dkr2ttd|d�\}}ntt|d�\}}|rgt|d�|_nx�|dD]�}tt|�\}}|rr|d}|dtjkr�|dd}t|�|j	|<q|dtj
kr|dd}t|�|j|<qqrqrWdS(Niiit	docstringtcompoundi(
tlentmatchtDOCSTRING_STMT_PATTERNtevalt
_docstringtCOMPOUND_STMT_PATTERNtsymboltfuncdeftFunctionInfoRtclassdeft	ClassInfoR(RRtfoundtvarstnodetcstmttname((s+/usr/lib64/python2.7/Demo/parser/example.pyR's 
cCs|jS(N(R(R((s+/usr/lib64/python2.7/Demo/parser/example.pyt
get_docstring;scCs|jS(N(t_name(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_name>scCs
|jj�S(N(Rtkeys(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_namesAscCs|j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_class_infoDscCs/y|j|SWntk
r*|j|SXdS(N(RtKeyErrorR(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pyt__getitem__Gs
N(t__name__t
__module__RR+tNoneRRR*R,R.R/R1(((s+/usr/lib64/python2.7/Demo/parser/example.pyRs					t
SuiteFuncInfocBseZd�Zd�ZRS(cCs
|jj�S(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_namesQscCs|j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_function_infoTs(R2R3R6R7(((s+/usr/lib64/python2.7/Demo/parser/example.pyR5Ns	R"cBseZdd�ZRS(cCs5|dd|_tj||r*|dp-d�dS(Niii����(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyRYsN(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR"XsR$cBs&eZdd�Zd�Zd�ZRS(cCs5|dd|_tj||r*|dp-d�dS(Niii����(R+RRR4(RR((s+/usr/lib64/python2.7/Demo/parser/example.pyR_scCs
|jj�S(N(RR-(R((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_namescscCs|j|S(N(R(RR)((s+/usr/lib64/python2.7/Demo/parser/example.pytget_method_infofsN(R2R3R4RR8R9(((s+/usr/lib64/python2.7/Demo/parser/example.pyR$^s	R
cBseZddd�ZRS(s<string>cCsU||_tj||�|rQtt|d�\}}|rQ|d|_qQndS(NiR(R+RRRRR(RRR)R%R&((s+/usr/lib64/python2.7/Demo/parser/example.pyRks	N(R2R3R4R(((s+/usr/lib64/python2.7/Demo/parser/example.pyR
jscCs�|dkri}nt|�tkr?|||d<d|fSt|�tk	ra||k|fSt|�t|�kr�d|fSxBtd||�D].\}}t|||�\}}|s�Pq�q�W||fS(saMatch `data' to `pattern', with variable extraction.

    pattern
        Pattern to match against, possibly containing variables.

    data
        Data to be checked and against which variables are extracted.

    vars
        Dictionary of variables which have already been found.  If not
        provided, an empty dictionary is created.

    The `pattern' value may contain variables of the form ['varname'] which
    are allowed to match anything.  The value that is matched is returned as
    part of a dictionary which maps 'varname' to the matched value.  'varname'
    is not required to be a string object, but using strings makes patterns
    and the code which uses them more readable.

    This function returns two values: a boolean indicating whether a match
    was found and a dictionary mapping variable names to their associated
    values.
    iiN(R4ttypeRRRtmapR(tpatterntdataR&tsame((s+/usr/lib64/python2.7/Demo/parser/example.pyRts	

RRR((('t__doc__RRR ttokenttypesRRRRR5R"R$R
R4Rtstmtt
compound_stmtRtsimple_stmtt
small_stmtt	expr_stmtttestlistttesttand_testtnot_testt
comparisontexprtxor_exprtand_exprt
shift_exprt
arith_exprttermtfactortpowertatomtSTRINGtNEWLINER(((s+/usr/lib64/python2.7/Demo/parser/example.pyt<module>sF	1

+	?simple.py000064400000000035150374071010006403 0ustar00def f(): "maybe a docstring"
test_unparse.py000064400000012701150374071010007631 0ustar00import unittest
from test import test_support
import cStringIO
import sys
import os
import tokenize
import ast
import unparse

def read_pyfile(filename):
    """Read and return the contents of a Python source file (as a
    string), taking into account the file encoding."""
    with open(filename, "r") as pyfile:
        source = pyfile.read()
    return source

for_else = """\
def f():
    for x in range(10):
        break
    else:
        y = 2
    z = 3
"""

while_else = """\
def g():
    while True:
        break
    else:
        y = 2
    z = 3
"""

relative_import = """\
from . import fred
from .. import barney
from .australia import shrimp as prawns
"""

class_decorator = """\
@f1(arg)
@f2
class Foo: pass
"""

elif1 = """\
if cond1:
    suite1
elif cond2:
    suite2
else:
    suite3
"""

elif2 = """\
if cond1:
    suite1
elif cond2:
    suite2
"""

try_except_finally = """\
try:
    suite1
except ex1:
    suite2
except ex2:
    suite3
else:
    suite4
finally:
    suite5
"""

class ASTTestCase(unittest.TestCase):
    def assertASTEqual(self, ast1, ast2):
        dump1 = ast.dump(ast1)
        dump2 = ast.dump(ast2)
        self.assertEqual(ast.dump(ast1), ast.dump(ast2))

    def check_roundtrip(self, code1, filename="internal"):
        ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST)
        unparse_buffer = cStringIO.StringIO()
        unparse.Unparser(ast1, unparse_buffer)
        code2 = unparse_buffer.getvalue()
        ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST)
        self.assertASTEqual(ast1, ast2)

class UnparseTestCase(ASTTestCase):
    # Tests for specific bugs found in earlier versions of unparse

    def test_del_statement(self):
        self.check_roundtrip("del x, y, z")

    def test_shifts(self):
        self.check_roundtrip("45 << 2")
        self.check_roundtrip("13 >> 7")

    def test_for_else(self):
        self.check_roundtrip(for_else)

    def test_while_else(self):
        self.check_roundtrip(while_else)

    def test_unary_parens(self):
        self.check_roundtrip("(-1)**7")
        self.check_roundtrip("(-1.)**8")
        self.check_roundtrip("(-1j)**6")
        self.check_roundtrip("not True or False")
        self.check_roundtrip("True or not False")

    def test_integer_parens(self):
        self.check_roundtrip("3 .__abs__()")

    def test_huge_float(self):
        self.check_roundtrip("1e1000")
        self.check_roundtrip("-1e1000")
        self.check_roundtrip("1e1000j")
        self.check_roundtrip("-1e1000j")

    def test_min_int(self):
        self.check_roundtrip(str(-sys.maxint-1))
        self.check_roundtrip("-(%s)" % (sys.maxint + 1))

    def test_imaginary_literals(self):
        self.check_roundtrip("7j")
        self.check_roundtrip("-7j")
        self.check_roundtrip("-(7j)")
        self.check_roundtrip("0j")
        self.check_roundtrip("-0j")
        self.check_roundtrip("-(0j)")

    def test_negative_zero(self):
        self.check_roundtrip("-0")
        self.check_roundtrip("-(0)")
        self.check_roundtrip("-0b0")
        self.check_roundtrip("-(0b0)")
        self.check_roundtrip("-0o0")
        self.check_roundtrip("-(0o0)")
        self.check_roundtrip("-0x0")
        self.check_roundtrip("-(0x0)")

    def test_lambda_parentheses(self):
        self.check_roundtrip("(lambda: int)()")

    def test_chained_comparisons(self):
        self.check_roundtrip("1 < 4 <= 5")
        self.check_roundtrip("a is b is c is not d")

    def test_function_arguments(self):
        self.check_roundtrip("def f(): pass")
        self.check_roundtrip("def f(a): pass")
        self.check_roundtrip("def f(b = 2): pass")
        self.check_roundtrip("def f(a, b): pass")
        self.check_roundtrip("def f(a, b = 2): pass")
        self.check_roundtrip("def f(a = 5, b = 2): pass")
        self.check_roundtrip("def f(*args, **kwargs): pass")

    def test_relative_import(self):
        self.check_roundtrip(relative_import)

    def test_bytes(self):
        self.check_roundtrip("b'123'")

    def test_set_literal(self):
        self.check_roundtrip("{'a', 'b', 'c'}")

    def test_set_comprehension(self):
        self.check_roundtrip("{x for x in range(5)}")

    def test_dict_comprehension(self):
        self.check_roundtrip("{x: x*x for x in range(10)}")

    def test_class_decorators(self):
        self.check_roundtrip(class_decorator)

    def test_elifs(self):
        self.check_roundtrip(elif1)
        self.check_roundtrip(elif2)

    def test_try_except_finally(self):
        self.check_roundtrip(try_except_finally)

class DirectoryTestCase(ASTTestCase):
    """Test roundtrip behaviour on all files in Lib and Lib/test."""

    # test directories, relative to the root of the distribution
    test_directories = 'Lib', os.path.join('Lib', 'test')

    def test_files(self):
        # get names of files to test
        dist_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)

        names = []
        for d in self.test_directories:
            test_dir = os.path.join(dist_dir, d)
            for n in os.listdir(test_dir):
                if n.endswith('.py') and not n.startswith('bad'):
                    names.append(os.path.join(test_dir, n))

        for filename in names:
            if test_support.verbose:
                print('Testing %s' % filename)
            source = read_pyfile(filename)
            self.check_roundtrip(source)


def test_main():
    test_support.run_unittest(UnparseTestCase, DirectoryTestCase)

if __name__ == '__main__':
    test_main()
simple.pyc000064400000000427150374071010006553 0ustar00�
��^c@s
d�ZdS(cCsdS(smaybe a docstringN((((s*/usr/lib64/python2.7/Demo/parser/simple.pytftN(R(((s*/usr/lib64/python2.7/Demo/parser/simple.pyt<module>Rdocstring.pyo000064400000000257150374071010007273 0ustar00�
��^c@s
dZdS(sSome documentation.
N(t__doc__(((s-/usr/lib64/python2.7/Demo/parser/docstring.pyt<module>tsource.pyc000064400000003060150374071010006556 0ustar00�
��^c@s&dZddd��YZd�ZdS(s�Exmaple file to be parsed for the parsermodule example.

The classes and functions in this module exist only to exhibit the ability
of the handling information extraction from nested definitions using parse
trees.  They shouldn't interest you otherwise!
tSimplecBs*eZdZd�Zddd��YZRS(sThis class does very little.cCsdS(s This method does almost nothing.i((tself((s*/usr/lib64/python2.7/Demo/parser/source.pytmethodstNestedcBseZdZd�ZRS(sThis is a nested class.cCs
d�}|S(sMethod of Nested class.cSsdS(s#Function in method of Nested class.N((((s*/usr/lib64/python2.7/Demo/parser/source.pytnested_functions((RR((s*/usr/lib64/python2.7/Demo/parser/source.pyt
nested_methods	(t__name__t
__module__t__doc__R(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs((RRRRR(((s*/usr/lib64/python2.7/Demo/parser/source.pyRs	cCsdS(s(This function lives at the module level.i((((s*/usr/lib64/python2.7/Demo/parser/source.pytfunctionsN((RRR	(((s*/usr/lib64/python2.7/Demo/parser/source.pyt<module>stest_parser.py000075500000002241150374071010007451 0ustar00#! /usr/bin/python2.7
#  (Force the script to use the latest build.)
#
#  test_parser.py

import parser, traceback

_numFailed = 0

def testChunk(t, fileName):
    global _numFailed
    print '----', fileName,
    try:
        st = parser.suite(t)
        tup = parser.st2tuple(st)
        # this discards the first ST; a huge memory savings when running
        # against a large source file like Tkinter.py.
        st = None
        new = parser.tuple2st(tup)
    except parser.ParserError, err:
        print
        print 'parser module raised exception on input file', fileName + ':'
        traceback.print_exc()
        _numFailed = _numFailed + 1
    else:
        if tup != parser.st2tuple(new):
            print
            print 'parser module failed on input file', fileName
            _numFailed = _numFailed + 1
        else:
            print 'o.k.'

def testFile(fileName):
    t = open(fileName).read()
    testChunk(t, fileName)

def test():
    import sys
    args = sys.argv[1:]
    if not args:
        import glob
        args = glob.glob("*.py")
        args.sort()
    map(testFile, args)
    sys.exit(_numFailed != 0)

if __name__ == '__main__':
    test()
unparse.pyc000064400000056705150374071010006751 0ustar00�
��^c@s�dZddlZddlZddlZddlZdeejjd�Zd�Z	dfd��YZ
ejd�Zd	�Z
d
�Zedkr�eejd�ndS(s'Usage: unparse.py <path to source file>i����Nt1eicCsZt|�}y|t|��Wntk
r3n#Xx|D]}|�||�q;WdS(s<Call f on each item in seq, calling inter() in between.
    N(titertnextt
StopIteration(tintertftseqtx((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
interleaves

tUnparsercBseZdZejd�Zdd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z!d�Z"d �Z#d!�Z$d"�Z%d#�Z&d$�Z'd%�Z(d&�Z)d'�Z*d(�Z+d)�Z,d*�Z-d+�Z.d,�Z/d-�Z0d.�Z1d/�Z2id0d16d2d36d4d56d6d76Z3d8�Z4id4d96d6d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6Z5dO�Z6i
dPdQ6dRdS6dTdU6dVdW6dXdY6dZd[6d\d]6d^d_6d`da6dbdc6Z7dd�Z8idee9j:6dfe9j;6Z<dg�Z=dh�Z>di�Z?dj�Z@dk�ZAdl�ZBdm�ZCdn�ZDdo�ZEdp�ZFdq�ZGdr�ZHRS(ss�Methods in this class recursively traverse an AST and
    output source code for the abstract syntax; original formatting
    is disregarded. cCsI||_g|_d|_|j|�|jjd�|jj�dS(sTUnparser(tree, file=sys.stdout) -> None.
         Print the source for tree to file.itN(Rtfuture_importst_indenttdispatchtwritetflush(tselfttreetfile((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt__init__s			
R
cCs#|jjdd|j|�dS(sBIndent a piece of text, according to the current indentation levels
s    N(RRR(Rttext((s+/usr/lib64/python2.7/Demo/parser/unparse.pytfill'scCs|jj|�dS(s+Append a piece of text to the current line.N(RR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR+scCs |jd�|jd7_dS(s(Print ':', and increase the indentation.t:iN(RR(R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytenter/s
cCs|jd8_dS(sDecrease the indentation level.iN(R(R((s+/usr/lib64/python2.7/Demo/parser/unparse.pytleave4scCsXt|t�r1x|D]}|j|�qWdSt|d|jj�}||�dS(s:Dispatcher function, dispatching tree type T to method _T.Nt_(t
isinstancetlistR
tgetattrt	__class__t__name__(RRtttmeth((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR
8s
cCs%x|jD]}|j|�q
WdS(N(tbodyR
(RRtstmt((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ModuleIscCs|j�|j|j�dS(N(RR
tvalue(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExprNs
cs0�jd�t�fd��j|j�dS(Nsimport cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyt<lambda>TR
(RRR
tnames(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ImportRs
cs�|jr8|jdkr8�jjd�|jD��n�jd��jd|j�|jru�j|j�n�jd�t�fd��j|j�dS(Nt
__future__css|]}|jVqdS(N(tname(t.0tn((s+/usr/lib64/python2.7/Demo/parser/unparse.pys	<genexpr>Yssfrom t.s import cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&`R
(	tmoduleRtextendR'RRtlevelRR
(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ImportFromVs 
	
cCsL|j�x+|jD] }|j|�|jd�qW|j|j�dS(Ns = (RttargetsR
RR$(RRttarget((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Assignbs


cCsS|j�|j|j�|jd|j|jjjd�|j|j�dS(Nt s= (	RR
R3RtbinoptopRRR$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_AugAssignis
%cCs:|jd�|jr6|jd�|j|j�ndS(NtreturnR5(RR$RR
(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Returnos
	
cCs|jd�dS(Ntpass(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_PassuscCs|jd�dS(Ntbreak(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BreakxscCs|jd�dS(Ntcontinue(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_Continue{scs0�jd�t�fd��j|j�dS(Nsdel cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
(RRR
R2(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Delete~s
cCsJ|jd�|j|j�|jrF|jd�|j|j�ndS(Nsassert s, (RR
ttesttmsgR(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Assert�s

	
cCss|jd�|j|j�|jrF|jd�|j|j�n|jro|jd�|j|j�ndS(Nsexec s in s, (RR
R!tglobalsRtlocals(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Exec�s
	
	
cCs�|jd�t}|jrB|jd�|j|j�t}nx:|jD]/}|rh|jd�nt}|j|�qLW|js�|jd�ndS(Nsprint s>>s, t,(RtFalsetdestRR
tTruetvaluestnl(RRtdo_commate((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Print�s
	
		cs0�jd�t�fd��j|j�dS(Nsglobal cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
(RRRR'(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Global�s
cCsT|jd�|jd�|jrC|jd�|j|j�n|jd�dS(Nt(tyieldR5t)(RR$R
(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Yield�s

	
cCs|jd�|jr)|j|j�n|jrR|jd�|j|j�n|jr{|jd�|j|j�ndS(Nsraise s, (RttypeR
tinstRttback(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Raise�s
		
	
cCs�|jd�|j�|j|j�|j�x|jD]}|j|�q;W|jr�|jd�|j�|j|j�|j�ndS(Nttrytelse(RRR
R!Rthandlerstorelse(RRtex((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_TryExcept�s


	

cCs�t|j�dkrAt|jdtj�rA|j|j�n1|jd�|j�|j|j�|j�|jd�|j�|j|j	�|j�dS(NiiRZtfinally(
tlenR!Rtastt	TryExceptR
RRRt	finalbody(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_TryFinally�s.




cCs�|jd�|jr6|jd�|j|j�n|jr_|jd�|j|j�n|j�|j|j�|j�dS(NtexceptR5s as (RRVRR
R*RR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ExceptHandler�s
	
	

cCs�|jd�x+|jD] }|jd�|j|�qW|jd|j�|jr�|jd�x+|jD] }|j|�|jd�qoW|jd�n|j�|j|j�|j�dS(Ns
t@sclass RRs, RT(	Rtdecorator_listRR
R*tbasesRR!R(RRtdecota((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_ClassDef�s

	


cCs�|jd�x+|jD] }|jd�|j|�qW|jd|jd�|j|j�|jd�|j�|j|j�|j�dS(Ns
Rhsdef RRRT(	RRiRR
R*targsRR!R(RRRk((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_FunctionDef�s



cCs�|jd�|j|j�|jd�|j|j�|j�|j|j�|j�|jr�|jd�|j�|j|j�|j�ndS(Nsfor s in R[(	RR
R3RRRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_For�s



	

cCs|jd�|j|j�|j�|j|j�|j�x�|jr�t|j�dkr�t|jdt	j
�r�|jd}|jd�|j|j�|j�|j|j�|j�qDW|jr
|jd�|j�|j|j�|j�ndS(Nsif iiselif R[(RR
RBRR!RR]RaRRbtIf(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Ifs$


!


	

cCs�|jd�|j|j�|j�|j|j�|j�|jr~|jd�|j�|j|j�|j�ndS(Nswhile R[(RR
RBRR!RR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_While!s


	

cCsn|jd�|j|j�|jrF|jd�|j|j�n|j�|j|j�|j�dS(Nswith s as (RR
tcontext_exprt
optional_varsRRR!R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_With-s
	

cCs�d|jkr(|jt|j��nut|jt�rW|jdt|j��nFt|jt�r�|jt|j�jd��nts�t	d��dS(Ntunicode_literalstbtusshouldn't get here(
RRtreprtsRtstrtunicodetlstripRItAssertionError(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Str8s"cCs|j|j�dS(N(Rtid(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NameEscCs.|jd�|j|j�|jd�dS(Nt`(RR
R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ReprHs
cCsjt|j�}|jd�r.|jd�n|j|jdt��|jd�rf|jd�ndS(Nt-RRtinfRT(RzR,t
startswithRtreplacetINFSTR(RRtrepr_n((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_NumMscs=�jd�t�fd��j|j��jd�dS(Nt[cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&YR
t](RRR
telts(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_ListWs
cCsO|jd�|j|j�x|jD]}|j|�q'W|jd�dS(NR�R�(RR
teltt
generators(RRtgen((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_ListComp\s

cCsO|jd�|j|j�x|jD]}|j|�q'W|jd�dS(NRRRT(RR
R�R�(RRR�((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_GeneratorExpcs

cCsO|jd�|j|j�x|jD]}|j|�q'W|jd�dS(Nt{t}(RR
R�R�(RRR�((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_SetCompjs

cCsl|jd�|j|j�|jd�|j|j�x|jD]}|j|�qDW|jd�dS(NR�s: R�(RR
tkeyR$R�(RRR�((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_DictCompqs

cCsl|jd�|j|j�|jd�|j|j�x+|jD] }|jd�|j|�qDWdS(Ns for s in s if (RR
R3Rtifs(RRt	if_clause((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_comprehensionzs


cCsh|jd�|j|j�|jd�|j|j�|jd�|j|j�|jd�dS(NRRs if s else RT(RR
R!RBR](RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_IfExp�s


csL|jst��jd�t�fd��j|j��jd�dS(NR�cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
R�(R�RRRR
(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Set�s
csU�jd��fd�}t�fd�|t|j|j���jd�dS(NR�cs7|\}}�j|��jd��j|�dS(Ns: (R
R(tpairtktv(R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
write_pair�s

cs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
R�(RRtziptkeysRL(RRR�((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Dict�s
(cs{�jd�t|j�dkrK|j\}�j|��jd�nt�fd��j|j��jd�dS(NRRiRHcs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
RT(RRaR�R
R(RRR�((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Tuple�s

t~tInverttnottNott+tUAddR�tUSubcCs�|jd�|j|j|jjj�|jd�t|jtj�r�t|jtj	�r�|jd�|j
|j�|jd�n|j
|j�|jd�dS(NRRR5RT(RtunopR7RRRRbR�toperandtNumR
(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_UnaryOp�s

*
tAddtSubt*tMultt/tDivt%tMods<<tLShifts>>tRShiftt|tBitOrt^tBitXort&tBitAnds//tFloorDivs**tPowcCsc|jd�|j|j�|jd|j|jjjd�|j|j�|jd�dS(NRRR5RT(RR
tleftR6R7RRtright(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BinOp�s

%s==tEqs!=tNotEqt<tLts<=tLtEt>tGts>=tGtEtistIssis nottIsNottintInsnot intNotIncCs�|jd�|j|j�xRt|j|j�D];\}}|jd|j|jjd�|j|�q3W|jd�dS(NRRR5RT(	RR
R�R�topstcomparatorstcmpopsRR(RRtoRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Compare�s
""tandtorcsW�jd�d�j|jj�t��fd��j|j��jd�dS(NRRs %s cs
�j��S(N(R((R{R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&�R
RT(RtboolopsR7RRR
RL(RR((R{Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt_BoolOp�s
"cCsk|j|j�t|jtj�rJt|jjt�rJ|jd�n|jd�|j|j�dS(NR5R-(	R
R$RRbR�R,tintRtattr(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_Attribute�s
*
cCs8|j|j�|jd�t}x:|jD]/}|rI|jd�nt}|j|�q-Wx:|jD]/}|r�|jd�nt}|j|�qjW|jr�|r�|jd�nt}|jd�|j|j�n|jr'|r|jd�nt}|jd�|j|j�n|jd�dS(NRRs, R�s**RT(	R
tfuncRRIRnRKtkeywordststarargstkwargs(RRtcommaRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Call�s4
	
	
cCs>|j|j�|jd�|j|j�|jd�dS(NR�R�(R
R$Rtslice(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_Subscript�s
cCs|jd�dS(Ns...(R(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_Ellipsis�scCs|j|j�dS(N(R
R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Index�scCsr|jr|j|j�n|jd�|jrE|j|j�n|jrn|jd�|j|j�ndS(NR(tlowerR
Rtuppertstep(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Slices	
		
cs#t�fd��j|j�dS(Ncs
�jd�S(Ns, (R((R(s+/usr/lib64/python2.7/Demo/parser/unparse.pyR&
R
(RR
tdims(RR((Rs+/usr/lib64/python2.7/Demo/parser/unparse.pyt	_ExtSlicescCs't}dgt|j�t|j�|j}xot|j|�D][\}}|r^t}n
|jd�|j|�f|rC|jd�|j|�qCqCW|j	r�|r�t}n
|jd�|jd�|j|j	�n|j
r#|r�t}n
|jd�|jd|j
�ndS(Ns, t=R�s**(RKtNoneRaRntdefaultsR�RIRR
tvarargtkwarg(RRtfirstR�Rltd((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt
_argumentss**	

		

		
cCs1|j|j�|jd�|j|j�dS(NR�(RtargR
R$(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_keyword)s
cCsX|jd�|jd�|j|j�|jd�|j|j�|jd�dS(NRRslambda s: RT(RR
RnR!(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_Lambda.s


cCs4|j|j�|jr0|jd|j�ndS(Ns as (RR*tasname(RR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt_alias6s	(IRt
__module__t__doc__tsyststdoutRRRRRR
R#R%R(R1R4R8R:R<R>R@RARDRGRPRQRURYR_ReRgRmRoRpRrRsRvR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R6R�R�R�RbtAndtOrR�R�R�R�R�R�R�R�R�R�R�R�R�(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyR	s�
																	
														
			
												
	
"	&#	-			
					
				cCsMt|d��}|j�}WdQXt||dtj�}t||�dS(Ntrtexec(topentreadtcompileRbt
PyCF_ONLY_ASTR	(tfilenametoutputtpyfiletsourceR((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt	roundtrip;scCsy5gtj|�D]}|jd�r|^q}Wn%tk
r\tjjd|�n�Xx�|D]�}tjj||�}tjj	|�r�t
j�}d|GHyt||�Wq�t
k
r�}dt|�GHq�Xqdtjj|�rdt|�qdqdWdS(Ns.pysDirectory not readable: %ss
Testing %ss$  Failed to compile, exception is %s(tostlistdirtendswithtOSErrorRtstderrRtpathtjointisfilet	cStringIOtStringIORt	ExceptionRztisdirttestdir(RlR,R'tfullnameRRO((s+/usr/lib64/python2.7/Demo/parser/unparse.pyRCs5

	cCsQ|ddkr2x:|dD]}t|�qWnx|D]}t|�q9WdS(Nis	--testdiri(RR(RnRl((s+/usr/lib64/python2.7/Demo/parser/unparse.pytmainUs

t__main__(R�RRbRRRzt
float_infot
max_10_expR�RR	RRRRRtargv(((s+/usr/lib64/python2.7/Demo/parser/unparse.pyt<module>s	
��%		test_unparse.pyo000064400000020716150374071010010015 0ustar00�
��^c@s�ddlZddlmZddlZddlZddlZddlZddlZddlZd�Z	dZ
dZdZdZ
dZd	Zd
Zdejfd��YZd
efd��YZdefd��YZd�Zedkr�e�ndS(i����N(ttest_supportcCs(t|d��}|j�}WdQX|S(snRead and return the contents of a Python source file (as a
    string), taking into account the file encoding.trN(topentread(tfilenametpyfiletsource((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytread_pyfile
ssQdef f():
    for x in range(10):
        break
    else:
        y = 2
    z = 3
sIdef g():
    while True:
        break
    else:
        y = 2
    z = 3
sQfrom . import fred
from .. import barney
from .australia import shrimp as prawns
s@f1(arg)
@f2
class Foo: pass
s=if cond1:
    suite1
elif cond2:
    suite2
else:
    suite3
s,if cond1:
    suite1
elif cond2:
    suite2
sctry:
    suite1
except ex1:
    suite2
except ex2:
    suite3
else:
    suite4
finally:
    suite5
tASTTestCasecBseZd�Zdd�ZRS(cCsDtj|�}tj|�}|jtj|�tj|��dS(N(tasttdumptassertEqual(tselftast1tast2tdump1tdump2((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytassertASTEqualMstinternalcCslt||dtj�}tj�}tj||�|j�}t||dtj�}|j||�dS(Ntexec(	tcompileR	t
PyCF_ONLY_ASTt	cStringIOtStringIOtunparsetUnparsertgetvalueR(Rtcode1RR
tunparse_buffertcode2R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytcheck_roundtripRs(t__name__t
__module__RR(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyRLs	tUnparseTestCasecBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs|jd�dS(Nsdel x, y, z(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_del_statement]scCs|jd�|jd�dS(Ns45 << 2s13 >> 7(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_shifts`s
cCs|jt�dS(N(Rtfor_else(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_for_elsedscCs|jt�dS(N(Rt
while_else(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_while_elsegscCsE|jd�|jd�|jd�|jd�|jd�dS(Ns(-1)**7s(-1.)**8s(-1j)**6snot True or FalsesTrue or not False(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_unary_parensjs




cCs|jd�dS(Ns3 .__abs__()(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_integer_parensqscCs8|jd�|jd�|jd�|jd�dS(Nt1e1000s-1e1000t1e1000js-1e1000j(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_huge_floatts


cCs7|jttjd��|jdtjd�dS(Nis-(%s)(Rtstrtsystmaxint(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_min_intzscCsR|jd�|jd�|jd�|jd�|jd�|jd�dS(Nt7js-7js-(7j)t0js-0js-(0j)(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_imaginary_literals~s




cCsl|jd�|jd�|jd�|jd�|jd�|jd�|jd�|jd�dS(	Ns-0s-(0)s-0b0s-(0b0)s-0o0s-(0o0)s-0x0s-(0x0)(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_negative_zero�s






cCs|jd�dS(Ns(lambda: int)()(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_lambda_parentheses�scCs|jd�|jd�dS(Ns
1 < 4 <= 5sa is b is c is not d(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_chained_comparisons�s
cCs_|jd�|jd�|jd�|jd�|jd�|jd�|jd�dS(Ns
def f(): passsdef f(a): passsdef f(b = 2): passsdef f(a, b): passsdef f(a, b = 2): passsdef f(a = 5, b = 2): passsdef f(*args, **kwargs): pass(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_function_arguments�s





cCs|jt�dS(N(Rtrelative_import(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_relative_import�scCs|jd�dS(Nsb'123'(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_bytes�scCs|jd�dS(Ns{'a', 'b', 'c'}(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_literal�scCs|jd�dS(Ns{x for x in range(5)}(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_comprehension�scCs|jd�dS(Ns{x: x*x for x in range(10)}(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_dict_comprehension�scCs|jt�dS(N(Rtclass_decorator(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_class_decorators�scCs|jt�|jt�dS(N(Rtelif1telif2(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_elifs�s
cCs|jt�dS(N(Rttry_except_finally(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_try_except_finally�s(RR R"R#R%R'R(R)R,R0R3R4R5R6R7R9R:R;R<R=R?RBRD(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyR!Zs*										
											tDirectoryTestCasecBs2eZdZdejjdd�fZd�ZRS(s:Test roundtrip behaviour on all files in Lib and Lib/test.tLibttestcCs�tjjtjjt�tjtj�}g}x~|jD]s}tjj||�}xUtj|�D]D}|jd�re|j	d�re|j
tjj||��qeqeWq:Wx<|D]4}tjr�d|GHnt
|�}|j|�q�WdS(Ns.pytbads
Testing %s(tostpathtjointdirnamet__file__tpardirttest_directoriestlistdirtendswitht
startswithtappendRtverboseRR(Rtdist_dirtnamestdttest_dirtnRR((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_files�s*'
	(RR t__doc__RIRJRKRORZ(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyRE�scCstjtt�dS(N(Rtrun_unittestR!RE(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt	test_main�st__main__(tunittestRGRRR.RIttokenizeR	RRR$R&R8R>R@RARCtTestCaseRR!RER]R(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt<module>s*			
_	test_unparse.pyc000064400000020716150374071010010001 0ustar00�
��^c@s�ddlZddlmZddlZddlZddlZddlZddlZddlZd�Z	dZ
dZdZdZ
dZd	Zd
Zdejfd��YZd
efd��YZdefd��YZd�Zedkr�e�ndS(i����N(ttest_supportcCs(t|d��}|j�}WdQX|S(snRead and return the contents of a Python source file (as a
    string), taking into account the file encoding.trN(topentread(tfilenametpyfiletsource((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytread_pyfile
ssQdef f():
    for x in range(10):
        break
    else:
        y = 2
    z = 3
sIdef g():
    while True:
        break
    else:
        y = 2
    z = 3
sQfrom . import fred
from .. import barney
from .australia import shrimp as prawns
s@f1(arg)
@f2
class Foo: pass
s=if cond1:
    suite1
elif cond2:
    suite2
else:
    suite3
s,if cond1:
    suite1
elif cond2:
    suite2
sctry:
    suite1
except ex1:
    suite2
except ex2:
    suite3
else:
    suite4
finally:
    suite5
tASTTestCasecBseZd�Zdd�ZRS(cCsDtj|�}tj|�}|jtj|�tj|��dS(N(tasttdumptassertEqual(tselftast1tast2tdump1tdump2((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytassertASTEqualMstinternalcCslt||dtj�}tj�}tj||�|j�}t||dtj�}|j||�dS(Ntexec(	tcompileR	t
PyCF_ONLY_ASTt	cStringIOtStringIOtunparsetUnparsertgetvalueR(Rtcode1RR
tunparse_buffertcode2R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pytcheck_roundtripRs(t__name__t
__module__RR(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyRLs	tUnparseTestCasecBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs|jd�dS(Nsdel x, y, z(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_del_statement]scCs|jd�|jd�dS(Ns45 << 2s13 >> 7(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_shifts`s
cCs|jt�dS(N(Rtfor_else(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_for_elsedscCs|jt�dS(N(Rt
while_else(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_while_elsegscCsE|jd�|jd�|jd�|jd�|jd�dS(Ns(-1)**7s(-1.)**8s(-1j)**6snot True or FalsesTrue or not False(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_unary_parensjs




cCs|jd�dS(Ns3 .__abs__()(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_integer_parensqscCs8|jd�|jd�|jd�|jd�dS(Nt1e1000s-1e1000t1e1000js-1e1000j(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_huge_floatts


cCs7|jttjd��|jdtjd�dS(Nis-(%s)(Rtstrtsystmaxint(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_min_intzscCsR|jd�|jd�|jd�|jd�|jd�|jd�dS(Nt7js-7js-(7j)t0js-0js-(0j)(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_imaginary_literals~s




cCsl|jd�|jd�|jd�|jd�|jd�|jd�|jd�|jd�dS(	Ns-0s-(0)s-0b0s-(0b0)s-0o0s-(0o0)s-0x0s-(0x0)(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_negative_zero�s






cCs|jd�dS(Ns(lambda: int)()(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_lambda_parentheses�scCs|jd�|jd�dS(Ns
1 < 4 <= 5sa is b is c is not d(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_chained_comparisons�s
cCs_|jd�|jd�|jd�|jd�|jd�|jd�|jd�dS(Ns
def f(): passsdef f(a): passsdef f(b = 2): passsdef f(a, b): passsdef f(a, b = 2): passsdef f(a = 5, b = 2): passsdef f(*args, **kwargs): pass(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_function_arguments�s





cCs|jt�dS(N(Rtrelative_import(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_relative_import�scCs|jd�dS(Nsb'123'(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_bytes�scCs|jd�dS(Ns{'a', 'b', 'c'}(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_literal�scCs|jd�dS(Ns{x for x in range(5)}(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_set_comprehension�scCs|jd�dS(Ns{x: x*x for x in range(10)}(R(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_dict_comprehension�scCs|jt�dS(N(Rtclass_decorator(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_class_decorators�scCs|jt�|jt�dS(N(Rtelif1telif2(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_elifs�s
cCs|jt�dS(N(Rttry_except_finally(R((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyttest_try_except_finally�s(RR R"R#R%R'R(R)R,R0R3R4R5R6R7R9R:R;R<R=R?RBRD(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyR!Zs*										
											tDirectoryTestCasecBs2eZdZdejjdd�fZd�ZRS(s:Test roundtrip behaviour on all files in Lib and Lib/test.tLibttestcCs�tjjtjjt�tjtj�}g}x~|jD]s}tjj||�}xUtj|�D]D}|jd�re|j	d�re|j
tjj||��qeqeWq:Wx<|D]4}tjr�d|GHnt
|�}|j|�q�WdS(Ns.pytbads
Testing %s(tostpathtjointdirnamet__file__tpardirttest_directoriestlistdirtendswitht
startswithtappendRtverboseRR(Rtdist_dirtnamestdttest_dirtnRR((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt
test_files�s*'
	(RR t__doc__RIRJRKRORZ(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyRE�scCstjtt�dS(N(Rtrun_unittestR!RE(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt	test_main�st__main__(tunittestRGRRR.RIttokenizeR	RRR$R&R8R>R@RARCtTestCaseRR!RER]R(((s0/usr/lib64/python2.7/Demo/parser/test_unparse.pyt<module>s*			
_	unparse.py000064400000041552150374071010006600 0ustar00"Usage: unparse.py <path to source file>"
import sys
import ast
import cStringIO
import os

# Large float and imaginary literals get turned into infinities in the AST.
# We unparse those infinities to INFSTR.
INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)

def interleave(inter, f, seq):
    """Call f on each item in seq, calling inter() in between.
    """
    seq = iter(seq)
    try:
        f(next(seq))
    except StopIteration:
        pass
    else:
        for x in seq:
            inter()
            f(x)

class Unparser:
    """Methods in this class recursively traverse an AST and
    output source code for the abstract syntax; original formatting
    is disregarded. """

    def __init__(self, tree, file = sys.stdout):
        """Unparser(tree, file=sys.stdout) -> None.
         Print the source for tree to file."""
        self.f = file
        self.future_imports = []
        self._indent = 0
        self.dispatch(tree)
        self.f.write("")
        self.f.flush()

    def fill(self, text = ""):
        "Indent a piece of text, according to the current indentation level"
        self.f.write("\n"+"    "*self._indent + text)

    def write(self, text):
        "Append a piece of text to the current line."
        self.f.write(text)

    def enter(self):
        "Print ':', and increase the indentation."
        self.write(":")
        self._indent += 1

    def leave(self):
        "Decrease the indentation level."
        self._indent -= 1

    def dispatch(self, tree):
        "Dispatcher function, dispatching tree type T to method _T."
        if isinstance(tree, list):
            for t in tree:
                self.dispatch(t)
            return
        meth = getattr(self, "_"+tree.__class__.__name__)
        meth(tree)


    ############### Unparsing methods ######################
    # There should be one method per concrete grammar type #
    # Constructors should be grouped by sum type. Ideally, #
    # this would follow the order in the grammar, but      #
    # currently doesn't.                                   #
    ########################################################

    def _Module(self, tree):
        for stmt in tree.body:
            self.dispatch(stmt)

    # stmt
    def _Expr(self, tree):
        self.fill()
        self.dispatch(tree.value)

    def _Import(self, t):
        self.fill("import ")
        interleave(lambda: self.write(", "), self.dispatch, t.names)

    def _ImportFrom(self, t):
        # A from __future__ import may affect unparsing, so record it.
        if t.module and t.module == '__future__':
            self.future_imports.extend(n.name for n in t.names)

        self.fill("from ")
        self.write("." * t.level)
        if t.module:
            self.write(t.module)
        self.write(" import ")
        interleave(lambda: self.write(", "), self.dispatch, t.names)

    def _Assign(self, t):
        self.fill()
        for target in t.targets:
            self.dispatch(target)
            self.write(" = ")
        self.dispatch(t.value)

    def _AugAssign(self, t):
        self.fill()
        self.dispatch(t.target)
        self.write(" "+self.binop[t.op.__class__.__name__]+"= ")
        self.dispatch(t.value)

    def _Return(self, t):
        self.fill("return")
        if t.value:
            self.write(" ")
            self.dispatch(t.value)

    def _Pass(self, t):
        self.fill("pass")

    def _Break(self, t):
        self.fill("break")

    def _Continue(self, t):
        self.fill("continue")

    def _Delete(self, t):
        self.fill("del ")
        interleave(lambda: self.write(", "), self.dispatch, t.targets)

    def _Assert(self, t):
        self.fill("assert ")
        self.dispatch(t.test)
        if t.msg:
            self.write(", ")
            self.dispatch(t.msg)

    def _Exec(self, t):
        self.fill("exec ")
        self.dispatch(t.body)
        if t.globals:
            self.write(" in ")
            self.dispatch(t.globals)
        if t.locals:
            self.write(", ")
            self.dispatch(t.locals)

    def _Print(self, t):
        self.fill("print ")
        do_comma = False
        if t.dest:
            self.write(">>")
            self.dispatch(t.dest)
            do_comma = True
        for e in t.values:
            if do_comma:self.write(", ")
            else:do_comma=True
            self.dispatch(e)
        if not t.nl:
            self.write(",")

    def _Global(self, t):
        self.fill("global ")
        interleave(lambda: self.write(", "), self.write, t.names)

    def _Yield(self, t):
        self.write("(")
        self.write("yield")
        if t.value:
            self.write(" ")
            self.dispatch(t.value)
        self.write(")")

    def _Raise(self, t):
        self.fill('raise ')
        if t.type:
            self.dispatch(t.type)
        if t.inst:
            self.write(", ")
            self.dispatch(t.inst)
        if t.tback:
            self.write(", ")
            self.dispatch(t.tback)

    def _TryExcept(self, t):
        self.fill("try")
        self.enter()
        self.dispatch(t.body)
        self.leave()

        for ex in t.handlers:
            self.dispatch(ex)
        if t.orelse:
            self.fill("else")
            self.enter()
            self.dispatch(t.orelse)
            self.leave()

    def _TryFinally(self, t):
        if len(t.body) == 1 and isinstance(t.body[0], ast.TryExcept):
            # try-except-finally
            self.dispatch(t.body)
        else:
            self.fill("try")
            self.enter()
            self.dispatch(t.body)
            self.leave()

        self.fill("finally")
        self.enter()
        self.dispatch(t.finalbody)
        self.leave()

    def _ExceptHandler(self, t):
        self.fill("except")
        if t.type:
            self.write(" ")
            self.dispatch(t.type)
        if t.name:
            self.write(" as ")
            self.dispatch(t.name)
        self.enter()
        self.dispatch(t.body)
        self.leave()

    def _ClassDef(self, t):
        self.write("\n")
        for deco in t.decorator_list:
            self.fill("@")
            self.dispatch(deco)
        self.fill("class "+t.name)
        if t.bases:
            self.write("(")
            for a in t.bases:
                self.dispatch(a)
                self.write(", ")
            self.write(")")
        self.enter()
        self.dispatch(t.body)
        self.leave()

    def _FunctionDef(self, t):
        self.write("\n")
        for deco in t.decorator_list:
            self.fill("@")
            self.dispatch(deco)
        self.fill("def "+t.name + "(")
        self.dispatch(t.args)
        self.write(")")
        self.enter()
        self.dispatch(t.body)
        self.leave()

    def _For(self, t):
        self.fill("for ")
        self.dispatch(t.target)
        self.write(" in ")
        self.dispatch(t.iter)
        self.enter()
        self.dispatch(t.body)
        self.leave()
        if t.orelse:
            self.fill("else")
            self.enter()
            self.dispatch(t.orelse)
            self.leave()

    def _If(self, t):
        self.fill("if ")
        self.dispatch(t.test)
        self.enter()
        self.dispatch(t.body)
        self.leave()
        # collapse nested ifs into equivalent elifs.
        while (t.orelse and len(t.orelse) == 1 and
               isinstance(t.orelse[0], ast.If)):
            t = t.orelse[0]
            self.fill("elif ")
            self.dispatch(t.test)
            self.enter()
            self.dispatch(t.body)
            self.leave()
        # final else
        if t.orelse:
            self.fill("else")
            self.enter()
            self.dispatch(t.orelse)
            self.leave()

    def _While(self, t):
        self.fill("while ")
        self.dispatch(t.test)
        self.enter()
        self.dispatch(t.body)
        self.leave()
        if t.orelse:
            self.fill("else")
            self.enter()
            self.dispatch(t.orelse)
            self.leave()

    def _With(self, t):
        self.fill("with ")
        self.dispatch(t.context_expr)
        if t.optional_vars:
            self.write(" as ")
            self.dispatch(t.optional_vars)
        self.enter()
        self.dispatch(t.body)
        self.leave()

    # expr
    def _Str(self, tree):
        # if from __future__ import unicode_literals is in effect,
        # then we want to output string literals using a 'b' prefix
        # and unicode literals with no prefix.
        if "unicode_literals" not in self.future_imports:
            self.write(repr(tree.s))
        elif isinstance(tree.s, str):
            self.write("b" + repr(tree.s))
        elif isinstance(tree.s, unicode):
            self.write(repr(tree.s).lstrip("u"))
        else:
            assert False, "shouldn't get here"

    def _Name(self, t):
        self.write(t.id)

    def _Repr(self, t):
        self.write("`")
        self.dispatch(t.value)
        self.write("`")

    def _Num(self, t):
        repr_n = repr(t.n)
        # Parenthesize negative numbers, to avoid turning (-1)**2 into -1**2.
        if repr_n.startswith("-"):
            self.write("(")
        # Substitute overflowing decimal literal for AST infinities.
        self.write(repr_n.replace("inf", INFSTR))
        if repr_n.startswith("-"):
            self.write(")")

    def _List(self, t):
        self.write("[")
        interleave(lambda: self.write(", "), self.dispatch, t.elts)
        self.write("]")

    def _ListComp(self, t):
        self.write("[")
        self.dispatch(t.elt)
        for gen in t.generators:
            self.dispatch(gen)
        self.write("]")

    def _GeneratorExp(self, t):
        self.write("(")
        self.dispatch(t.elt)
        for gen in t.generators:
            self.dispatch(gen)
        self.write(")")

    def _SetComp(self, t):
        self.write("{")
        self.dispatch(t.elt)
        for gen in t.generators:
            self.dispatch(gen)
        self.write("}")

    def _DictComp(self, t):
        self.write("{")
        self.dispatch(t.key)
        self.write(": ")
        self.dispatch(t.value)
        for gen in t.generators:
            self.dispatch(gen)
        self.write("}")

    def _comprehension(self, t):
        self.write(" for ")
        self.dispatch(t.target)
        self.write(" in ")
        self.dispatch(t.iter)
        for if_clause in t.ifs:
            self.write(" if ")
            self.dispatch(if_clause)

    def _IfExp(self, t):
        self.write("(")
        self.dispatch(t.body)
        self.write(" if ")
        self.dispatch(t.test)
        self.write(" else ")
        self.dispatch(t.orelse)
        self.write(")")

    def _Set(self, t):
        assert(t.elts) # should be at least one element
        self.write("{")
        interleave(lambda: self.write(", "), self.dispatch, t.elts)
        self.write("}")

    def _Dict(self, t):
        self.write("{")
        def write_pair(pair):
            (k, v) = pair
            self.dispatch(k)
            self.write(": ")
            self.dispatch(v)
        interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values))
        self.write("}")

    def _Tuple(self, t):
        self.write("(")
        if len(t.elts) == 1:
            (elt,) = t.elts
            self.dispatch(elt)
            self.write(",")
        else:
            interleave(lambda: self.write(", "), self.dispatch, t.elts)
        self.write(")")

    unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"}
    def _UnaryOp(self, t):
        self.write("(")
        self.write(self.unop[t.op.__class__.__name__])
        self.write(" ")
        # If we're applying unary minus to a number, parenthesize the number.
        # This is necessary: -2147483648 is different from -(2147483648) on
        # a 32-bit machine (the first is an int, the second a long), and
        # -7j is different from -(7j).  (The first has real part 0.0, the second
        # has real part -0.0.)
        if isinstance(t.op, ast.USub) and isinstance(t.operand, ast.Num):
            self.write("(")
            self.dispatch(t.operand)
            self.write(")")
        else:
            self.dispatch(t.operand)
        self.write(")")

    binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%",
                    "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&",
                    "FloorDiv":"//", "Pow": "**"}
    def _BinOp(self, t):
        self.write("(")
        self.dispatch(t.left)
        self.write(" " + self.binop[t.op.__class__.__name__] + " ")
        self.dispatch(t.right)
        self.write(")")

    cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=",
                        "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"}
    def _Compare(self, t):
        self.write("(")
        self.dispatch(t.left)
        for o, e in zip(t.ops, t.comparators):
            self.write(" " + self.cmpops[o.__class__.__name__] + " ")
            self.dispatch(e)
        self.write(")")

    boolops = {ast.And: 'and', ast.Or: 'or'}
    def _BoolOp(self, t):
        self.write("(")
        s = " %s " % self.boolops[t.op.__class__]
        interleave(lambda: self.write(s), self.dispatch, t.values)
        self.write(")")

    def _Attribute(self,t):
        self.dispatch(t.value)
        # Special case: 3.__abs__() is a syntax error, so if t.value
        # is an integer literal then we need to either parenthesize
        # it or add an extra space to get 3 .__abs__().
        if isinstance(t.value, ast.Num) and isinstance(t.value.n, int):
            self.write(" ")
        self.write(".")
        self.write(t.attr)

    def _Call(self, t):
        self.dispatch(t.func)
        self.write("(")
        comma = False
        for e in t.args:
            if comma: self.write(", ")
            else: comma = True
            self.dispatch(e)
        for e in t.keywords:
            if comma: self.write(", ")
            else: comma = True
            self.dispatch(e)
        if t.starargs:
            if comma: self.write(", ")
            else: comma = True
            self.write("*")
            self.dispatch(t.starargs)
        if t.kwargs:
            if comma: self.write(", ")
            else: comma = True
            self.write("**")
            self.dispatch(t.kwargs)
        self.write(")")

    def _Subscript(self, t):
        self.dispatch(t.value)
        self.write("[")
        self.dispatch(t.slice)
        self.write("]")

    # slice
    def _Ellipsis(self, t):
        self.write("...")

    def _Index(self, t):
        self.dispatch(t.value)

    def _Slice(self, t):
        if t.lower:
            self.dispatch(t.lower)
        self.write(":")
        if t.upper:
            self.dispatch(t.upper)
        if t.step:
            self.write(":")
            self.dispatch(t.step)

    def _ExtSlice(self, t):
        interleave(lambda: self.write(', '), self.dispatch, t.dims)

    # others
    def _arguments(self, t):
        first = True
        # normal arguments
        defaults = [None] * (len(t.args) - len(t.defaults)) + t.defaults
        for a,d in zip(t.args, defaults):
            if first:first = False
            else: self.write(", ")
            self.dispatch(a),
            if d:
                self.write("=")
                self.dispatch(d)

        # varargs
        if t.vararg:
            if first:first = False
            else: self.write(", ")
            self.write("*")
            self.write(t.vararg)

        # kwargs
        if t.kwarg:
            if first:first = False
            else: self.write(", ")
            self.write("**"+t.kwarg)

    def _keyword(self, t):
        self.write(t.arg)
        self.write("=")
        self.dispatch(t.value)

    def _Lambda(self, t):
        self.write("(")
        self.write("lambda ")
        self.dispatch(t.args)
        self.write(": ")
        self.dispatch(t.body)
        self.write(")")

    def _alias(self, t):
        self.write(t.name)
        if t.asname:
            self.write(" as "+t.asname)

def roundtrip(filename, output=sys.stdout):
    with open(filename, "r") as pyfile:
        source = pyfile.read()
    tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST)
    Unparser(tree, output)



def testdir(a):
    try:
        names = [n for n in os.listdir(a) if n.endswith('.py')]
    except OSError:
        sys.stderr.write("Directory not readable: %s" % a)
    else:
        for n in names:
            fullname = os.path.join(a, n)
            if os.path.isfile(fullname):
                output = cStringIO.StringIO()
                print 'Testing %s' % fullname
                try:
                    roundtrip(fullname, output)
                except Exception as e:
                    print '  Failed to compile, exception is %s' % repr(e)
            elif os.path.isdir(fullname):
                testdir(fullname)

def main(args):
    if args[0] == '--testdir':
        for a in args[1:]:
            testdir(a)
    else:
        for a in args:
            roundtrip(a)

if __name__=='__main__':
    main(sys.argv[1:])