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
:confval:`logging/config_file` was set. (Fixes: :issue:`740`)
- Configuration: :option:`mopidy --config` now supports directories.
v0.19.3 (2014-08-03)
====================

View File

@ -116,21 +116,14 @@ def _load(files, defaults, overrides):
parser.readfp(io.BytesIO(default))
# Load config from a series of config files
for filename in files:
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)
for name in files:
if os.path.isdir(name):
for filename in os.listdir(name):
filename = os.path.join(name, filename)
if os.path.isfile(filename):
_load_file(parser, filename)
else:
_load_file(parser, name)
# 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.
@ -146,6 +139,23 @@ def _load(files, defaults, overrides):
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):
# Get validated config
config = {}

View File

@ -60,6 +60,12 @@ class LoadConfigTest(unittest.TestCase):
result = config._load([file1, file2], [], [])
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):
expected = {'foo': {'bar': 'æøå'.encode('utf-8')}}
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