Ticket #14087: namespace_package_pth.diff
File namespace_package_pth.diff, 16.9 KB (added by , 13 years ago) |
---|
-
django/core/management/__init__.py
diff --git a/django/core/management/__init__.py b/django/core/management/__init__.py index bafab17..0166d60 100644
a b import imp 5 5 6 6 import django 7 7 from django.core.management.base import BaseCommand, CommandError, handle_default_options 8 from django.utils.importlib import import_module 8 from django.utils.importlib import import_module, find_modules 9 9 10 10 # For backwards compatibility: get_version() used to be in this module. 11 11 get_version = django.get_version … … def find_management_module(app_name): 36 36 Raises ImportError if the management module cannot be found for any reason. 37 37 """ 38 38 parts = app_name.split('.') 39 parts.append('management') 40 parts.reverse() 41 part = parts.pop() 42 path = None 43 44 # When using manage.py, the project module is added to the path, 45 # loaded, then removed from the path. This means that 46 # testproject.testapp.models can be loaded in future, even if 47 # testproject isn't in the path. When looking for the management 48 # module, we need look for the case where the project name is part 49 # of the app_name but the project directory itself isn't on the path. 50 try: 51 f, path, descr = imp.find_module(part,path) 52 except ImportError,e: 53 if os.path.basename(os.getcwd()) != part: 54 raise e 39 40 for i in range(len(parts), 0, -1): 41 try: 42 paths = sys.modules['.'.join(parts[:i])].__path__ 43 except KeyError: 44 continue 45 46 parts = parts[i:] + ['management'] 47 parts.reverse() 48 break 49 else: 50 parts = app_name.split('.') 51 parts.append('management') 52 parts.reverse() 53 part = parts.pop() 54 paths = None 55 56 # When using manage.py, the project module is added to the path, 57 # loaded, then removed from the path. This means that 58 # testproject.testapp.models can be loaded in future, even if 59 # testproject isn't in the path. When looking for the management 60 # module, we need look for the case where the project name is part 61 # of the app_name but the project directory itself isn't on the path. 62 try: 63 modules = find_modules(part, paths) 64 paths = [m[1] for m in modules] 65 except ImportError,e: 66 if os.path.basename(os.getcwd()) != part: 67 raise e 55 68 56 69 while parts: 57 70 part = parts.pop() 58 f, path, descr = imp.find_module(part, path and [path] or None) 59 return path 71 modules = find_modules(part, paths) 72 paths = [m[1] for m in modules] 73 return paths[0] 60 74 61 75 def load_command_class(app_name, name): 62 76 """ -
django/utils/importlib.py
diff --git a/django/utils/importlib.py b/django/utils/importlib.py index ef4d0e4..1507a2b 100644
a b 1 1 # Taken from Python 2.7 with permission from/by the original author. 2 2 import sys 3 import imp 3 4 4 5 def _resolve_name(name, package, level): 5 6 """Return the absolute name of the module to be imported.""" … … def import_module(name, package=None): 34 35 name = _resolve_name(name[level:], package, level) 35 36 __import__(name) 36 37 return sys.modules[name] 38 39 40 def find_modules(name, path=None): 41 """Find all modules with name 'name' 42 43 Unlike find_module in the imp package this returns a list of all 44 matched modules. 45 """ 46 results = [] 47 if path is None: path = sys.path 48 for p in path: 49 importer = sys.path_importer_cache.get(p, None) 50 if importer is None: 51 find_module = imp.find_module 52 else: 53 find_module = importer.find_module 54 55 try: 56 result = find_module(name, [p]) 57 if result is not None: 58 results.append(result) 59 except ImportError: 60 pass 61 if not results: 62 raise ImportError("No module named %.200s" % name) 63 return results -
new file tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/nons_app_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/__init__.py b/tests/regressiontests/admin_scripts/lib1/nons_app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/management/__init__.py b/tests/regressiontests/admin_scripts/lib1/nons_app/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/nons_app_command1.py b/tests/regressiontests/admin_scripts/lib1/nons_app/management/commands/nons_app_command1.py new file mode 100644 index 0000000..a393663
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in non-namespaced app' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:nons_app_command1' -
new file tests/regressiontests/admin_scripts/lib1/nsapps/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nons_app/models.py b/tests/regressiontests/admin_scripts/lib1/nons_app/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib1/nsapps/contrib/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/app1_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/app1_command1.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/management/commands/app1_command1.py new file mode 100644 index 0000000..2f479bb
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in namespaced apps' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:app1_command1' -
new file tests/regressiontests/admin_scripts/lib2/nsapps/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/models.py b/tests/regressiontests/admin_scripts/lib1/nsapps/contrib/app1/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib2/nsapps/contrib/__init__.py
diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/__init__.py new file mode 100644 index 0000000..32f26d8
- + 1 # http://packages.python.org/distribute/setuptools.html#namespace-packages 2 try: 3 __import__('pkg_resources').declare_namespace(__name__) 4 except ImportError: 5 from pkgutil import extend_path 6 __path__ = extend_path(__path__, __name__) -
new file tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/app2_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/app2_command1.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/management/commands/app2_command1.py new file mode 100644 index 0000000..b9e20a7
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in namespaced apps' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:app2_command1' -
new file tests/regressiontests/admin_scripts/lib3/_addsitedir.py
diff --git a/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/models.py b/tests/regressiontests/admin_scripts/lib2/nsapps/contrib/app2/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/_addsitedir.py b/tests/regressiontests/admin_scripts/lib3/_addsitedir.py new file mode 100644 index 0000000..9e264d2
- + 1 import os.path, site; site.addsitedir(os.path.dirname(__file__)) -
new file tests/regressiontests/admin_scripts/lib3/exapps-nspkg.pth
diff --git a/tests/regressiontests/admin_scripts/lib3/exapps-nspkg.pth b/tests/regressiontests/admin_scripts/lib3/exapps-nspkg.pth new file mode 100644 index 0000000..1f31155
- + 1 import sys,new,os; p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('exapps',)); ie = os.path.exists(os.path.join(p,'__init__.py')); m = not ie and sys.modules.setdefault('exapps',new.module('exapps')); mp = (m or []) and m.__dict__.setdefault('__path__',[]); (p not in mp) and mp.append(p) -
new file tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/app3_command1.py
diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/__init__.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/__init__.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/__init__.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/app3_command1.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/management/commands/app3_command1.py new file mode 100644 index 0000000..97f5d33
- + 1 from django.core.management.base import BaseCommand 2 3 class Command(BaseCommand): 4 help = 'Test managment commands in namespaced apps' 5 requires_model_validation = False 6 args = '' 7 8 def handle(self, *labels, **options): 9 print 'EXECUTE:app3_command1' -
tests/regressiontests/admin_scripts/tests.py
diff --git a/tests/regressiontests/admin_scripts/lib3/exapps/app3/models.py b/tests/regressiontests/admin_scripts/lib3/exapps/app3/models.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/regressiontests/admin_scripts/tests.py b/tests/regressiontests/admin_scripts/tests.py index ed4bd35..a8735b6 100644
a b class AdminScriptTestCase(unittest.TestCase): 84 84 test_dir = os.path.dirname(os.path.dirname(__file__)) 85 85 project_dir = os.path.dirname(test_dir) 86 86 base_dir = os.path.dirname(project_dir) 87 lib1_dir = os.path.join(os.path.dirname(__file__), 'lib1') 88 lib2_dir = os.path.join(os.path.dirname(__file__), 'lib2') 89 lib3_dir = os.path.join(os.path.dirname(__file__), 'lib3') 87 90 ext_backend_base_dirs = self._ext_backend_paths() 88 91 89 92 # Remember the old environment … … class AdminScriptTestCase(unittest.TestCase): 101 104 os.environ['DJANGO_SETTINGS_MODULE'] = settings_file 102 105 elif 'DJANGO_SETTINGS_MODULE' in os.environ: 103 106 del os.environ['DJANGO_SETTINGS_MODULE'] 104 python_path = [test_dir, base_dir ]107 python_path = [test_dir, base_dir, lib1_dir, lib2_dir, lib3_dir] 105 108 python_path.extend(ext_backend_base_dirs) 106 109 os.environ[python_path_var_name] = os.pathsep.join(python_path) 107 110 … … class ArgumentOrder(AdminScriptTestCase): 1291 1294 out, err = self.run_manage(args) 1292 1295 self.assertNoOutput(err) 1293 1296 self.assertOutput(out, "EXECUTE:BaseCommand labels=('testlabel',), options=[('option_a', 'x'), ('option_b', 'y'), ('option_c', '3'), ('pythonpath', None), ('settings', 'alternate_settings'), ('traceback', None), ('verbosity', '1')]") 1297 1298 class NamespacePackagedApps(AdminScriptTestCase): 1299 def setUp(self): 1300 self.write_settings('settings.py', apps=['nons_app', 'nsapps.contrib.app1','nsapps.contrib.app2','exapps.app3']) 1301 test_dir = os.path.dirname(os.path.dirname(__file__)) 1302 settings_file = open(os.path.join(test_dir, 'settings.py'), 'a') 1303 settings_file.write('import _addsitedir') 1304 settings_file.close() 1305 1306 def tearDown(self): 1307 self.remove_settings('settings.py') 1308 1309 def test_help(self): 1310 out, err = self.run_manage(['help']) 1311 self.assertOutput(err, "nons_app_command1") 1312 self.assertOutput(err, "app1_command1") 1313 self.assertOutput(err, "app2_command1") 1314 self.assertOutput(err, "app3_command1") 1315 1316 def test_nons_app(self): 1317 args = ['nons_app_command1'] 1318 out, err = self.run_manage(args) 1319 self.assertNoOutput(err) 1320 self.assertOutput(out, "EXECUTE:nons_app_command1") 1321 1322 def test_nsapps(self): 1323 args = ['app1_command1'] 1324 out, err = self.run_manage(args) 1325 self.assertNoOutput(err) 1326 self.assertOutput(out, "EXECUTE:app1_command1") 1327 1328 args = ['app2_command1'] 1329 out, err = self.run_manage(args) 1330 self.assertNoOutput(err) 1331 self.assertOutput(out, "EXECUTE:app2_command1") 1332 1333 def test_exapps(self): 1334 args = ['app3_command1'] 1335 out, err = self.run_manage(args) 1336 self.assertNoOutput(err) 1337 self.assertOutput(out, "EXECUTE:app3_command1") 1338 1339 class PreloadedNamespacePackagedApps(AdminScriptTestCase): 1340 def setUp(self): 1341 self.write_settings('settings.py', apps=['nsapps.contrib.app1','nsapps.contrib.app2']) 1342 test_dir = os.path.dirname(os.path.dirname(__file__)) 1343 settings_file = open(os.path.join(test_dir, 'settings.py'), 'a') 1344 settings_file.write('import nsapps') 1345 settings_file.close() 1346 1347 def tearDown(self): 1348 self.remove_settings('settings.py') 1349 1350 def test_help(self): 1351 out, err = self.run_manage(['help']) 1352 self.assertOutput(err, "app1_command1") 1353 self.assertOutput(err, "app2_command1") 1354 1355 1356 def test_nsapps(self): 1357 args = ['app1_command1'] 1358 out, err = self.run_manage(args) 1359 self.assertNoOutput(err) 1360 self.assertOutput(out, "EXECUTE:app1_command1") 1361 1362 args = ['app2_command1'] 1363 out, err = self.run_manage(args) 1364 self.assertNoOutput(err) 1365 self.assertOutput(out, "EXECUTE:app2_command1") 1366 1367