o
    Š�bcN.  ã                   @   s€   d Z ddlmZmZ ddlZddlZddlZddlZddlZddl	Z	ddl
mZ dd„ ZG dd	„ d	ejƒZd
d„ Zddd„ZdS )z
Main program for 2to3.
é    )Úwith_statementÚprint_functionNé   )Úrefactorc              	   C   s(   |   ¡ } |  ¡ }tj| |||dddd�S )z%Return a unified diff of two strings.z
(original)z(refactored)Ú )Úlineterm)Ú
splitlinesÚdifflibÚunified_diff)ÚaÚbÚfilename© r   ú#/usr/lib/python3.10/lib2to3/main.pyÚ
diff_texts   s   þr   c                       s@   e Zd ZdZ	d‡ fdd„	Zdd„ Z‡ fdd„Zd	d
„ Z‡  ZS )ÚStdoutRefactoringToola2  
    A refactoring tool that can avoid overwriting its input files.
    Prints output to stdout.

    Output files can optionally be written to a different directory and or
    have an extra file suffix appended to their name for use in situations
    where you do not want to replace the input files.
    r   c	           	         sP   || _ || _|r| tj¡s|tj7 }|| _|| _|| _tt	| ƒ 
|||¡ dS )aF  
        Args:
            fixers: A list of fixers to import.
            options: A dict with RefactoringTool configuration.
            explicit: A list of fixers to run even if they are explicit.
            nobackups: If true no backup '.bak' files will be created for those
                files that are being refactored.
            show_diffs: Should diffs of the refactoring be printed to stdout?
            input_base_dir: The base directory for all input files.  This class
                will strip this path prefix off of filenames before substituting
                it with output_dir.  Only meaningful if output_dir is supplied.
                All files processed by refactor() must start with this path.
            output_dir: If supplied, all converted files will be written into
                this directory tree instead of input_base_dir.
            append_suffix: If supplied, all files output by this tool will have
                this appended to their filename.  Useful for changing .py to
                .py3 for example by passing append_suffix='3'.
        N)Ú	nobackupsÚ
show_diffsÚendswithÚosÚsepÚ_input_base_dirÚ_output_dirÚ_append_suffixÚsuperr   Ú__init__)	ÚselfÚfixersÚoptionsÚexplicitr   r   Úinput_base_dirÚ
output_dirÚappend_suffix©Ú	__class__r   r   r   $   s   
zStdoutRefactoringTool.__init__c                 O   s0   | j  |||f¡ | jj|g|¢R i |¤Ž d S ©N)ÚerrorsÚappendÚloggerÚerror)r   ÚmsgÚargsÚkwargsr   r   r   Ú	log_errorA   s   zStdoutRefactoringTool.log_errorc           	         sV  |}| j r$| | j¡rtj | j |t| jƒd … ¡}n	td|| jf ƒ‚| jr,|| j7 }||krJtj 	|¡}tj 
|¡sC|rCt |¡ |  d||¡ | js‡|d }tj |¡rnzt |¡ W n tym   |  d|¡ Y nw zt ||¡ W n ty†   |  d||¡ Y nw tt| ƒj}|||||ƒ | js�t ||¡ ||kr©t ||¡ d S d S )Nz5filename %s does not start with the input_base_dir %szWriting converted %s to %s.z.bakzCan't remove backup %szCan't rename %s to %s)r   Ú
startswithr   r   ÚpathÚjoinÚlenÚ
ValueErrorr   ÚdirnameÚisdirÚmakedirsÚlog_messager   ÚlexistsÚremoveÚOSErrorÚrenamer   r   Ú
write_fileÚshutilÚcopymode)	r   Únew_textr   Úold_textÚencodingÚorig_filenamer!   ÚbackupÚwriter#   r   r   r;   E   sN   
ÿÿÿ

ÿÿÿþz StdoutRefactoringTool.write_filec                 C   sÊ   |r
|   d|¡ d S |   d|¡ | jrct|||ƒ}z8| jd urF| j� |D ]}t|ƒ q%tj ¡  W d   ƒ n1 s;w   Y  W d S W d S |D ]}t|ƒ qHW d S  tyb   t	d|f ƒ Y d S w d S )NzNo changes to %szRefactored %sz+couldn't encode %s's diff for your terminal)
r6   r   r   Úoutput_lockÚprintÚsysÚstdoutÚflushÚUnicodeEncodeErrorÚwarn)r   ÚoldÚnewr   ÚequalÚ
diff_linesÚliner   r   r   Úprint_outputl   s,   

(ý
ÿÿýõz"StdoutRefactoringTool.print_output)r   r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r-   r;   rP   Ú__classcell__r   r   r#   r   r      s    
ÿ'r   c                 C   s   t d| f tjd� d S )NzWARNING: %s©Úfile)rE   rF   Ústderr)r*   r   r   r   rJ   �   s   rJ   c              
      s  t jdd�}|jddddd� |jdd	d
g dd� |jddddddd� |jddd
g dd� |jddddd� |jddddd� |jddddd� |jd d!dd"d� |jd#dd$d� |jd%d&dd'd� |jd(d)dd*d+d� |jd,d-dd.d/d0d1� |jd2d3dd4d� |jd5dd.d/d6d1� d*}i }| |¡\}}|jr§d7|d8< |js¤td9ƒ d7|_|jr²|js²| 	d:¡ |j
r½|js½| 	d;¡ |jsÇ|jrÇtd<ƒ |jsÒ|jrÒ| 	d=¡ |jrétd>ƒ t ˆ ¡D ]}t|ƒ qÞ|séd?S |sûtd@tjdA� tdBtjdA� dCS dD|v �rd7}|j�rtdEtjdA� dCS |j�rd7|dF< |j�rd7|dG< |j�r&tjntj}tjdH|dI� t dJ¡}tt ˆ ¡ƒ}	t‡ fdKdL„|jD ƒƒ}
tƒ }|j�rud*}|jD ]}|dMk�r_d7}�qT| ˆ dN | ¡ �qT|�rr|	 |¡n|}n|	 |¡}|  |
¡}t!j" #|¡}|�rœ| $t!j%¡�sœt!j" &|¡�sœt!j" '|¡}|j�r®| (t!j%¡}| )dO|j|¡ t*t+|ƒ|t+|ƒ|j|j ||j|j
dP�}|j,�sü|�rÏ| -¡  n)z| ||j|j.|j/¡ W n tj0�y÷   |j/dk�síJ ‚tdQtjdA� Y dS w | 1¡  t2t3|j,ƒƒS )RzþMain program.

    Args:
        fixer_pkg: the name of a package where the fixers are located.
        args: optional; a list of command line arguments. If omitted,
              sys.argv[1:] is used.

    Returns a suggested exit status (0, 1, 2).
    z2to3 [options] file|dir ...)Úusagez-dz--doctests_onlyÚ
store_truezFix up doctests only)ÚactionÚhelpz-fz--fixr'   z1Each FIX specifies a transformation; default: all)r[   Údefaultr\   z-jz--processesÚstorer   ÚintzRun 2to3 concurrently)r[   r]   Útyper\   z-xz--nofixz'Prevent a transformation from being runz-lz--list-fixeszList available transformationsz-pz--print-functionz0Modify the grammar so that print() is a functionz-ez--exec-functionz/Modify the grammar so that exec() is a functionz-vz	--verbosezMore verbose loggingz
--no-diffsz#Don't show diffs of the refactoringz-wz--writezWrite back modified filesz-nz--nobackupsFz&Don't write backups for modified filesz-oz--output-dirÚstrr   zXPut output files in this directory instead of overwriting the input files.  Requires -n.)r[   r`   r]   r\   z-Wz--write-unchanged-fileszYAlso write files even if no changes were required (useful with --output-dir); implies -w.z--add-suffixzuAppend this string to all output filenames. Requires -n if non-empty.  ex: --add-suffix='3' will generate .py3 files.TÚwrite_unchanged_filesz&--write-unchanged-files/-W implies -w.z%Can't use --output-dir/-o without -n.z"Can't use --add-suffix without -n.z@not writing files and not printing diffs; that's not very usefulzCan't use -n without -wz2Available transformations for the -f/--fix option:r   z1At least one file or directory argument required.rV   zUse --help to show usage.é   ú-zCan't write to stdin.r   Úexec_functionz%(name)s: %(message)s)ÚformatÚlevelzlib2to3.mainc                 3   s   � | ]	}ˆ d  | V  qdS )ú.fix_Nr   )Ú.0Úfix©Ú	fixer_pkgr   r   Ú	<genexpr>â   s   € zmain.<locals>.<genexpr>Úallrh   z7Output in %r will mirror the input directory %r layout.)r    r!   r"   z+Sorry, -j isn't supported on this platform.)4ÚoptparseÚOptionParserÚ
add_optionÚ
parse_argsrb   rC   rJ   r!   r   r)   Ú
add_suffixÚno_diffsÚ
list_fixesrE   r   Úget_all_fix_namesrF   rX   r   re   ÚverboseÚloggingÚDEBUGÚINFOÚbasicConfigÚ	getLoggerÚsetÚget_fixers_from_packageÚnofixrj   ÚaddÚunionÚ
differencer   r/   Úcommonprefixr   r   r4   r3   ÚrstripÚinfor   Úsortedr&   Úrefactor_stdinÚdoctests_onlyÚ	processesÚMultiprocessingUnsupportedÚ	summarizer_   Úbool)rl   r+   Úparserr‡   Úflagsr   Úfixnamerg   r(   Úavail_fixesÚunwanted_fixesr   Úall_presentrj   Ú	requestedÚfixer_namesr    Úrtr   rk   r   Úmain…   sü   
ÿÿÿÿ
ÿ
ÿ
ÿ
ÿÿ
ÿÿÿ
ÿÿ










ÿÿ
û
ÿÿür–   r%   )rT   Ú
__future__r   r   rF   r   r	   rx   r<   ro   r   r   r   ÚMultiprocessRefactoringToolr   rJ   r–   r   r   r   r   Ú<module>   s    	g