Fixed #17037 -- Added a --all option to diffsettings.

This commit is contained in:
Aymeric Augustin 2013-03-17 20:48:30 +01:00
parent 68905695b8
commit 20a91cce04
4 changed files with 31 additions and 6 deletions

View File

@ -1,14 +1,22 @@
from optparse import make_option
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
def module_to_dict(module, omittable=lambda k: k.startswith('_')): def module_to_dict(module, omittable=lambda k: k.startswith('_')):
"Converts a module namespace to a Python dictionary. Used by get_settings_diff." """Converts a module namespace to a Python dictionary."""
return dict([(k, repr(v)) for k, v in module.__dict__.items() if not omittable(k)]) return dict((k, repr(v)) for k, v in module.__dict__.items() if not omittable(k))
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = """Displays differences between the current settings.py and Django's help = """Displays differences between the current settings.py and Django's
default settings. Settings that don't appear in the defaults are default settings. Settings that don't appear in the defaults are
followed by "###".""" followed by "###"."""
option_list = NoArgsCommand.option_list + (
make_option('--all', action='store_true', dest='all', default=False,
help='Display all settings, regardless of their value. '
'Default values are prefixed by "###".'),
)
requires_model_validation = False requires_model_validation = False
def handle_noargs(self, **options): def handle_noargs(self, **options):
@ -22,9 +30,11 @@ class Command(NoArgsCommand):
default_settings = module_to_dict(global_settings) default_settings = module_to_dict(global_settings)
output = [] output = []
for key in sorted(user_settings.keys()): for key in sorted(user_settings):
if key not in default_settings: if key not in default_settings:
output.append("%s = %s ###" % (key, user_settings[key])) output.append("%s = %s ###" % (key, user_settings[key]))
elif user_settings[key] != default_settings[key]: elif user_settings[key] != default_settings[key]:
output.append("%s = %s" % (key, user_settings[key])) output.append("%s = %s" % (key, user_settings[key]))
elif options['all']:
output.append("### %s = %s" % (key, user_settings[key]))
return '\n'.join(output) return '\n'.join(output)

View File

@ -168,8 +168,11 @@ example, the default settings don't define :setting:`ROOT_URLCONF`, so
:setting:`ROOT_URLCONF` is followed by ``"###"`` in the output of :setting:`ROOT_URLCONF` is followed by ``"###"`` in the output of
``diffsettings``. ``diffsettings``.
Note that Django's default settings live in ``django/conf/global_settings.py``, The :djadminopt:`--all` option may be provided to display all settings, even
if you're ever curious to see the full list of defaults. if they have Django's default value. Such settings are prefixed by ``"###"``.
.. versionadded:: 1.6
The :djadminopt:`--all` option was added.
dumpdata <appname appname appname.Model ...> dumpdata <appname appname appname.Model ...>
-------------------------------------------- --------------------------------------------

View File

@ -157,6 +157,8 @@ Minor features
* The documentation contains a :doc:`deployment checklist * The documentation contains a :doc:`deployment checklist
</howto/deployment/checklist>`. </howto/deployment/checklist>`.
* The :djadmin:`diffsettings` comand gained a ``--all`` option.
Backwards incompatible changes in 1.6 Backwards incompatible changes in 1.6
===================================== =====================================

View File

@ -1661,11 +1661,21 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase):
class DiffSettings(AdminScriptTestCase): class DiffSettings(AdminScriptTestCase):
"""Tests for diffsettings management command.""" """Tests for diffsettings management command."""
def test_basic(self): def test_basic(self):
"Runs without error and emits settings diff." """Runs without error and emits settings diff."""
self.write_settings('settings_to_diff.py', sdict={'FOO': '"bar"'}) self.write_settings('settings_to_diff.py', sdict={'FOO': '"bar"'})
self.addCleanup(self.remove_settings, 'settings_to_diff.py') self.addCleanup(self.remove_settings, 'settings_to_diff.py')
args = ['diffsettings', '--settings=settings_to_diff'] args = ['diffsettings', '--settings=settings_to_diff']
out, err = self.run_manage(args) out, err = self.run_manage(args)
self.assertNoOutput(err) self.assertNoOutput(err)
self.assertOutput(out, "FOO = 'bar' ###") self.assertOutput(out, "FOO = 'bar' ###")
def test_all(self):
"""The all option also shows settings with the default value."""
self.write_settings('settings_to_diff.py', sdict={'STATIC_URL': 'None'})
self.addCleanup(self.remove_settings, 'settings_to_diff.py')
args = ['diffsettings', '--settings=settings_to_diff', '--all']
out, err = self.run_manage(args)
self.assertNoOutput(err)
self.assertOutput(out, "### STATIC_URL = None")