diff --git a/mopidy/utils/settings.py b/mopidy/utils/settings.py index 7f541c21..2bd6e6f3 100644 --- a/mopidy/utils/settings.py +++ b/mopidy/utils/settings.py @@ -3,6 +3,7 @@ from __future__ import absolute_import from copy import copy import logging import os +from pprint import pformat import sys from mopidy import SettingsError @@ -140,19 +141,22 @@ def list_settings_optparse_callback(*args): option. """ from mopidy import settings + print format_settings_list(settings) + sys.exit(0) + +def format_settings_list(settings): errors = settings.get_errors() lines = [] for (key, value) in sorted(settings.current.iteritems()): default_value = settings.default.get(key) - value = mask_value_if_secret(key, value) - lines.append(u'%s:' % key) - lines.append(u' Value: %s' % repr(value)) + masked_value = mask_value_if_secret(key, value) + lines.append(u'%s: %s' % (key, indent(pformat(masked_value), places=2))) if value != default_value and default_value is not None: - lines.append(u' Default: %s' % repr(default_value)) + lines.append(u' Default: %s' % + indent(pformat(default_value), places=4)) if errors.get(key) is not None: lines.append(u' Error: %s' % errors[key]) - print u'Settings: %s' % indent('\n'.join(lines), places=2) - sys.exit(0) + return '\n'.join(lines) def mask_value_if_secret(key, value): if key.endswith('PASSWORD') and value: diff --git a/tests/utils/settings_test.py b/tests/utils/settings_test.py index 11914f61..1ffff9a6 100644 --- a/tests/utils/settings_test.py +++ b/tests/utils/settings_test.py @@ -2,8 +2,8 @@ import os import unittest from mopidy import settings as default_settings_module, SettingsError -from mopidy.utils.settings import validate_settings, SettingsProxy -from mopidy.utils.settings import mask_value_if_secret +from mopidy.utils.settings import (format_settings_list, mask_value_if_secret, + SettingsProxy, validate_settings) class ValidateSettingsTest(unittest.TestCase): def setUp(self): @@ -140,3 +140,48 @@ class SettingsProxyTest(unittest.TestCase): self.settings.TEST = './test' actual = self.settings.TEST self.assertEqual(actual, './test') + + +class FormatSettingListTest(unittest.TestCase): + def setUp(self): + self.settings = SettingsProxy(default_settings_module) + + def test_contains_the_setting_name(self): + self.settings.TEST = u'test' + result = format_settings_list(self.settings) + self.assert_('TEST:' in result, result) + + def test_repr_of_a_string_value(self): + self.settings.TEST = u'test' + result = format_settings_list(self.settings) + self.assert_("TEST: u'test'" in result, result) + + def test_repr_of_an_int_value(self): + self.settings.TEST = 123 + result = format_settings_list(self.settings) + self.assert_("TEST: 123" in result, result) + + def test_repr_of_a_tuple_value(self): + self.settings.TEST = (123, u'abc') + result = format_settings_list(self.settings) + self.assert_("TEST: (123, u'abc')" in result, result) + + def test_passwords_are_masked(self): + self.settings.TEST_PASSWORD = u'secret' + result = format_settings_list(self.settings) + self.assert_("TEST_PASSWORD: u'secret'" not in result, result) + self.assert_("TEST_PASSWORD: u'********'" in result, result) + + def test_short_values_are_not_pretty_printed(self): + self.settings.FRONTEND = (u'mopidy.frontends.mpd.MpdFrontend',) + result = format_settings_list(self.settings) + self.assert_("FRONTEND: (u'mopidy.frontends.mpd.MpdFrontend',)" in result, + result) + + def test_long_values_are_pretty_printed(self): + self.settings.FRONTEND = (u'mopidy.frontends.mpd.MpdFrontend', + u'mopidy.frontends.lastfm.LastfmFrontend') + result = format_settings_list(self.settings) + self.assert_("""FRONTEND: + (u'mopidy.frontends.mpd.MpdFrontend', + u'mopidy.frontends.lastfm.LastfmFrontend')""" in result, result)