Skip to content

Commit

Permalink
Merge pull request #804 from thecardcheat/django-110-deprecations
Browse files Browse the repository at this point in the history
Transition command files to argparse compatibility.
  • Loading branch information
trbs committed Jan 24, 2016
2 parents 1e92150 + 160aaa8 commit f3d80be
Show file tree
Hide file tree
Showing 43 changed files with 629 additions and 532 deletions.
40 changes: 39 additions & 1 deletion django_extensions/compat.py
Expand Up @@ -2,9 +2,11 @@
from __future__ import unicode_literals

import sys
from optparse import make_option
import django
from django.conf import settings
from django.core.management.base import CommandError
from django.core.management.base import (BaseCommand, AppCommand, LabelCommand,
CommandError)

# flake8: noqa

Expand Down Expand Up @@ -195,3 +197,39 @@ def add_to_builtins_compat(name):
else:
from django.template import engines
engines['django'].engine.builtins.append(name)


class ProxyParser(object):
"""Faux parser object that will ferry our arguments into options."""

def __init__(self, command):
self.command = command

def add_argument(self, *args, **kwargs):
self.command.option_list += (make_option(*args, **kwargs), )

class CompatibilityBaseCommand(BaseCommand):
"""Provides a compatibility between optparse and argparse transition.
Starting in Django 1.8, argparse is used. In Django 1.9, optparse support
will be removed.
For optparse, you append to the option_list class attribute.
For argparse, you must define add_arguments(self, parser).
BaseCommand uses the presence of option_list to decide what course to take.
"""

def __init__(self, *args, **kwargs):
if django.VERSION < (1, 8) and hasattr(self, 'add_arguments'):
self.option_list = BaseCommand.option_list
parser = ProxyParser(self)
self.add_arguments(parser)
super(CompatibilityBaseCommand, self).__init__(*args, **kwargs)


class CompatibilityAppCommand(AppCommand, CompatibilityBaseCommand):
"""AppCommand is a BaseCommand sub-class without its own __init__."""


class CompatibilityLabelCommand(LabelCommand, CompatibilityBaseCommand):
"""LabelCommand is a BaseCommand sub-class without its own __init__."""
33 changes: 16 additions & 17 deletions django_extensions/management/commands/admin_generator.py
Expand Up @@ -15,17 +15,16 @@
https://github.com/WoLpH/django-admin-generator/
"""

import optparse
import re
import sys

from django.conf import settings
from django.core.management.base import BaseCommand
from django.db import models

from django_extensions.compat import get_apps, get_models_compat
from django_extensions.management.color import color_style
from django_extensions.management.utils import signalcommand
from django_extensions.compat import CompatibilityBaseCommand as BaseCommand

# Configurable constants
MAX_LINE_WIDTH = getattr(settings, 'MAX_LINE_WIDTH', 78)
Expand Down Expand Up @@ -291,35 +290,35 @@ def _process(self):

class Command(BaseCommand):
help = '''Generate a `admin.py` file for the given app (models)'''
option_list = BaseCommand.option_list + (
optparse.make_option(
can_import_settings = True

def add_arguments(self, parser):
parser.add_argument(
'-s', '--search-field', action='append',
default=SEARCH_FIELD_NAMES,
help='Fields named like this will be added to `search_fields`'
' [default: %default]'),
optparse.make_option(
' [default: %default]')
parser.add_argument(
'-d', '--date-hierarchy', action='append',
default=DATE_HIERARCHY_NAMES,
help='A field named like this will be set as `date_hierarchy`'
' [default: %default]'),
optparse.make_option(
' [default: %default]')
parser.add_argument(
'-p', '--prepopulated-fields', action='append',
default=PREPOPULATED_FIELD_NAMES,
help='These fields will be prepopulated by the other field.'
'The field names can be specified like `spam=eggA,eggB,eggC`'
' [default: %default]'),
optparse.make_option(
'-l', '--list-filter-threshold', type='int',
' [default: %default]')
parser.add_argument(
'-l', '--list-filter-threshold', type=int,
default=LIST_FILTER_THRESHOLD, metavar='LIST_FILTER_THRESHOLD',
help='If a foreign key has less than LIST_FILTER_THRESHOLD items '
'it will be added to `list_filter` [default: %default]'),
optparse.make_option(
'-r', '--raw-id-threshold', type='int',
'it will be added to `list_filter` [default: %default]')
parser.add_argument(
'-r', '--raw-id-threshold', type=int,
default=RAW_ID_THRESHOLD, metavar='RAW_ID_THRESHOLD',
help='If a foreign key has more than RAW_ID_THRESHOLD items '
'it will be added to `list_filter` [default: %default]'),
)
can_import_settings = True
'it will be added to `list_filter` [default: %default]')

@signalcommand
def handle(self, *args, **kwargs):
Expand Down
22 changes: 11 additions & 11 deletions django_extensions/management/commands/clean_pyc.py
@@ -1,29 +1,29 @@
# coding=utf-8
import fnmatch
import os
from optparse import make_option
from os.path import join as _j

from django.conf import settings
from django.core.management.base import CommandError, NoArgsCommand
from django.core.management.base import CommandError

from django_extensions.management.utils import signalcommand
from django_extensions.compat import CompatibilityBaseCommand as BaseCommand


class Command(NoArgsCommand):
option_list = NoArgsCommand.option_list + (
make_option('--optimize', '-o', '-O', action='store_true',
dest='optimize',
help='Remove optimized python bytecode files'),
make_option('--path', '-p', action='store', dest='path',
help='Specify path to recurse into'),
)
class Command(BaseCommand):
help = "Removes all python bytecode compiled files from the project."

requires_system_checks = False

def add_arguments(self, parser):
parser.add_argument('--optimize', '-o', '-O', action='store_true',
dest='optimize',
help='Remove optimized python bytecode files')
parser.add_argument('--path', '-p', action='store', dest='path',
help='Specify path to recurse into')

@signalcommand
def handle_noargs(self, **options):
def handle(self, *args, **options):
project_root = options.get("path", getattr(settings, 'BASE_DIR', None))
if not project_root:
project_root = getattr(settings, 'BASE_DIR', None)
Expand Down
2 changes: 1 addition & 1 deletion django_extensions/management/commands/clear_cache.py
@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
# Author: AxiaCore S.A.S. http://axiacore.com
from django.core.cache import cache
from django.core.management.base import BaseCommand

from django_extensions.management.utils import signalcommand
from django_extensions.compat import CompatibilityBaseCommand as BaseCommand


class Command(BaseCommand):
Expand Down
17 changes: 8 additions & 9 deletions django_extensions/management/commands/compile_pyc.py
Expand Up @@ -2,26 +2,25 @@
import fnmatch
import os
import py_compile
from optparse import make_option
from os.path import join as _j

from django.conf import settings
from django.core.management.base import CommandError, NoArgsCommand
from django.core.management.base import CommandError

from django_extensions.management.utils import signalcommand
from django_extensions.compat import CompatibilityBaseCommand as BaseCommand


class Command(NoArgsCommand):
option_list = NoArgsCommand.option_list + (
make_option('--path', '-p', action='store', dest='path',
help='Specify path to recurse into'),
)
class Command(BaseCommand):
help = "Compile python bytecode files for the project."

requires_system_checks = False

def add_arguments(self, parser):
parser.add_argument('--path', '-p', action='store', dest='path',
help='Specify path to recurse into')

@signalcommand
def handle_noargs(self, **options):
def handle(self, *args, **options):
project_root = options.get("path", None)
if not project_root:
project_root = getattr(settings, 'BASE_DIR', None)
Expand Down
29 changes: 16 additions & 13 deletions django_extensions/management/commands/create_app.py
Expand Up @@ -2,39 +2,42 @@
import os
import re
import sys
from optparse import make_option

from django import VERSION
from django.conf import settings
from django.core.management.base import CommandError, LabelCommand
from django.core.management.base import CommandError
from django.db import connection
from django.template import Context, Template

import django_extensions
from django_extensions.management.utils import _make_writeable, signalcommand
from django_extensions.settings import REPLACEMENTS
from django_extensions.utils.dia2django import dia2django
from django_extensions.compat import CompatibilityLabelCommand as LabelCommand


class Command(LabelCommand):
option_list = LabelCommand.option_list + (
make_option('--template', '-t', action='store', dest='app_template',
help='The path to the app template'),
make_option('--parent_path', '-p', action='store', dest='parent_path',
help='The parent path of the application to be created'),
make_option('-d', action='store_true', dest='dia_parse',
help='Generate model.py and admin.py from [APP_NAME].dia file'),
make_option('--diagram', action='store', dest='dia_path',
help='The diagram path of the app to be created. -d is implied'),
)

help = "Creates an application directory structure for the specified application name."
args = "APP_NAME"
label = 'application name'

requires_system_checks = False
can_import_settings = True

def add_arguments(self, parser):
parser.add_argument(
'--template', '-t', action='store', dest='app_template',
help='The path to the app template')
parser.add_argument(
'--parent_path', '-p', action='store', dest='parent_path',
help='The parent path of the application to be created')
parser.add_argument(
'-d', action='store_true', dest='dia_parse',
help='Generate model.py and admin.py from [APP_NAME].dia file')
parser.add_argument(
'--diagram', action='store', dest='dia_path',
help='The diagram path of the app to be created. -d is implied')

@signalcommand
def handle_label(self, label, **options):
project_dir = os.getcwd()
Expand Down
21 changes: 11 additions & 10 deletions django_extensions/management/commands/create_command.py
Expand Up @@ -3,22 +3,13 @@
import sys
import shutil

from optparse import make_option

from django.core.management.base import AppCommand
from django.core.management.color import color_style

from django_extensions.management.utils import _make_writeable, signalcommand
from django_extensions.compat import CompatibilityAppCommand as AppCommand


class Command(AppCommand):
option_list = AppCommand.option_list + (
make_option('--name', '-n', action='store', dest='command_name', default='sample',
help='The name to use for the management command'),
make_option('--base', '-b', action='store', dest='base_command', default='Base',
help='The base class used for implementation of this command. Should be one of Base, App, Label, or NoArgs'),
)

help = ("Creates a Django management command directory structure for the given app name"
" in the app's directory.")
args = "[appname]"
Expand All @@ -29,6 +20,16 @@ class Command(AppCommand):
# necessarily been created.
can_import_settings = True

def add_arguments(self, parser):
parser.add_argument(
'--name', '-n', action='store', dest='command_name',
default='sample',
help='The name to use for the management command')
parser.add_argument(
'--base', '-b', action='store', dest='base_command',
default='Base', help='The base class used for implementation of '
'this command. Should be one of Base, App, Label, or NoArgs')

@signalcommand
def handle_app_config(self, app, **options):
copy_template('command_template', app.path, **options)
Expand Down
2 changes: 1 addition & 1 deletion django_extensions/management/commands/create_jobs.py
Expand Up @@ -3,9 +3,9 @@
import sys
import shutil

from django.core.management.base import AppCommand
from django.core.management.color import color_style

from django_extensions.compat import CompatibilityAppCommand as AppCommand
from django_extensions.management.utils import _make_writeable, signalcommand


Expand Down
16 changes: 8 additions & 8 deletions django_extensions/management/commands/create_template_tags.py
@@ -1,24 +1,24 @@
# coding=utf-8
import os
import sys
from optparse import make_option

from django.core.management.base import AppCommand

from django_extensions.compat import CompatibilityAppCommand as AppCommand
from django_extensions.management.utils import _make_writeable, signalcommand


class Command(AppCommand):
option_list = AppCommand.option_list + (
make_option('--name', '-n', action='store', dest='tag_library_name', default='appname_tags',
help='The name to use for the template tag base name. Defaults to `appname`_tags.'),
)

help = ("Creates a Django template tags directory structure for the given app name"
" in the apps's directory")
args = "[appname]"
label = 'application name'

def add_arguments(self, parser):
parser.add_argument(
'--name', '-n', action='store', dest='tag_library_name',
default='appname_tags',
help='The name to use for the template tag base name. '
'Defaults to `appname`_tags.')

requires_system_checks = False
# Can't import settings during this command, because they haven't
# necessarily been created.
Expand Down
3 changes: 2 additions & 1 deletion django_extensions/management/commands/describe_form.py
@@ -1,7 +1,8 @@
# coding=utf-8
from django.core.management.base import CommandError, LabelCommand
from django.core.management.base import CommandError

from django_extensions.management.utils import signalcommand
from django_extensions.compat import CompatibilityLabelCommand as LabelCommand

try:
from django.utils.encoding import force_text
Expand Down

0 comments on commit f3d80be

Please sign in to comment.