| 
									
										
											  
											
												Merged revisions 77102 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
  r77102 | benjamin.peterson | 2009-12-28 17:50:41 -0600 (Mon, 28 Dec 2009) | 50 lines
  Merged revisions 76871-76872,77093-77095,77097-77101 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
  ........
    r76871 | benjamin.peterson | 2009-12-17 20:49:21 -0600 (Thu, 17 Dec 2009) | 1 line
    handle unencodable diffs gracefully #5093
  ........
    r76872 | benjamin.peterson | 2009-12-17 20:51:37 -0600 (Thu, 17 Dec 2009) | 1 line
    fix emacs header
  ........
    r77093 | benjamin.peterson | 2009-12-28 14:43:32 -0600 (Mon, 28 Dec 2009) | 7 lines
    replace callable(x) with isinstance(x, collections.Callable) #7006
    This is a more accurate translation than hasattr(x, '__call__') which failed in
    the case that somebody had put __call__ in the instance dictionary.
    Patch mostly by Joe Amenta.
  ........
    r77094 | benjamin.peterson | 2009-12-28 14:45:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    deuglify imports
  ........
    r77095 | benjamin.peterson | 2009-12-28 14:49:23 -0600 (Mon, 28 Dec 2009) | 1 line
    remove unused flag
  ........
    r77097 | benjamin.peterson | 2009-12-28 16:12:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    clean up imports and whitespace
  ........
    r77098 | benjamin.peterson | 2009-12-28 16:43:35 -0600 (Mon, 28 Dec 2009) | 1 line
    *** empty log message ***
  ........
    r77099 | benjamin.peterson | 2009-12-28 16:45:10 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended change
  ........
    r77100 | benjamin.peterson | 2009-12-28 16:53:21 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended changes
  ........
    r77101 | benjamin.peterson | 2009-12-28 17:46:02 -0600 (Mon, 28 Dec 2009) | 1 line
    normalize whitespace
  ........
................
											
										 
											2009-12-29 00:06:20 +00:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | import codecs | 
					
						
							|  |  |  | import io | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  | import logging | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2012-02-13 16:43:55 -08:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  | import shutil | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import tempfile | 
					
						
							| 
									
										
											  
											
												Merged revisions 77102 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
  r77102 | benjamin.peterson | 2009-12-28 17:50:41 -0600 (Mon, 28 Dec 2009) | 50 lines
  Merged revisions 76871-76872,77093-77095,77097-77101 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
  ........
    r76871 | benjamin.peterson | 2009-12-17 20:49:21 -0600 (Thu, 17 Dec 2009) | 1 line
    handle unencodable diffs gracefully #5093
  ........
    r76872 | benjamin.peterson | 2009-12-17 20:51:37 -0600 (Thu, 17 Dec 2009) | 1 line
    fix emacs header
  ........
    r77093 | benjamin.peterson | 2009-12-28 14:43:32 -0600 (Mon, 28 Dec 2009) | 7 lines
    replace callable(x) with isinstance(x, collections.Callable) #7006
    This is a more accurate translation than hasattr(x, '__call__') which failed in
    the case that somebody had put __call__ in the instance dictionary.
    Patch mostly by Joe Amenta.
  ........
    r77094 | benjamin.peterson | 2009-12-28 14:45:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    deuglify imports
  ........
    r77095 | benjamin.peterson | 2009-12-28 14:49:23 -0600 (Mon, 28 Dec 2009) | 1 line
    remove unused flag
  ........
    r77097 | benjamin.peterson | 2009-12-28 16:12:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    clean up imports and whitespace
  ........
    r77098 | benjamin.peterson | 2009-12-28 16:43:35 -0600 (Mon, 28 Dec 2009) | 1 line
    *** empty log message ***
  ........
    r77099 | benjamin.peterson | 2009-12-28 16:45:10 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended change
  ........
    r77100 | benjamin.peterson | 2009-12-28 16:53:21 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended changes
  ........
    r77101 | benjamin.peterson | 2009-12-28 17:46:02 -0600 (Mon, 28 Dec 2009) | 1 line
    normalize whitespace
  ........
................
											
										 
											2009-12-29 00:06:20 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from lib2to3 import main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  | TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data") | 
					
						
							|  |  |  | PY2_TEST_MODULE = os.path.join(TEST_DATA_DIR, "py2_test_grammar.py") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 77102 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
  r77102 | benjamin.peterson | 2009-12-28 17:50:41 -0600 (Mon, 28 Dec 2009) | 50 lines
  Merged revisions 76871-76872,77093-77095,77097-77101 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
  ........
    r76871 | benjamin.peterson | 2009-12-17 20:49:21 -0600 (Thu, 17 Dec 2009) | 1 line
    handle unencodable diffs gracefully #5093
  ........
    r76872 | benjamin.peterson | 2009-12-17 20:51:37 -0600 (Thu, 17 Dec 2009) | 1 line
    fix emacs header
  ........
    r77093 | benjamin.peterson | 2009-12-28 14:43:32 -0600 (Mon, 28 Dec 2009) | 7 lines
    replace callable(x) with isinstance(x, collections.Callable) #7006
    This is a more accurate translation than hasattr(x, '__call__') which failed in
    the case that somebody had put __call__ in the instance dictionary.
    Patch mostly by Joe Amenta.
  ........
    r77094 | benjamin.peterson | 2009-12-28 14:45:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    deuglify imports
  ........
    r77095 | benjamin.peterson | 2009-12-28 14:49:23 -0600 (Mon, 28 Dec 2009) | 1 line
    remove unused flag
  ........
    r77097 | benjamin.peterson | 2009-12-28 16:12:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    clean up imports and whitespace
  ........
    r77098 | benjamin.peterson | 2009-12-28 16:43:35 -0600 (Mon, 28 Dec 2009) | 1 line
    *** empty log message ***
  ........
    r77099 | benjamin.peterson | 2009-12-28 16:45:10 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended change
  ........
    r77100 | benjamin.peterson | 2009-12-28 16:53:21 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended changes
  ........
    r77101 | benjamin.peterson | 2009-12-28 17:46:02 -0600 (Mon, 28 Dec 2009) | 1 line
    normalize whitespace
  ........
................
											
										 
											2009-12-29 00:06:20 +00:00
										 |  |  | class TestMain(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.temp_dir = None  # tearDown() will rmtree this directory if set. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-30 19:52:54 +00:00
										 |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         # Clean up logging configuration down by main. | 
					
						
							|  |  |  |         del logging.root.handlers[:] | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  |         if self.temp_dir: | 
					
						
							|  |  |  |             shutil.rmtree(self.temp_dir) | 
					
						
							| 
									
										
										
										
											2009-12-30 19:52:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 77102 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
  r77102 | benjamin.peterson | 2009-12-28 17:50:41 -0600 (Mon, 28 Dec 2009) | 50 lines
  Merged revisions 76871-76872,77093-77095,77097-77101 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
  ........
    r76871 | benjamin.peterson | 2009-12-17 20:49:21 -0600 (Thu, 17 Dec 2009) | 1 line
    handle unencodable diffs gracefully #5093
  ........
    r76872 | benjamin.peterson | 2009-12-17 20:51:37 -0600 (Thu, 17 Dec 2009) | 1 line
    fix emacs header
  ........
    r77093 | benjamin.peterson | 2009-12-28 14:43:32 -0600 (Mon, 28 Dec 2009) | 7 lines
    replace callable(x) with isinstance(x, collections.Callable) #7006
    This is a more accurate translation than hasattr(x, '__call__') which failed in
    the case that somebody had put __call__ in the instance dictionary.
    Patch mostly by Joe Amenta.
  ........
    r77094 | benjamin.peterson | 2009-12-28 14:45:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    deuglify imports
  ........
    r77095 | benjamin.peterson | 2009-12-28 14:49:23 -0600 (Mon, 28 Dec 2009) | 1 line
    remove unused flag
  ........
    r77097 | benjamin.peterson | 2009-12-28 16:12:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    clean up imports and whitespace
  ........
    r77098 | benjamin.peterson | 2009-12-28 16:43:35 -0600 (Mon, 28 Dec 2009) | 1 line
    *** empty log message ***
  ........
    r77099 | benjamin.peterson | 2009-12-28 16:45:10 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended change
  ........
    r77100 | benjamin.peterson | 2009-12-28 16:53:21 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended changes
  ........
    r77101 | benjamin.peterson | 2009-12-28 17:46:02 -0600 (Mon, 28 Dec 2009) | 1 line
    normalize whitespace
  ........
................
											
										 
											2009-12-29 00:06:20 +00:00
										 |  |  |     def run_2to3_capture(self, args, in_capture, out_capture, err_capture): | 
					
						
							|  |  |  |         save_stdin = sys.stdin | 
					
						
							|  |  |  |         save_stdout = sys.stdout | 
					
						
							|  |  |  |         save_stderr = sys.stderr | 
					
						
							|  |  |  |         sys.stdin = in_capture | 
					
						
							|  |  |  |         sys.stdout = out_capture | 
					
						
							|  |  |  |         sys.stderr = err_capture | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             return main.main("lib2to3.fixes", args) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.stdin = save_stdin | 
					
						
							|  |  |  |             sys.stdout = save_stdout | 
					
						
							|  |  |  |             sys.stderr = save_stderr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_unencodable_diff(self): | 
					
						
							|  |  |  |         input_stream = io.StringIO("print 'nothing'\nprint u'über'\n") | 
					
						
							| 
									
										
										
										
											2009-12-29 00:37:04 +00:00
										 |  |  |         out = io.BytesIO() | 
					
						
							| 
									
										
											  
											
												Merged revisions 77102 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
  r77102 | benjamin.peterson | 2009-12-28 17:50:41 -0600 (Mon, 28 Dec 2009) | 50 lines
  Merged revisions 76871-76872,77093-77095,77097-77101 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
  ........
    r76871 | benjamin.peterson | 2009-12-17 20:49:21 -0600 (Thu, 17 Dec 2009) | 1 line
    handle unencodable diffs gracefully #5093
  ........
    r76872 | benjamin.peterson | 2009-12-17 20:51:37 -0600 (Thu, 17 Dec 2009) | 1 line
    fix emacs header
  ........
    r77093 | benjamin.peterson | 2009-12-28 14:43:32 -0600 (Mon, 28 Dec 2009) | 7 lines
    replace callable(x) with isinstance(x, collections.Callable) #7006
    This is a more accurate translation than hasattr(x, '__call__') which failed in
    the case that somebody had put __call__ in the instance dictionary.
    Patch mostly by Joe Amenta.
  ........
    r77094 | benjamin.peterson | 2009-12-28 14:45:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    deuglify imports
  ........
    r77095 | benjamin.peterson | 2009-12-28 14:49:23 -0600 (Mon, 28 Dec 2009) | 1 line
    remove unused flag
  ........
    r77097 | benjamin.peterson | 2009-12-28 16:12:13 -0600 (Mon, 28 Dec 2009) | 2 lines
    clean up imports and whitespace
  ........
    r77098 | benjamin.peterson | 2009-12-28 16:43:35 -0600 (Mon, 28 Dec 2009) | 1 line
    *** empty log message ***
  ........
    r77099 | benjamin.peterson | 2009-12-28 16:45:10 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended change
  ........
    r77100 | benjamin.peterson | 2009-12-28 16:53:21 -0600 (Mon, 28 Dec 2009) | 1 line
    revert unintended changes
  ........
    r77101 | benjamin.peterson | 2009-12-28 17:46:02 -0600 (Mon, 28 Dec 2009) | 1 line
    normalize whitespace
  ........
................
											
										 
											2009-12-29 00:06:20 +00:00
										 |  |  |         out_enc = codecs.getwriter("ascii")(out) | 
					
						
							|  |  |  |         err = io.StringIO() | 
					
						
							|  |  |  |         ret = self.run_2to3_capture(["-"], input_stream, out_enc, err) | 
					
						
							|  |  |  |         self.assertEqual(ret, 0) | 
					
						
							| 
									
										
										
										
											2009-12-29 00:37:04 +00:00
										 |  |  |         output = out.getvalue().decode("ascii") | 
					
						
							| 
									
										
										
										
											2013-11-14 23:49:58 +02:00
										 |  |  |         self.assertIn("-print 'nothing'", output) | 
					
						
							|  |  |  |         self.assertIn("WARNING: couldn't encode <stdin>'s diff for " | 
					
						
							|  |  |  |                       "your terminal", err.getvalue()) | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def setup_test_source_trees(self): | 
					
						
							|  |  |  |         """Setup a test source tree and output destination tree.""" | 
					
						
							|  |  |  |         self.temp_dir = tempfile.mkdtemp()  # tearDown() cleans this up. | 
					
						
							|  |  |  |         self.py2_src_dir = os.path.join(self.temp_dir, "python2_project") | 
					
						
							|  |  |  |         self.py3_dest_dir = os.path.join(self.temp_dir, "python3_project") | 
					
						
							|  |  |  |         os.mkdir(self.py2_src_dir) | 
					
						
							|  |  |  |         os.mkdir(self.py3_dest_dir) | 
					
						
							|  |  |  |         # Turn it into a package with a few files. | 
					
						
							|  |  |  |         self.setup_files = [] | 
					
						
							|  |  |  |         open(os.path.join(self.py2_src_dir, "__init__.py"), "w").close() | 
					
						
							|  |  |  |         self.setup_files.append("__init__.py") | 
					
						
							|  |  |  |         shutil.copy(PY2_TEST_MODULE, self.py2_src_dir) | 
					
						
							|  |  |  |         self.setup_files.append(os.path.basename(PY2_TEST_MODULE)) | 
					
						
							|  |  |  |         self.trivial_py2_file = os.path.join(self.py2_src_dir, "trivial.py") | 
					
						
							|  |  |  |         self.init_py2_file = os.path.join(self.py2_src_dir, "__init__.py") | 
					
						
							|  |  |  |         with open(self.trivial_py2_file, "w") as trivial: | 
					
						
							|  |  |  |             trivial.write("print 'I need a simple conversion.'") | 
					
						
							|  |  |  |         self.setup_files.append("trivial.py") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_filename_changing_on_output_single_dir(self): | 
					
						
							|  |  |  |         """2to3 a single directory with a new output dir and suffix.""" | 
					
						
							|  |  |  |         self.setup_test_source_trees() | 
					
						
							|  |  |  |         out = io.StringIO() | 
					
						
							|  |  |  |         err = io.StringIO() | 
					
						
							|  |  |  |         suffix = "TEST" | 
					
						
							|  |  |  |         ret = self.run_2to3_capture( | 
					
						
							|  |  |  |                 ["-n", "--add-suffix", suffix, "--write-unchanged-files", | 
					
						
							|  |  |  |                  "--no-diffs", "--output-dir", | 
					
						
							|  |  |  |                  self.py3_dest_dir, self.py2_src_dir], | 
					
						
							|  |  |  |                 io.StringIO(""), out, err) | 
					
						
							|  |  |  |         self.assertEqual(ret, 0) | 
					
						
							|  |  |  |         stderr = err.getvalue() | 
					
						
							|  |  |  |         self.assertIn(" implies -w.", stderr) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							|  |  |  |                 "Output in %r will mirror the input directory %r layout" % ( | 
					
						
							|  |  |  |                         self.py3_dest_dir, self.py2_src_dir), stderr) | 
					
						
							|  |  |  |         self.assertEqual(set(name+suffix for name in self.setup_files), | 
					
						
							|  |  |  |                          set(os.listdir(self.py3_dest_dir))) | 
					
						
							|  |  |  |         for name in self.setup_files: | 
					
						
							|  |  |  |             self.assertIn("Writing converted %s to %s" % ( | 
					
						
							|  |  |  |                     os.path.join(self.py2_src_dir, name), | 
					
						
							|  |  |  |                     os.path.join(self.py3_dest_dir, name+suffix)), stderr) | 
					
						
							| 
									
										
										
										
											2012-02-13 16:38:37 -08:00
										 |  |  |         sep = re.escape(os.sep) | 
					
						
							| 
									
										
										
										
											2012-02-13 16:24:46 -08:00
										 |  |  |         self.assertRegex( | 
					
						
							| 
									
										
										
										
											2012-02-13 16:38:37 -08:00
										 |  |  |                 stderr, r"No changes to .*/__init__\.py".replace("/", sep)) | 
					
						
							| 
									
										
										
										
											2012-02-13 16:24:46 -08:00
										 |  |  |         self.assertNotRegex( | 
					
						
							| 
									
										
										
										
											2012-02-13 16:38:37 -08:00
										 |  |  |                 stderr, r"No changes to .*/trivial\.py".replace("/", sep)) | 
					
						
							| 
									
										
										
										
											2012-02-12 15:50:21 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_filename_changing_on_output_two_files(self): | 
					
						
							|  |  |  |         """2to3 two files in one directory with a new output dir.""" | 
					
						
							|  |  |  |         self.setup_test_source_trees() | 
					
						
							|  |  |  |         err = io.StringIO() | 
					
						
							|  |  |  |         py2_files = [self.trivial_py2_file, self.init_py2_file] | 
					
						
							|  |  |  |         expected_files = set(os.path.basename(name) for name in py2_files) | 
					
						
							|  |  |  |         ret = self.run_2to3_capture( | 
					
						
							|  |  |  |                 ["-n", "-w", "--write-unchanged-files", | 
					
						
							|  |  |  |                  "--no-diffs", "--output-dir", self.py3_dest_dir] + py2_files, | 
					
						
							|  |  |  |                 io.StringIO(""), io.StringIO(), err) | 
					
						
							|  |  |  |         self.assertEqual(ret, 0) | 
					
						
							|  |  |  |         stderr = err.getvalue() | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							|  |  |  |                 "Output in %r will mirror the input directory %r layout" % ( | 
					
						
							|  |  |  |                         self.py3_dest_dir, self.py2_src_dir), stderr) | 
					
						
							|  |  |  |         self.assertEqual(expected_files, set(os.listdir(self.py3_dest_dir))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_filename_changing_on_output_single_file(self): | 
					
						
							|  |  |  |         """2to3 a single file with a new output dir.""" | 
					
						
							|  |  |  |         self.setup_test_source_trees() | 
					
						
							|  |  |  |         err = io.StringIO() | 
					
						
							|  |  |  |         ret = self.run_2to3_capture( | 
					
						
							|  |  |  |                 ["-n", "-w", "--no-diffs", "--output-dir", self.py3_dest_dir, | 
					
						
							|  |  |  |                  self.trivial_py2_file], | 
					
						
							|  |  |  |                 io.StringIO(""), io.StringIO(), err) | 
					
						
							|  |  |  |         self.assertEqual(ret, 0) | 
					
						
							|  |  |  |         stderr = err.getvalue() | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							|  |  |  |                 "Output in %r will mirror the input directory %r layout" % ( | 
					
						
							|  |  |  |                         self.py3_dest_dir, self.py2_src_dir), stderr) | 
					
						
							|  |  |  |         self.assertEqual(set([os.path.basename(self.trivial_py2_file)]), | 
					
						
							|  |  |  |                          set(os.listdir(self.py3_dest_dir))) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |