o bcN.@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(|}|}tj||||ddddS)z%Return a unified diff of two strings.z (original)z (refactored))lineterm) splitlinesdifflib unified_diff)abfilenamer#/usr/lib/python3.10/lib2to3/main.py diff_textss  rcs@eZdZdZ d fdd ZddZfddZd d ZZS) 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 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__) selffixersoptionsexplicitrrinput_base_dir output_dir append_suffix __class__rrr$s zStdoutRefactoringTool.__init__cOs0|j|||f|jj|g|Ri|dSN)errorsappendloggererror)rmsgargskwargsrrr log_errorAszStdoutRefactoringTool.log_errorc sV|}|jr$||jrtj|j|t|jd}n td||jf|jr,||j7}||krJtj |}tj |sC|rCt || d|||j s|d}tj|rnzt|Wntym| d|Ynwzt||Wnty| d||Ynwtt|j}||||||j st||||krt||dSdS)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_fileshutilcopymode) rnew_textr old_textencoding orig_filenamer!backupwriter#rrr;EsN          z StdoutRefactoringTool.write_filecCs|r |d|dS|d||jrct|||}z8|jdurF|j|D]}t|q%tjWdn 1s;wYWdSWdS|D]}t|qHWdStybt d|fYdSwdS)NzNo changes to %sz Refactored %sz+couldn't encode %s's diff for your terminal) r6rr output_lockprintsysstdoutflushUnicodeEncodeErrorwarn)roldnewr equal diff_lineslinerrr print_outputls,     (  z"StdoutRefactoringTool.print_output)rrr) __name__ __module__ __qualname____doc__rr-r;rP __classcell__rrr#rrs  'rcCstd|ftjddS)Nz WARNING: %sfile)rErFstderr)r*rrrrJsrJc stjdd}|jddddd|jdd d gd d |jd dddddd|jddd gdd |jddddd|jddddd|jddddd|jd d!dd"d|jd#dd$d|jd%d&dd'd|jd(d)dd*d+d |jd,d-dd.d/d0d1|jd2d3dd4d|jd5dd.d/d6d1d*}i}||\}}|jrd7|d8<|jstd9d7|_|jr|js| d:|j r|js| d;|js|j rtd<|js|jr| d=|j rt d>tD]}t |q|sd?S|st d@tjdAt dBtjdAdCSdD|vrd7}|jrt dEtjdAdCS|jrd7|dF<|jrd7|dG<|jr&tjntj}tjdH|dItdJ}tt} tfdKdL|jD} t} |jrud*} |jD]} | dMkr_d7} qT| dN| qT| rr| | n| }n| | }| | }t!j"#|}|r|$t!j%st!j"&|st!j"'|}|jr|(t!j%}|)dO|j|t*t+||t+| |j|j ||j|j dP}|j,s|r|-n)z |||j|j.|j/Wntj0y|j/dksJt dQtjdAYdSw|1t2t3|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). z2to3 [options] file|dir ...)usagez-dz--doctests_only store_truezFix up doctests only)actionhelpz-fz--fixr'z1Each FIX specifies a transformation; default: all)r[defaultr\z-jz --processesstorerintzRun 2to3 concurrently)r[r]typer\z-xz--nofixz'Prevent a transformation from being runz-lz --list-fixeszList 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 --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.)r[r`r]r\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.rVzUse --help to show usage.-zCan't write to stdin.r exec_functionz%(name)s: %(message)s)formatlevelz lib2to3.mainc3s|] }d|VqdS).fix_Nr).0fix fixer_pkgrr szmain..allrhz7Output in %r will mirror the input directory %r layout.)r r!r"z+Sorry, -j isn't supported on this platform.)4optparse OptionParser add_option parse_argsrbrCrJr!rr) add_suffixno_diffs list_fixesrErget_all_fix_namesrFrXrreverboseloggingDEBUGINFO basicConfig getLoggersetget_fixers_from_packagenofixrjaddunion differencerr/ commonprefixrrr4r3rstripinforsortedr&refactor_stdin doctests_only processesMultiprocessingUnsupported summarizer_bool)rlr+parserrflagsrfixnamergr( avail_fixesunwanted_fixesr all_presentrj requested fixer_namesr rtrrkrmains                                 rr%)rT __future__rrrFrr rxr<rorrrMultiprocessRefactoringToolrrJrrrrrs  g