a
    IfN.                     @   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) )Zlineterm)
splitlinesdifflibZunified_diff)abfilename r   lib/python3.9/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__)	selfZ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           	         sZ  |}| j rH|| jr6tj| j |t| jd  }ntd|| jf | jrX|| j7 }||krtj	|}tj
|s|rt| | d|| | js|d }tj|rzt| W n ty   | d| Y n0 zt|| W n" ty   | d|| Y n0 tt| j}||||| | js@t|| ||krVt|| 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shutilZcopymode)	r   Znew_textr   Zold_textencodingZorig_filenamer   Zbackupwriter    r   r   r7   E   sH    



z StdoutRefactoringTool.write_filec                 C   s   |r|  d| n|  d| | jrt|||}zd| jd ur| j, |D ]}t| qHtj  W d    q1 st0    Y  n|D ]}t| qW n" ty   t	d|f  Y d S 0 d S )NzNo changes to %szRefactored %sz+couldn't encode %s's diff for your terminal)
r2   r   r   Zoutput_lockprintsysstdoutflushUnicodeEncodeErrorwarn)r   oldnewr   ZequalZ
diff_linesliner   r   r   print_outputl   s$    

*z"StdoutRefactoringTool.print_output)r   r   r   )	__name__
__module____qualname____doc__r   r)   r7   rD   __classcell__r   r   r    r   r      s   
 'r   c                 C   s   t d| f tjd d S )NzWARNING: %sfile)r;   r<   stderr)r&   r   r   r   r@      s    r@   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rRd7|d8< |jsLtd9 d7|_|jrl|jsl|	d: |j
r|js|	d; |js|jrtd< |js|jr|	d= |jrtd> t D ]}t| q|sd?S |std@tjdA tdBtjdA dCS dD|v r:d7}|jr:tdEtjdA dCS |jrJd7|dF< |jrZd7|dG< |jrhtjntj}tjdH|dI tdJ}tt }	t fdKdL|jD }
t }|jrd*}|jD ](}|dMkrd7}n| dN |  q|r|	|n|}n
|	|}| |
}t!j"#|}|rR|$t!j%sRt!j"&|sRt!j"'|}|jrv|(t!j%}|)dO|j| t*t+||t+||j|j ||j|j
dP}|j,s|r|-  nRz|||j|j.|j/ W n6 tj0y   |j/dksJ tdQtjdA Y dS 0 |1  t2t3|j,S )RzMain 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 ...)Zusagez-dz--doctests_only
store_truezFix up doctests only)actionhelpz-fz--fixr#   z1Each FIX specifies a transformation; default: all)rN   defaultrO   z-jz--processesZstorer   intzRun 2to3 concurrently)rN   rP   typerO   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.)rN   rR   rP   rO   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.rJ   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>       zmain.<locals>.<genexpr>allrZ   z7Output in %r will mirror the input directory %r layout.)r   r   r   z+Sorry, -j isn't supported on this platform.)4optparseZOptionParserZ
add_option
parse_argsrT   r:   r@   r   r   r%   Z
add_suffixZno_diffsZ
list_fixesr;   r   Zget_all_fix_namesr<   rL   r   rW   verboseloggingDEBUGINFOZbasicConfigZ	getLoggersetZget_fixers_from_packageZnofixr\   addunion
differencer   r+   commonprefixr   r   r0   r/   rstripinfor   sortedr"   refactor_stdinZdoctests_onlyZ	processesZMultiprocessingUnsupportedZ	summarizerQ   bool)r^   r'   parserrp   flagsr   ZfixnamerY   r$   Zavail_fixesZunwanted_fixesr   Zall_presentr\   Z	requestedZfixer_namesr   Zrtr   r]   r   main   s    


















rt   )N)rH   Z
__future__r   r   r<   r   r   re   r8   rb   r   r   r   ZMultiprocessRefactoringToolr   r@   rt   r   r   r   r   <module>   s   	g