Fixed #21284 -- Prevented KeyError swallowing in fetch_command
Thanks wildfire for the report.
This commit is contained in:
parent
a14f087233
commit
3514bcb251
|
@ -257,8 +257,10 @@ class ManagementUtility(object):
|
|||
appropriate command called from the command line (usually
|
||||
"django-admin.py" or "manage.py") if it can't be found.
|
||||
"""
|
||||
# Get commands outside of try block to prevent swallowing exceptions
|
||||
commands = get_commands()
|
||||
try:
|
||||
app_name = get_commands()[subcommand]
|
||||
app_name = commands[subcommand]
|
||||
except KeyError:
|
||||
sys.stderr.write("Unknown command: %r\nType '%s help' for usage.\n" % \
|
||||
(subcommand, self.prog_name))
|
||||
|
|
|
@ -1011,28 +1011,24 @@ class ManageMultipleSettings(AdminScriptTestCase):
|
|||
self.assertOutput(out, "EXECUTE:NoArgsCommand")
|
||||
|
||||
|
||||
class ManageSettingsWithImportError(AdminScriptTestCase):
|
||||
"""Tests for manage.py when using the default settings.py file
|
||||
with an import error. Ticket #14130.
|
||||
class ManageSettingsWithSettingsErrors(AdminScriptTestCase):
|
||||
"""
|
||||
Tests for manage.py when using the default settings.py file containing
|
||||
runtime errors.
|
||||
"""
|
||||
def tearDown(self):
|
||||
self.remove_settings('settings.py')
|
||||
|
||||
def write_settings_with_import_error(self, filename, apps=None, is_dir=False, sdict=None):
|
||||
if is_dir:
|
||||
settings_dir = os.path.join(test_dir, filename)
|
||||
os.mkdir(settings_dir)
|
||||
settings_file_path = os.path.join(settings_dir, '__init__.py')
|
||||
else:
|
||||
def write_settings_with_import_error(self, filename):
|
||||
settings_file_path = os.path.join(test_dir, filename)
|
||||
with open(settings_file_path, 'w') as settings_file:
|
||||
settings_file.write('# Settings file automatically generated by admin_scripts test case\n')
|
||||
settings_file.write('# The next line will cause an import error:\nimport foo42bar\n')
|
||||
|
||||
def test_builtin_command(self):
|
||||
def test_import_error(self):
|
||||
"""
|
||||
import error: manage.py builtin commands shows useful diagnostic info
|
||||
when settings with import errors is provided
|
||||
when settings with import errors is provided (#14130).
|
||||
"""
|
||||
self.write_settings_with_import_error('settings.py')
|
||||
args = ['sqlall', 'admin_scripts']
|
||||
|
@ -1041,9 +1037,10 @@ class ManageSettingsWithImportError(AdminScriptTestCase):
|
|||
self.assertOutput(err, "No module named")
|
||||
self.assertOutput(err, "foo42bar")
|
||||
|
||||
def test_builtin_command_with_attribute_error(self):
|
||||
def test_attribute_error(self):
|
||||
"""
|
||||
manage.py builtin commands does not swallow attribute errors from bad settings (#18845)
|
||||
manage.py builtin commands does not swallow attribute error due to bad
|
||||
settings (#18845).
|
||||
"""
|
||||
self.write_settings('settings.py', sdict={'BAD_VAR': 'INSTALLED_APPS.crash'})
|
||||
args = ['collectstatic', 'admin_scripts']
|
||||
|
@ -1051,6 +1048,13 @@ class ManageSettingsWithImportError(AdminScriptTestCase):
|
|||
self.assertNoOutput(out)
|
||||
self.assertOutput(err, "AttributeError: 'list' object has no attribute 'crash'")
|
||||
|
||||
def test_key_error(self):
|
||||
self.write_settings('settings.py', sdict={'BAD_VAR': 'DATABASES["blah"]'})
|
||||
args = ['collectstatic', 'admin_scripts']
|
||||
out, err = self.run_manage(args)
|
||||
self.assertNoOutput(out)
|
||||
self.assertOutput(err, "KeyError: 'blah'")
|
||||
|
||||
|
||||
class ManageValidate(AdminScriptTestCase):
|
||||
def tearDown(self):
|
||||
|
|
Loading…
Reference in New Issue