a XC?hN. � @ s� d Z ddlmZmZ ddlZddlZddlZddlZddlZddl Z ddl mZ dd� ZG dd � d ej �Zd d� Zddd �ZdS )z Main program for 2to3. � )�with_statement�print_functionN� )�refactorc C s( | � � } |� � }tj| |||dddd�S )z%Return a unified diff of two strings.z (original)z(refactored)� )Zlineterm)� splitlines�difflibZunified_diff)�a�b�filename� r �1/opt/alt/python39/lib64/python3.9/lib2to3/main.py� diff_texts s �r c s> e Zd ZdZd� fdd� Zdd� Z� fdd�Zd 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&|�tj�s&|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_diffs�endswith�os�sep�_input_base_dir�_output_dir�_append_suffix�superr �__init__) �selfZfixers�options�explicitr r �input_base_dir� output_dir� append_suffix�� __class__r r r $ s zStdoutRefactoringTool.__init__c O s0 | j �|||f� | jj|g|�R i |�� d S )N)�errors�append�logger�error)r �msg�args�kwargsr r r � log_errorA s zStdoutRefactoringTool.log_errorc sZ |}| j rH|�| j�r6tj�| j |t| j�d � �}ntd|| jf ��| jrX|| j7 }||kr�tj� |�}tj� |�s�|r�t�|� | �d||� | j �s|d }tj�|�r�zt�|� W n ty� | �d|� Y n0 zt�||� W n" t�y | �d||� Y n0 tt| �j}|||||� | j �s@t�||� ||k�rVt�||� 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 �path�join�len� ValueErrorr �dirname�isdir�makedirs�log_messager �lexists�remove�OSError�renamer r � write_file�shutilZcopymode) r Znew_textr Zold_text�encodingZ orig_filenamer Zbackup�writer r r r7 E sH ��� � z StdoutRefactoringTool.write_filec C s� |r| � d|� n�| � d|� | jr�t|||�}zd| jd ur�| j�, |D ]}t|� qHtj�� W d � q�1 st0 Y n|D ]}t|� q�W n" ty� t d|f � Y d S 0 d S )NzNo changes to %sz Refactored %sz+couldn't encode %s's diff for your terminal) r2 r r Zoutput_lock�print�sys�stdout�flush�UnicodeEncodeError�warn)r �old�newr ZequalZ 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 tjd� d S )NzWARNING: %s��file)r; r<