mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	lib2to3.pgen3.driver.load_grammar() now creates a stable cache file
between runs given the same Grammar.txt input regardless of the hash randomization setting.
This commit is contained in:
		
						commit
						0c578d62fc
					
				
					 6 changed files with 116 additions and 16 deletions
				
			
		|  | @ -15,11 +15,15 @@ | |||
| 
 | ||||
| # Python imports | ||||
| import os | ||||
| import shutil | ||||
| import subprocess | ||||
| import sys | ||||
| import tempfile | ||||
| import unittest | ||||
| import warnings | ||||
| import subprocess | ||||
| 
 | ||||
| # Local imports | ||||
| from lib2to3.pgen2 import driver as pgen2_driver | ||||
| from lib2to3.pgen2 import tokenize | ||||
| from ..pgen2.parse import ParseError | ||||
| from lib2to3.pygram import python_symbols as syms | ||||
|  | @ -34,6 +38,71 @@ def test_formfeed(self): | |||
|         self.assertEqual(t.children[1].children[0].type, syms.print_stmt) | ||||
| 
 | ||||
| 
 | ||||
| class TestPgen2Caching(support.TestCase): | ||||
|     def test_load_grammar_from_txt_file(self): | ||||
|         pgen2_driver.load_grammar(support.grammar_path, save=False, force=True) | ||||
| 
 | ||||
|     def test_load_grammar_from_pickle(self): | ||||
|         # Make a copy of the grammar file in a temp directory we are | ||||
|         # guaranteed to be able to write to. | ||||
|         tmpdir = tempfile.mkdtemp() | ||||
|         try: | ||||
|             grammar_copy = os.path.join( | ||||
|                     tmpdir, os.path.basename(support.grammar_path)) | ||||
|             shutil.copy(support.grammar_path, grammar_copy) | ||||
|             pickle_name = pgen2_driver._generate_pickle_name(grammar_copy) | ||||
| 
 | ||||
|             pgen2_driver.load_grammar(grammar_copy, save=True, force=True) | ||||
|             self.assertTrue(os.path.exists(pickle_name)) | ||||
| 
 | ||||
|             os.unlink(grammar_copy)  # Only the pickle remains... | ||||
|             pgen2_driver.load_grammar(grammar_copy, save=False, force=False) | ||||
|         finally: | ||||
|             shutil.rmtree(tmpdir) | ||||
| 
 | ||||
|     @unittest.skipIf(sys.executable is None, 'sys.executable required') | ||||
|     def test_load_grammar_from_subprocess(self): | ||||
|         tmpdir = tempfile.mkdtemp() | ||||
|         tmpsubdir = os.path.join(tmpdir, 'subdir') | ||||
|         try: | ||||
|             os.mkdir(tmpsubdir) | ||||
|             grammar_base = os.path.basename(support.grammar_path) | ||||
|             grammar_copy = os.path.join(tmpdir, grammar_base) | ||||
|             grammar_sub_copy = os.path.join(tmpsubdir, grammar_base) | ||||
|             shutil.copy(support.grammar_path, grammar_copy) | ||||
|             shutil.copy(support.grammar_path, grammar_sub_copy) | ||||
|             pickle_name = pgen2_driver._generate_pickle_name(grammar_copy) | ||||
|             pickle_sub_name = pgen2_driver._generate_pickle_name( | ||||
|                      grammar_sub_copy) | ||||
|             self.assertNotEqual(pickle_name, pickle_sub_name) | ||||
| 
 | ||||
|             # Generate a pickle file from this process. | ||||
|             pgen2_driver.load_grammar(grammar_copy, save=True, force=True) | ||||
|             self.assertTrue(os.path.exists(pickle_name)) | ||||
| 
 | ||||
|             # Generate a new pickle file in a subprocess with a most likely | ||||
|             # different hash randomization seed. | ||||
|             sub_env = dict(os.environ) | ||||
|             sub_env['PYTHONHASHSEED'] = 'random' | ||||
|             subprocess.check_call( | ||||
|                     [sys.executable, '-c', """ | ||||
| from lib2to3.pgen2 import driver as pgen2_driver | ||||
| pgen2_driver.load_grammar(%r, save=True, force=True) | ||||
|                     """ % (grammar_sub_copy,)], | ||||
|                     env=sub_env) | ||||
|             self.assertTrue(os.path.exists(pickle_sub_name)) | ||||
| 
 | ||||
|             with open(pickle_name, 'rb') as pickle_f_1, \ | ||||
|                     open(pickle_sub_name, 'rb') as pickle_f_2: | ||||
|                 self.assertEqual( | ||||
|                     pickle_f_1.read(), pickle_f_2.read(), | ||||
|                     msg='Grammar caches generated using different hash seeds' | ||||
|                     ' were not identical.') | ||||
|         finally: | ||||
|             shutil.rmtree(tmpdir) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class GrammarTest(support.TestCase): | ||||
|     def validate(self, code): | ||||
|         support.parse_string(code) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)
						Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)