mirror of https://github.com/pallets/flask.git
				
				
				
			Explain is_package AttributeError in find_package
When a PEP 302 import hook is used that doesn't implement .is_package() an AttributeError is raised. This looks like a bug in Flask. This change fixes that problem in the sense that it explains, that the AttributeError is intentional.
This commit is contained in:
		
							parent
							
								
									f606a6d6a1
								
							
						
					
					
						commit
						94f4360137
					
				
							
								
								
									
										3
									
								
								CHANGES
								
								
								
								
							
							
						
						
									
										3
									
								
								CHANGES
								
								
								
								
							|  | @ -9,6 +9,9 @@ Version 0.10.2 | |||
| (bugfix release, release date to be announced) | ||||
| 
 | ||||
| - Fixed broken `test_appcontext_signals()` test case. | ||||
| - Raise an :exc:`AttributeError` in :func:`flask.helpers.find_package` with a | ||||
|   useful message explaining why it is raised when a PEP 302 import hook is used | ||||
|   without an `is_package()` method. | ||||
| 
 | ||||
| Version 0.10.1 | ||||
| -------------- | ||||
|  |  | |||
|  | @ -679,8 +679,13 @@ def find_package(import_name): | |||
|             filename = sys.modules[import_name].__file__ | ||||
|         package_path = os.path.abspath(os.path.dirname(filename)) | ||||
|         # package_path ends with __init__.py for a package | ||||
|         if loader.is_package(root_mod_name): | ||||
|             package_path = os.path.dirname(package_path) | ||||
|         if hasattr(loader, 'is_package'): | ||||
|             if loader.is_package(root_mod_name): | ||||
|                 package_path = os.path.dirname(package_path) | ||||
|         else: | ||||
|             raise AttributeError( | ||||
|                 ('%s.is_package() method is missing but is ' | ||||
|                  'required by Flask of PEP 302 import hooks') % loader.__class__.__name__) | ||||
| 
 | ||||
|     site_parent, site_folder = os.path.split(package_path) | ||||
|     py_prefix = os.path.abspath(sys.prefix) | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ import pkgutil | |||
| import unittest | ||||
| from contextlib import contextmanager | ||||
| from flask.testsuite import FlaskTestCase | ||||
| from flask._compat import PY2 | ||||
| 
 | ||||
| 
 | ||||
| # config keys used for the ConfigTestCase | ||||
|  | @ -291,6 +292,18 @@ class InstanceTestCase(FlaskTestCase): | |||
|             if 'site_egg' in sys.modules: | ||||
|                 del sys.modules['site_egg'] | ||||
| 
 | ||||
|     if PY2: | ||||
|         def test_meta_path_loader_without_is_package(self): | ||||
|             class Loader(object): | ||||
|                 def find_module(self, name): | ||||
|                     return self | ||||
|             sys.meta_path.append(Loader()) | ||||
|             try: | ||||
|                 with self.assert_raises(AttributeError): | ||||
|                     flask.Flask(__name__) | ||||
|             finally: | ||||
|                 sys.meta_path.pop() | ||||
| 
 | ||||
| 
 | ||||
| def suite(): | ||||
|     suite = unittest.TestSuite() | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue