From 0863a813fafc67ce785204c27f77452584a6cf2d Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Mon, 11 Aug 2014 13:43:18 +0200 Subject: [PATCH 1/6] main: Return status code 1 if {Backend,Frontend,Mixer}Error is raised --- mopidy/commands.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mopidy/commands.py b/mopidy/commands.py index f7c71d4e..db012208 100644 --- a/mopidy/commands.py +++ b/mopidy/commands.py @@ -276,8 +276,10 @@ class RootCommand(Command): exceptions.FrontendError, exceptions.MixerError): logger.info('Initialization error. Exiting...') + exit_status_code = 1 except KeyboardInterrupt: logger.info('Interrupted. Exiting...') + exit_status_code = 0 finally: loop.quit() self.stop_frontends(frontend_classes) @@ -286,6 +288,7 @@ class RootCommand(Command): self.stop_audio() self.stop_mixer(mixer_class) process.stop_remaining_actors() + return exit_status_code def get_mixer_class(self, config, mixer_classes): logger.debug( From 9e41eff187b68a19375ce7c79b5967f7b2699e60 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Mon, 11 Aug 2014 14:48:04 +0200 Subject: [PATCH 2/6] config: Support passing directories to mopidy --config --- docs/changelog.rst | 2 ++ mopidy/config/__init__.py | 40 ++++++++++++++++++++++-------------- tests/config/test_config.py | 6 ++++++ tests/data/conf.d/file1.conf | 2 ++ tests/data/conf.d/file2.conf | 2 ++ 5 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 tests/data/conf.d/file1.conf create mode 100644 tests/data/conf.d/file2.conf diff --git a/docs/changelog.rst b/docs/changelog.rst index 8409054a..42075ecd 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -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) ==================== diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index 3b63a1ab..09cdc0ca 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -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 = {} diff --git a/tests/config/test_config.py b/tests/config/test_config.py index 52035825..6a0ee12b 100644 --- a/tests/config/test_config.py +++ b/tests/config/test_config.py @@ -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')], [], []) diff --git a/tests/data/conf.d/file1.conf b/tests/data/conf.d/file1.conf new file mode 100644 index 00000000..e6396bff --- /dev/null +++ b/tests/data/conf.d/file1.conf @@ -0,0 +1,2 @@ +[foo] +bar = baz diff --git a/tests/data/conf.d/file2.conf b/tests/data/conf.d/file2.conf new file mode 100644 index 00000000..ef189703 --- /dev/null +++ b/tests/data/conf.d/file2.conf @@ -0,0 +1,2 @@ +[foo2] +bar = baz From 4ea5271362ebbaa7015a7a993f9b230334842d53 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Mon, 11 Aug 2014 16:13:40 +0200 Subject: [PATCH 3/6] docs: Return exit status 1 on initialization error --- docs/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 8409054a..8fdbb8ba 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -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`) +- Core: Return exit status 1 when exiting because of initialization error. + v0.19.3 (2014-08-03) ==================== From 584484379a9c98d9686e11fce821cd9681a4759b Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Mon, 11 Aug 2014 16:21:34 +0200 Subject: [PATCH 4/6] config: Only load .conf-files when loading directories --- mopidy/config/__init__.py | 2 +- tests/config/test_config.py | 8 +++++++- tests/data/{conf.d => conf1.d}/file1.conf | 0 tests/data/{conf.d => conf1.d}/file2.conf | 0 tests/data/conf2.d/file1.conf | 2 ++ tests/data/conf2.d/file2.conf.disabled | 2 ++ 6 files changed, 12 insertions(+), 2 deletions(-) rename tests/data/{conf.d => conf1.d}/file1.conf (100%) rename tests/data/{conf.d => conf1.d}/file2.conf (100%) create mode 100644 tests/data/conf2.d/file1.conf create mode 100644 tests/data/conf2.d/file2.conf.disabled diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index 09cdc0ca..5611c717 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -120,7 +120,7 @@ def _load(files, defaults, overrides): if os.path.isdir(name): for filename in os.listdir(name): filename = os.path.join(name, filename) - if os.path.isfile(filename): + if os.path.isfile(filename) and filename.endswith('.conf'): _load_file(parser, filename) else: _load_file(parser, name) diff --git a/tests/config/test_config.py b/tests/config/test_config.py index 6a0ee12b..da0e5192 100644 --- a/tests/config/test_config.py +++ b/tests/config/test_config.py @@ -61,11 +61,17 @@ class LoadConfigTest(unittest.TestCase): self.assertEqual(expected, result) def test_load_directory(self): - directory = path_to_data_dir('conf.d') + directory = path_to_data_dir('conf1.d') expected = {'foo': {'bar': 'baz'}, 'foo2': {'bar': 'baz'}} result = config._load([directory], [], []) self.assertEqual(expected, result) + def test_load_directory_only_conf_files(self): + directory = path_to_data_dir('conf2.d') + expected = {'foo': {'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')], [], []) diff --git a/tests/data/conf.d/file1.conf b/tests/data/conf1.d/file1.conf similarity index 100% rename from tests/data/conf.d/file1.conf rename to tests/data/conf1.d/file1.conf diff --git a/tests/data/conf.d/file2.conf b/tests/data/conf1.d/file2.conf similarity index 100% rename from tests/data/conf.d/file2.conf rename to tests/data/conf1.d/file2.conf diff --git a/tests/data/conf2.d/file1.conf b/tests/data/conf2.d/file1.conf new file mode 100644 index 00000000..e6396bff --- /dev/null +++ b/tests/data/conf2.d/file1.conf @@ -0,0 +1,2 @@ +[foo] +bar = baz diff --git a/tests/data/conf2.d/file2.conf.disabled b/tests/data/conf2.d/file2.conf.disabled new file mode 100644 index 00000000..ef189703 --- /dev/null +++ b/tests/data/conf2.d/file2.conf.disabled @@ -0,0 +1,2 @@ +[foo2] +bar = baz From d776ada30ad94314adfa456dc5d6f607f65cbc08 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Mon, 11 Aug 2014 16:27:19 +0200 Subject: [PATCH 5/6] docs: Add directories to --config in man page --- docs/command.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/command.rst b/docs/command.rst index 79ca3ed0..8ef7414b 100644 --- a/docs/command.rst +++ b/docs/command.rst @@ -50,11 +50,12 @@ Options Save debug log to the file specified in the :confval:`logging/debug_file` config value, typically ``./mopidy.log``. -.. cmdoption:: --config +.. cmdoption:: --config - Specify config file to use. To use multiple config files, separate them - with a colon. The later files override the earlier ones if there's a - conflict. + Specify config files and directories to use. To use multiple config files + or directories, separate them with a colon. The later files override the + earlier ones if there's a conflict. When specifying a directory, all files + ending in .conf in the directory is used. .. cmdoption:: --option