U if- @ s d Z ddlmZmZ ddlZddlZddlZddlZddlZddl Z ddl mZ dd ZG dd d ej Zd d Zddd ZdS )z Main program for 2to3. )with_statementprint_functionN )refactorc C s( | } | }tj| |||ddddS )z%Return a unified diff of two strings.z (original)z(refactored) )Zlineterm) splitlinesdifflibZunified_diff)abfilename r 1/opt/alt/python38/lib64/python3.8/lib2to3/main.py diff_texts s r c s> e Zd ZdZd fdd Zdd Z fddZd d Z ZS )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&|tjs&|tj7 }|| _|| _|| _tt | ||| dS )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_diffsendswithossep_input_base_dir_output_dir_append_suffixsuperr __init__) selfZfixersoptionsexplicitr r input_base_dir output_dir append_suffix __class__r r r $ s zStdoutRefactoringTool.__init__c O s* | j |||f | jj|f|| d S )N)errorsappendloggererror)r msgargskwargsr r r log_errorA s zStdoutRefactoringTool.log_errorc sz |}| j rH|| jr6tj| j |t| jd }ntd|| jf | jrX|| j7 }||krtj |}tj |s|rt| | d|| | j s2|d }tj|rzt| W n. tk r } z| d| W 5 d }~X Y nX zt|| W n2 tk r0 } z| d|| W 5 d }~X Y nX tt| j} | |||| | j s`t|| ||krvt|| d S )Nz5filename %s does not start with the input_base_dir %szWriting converted %s to %s.z.bakzCan't remove backup %szCan't rename %s to %s)r startswithr r pathjoinlen ValueErrorr dirnameisdirmakedirslog_messager lexistsremoveOSErrorrenamer r write_fileshutilZcopymode) r Znew_textr Zold_textencodingZ orig_filenamer Zbackuperrwriter r r r7 E sJ z StdoutRefactoringTool.write_filec C s |r| d| n| d| | jrt|||}zP| jd k rl| j" |D ]}t| qHtj W 5 Q R X n|D ]}t| qpW n$ tk r t d|f Y d S X d S )NzNo changes to %sz Refactored %sz+couldn't encode %s's diff for your terminal) r2 r r Zoutput_lockprintsysstdoutflushUnicodeEncodeErrorwarn)r oldnewr ZequalZ diff_linesliner r r print_outputl s$ z"StdoutRefactoringTool.print_output)r r r ) __name__ __module____qualname____doc__r r) r7 rE __classcell__r r r r r s 'r c C s t d| f tjd d S )NzWARNING: %sfile)r<