Fixed #24776 -- Improved apps.get_app_config() error message on fully-qualified package names.

This commit is contained in:
Peter Inglesby 2015-05-12 10:02:23 +01:00 committed by Tim Graham
parent 70faaccc3e
commit 0688a7946a
4 changed files with 17 additions and 8 deletions

View File

@ -147,7 +147,12 @@ class Apps(object):
try: try:
return self.app_configs[app_label] return self.app_configs[app_label]
except KeyError: except KeyError:
raise LookupError("No installed app with label '%s'." % app_label) message = "No installed app with label '%s'." % app_label
for app_config in self.get_app_configs():
if app_config.name == app_label:
message += " Did you mean '%s'?" % app_config.label
break
raise LookupError(message)
# This method is performance-critical at least for Django's test suite. # This method is performance-critical at least for Django's test suite.
@lru_cache.lru_cache(maxsize=None) @lru_cache.lru_cache(maxsize=None)

View File

@ -68,8 +68,8 @@ class Command(BaseCommand):
else: else:
try: try:
app_config = apps.get_app_config(exclude) app_config = apps.get_app_config(exclude)
except LookupError: except LookupError as e:
raise CommandError('Unknown app in excludes: %s' % exclude) raise CommandError(str(e))
excluded_apps.add(app_config) excluded_apps.add(app_config)
if len(app_labels) == 0: if len(app_labels) == 0:
@ -87,8 +87,8 @@ class Command(BaseCommand):
app_label, model_label = label.split('.') app_label, model_label = label.split('.')
try: try:
app_config = apps.get_app_config(app_label) app_config = apps.get_app_config(app_label)
except LookupError: except LookupError as e:
raise CommandError("Unknown application: %s" % app_label) raise CommandError(str(e))
if app_config.models_module is None or app_config in excluded_apps: if app_config.models_module is None or app_config in excluded_apps:
continue continue
try: try:
@ -111,8 +111,8 @@ class Command(BaseCommand):
app_label = label app_label = label
try: try:
app_config = apps.get_app_config(app_label) app_config = apps.get_app_config(app_label)
except LookupError: except LookupError as e:
raise CommandError("Unknown application: %s" % app_label) raise CommandError(str(e))
if app_config.models_module is None or app_config in excluded_apps: if app_config.models_module is None or app_config in excluded_apps:
continue continue
app_list[app_config] = None app_list[app_config] = None

View File

@ -121,6 +121,10 @@ class AppsTests(SimpleTestCase):
with self.assertRaises(LookupError): with self.assertRaises(LookupError):
apps.get_app_config('webdesign') apps.get_app_config('webdesign')
msg = "No installed app with label 'django.contrib.auth'. Did you mean 'myauth'"
with self.assertRaisesMessage(LookupError, msg):
apps.get_app_config('django.contrib.auth')
@override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS) @override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS)
def test_is_installed(self): def test_is_installed(self):
""" """

View File

@ -216,7 +216,7 @@ class FixtureLoadingTests(DumpDataAssertMixin, TestCase):
# Excluding a bogus app should throw an error # Excluding a bogus app should throw an error
with six.assertRaisesRegex(self, management.CommandError, with six.assertRaisesRegex(self, management.CommandError,
"Unknown app in excludes: foo_app"): "No installed app with label 'foo_app'."):
self._dumpdata_assert(['fixtures', 'sites'], '', exclude_list=['foo_app']) self._dumpdata_assert(['fixtures', 'sites'], '', exclude_list=['foo_app'])
# Excluding a bogus model should throw an error # Excluding a bogus model should throw an error