
-c`v-                 @   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 Gd 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:   |  j    }  | j    } 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   "/usr/lib/python3.5/lib2to3/main.py
diff_texts   s
    	r   c                   s[   e  Z d  Z d Z d d d   f d d  Z d d   Z   f d d   Z d	 d
   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	       	         ss   | |  _  | |  _ | r8 | j t j  r8 | t j 7} | |  _ | |  _ | |  _ t t	 |   j
 | | |  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   s3   |  j  j | | | f  |  j j | | |  d  S)N)errorsappendloggererror)r   msgargskwargsr   r   r   	log_errorA   s    zStdoutRefactoringTool.log_errorc       
   !      s  | } |  j  rh | j |  j  rO t j j |  j  | t |  j  d    } n t d | |  j f   |  j r~ | |  j 7} | | k r t j j	 |  } t j j
 |  s t j |  |  j d | |  |  j s| d } t j j |  r<y t j |  Wn5 t k
 r;} z |  j d |  WYd  d  } ~ Xn Xy t j | |  Wn8 t k
 r} z |  j d | |  WYd  d  } ~ Xn Xt t |   j }	 |	 | | | |  |  j st j | |  | | k rt j | |  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errwrite)r    r   r   r6   E   s@    			
#&	z StdoutRefactoringTool.write_filec             C   s   | r |  j  d |  n |  j  d |  |  j r t | | |  } yj |  j d  k	 r |  j - x | D] } t |  qg Wt j j   Wd  QRXn x | D] } t |  q WWn' t k
 r t	 d | f  d  SYn Xd  S)NzNo changes to %szRefactored %sz+couldn't encode %s's diff for your terminal)
r1   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)__name__
__module____qualname____doc__r   r(   r6   rD   r   r   )r    r   r      s
   'r   c             C   s   t  d |  f d t j 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 d | j d	 d
 d d d g  d d | j d d d d d d d d d d | j d d d d d g  d d | j d d d d d d | j d d d d d d | j d d d d d d  | j d! d d d d" | j d# d$ d d d d% | j d& d' d d d d( d d) | j d* d+ d d d d, d d- d d. | j d/ d0 d d d d1 | j d2 d d d d, d d- d d3 d( } i  } | j |  \ } } | j rd4 | d5 <| j st d6  d4 | _ | j r| j r| j	 d7  | j
 r>| j r>| j	 d8  | j r[| j r[t d9  | j r{| j r{| j	 d:  | j rt d;  x! t j    D] } t |  qW| sd< S| st d= d> t j t d? d> t j d@ SdA | k rd4 } | j rt dB d> t j d@ S| j r1d4 | dC <| j rCt j n t j } t j dD dE dF |  t j dG  } t t j     }	 t   f dH dI   | j D  }
 t   } | j rd( } x; | j D]0 } | dJ k rd4 } q| j   dK |  qW| r|	 j |  n | } n |	 j |  } | j |
  } t  j! j" |  } | r| j# t  j$  rt  j! j% |  rt  j! j& |  } | j r| j' t  j$  } | j( dL | j |  t) t* |  | t* |  | j | j dM | dN | j dO | j
 } | j+ s| r| j,   ng y# | j | | j | j- | j.  WnA t j/ k
 r| j. d k set0  t dP d> t j d SYn X| j1   t2 t3 | j+   S)QzMain 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usagez2to3 [options] file|dir ...z-dz--doctests_onlyaction
store_truehelpzFix up doctests onlyz-fz--fixr"   defaultz1Each FIX specifies a transformation; default: allz-jz--processesZstorer   typeintzRun 2to3 concurrentlyz-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-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.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.rI   zUse --help to show usage.   -zCan't write to stdin.r   formatz%(name)s: %(message)slevelzlib2to3.mainc             3   s   |  ] }   d  | Vq d S)z.fix_Nr   ).0fix)	fixer_pkgr   r   	<genexpr>   s    zmain.<locals>.<genexpr>allz.fix_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_argsrR   r:   r@   r   r   r$   Z
add_suffixZno_diffsZ
list_fixesr;   r   Zget_all_fix_namesr<   rJ   r   verboseloggingDEBUGINFOZbasicConfigZ	getLoggersetZget_fixers_from_packageZnofixrX   addunion
differencer   r*   commonprefixr   r   r/   r.   rstripinfor   sortedr!   refactor_stdinZdoctests_onlyZ	processesZMultiprocessingUnsupportedAssertionErrorZ	summarizerP   bool)rY   r&   parserrj   flagsr   ZfixnamerV   r#   Zavail_fixesZunwanted_fixesr   Zall_presentrX   Z	requestedZfixer_namesr   Zrtr   )rY   r   main   s    	
	
	
	
		
"								
	
ro   )rH   Z
__future__r   r   r<   r   r   r_   r7   r\   r   r   r   ZMultiprocessRefactoringToolr   r@   ro   r   r   r   r   <module>   s   	g