i f-@sdZddlmZmZddlZddlZddlZddlZddlZddl Z ddl m Z ddZ Gdd d e j Zd d Zdd d ZdS)z Main program for 2to3. )with_statementprint_functionN)refactorc Cs:|j}|j}tj||||ddddS)z%Return a unified diff of two strings.z (original)z (refactored)Zlineterm) splitlinesdifflibZ unified_diff)abfilenamer 1/opt/alt/python34/lib64/python3.4/lib2to3/main.py diff_textss    rcs[eZdZdZdddfddZddZfddZd d 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. rc sv||_||_|r;|jtj r;|tj7}n||_||_||_tt |j |||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__) selfZfixersoptionsexplicitrrinput_base_dir output_dir append_suffix) __class__r r r$s     zStdoutRefactoringTool.__init__cOs3|jj|||f|jj|||dS)N)errorsappendloggererror)rmsgargskwargsr r r log_errorAszStdoutRefactoringTool.log_errorc !s|}|jrk|j|jrOtjj|j|t|jd}qktd||jfn|jr||j7}n||krtjj |}tjj |stj |n|j d||n|j s|d}tjj|rKytj|WqKtk rG}z|j d|WYdd}~XqKXnytj||Wqtk r}z|j d||WYdd}~XqXntt|j} | |||||j stj||n||krtj||ndS)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 startswithrrpathjoinlen ValueErrorrdirnameisdirmakedirs log_messagerlexistsremoveOSErrorrenamerr write_fileshutilZcopymode) rZnew_textr Zold_textencodingZ orig_filenamerZbackuperrwrite)r r r r6Es@       &)  z StdoutRefactoringTool.write_filecCs|r|jd|n|jd||jrt|||}yi|jdk r|j-x|D]}t|qgWtjjWdQXnx|D]}t|qWWqtk rt d|fdSYqXndS)NzNo changes to %sz Refactored %sz+couldn't encode %s's diff for your terminal) r1rrZ output_lockprintsysstdoutflushUnicodeEncodeErrorwarn)roldnewr ZequalZ diff_linesliner r r print_outputls"      z"StdoutRefactoringTool.print_output)__name__ __module__ __qualname____doc__rr(r6rDr r )r r rs  'rcCstd|fdtjdS)Nz WARNING: %sfile)r;r<stderr)r%r r r r@sr@c stjdd}|jdddddd|jd d dd d gdd |jddddd ddddd|jdddd d gdd|jdddddd|jdddddd|jdddddd |jd!dddd"|jd#d$dddd%|jd&d'ddd d(dd)|jd*d+dddd,d d-dd.|jd/d0dddd1|jd2dddd,d d-dd3d(}i}|j|\}}|jrd4|d5<|jstd6nd4|_n|jr'|j r'|j d7n|j rJ|j rJ|j d8n|j rj|j rjtd9n|j r|jr|j d:n|j rt d;x!tjD]}t |qW|sd<Sn|st d=d>tjt d?d>tjd@SdA|kr6d4}|jr6t dBd>tjd@Sn|jrLd4|dCtjdSYnX|j2nt3t4|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). Zusagez2to3 [options] file|dir ...z-dz--doctests_onlyaction store_truehelpzFix up doctests onlyz-fz--fixr"defaultz1Each FIX specifies a transformation; default: allz-jz --processesZstorertypeintzRun 2to3 concurrentlyz-xz--nofixz'Prevent a transformation from being runz-lz --list-fixeszList available transformationsz-pz--print-functionz0Modify the grammar so that print() is a functionz-vz --verbosezMore verbose loggingz --no-diffsz#Don't show diffs of the refactoringz-wz--writezWrite back modified filesz-nz --nobackupsFz&Don't write backups for modified filesz-oz --output-dirstrrzXPut 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.Twrite_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 usefulzCan't use -n without -wz2Available transformations for the -f/--fix option:rz1At least one file or directory argument required.rIzUse --help to show usage.-zCan't write to stdin.rformatz%(name)s: %(message)slevelz lib2to3.mainc3s|]}d|VqdS)z.fix_Nr ).0fix) fixer_pkgr r szmain..allz.fix_z7Output in %r will mirror the input directory %r layout.rrrz+Sorry, -j isn't supported on this platform.)5optparseZ OptionParserZ add_option parse_argsrRr:r@rrr$Z add_suffixZno_diffsZ list_fixesr;rZget_all_fix_namesr<rJrverboseloggingDEBUGINFOrootZhandlersZ basicConfigZ getLoggersetZget_fixers_from_packageZnofixrXaddunion differencerr* commonprefixrrr/r.rstripinforsortedr!refactor_stdinZ doctests_onlyZ processesZMultiprocessingUnsupportedZ summarizerPbool)rYr&parserrkflagsrZfixnamerVr#Z avail_fixesZunwanted_fixesrZ all_presentrXZ requestedZ fixer_namesrZrtr )rYr mains                "              ro)rHZ __future__rrr<rrr_r7r\rrrZMultiprocessRefactoringToolrr@ror r r r s       g