From ce1bc2c94b30a42a2c7c0d58e6cb6d8875cadf60 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Thu, 26 Dec 2013 18:40:28 +0100 Subject: [PATCH] Made the AppConfig API marginally more consistent. Eliminated the app_ prefix that was more confusing than useful. --- django/apps/base.py | 17 ++++++++++------- django/contrib/comments/__init__.py | 2 +- django/core/management/commands/migrate.py | 2 +- django/test/simple.py | 2 +- django/utils/module_loading.py | 2 +- docs/ref/applications.txt | 2 +- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/django/apps/base.py b/django/apps/base.py index 5d2cfd88a7b..3f9f2d9bcd7 100644 --- a/django/apps/base.py +++ b/django/apps/base.py @@ -13,13 +13,13 @@ class AppConfig(object): Class representing a Django application and its configuration. """ - def __init__(self, app_name): + def __init__(self, app_name, app_module): # Full Python path to the application eg. 'django.contrib.admin'. self.name = app_name # Root module for the application eg. . - self.app_module = import_module(app_name) + self.module = app_module # The following attributes could be defined at the class level in a # subclass, hence the test-and-set pattern. @@ -39,7 +39,7 @@ class AppConfig(object): # egg. Otherwise it's a unicode on Python 2 and a str on Python 3. if not hasattr(self, 'path'): try: - self.path = upath(self.app_module.__path__[0]) + self.path = upath(app_module.__path__[0]) except AttributeError: self.path = None @@ -63,7 +63,7 @@ class AppConfig(object): try: # If import_module succeeds, entry is a path to an app module. # Otherwise, entry is a path to an app config class or an error. - import_module(entry) + module = import_module(entry) except ImportError: # Raise the original exception when entry cannot be a path to an @@ -88,12 +88,15 @@ class AppConfig(object): raise ImproperlyConfigured( "%r must supply a name attribute." % entry) + # Ensure app_names points to a valid module. + app_module = import_module(app_name) + # Entry is a path to an app config class. - return cls(app_name) + return cls(app_name, app_module) else: # Entry is a path to an app module. - return cls(entry) + return cls(entry, module) def import_models(self, all_models): # Dictionary of models for this app, primarily maintained in the @@ -102,6 +105,6 @@ class AppConfig(object): # imported, which may happen before populate_models() runs. self.models = all_models - if module_has_submodule(self.app_module, MODELS_MODULE_NAME): + if module_has_submodule(self.module, MODELS_MODULE_NAME): models_module_name = '%s.%s' % (self.name, MODELS_MODULE_NAME) self.models_module = import_module(models_module_name) diff --git a/django/contrib/comments/__init__.py b/django/contrib/comments/__init__.py index a6286b48ed1..19dd7ef9a16 100644 --- a/django/contrib/comments/__init__.py +++ b/django/contrib/comments/__init__.py @@ -20,7 +20,7 @@ def get_comment_app(): except LookupError: raise ImproperlyConfigured("The COMMENTS_APP (%r) " "must be in INSTALLED_APPS" % settings.COMMENTS_APP) - return app_config.app_module + return app_config.module def get_comment_app_name(): """ diff --git a/django/core/management/commands/migrate.py b/django/core/management/commands/migrate.py index 1f5e9619c71..1c808f1c7ea 100644 --- a/django/core/management/commands/migrate.py +++ b/django/core/management/commands/migrate.py @@ -47,7 +47,7 @@ class Command(BaseCommand): # Import the 'management' module within each installed app, to register # dispatcher events. for app_config in apps.get_app_configs(): - if module_has_submodule(app_config.app_module, "management"): + if module_has_submodule(app_config.module, "management"): import_module('.management', app_config.name) # Get the database we're operating from diff --git a/django/test/simple.py b/django/test/simple.py index fa70738447c..5f33044de6a 100644 --- a/django/test/simple.py +++ b/django/test/simple.py @@ -102,7 +102,7 @@ def get_tests(app_config): except ImportError: # Couldn't import tests.py. Was it due to a missing file, or # due to an import error in a tests.py that actually exists? - if not module_has_submodule(app_config.app_module, TEST_MODULE): + if not module_has_submodule(app_config.module, TEST_MODULE): test_module = None else: # The module exists, so there must be an import error in the test diff --git a/django/utils/module_loading.py b/django/utils/module_loading.py index 1ed7d93e31a..bd012cd55ba 100644 --- a/django/utils/module_loading.py +++ b/django/utils/module_loading.py @@ -80,7 +80,7 @@ def autodiscover_modules(*args, **kwargs): # Decide whether to bubble up this error. If the app just # doesn't have an admin module, we can ignore the error # attempting to import it, otherwise we want it to bubble up. - if module_has_submodule(app_config.app_module, module_to_search): + if module_has_submodule(app_config.module, module_to_search): raise diff --git a/docs/ref/applications.txt b/docs/ref/applications.txt index a675d55a9df..15cc481f510 100644 --- a/docs/ref/applications.txt +++ b/docs/ref/applications.txt @@ -141,7 +141,7 @@ Read-only attributes It may be ``None`` if the application isn't stored in a directory, for instance if it's loaded from an egg. -.. attribute:: AppConfig.app_module +.. attribute:: AppConfig.module Root module for the application, e.g. ````.