Merge pull request #107 from knutz3n/feature/interactive-settings

This commit is contained in:
Stein Magnus Jodal 2011-06-09 11:47:45 -07:00
commit b8d4af8367
5 changed files with 41 additions and 11 deletions

View File

@ -70,6 +70,9 @@ Please note that 0.5.0 requires some updated dependencies, as listed under
- Improve :option:`--list-settings` output. (Fixes: :issue:`91`)
- Added :option:`--interactive` for reading missing local settings from
``stdin``. (Fixes: :issue:`96`)
- Tag cache generator:
- Made it possible to abort :command:`mopidy-scan` with CTRL+C.

View File

@ -28,15 +28,15 @@ from mopidy.utils.settings import list_settings_optparse_callback
logger = logging.getLogger('mopidy.core')
def main():
options = parse_options()
setup_logging(options.verbosity_level, options.save_debug_log)
setup_settings()
setup_gobject_loop()
setup_gstreamer()
setup_mixer()
setup_backend()
setup_frontends()
try:
options = parse_options()
setup_logging(options.verbosity_level, options.save_debug_log)
setup_settings(options.interactive)
setup_gobject_loop()
setup_gstreamer()
setup_mixer()
setup_backend()
setup_frontends()
while ActorRegistry.get_all():
time.sleep(1)
logger.info(u'No actors left. Exiting...')
@ -49,6 +49,9 @@ def parse_options():
parser.add_option('--help-gst',
action='store_true', dest='help_gst',
help='show GStreamer help options')
parser.add_option('-i', '--interactive',
action='store_true', dest='interactive',
help='ask interactively for required settings which is missing')
parser.add_option('-q', '--quiet',
action='store_const', const=0, dest='verbosity_level',
help='less output (warning level)')
@ -63,11 +66,11 @@ def parse_options():
help='list current settings')
return parser.parse_args(args=mopidy_args)[0]
def setup_settings():
def setup_settings(interactive):
get_or_create_folder('~/.mopidy/')
get_or_create_file('~/.mopidy/settings.py')
try:
settings.validate()
settings.validate(interactive)
except SettingsError, e:
logger.error(e.message)
sys.exit(1)

View File

@ -1,6 +1,7 @@
# Absolute import needed to import ~/.mopidy/settings.py and not ourselves
from __future__ import absolute_import
from copy import copy
import getpass
import logging
import os
from pprint import pformat
@ -63,12 +64,28 @@ class SettingsProxy(object):
else:
super(SettingsProxy, self).__setattr__(attr, value)
def validate(self):
def validate(self, interactive):
if interactive:
self._read_missing_settings_from_stdin(self.default, self.local)
if self.get_errors():
logger.error(u'Settings validation errors: %s',
indent(self.get_errors_as_string()))
raise SettingsError(u'Settings validation failed.')
def _read_missing_settings_from_stdin(self, default, local):
for setting, value in default.iteritems():
if isinstance(value, basestring) and len(value) == 0:
local[setting] = self._read_from_stdin(setting + u': ')
def _read_from_stdin(self, prompt):
if u'_PASSWORD' in prompt:
return (getpass.getpass(prompt)
.decode(sys.stdin.encoding, 'ignore'))
else:
sys.stdout.write(prompt)
return (sys.stdin.readline().strip()
.decode(sys.stdin.encoding, 'ignore'))
def get_errors(self):
return validate_settings(self.default, self.local)

View File

@ -14,6 +14,7 @@ class HelpTest(unittest.TestCase):
self.assert_('--version' in output)
self.assert_('--help' in output)
self.assert_('--help-gst' in output)
self.assert_('--interactive' in output)
self.assert_('--quiet' in output)
self.assert_('--verbose' in output)
self.assert_('--save-debug-log' in output)

View File

@ -149,6 +149,12 @@ class SettingsProxyTest(unittest.TestCase):
actual = self.settings.TEST
self.assertEqual(actual, './test')
def test_interactive_input_of_missing_defaults(self):
self.settings.default['TEST'] = ''
interactive_input = 'input'
self.settings._read_from_stdin = lambda _: interactive_input
self.settings.validate(interactive=True)
self.assertEqual(interactive_input, self.settings.TEST)
class FormatSettingListTest(unittest.TestCase):
def setUp(self):