Fix #3539: reload module with assertion rewrite import hook
This commit is contained in:
		
							parent
							
								
									ec57cbf82d
								
							
						
					
					
						commit
						c61ff31ffa
					
				
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							|  | @ -93,6 +93,7 @@ Hui Wang (coldnight) | ||||||
| Ian Bicking | Ian Bicking | ||||||
| Ian Lesperance | Ian Lesperance | ||||||
| Ionuț Turturică | Ionuț Turturică | ||||||
|  | Iwan Briquemont | ||||||
| Jaap Broekhuizen | Jaap Broekhuizen | ||||||
| Jan Balster | Jan Balster | ||||||
| Janne Vanhala | Janne Vanhala | ||||||
|  |  | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | Fix reload on assertion rewritten modules. | ||||||
|  | @ -269,17 +269,17 @@ class AssertionRewritingHook(object): | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|     def load_module(self, name): |     def load_module(self, name): | ||||||
|         # If there is an existing module object named 'fullname' in |  | ||||||
|         # sys.modules, the loader must use that existing module. (Otherwise, |  | ||||||
|         # the reload() builtin will not work correctly.) |  | ||||||
|         if name in sys.modules: |  | ||||||
|             return sys.modules[name] |  | ||||||
| 
 |  | ||||||
|         co, pyc = self.modules.pop(name) |         co, pyc = self.modules.pop(name) | ||||||
|         # I wish I could just call imp.load_compiled here, but __file__ has to |         if name in sys.modules: | ||||||
|         # be set properly. In Python 3.2+, this all would be handled correctly |             # If there is an existing module object named 'fullname' in | ||||||
|         # by load_compiled. |             # sys.modules, the loader must use that existing module. (Otherwise, | ||||||
|         mod = sys.modules[name] = imp.new_module(name) |             # the reload() builtin will not work correctly.) | ||||||
|  |             mod = sys.modules[name] | ||||||
|  |         else: | ||||||
|  |             # I wish I could just call imp.load_compiled here, but __file__ has to | ||||||
|  |             # be set properly. In Python 3.2+, this all would be handled correctly | ||||||
|  |             # by load_compiled. | ||||||
|  |             mod = sys.modules[name] = imp.new_module(name) | ||||||
|         try: |         try: | ||||||
|             mod.__file__ = co.co_filename |             mod.__file__ = co.co_filename | ||||||
|             # Normally, this attribute is 3.2+. |             # Normally, this attribute is 3.2+. | ||||||
|  |  | ||||||
|  | @ -1050,6 +1050,48 @@ class TestAssertionRewriteHookDetails(object): | ||||||
|         result = testdir.runpytest("-s") |         result = testdir.runpytest("-s") | ||||||
|         result.stdout.fnmatch_lines(["* 1 passed*"]) |         result.stdout.fnmatch_lines(["* 1 passed*"]) | ||||||
| 
 | 
 | ||||||
|  |     def test_reload_reloads(self, testdir): | ||||||
|  |         """Reloading a module after change picks up the change.""" | ||||||
|  |         testdir.tmpdir.join("file.py").write( | ||||||
|  |             textwrap.dedent( | ||||||
|  |                 """ | ||||||
|  |             def reloaded(): | ||||||
|  |                 return False | ||||||
|  | 
 | ||||||
|  |             def rewrite_self(): | ||||||
|  |                 with open(__file__, 'w') as self: | ||||||
|  |                     self.write('def reloaded(): return True') | ||||||
|  |         """ | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |         testdir.tmpdir.join("pytest.ini").write( | ||||||
|  |             textwrap.dedent( | ||||||
|  |                 """ | ||||||
|  |             [pytest] | ||||||
|  |             python_files = *.py | ||||||
|  |         """ | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |         testdir.makepyfile( | ||||||
|  |             test_fun=""" | ||||||
|  |             import sys | ||||||
|  |             try: | ||||||
|  |                 from imp import reload | ||||||
|  |             except ImportError: | ||||||
|  |                 pass | ||||||
|  | 
 | ||||||
|  |             def test_loader(): | ||||||
|  |                 import file | ||||||
|  |                 assert not file.reloaded() | ||||||
|  |                 file.rewrite_self() | ||||||
|  |                 reload(file) | ||||||
|  |                 assert file.reloaded() | ||||||
|  |             """ | ||||||
|  |         ) | ||||||
|  |         result = testdir.runpytest("-s") | ||||||
|  |         result.stdout.fnmatch_lines(["* 1 passed*"]) | ||||||
|  | 
 | ||||||
|     def test_get_data_support(self, testdir): |     def test_get_data_support(self, testdir): | ||||||
|         """Implement optional PEP302 api (#808). |         """Implement optional PEP302 api (#808). | ||||||
|         """ |         """ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue