From 5949c2118d7cc7cffe86cd9db1820b186b88bfc0 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Sat, 14 Jun 2014 18:12:43 +0200 Subject: [PATCH] Restored command error behavior when called from command line Refs #19973. --- django/core/management/base.py | 9 +++++++-- tests/admin_scripts/tests.py | 7 ++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/django/core/management/base.py b/django/core/management/base.py index fbffc89786..b61d0b9b77 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -52,11 +52,14 @@ class CommandParser(ArgumentParser): # Catch missing argument for a better error message if (hasattr(self.cmd, 'missing_args_message') and not (args or any([not arg.startswith('-') for arg in args]))): - raise CommandError("Error: %s" % self.cmd.missing_args_message) + self.error(self.cmd.missing_args_message) return super(CommandParser, self).parse_args(args, namespace) def error(self, message): - raise CommandError("Error: %s" % message) + if self.cmd._called_from_command_line: + super(CommandParser, self).error(message) + else: + raise CommandError("Error: %s" % message) def handle_default_options(options): @@ -208,6 +211,7 @@ class BaseCommand(object): args = '' # Configuration shortcuts that alter various logic. + _called_from_command_line = False can_import_settings = True output_transaction = False # Whether to wrap the output in a "BEGIN; COMMIT;" leave_locale_alone = False @@ -338,6 +342,7 @@ class BaseCommand(object): to stderr. If the ``--traceback`` option is present or the raised ``Exception`` is not ``CommandError``, raise it. """ + self._called_from_command_line = True parser = self.create_parser(argv[0], argv[1]) if self.use_argparse: diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index 48414272ac..b8fea1d0d3 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -1494,7 +1494,7 @@ class CommandTypes(AdminScriptTestCase): "NoArg Commands raise an error if an argument is provided" args = ['noargs_command', 'argument'] out, err = self.run_manage(args) - self.assertOutput(err, "Error: unrecognized arguments: argument") + self.assertOutput(err, "error: unrecognized arguments: argument") def test_app_command(self): "User AppCommands can execute when a single app name is provided" @@ -1508,7 +1508,7 @@ class CommandTypes(AdminScriptTestCase): "User AppCommands raise an error when no app name is provided" args = ['app_command'] out, err = self.run_manage(args) - self.assertOutput(err, 'Error: Enter at least one application label.') + self.assertOutput(err, 'error: Enter at least one application label.') def test_app_command_multiple_apps(self): "User AppCommands raise an error when multiple app names are provided" @@ -1642,9 +1642,10 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase): ] def test_wrong_args(self): - "Make sure passing the wrong kinds of arguments raises a CommandError" + "Make sure passing the wrong kinds of arguments outputs an error and prints usage" out, err = self.run_django_admin(['startproject']) self.assertNoOutput(out) + self.assertOutput(err, "usage:") self.assertOutput(err, "You must provide a project name.") def test_simple_project(self):