diff options
| author | Tim Graham <timograham@gmail.com> | 2015-08-18 12:46:03 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-09-23 19:31:10 -0400 |
| commit | 6a70cb53971a19f2d9e71d5ee24bfb0e844b4d9d (patch) | |
| tree | a12774fd9787b8f8b4581daca60de6beacf8e943 /django | |
| parent | 3bbebd06adc36f31877a9c0af6c20c5b5a71a900 (diff) | |
Refs #19973 -- Removed optparse support in management commands per deprecation timeline.
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/management/__init__.py | 33 | ||||
| -rw-r--r-- | django/core/management/base.py | 104 | ||||
| -rw-r--r-- | django/core/management/commands/test.py | 7 |
3 files changed, 38 insertions, 106 deletions
diff --git a/django/core/management/__init__.py b/django/core/management/__init__.py index dec7c052b3..7e4982f0a2 100644 --- a/django/core/management/__init__.py +++ b/django/core/management/__init__.py @@ -100,19 +100,16 @@ def call_command(name, *args, **options): # Simulate argument parsing to get the option defaults (see #10080 for details). parser = command.create_parser('', name) - if command.use_argparse: - # Use the `dest` option name from the parser option - opt_mapping = {sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest - for s_opt in parser._actions if s_opt.option_strings} - arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} - defaults = parser.parse_args(args=args) - defaults = dict(defaults._get_kwargs(), **arg_options) - # Move positional args out of options to mimic legacy optparse - args = defaults.pop('args', ()) - else: - # Legacy optparse method - defaults, _ = parser.parse_args(args=[]) - defaults = dict(defaults.__dict__, **options) + # Use the `dest` option name from the parser option + opt_mapping = { + sorted(s_opt.option_strings)[0].lstrip('-').replace('-', '_'): s_opt.dest + for s_opt in parser._actions if s_opt.option_strings + } + arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} + defaults = parser.parse_args(args=args) + defaults = dict(defaults._get_kwargs(), **arg_options) + # Move positional args out of options to mimic legacy optparse + args = defaults.pop('args', ()) if 'skip_checks' not in options: defaults['skip_checks'] = True @@ -249,12 +246,10 @@ class ManagementUtility(object): # user will find out once they execute the command. pass parser = subcommand_cls.create_parser('', cwords[0]) - if subcommand_cls.use_argparse: - options.extend((sorted(s_opt.option_strings)[0], s_opt.nargs != 0) for s_opt in - parser._actions if s_opt.option_strings) - else: - options.extend((s_opt.get_opt_string(), s_opt.nargs != 0) for s_opt in - parser.option_list) + options.extend( + (sorted(s_opt.option_strings)[0], s_opt.nargs != 0) + for s_opt in parser._actions if s_opt.option_strings + ) # filter out previously specified options from available options prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] options = [opt for opt in options if opt[0] not in prev_opts] diff --git a/django/core/management/base.py b/django/core/management/base.py index 7eaea741e0..10d1b728fe 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -9,7 +9,6 @@ import os import sys import warnings from argparse import ArgumentParser -from optparse import OptionParser import django from django.core import checks @@ -152,12 +151,6 @@ class BaseCommand(object): Several attributes affect behavior at various steps along the way: - ``args`` - A string listing the arguments accepted by the command, - suitable for use in help messages; e.g., a command which takes - a list of application names might set this to '<app_label - app_label ...>'. - ``can_import_settings`` A boolean indicating whether the command needs to be able to import Django settings; if ``True``, ``execute()`` will verify @@ -168,12 +161,6 @@ class BaseCommand(object): A short description of the command, which will be printed in help messages. - ``option_list`` - This is the list of ``optparse`` options which will be fed - into the command's ``OptionParser`` for parsing arguments. - Deprecated and will be removed in Django 1.10. - Use ``add_arguments`` instead. - ``output_transaction`` A boolean indicating whether the command outputs SQL statements; if ``True``, the output will automatically be @@ -207,9 +194,7 @@ class BaseCommand(object): to settings. This condition will generate a CommandError. """ # Metadata about this command. - option_list = () help = '' - args = '' # Configuration shortcuts that alter various logic. _called_from_command_line = False @@ -227,10 +212,6 @@ class BaseCommand(object): self.style = color_style() self.stderr.style_func = self.style.ERROR - @property - def use_argparse(self): - return not bool(self.option_list) - def get_version(self): """ Return the Django version, which should be correct for all @@ -255,59 +236,26 @@ class BaseCommand(object): Create and return the ``ArgumentParser`` which will be used to parse the arguments to this command. """ - if not self.use_argparse: - def store_as_int(option, opt_str, value, parser): - setattr(parser.values, option.dest, int(value)) - - # Backwards compatibility: use deprecated optparse module - warnings.warn("OptionParser usage for Django management commands " - "is deprecated, use ArgumentParser instead", - RemovedInDjango110Warning) - parser = OptionParser(prog=prog_name, - usage=self.usage(subcommand), - version=self.get_version()) - parser.add_option('-v', '--verbosity', action='callback', dest='verbosity', default=1, - type='choice', choices=['0', '1', '2', '3'], callback=store_as_int, - help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output') - parser.add_option('--settings', - help=( - 'The Python path to a settings module, e.g. ' - '"myproject.settings.main". If this isn\'t provided, the ' - 'DJANGO_SETTINGS_MODULE environment variable will be used.' - ), - ) - parser.add_option('--pythonpath', - help='A directory to add to the Python path, e.g. "/home/djangoprojects/myproject".'), - parser.add_option('--traceback', action='store_true', - help='Raise on CommandError exceptions') - parser.add_option('--no-color', action='store_true', dest='no_color', default=False, - help="Don't colorize the command output.") - for opt in self.option_list: - parser.add_option(opt) - else: - parser = CommandParser(self, prog="%s %s" % (os.path.basename(prog_name), subcommand), - description=self.help or None) - parser.add_argument('--version', action='version', version=self.get_version()) - parser.add_argument('-v', '--verbosity', action='store', dest='verbosity', default='1', - type=int, choices=[0, 1, 2, 3], - help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output') - parser.add_argument('--settings', - help=( - 'The Python path to a settings module, e.g. ' - '"myproject.settings.main". If this isn\'t provided, the ' - 'DJANGO_SETTINGS_MODULE environment variable will be used.' - ), - ) - parser.add_argument('--pythonpath', - help='A directory to add to the Python path, e.g. "/home/djangoprojects/myproject".') - parser.add_argument('--traceback', action='store_true', - help='Raise on CommandError exceptions') - parser.add_argument('--no-color', action='store_true', dest='no_color', default=False, - help="Don't colorize the command output.") - if self.args: - # Keep compatibility and always accept positional arguments, like optparse when args is set - parser.add_argument('args', nargs='*') - self.add_arguments(parser) + parser = CommandParser(self, prog="%s %s" % (os.path.basename(prog_name), subcommand), + description=self.help or None) + parser.add_argument('--version', action='version', version=self.get_version()) + parser.add_argument('-v', '--verbosity', action='store', dest='verbosity', default='1', + type=int, choices=[0, 1, 2, 3], + help='Verbosity level; 0=minimal output, 1=normal output, 2=verbose output, 3=very verbose output') + parser.add_argument('--settings', + help=( + 'The Python path to a settings module, e.g. ' + '"myproject.settings.main". If this isn\'t provided, the ' + 'DJANGO_SETTINGS_MODULE environment variable will be used.' + ), + ) + parser.add_argument('--pythonpath', + help='A directory to add to the Python path, e.g. "/home/djangoprojects/myproject".') + parser.add_argument('--traceback', action='store_true', + help='Raise on CommandError exceptions') + parser.add_argument('--no-color', action='store_true', dest='no_color', default=False, + help="Don't colorize the command output.") + self.add_arguments(parser) return parser def add_arguments(self, parser): @@ -335,14 +283,10 @@ class BaseCommand(object): self._called_from_command_line = True parser = self.create_parser(argv[0], argv[1]) - if self.use_argparse: - options = parser.parse_args(argv[2:]) - cmd_options = vars(options) - # Move positional args out of options to mimic legacy optparse - args = cmd_options.pop('args', ()) - else: - options, args = parser.parse_args(argv[2:]) - cmd_options = vars(options) + options = parser.parse_args(argv[2:]) + cmd_options = vars(options) + # Move positional args out of options to mimic legacy optparse + args = cmd_options.pop('args', ()) handle_default_options(options) try: self.execute(*args, **cmd_options) diff --git a/django/core/management/commands/test.py b/django/core/management/commands/test.py index ad54994d74..6fdaca944c 100644 --- a/django/core/management/commands/test.py +++ b/django/core/management/commands/test.py @@ -50,13 +50,6 @@ class Command(BaseCommand): 'default value is localhost:8081-8179.'), test_runner_class = get_runner(settings, self.test_runner) - if hasattr(test_runner_class, 'option_list'): - # Keeping compatibility with both optparse and argparse at this level - # would be too heavy for a non-critical item - raise RuntimeError( - "The method to extend accepted command-line arguments by the " - "test management command has changed in Django 1.8. Please " - "create an add_arguments class method to achieve this.") if hasattr(test_runner_class, 'add_arguments'): test_runner_class.add_arguments(parser) |
