config: Support passing directories to mopidy --config

This commit is contained in:
Trygve Aaberge 2014-08-11 14:48:04 +02:00
parent 0863a813fa
commit 9e41eff187
5 changed files with 37 additions and 15 deletions

View File

@ -17,6 +17,8 @@ Bug fix release.
- Logging: Fix that some loggers would be disabled if - Logging: Fix that some loggers would be disabled if
:confval:`logging/config_file` was set. (Fixes: :issue:`740`) :confval:`logging/config_file` was set. (Fixes: :issue:`740`)
- Configuration: :option:`mopidy --config` now supports directories.
v0.19.3 (2014-08-03) v0.19.3 (2014-08-03)
==================== ====================

View File

@ -116,21 +116,14 @@ def _load(files, defaults, overrides):
parser.readfp(io.BytesIO(default)) parser.readfp(io.BytesIO(default))
# Load config from a series of config files # Load config from a series of config files
for filename in files: for name in files:
try: if os.path.isdir(name):
with io.open(filename, 'rb') as filehandle: for filename in os.listdir(name):
parser.readfp(filehandle) filename = os.path.join(name, filename)
except configparser.MissingSectionHeaderError as e: if os.path.isfile(filename):
logger.warning('%s does not have a config section, not loaded.', _load_file(parser, filename)
filename) else:
except configparser.ParsingError as e: _load_file(parser, name)
linenos = ', '.join(str(lineno) for lineno, line in e.errors)
logger.warning(
'%s has errors, line %s has been ignored.', filename, linenos)
except IOError:
# TODO: if this is the initial load of logging config we might not
# have a logger at this point, we might want to handle this better.
logger.debug('Config file %s not found; skipping', filename)
# If there have been parse errors there is a python bug that causes the # If there have been parse errors there is a python bug that causes the
# values to be lists, this little trick coerces these into strings. # values to be lists, this little trick coerces these into strings.
@ -146,6 +139,23 @@ def _load(files, defaults, overrides):
return raw_config return raw_config
def _load_file(parser, filename):
try:
with io.open(filename, 'rb') as filehandle:
parser.readfp(filehandle)
except configparser.MissingSectionHeaderError as e:
logger.warning('%s does not have a config section, not loaded.',
filename)
except configparser.ParsingError as e:
linenos = ', '.join(str(lineno) for lineno, line in e.errors)
logger.warning(
'%s has errors, line %s has been ignored.', filename, linenos)
except IOError:
# TODO: if this is the initial load of logging config we might not
# have a logger at this point, we might want to handle this better.
logger.debug('Config file %s not found; skipping', filename)
def _validate(raw_config, schemas): def _validate(raw_config, schemas):
# Get validated config # Get validated config
config = {} config = {}

View File

@ -60,6 +60,12 @@ class LoadConfigTest(unittest.TestCase):
result = config._load([file1, file2], [], []) result = config._load([file1, file2], [], [])
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_load_directory(self):
directory = path_to_data_dir('conf.d')
expected = {'foo': {'bar': 'baz'}, 'foo2': {'bar': 'baz'}}
result = config._load([directory], [], [])
self.assertEqual(expected, result)
def test_load_file_with_utf8(self): def test_load_file_with_utf8(self):
expected = {'foo': {'bar': 'æøå'.encode('utf-8')}} expected = {'foo': {'bar': 'æøå'.encode('utf-8')}}
result = config._load([path_to_data_dir('file3.conf')], [], []) result = config._load([path_to_data_dir('file3.conf')], [], [])

View File

@ -0,0 +1,2 @@
[foo]
bar = baz

View File

@ -0,0 +1,2 @@
[foo2]
bar = baz