Ticket #14087: namespace_package_pth.diff

File namespace_package_pth.diff, 16.9 KB (added by bhuztez, 13 years ago)

a dirty fix for pth

  • 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  
    55
    66import django
    77from django.core.management.base import BaseCommand, CommandError, handle_default_options
    8 from django.utils.importlib import import_module
     8from django.utils.importlib import import_module, find_modules
    99
    1010# For backwards compatibility: get_version() used to be in this module.
    1111get_version = django.get_version
    def find_management_module(app_name):  
    3636    Raises ImportError if the management module cannot be found for any reason.
    3737    """
    3838    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
    5568
    5669    while parts:
    5770        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]
    6074
    6175def load_command_class(app_name, name):
    6276    """
  • django/utils/importlib.py

    diff --git a/django/utils/importlib.py b/django/utils/importlib.py
    index ef4d0e4..1507a2b 100644
    a b  
    11# Taken from Python 2.7 with permission from/by the original author.
    22import sys
     3import imp
    34
    45def _resolve_name(name, package, level):
    56    """Return the absolute name of the module to be imported."""
    def import_module(name, package=None):  
    3435        name = _resolve_name(name[level:], package, level)
    3536    __import__(name)
    3637    return sys.modules[name]
     38
     39
     40def 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
    - +  
     1from django.core.management.base import BaseCommand
     2
     3class 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
     2try:
     3    __import__('pkg_resources').declare_namespace(__name__)
     4except 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
     2try:
     3    __import__('pkg_resources').declare_namespace(__name__)
     4except 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
    - +  
     1from django.core.management.base import BaseCommand
     2
     3class 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
     2try:
     3    __import__('pkg_resources').declare_namespace(__name__)
     4except 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
     2try:
     3    __import__('pkg_resources').declare_namespace(__name__)
     4except 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
    - +  
     1from django.core.management.base import BaseCommand
     2
     3class 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
    - +  
     1import 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
    - +  
     1import 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
    - +  
     1from django.core.management.base import BaseCommand
     2
     3class 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):  
    8484        test_dir = os.path.dirname(os.path.dirname(__file__))
    8585        project_dir = os.path.dirname(test_dir)
    8686        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')
    8790        ext_backend_base_dirs = self._ext_backend_paths()
    8891
    8992        # Remember the old environment
    class AdminScriptTestCase(unittest.TestCase):  
    101104            os.environ['DJANGO_SETTINGS_MODULE'] = settings_file
    102105        elif 'DJANGO_SETTINGS_MODULE' in os.environ:
    103106            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]
    105108        python_path.extend(ext_backend_base_dirs)
    106109        os.environ[python_path_var_name] = os.pathsep.join(python_path)
    107110
    class ArgumentOrder(AdminScriptTestCase):  
    12911294        out, err = self.run_manage(args)
    12921295        self.assertNoOutput(err)
    12931296        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
     1298class 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
     1339class 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
Back to Top