From a363d9672f2be9de44cd1d3b3ae1fa1e69c1c5c9 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Mon, 10 Feb 2014 11:32:02 +0100 Subject: [PATCH] Load plugins from cli config --- beets/ui/__init__.py | 39 +++++++++++++++++++++---------------- test/rsrc/beetsplug/test.py | 9 ++++++--- test/test_ui.py | 12 ++++++++++++ 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/beets/ui/__init__.py b/beets/ui/__init__.py index 1d1bda042..ceb14ef5a 100644 --- a/beets/ui/__init__.py +++ b/beets/ui/__init__.py @@ -668,6 +668,16 @@ class SubcommandsOptionParser(optparse.OptionParser): """ options, args = optparse.OptionParser.parse_args(self, a, v) + if getattr(options, 'config', None) is not None: + config_path = options.config + del options.config + config.set_file(config_path) + config.set_args(options) + load_plugins() + + for cmd in plugins.commands(): + self.add_subcommand(cmd) + if not args: # No command given. self.print_help() @@ -735,17 +745,7 @@ def vararg_callback(option, opt_str, value, parser): # The root parser and its main function. -def _raw_main(args): - """A helper function for `main` without top-level exception - handling. - """ - # Temporary: Migrate from 1.0-style configuration. - from beets.ui import migrate - migrate.automigrate() - - # Get the default subcommands. - from beets.ui.commands import default_commands - +def load_plugins(): # Add plugin paths. import beetsplug beetsplug.__path__ = get_plugin_paths() + beetsplug.__path__ @@ -757,9 +757,19 @@ def _raw_main(args): plugins.load_plugins(config['plugins'].as_str_seq()) plugins.send("pluginload") +def _raw_main(args): + """A helper function for `main` without top-level exception + handling. + """ + # Temporary: Migrate from 1.0-style configuration. + from beets.ui import migrate + migrate.automigrate() + + # Get the default subcommands. + from beets.ui.commands import default_commands + # Construct the root parser. commands = list(default_commands) - commands += plugins.commands() commands.append(migrate.migrate_cmd) # Temporary. parser = SubcommandsOptionParser(subcommands=commands) parser.add_option('-l', '--library', dest='library', @@ -773,11 +783,6 @@ def _raw_main(args): # Parse the command-line! options, subcommand, suboptions, subargs = parser.parse_args(args) - if getattr(options, 'config', None) is not None: - config_path = options.config - del options.config - config.set_file(config_path) - config.set_args(options) # Open library file. dbpath = config['library'].as_filename() diff --git a/test/rsrc/beetsplug/test.py b/test/rsrc/beetsplug/test.py index 296d522ed..a1ad19441 100644 --- a/test/rsrc/beetsplug/test.py +++ b/test/rsrc/beetsplug/test.py @@ -4,8 +4,11 @@ from beets import ui class TestPlugin(BeetsPlugin): def __init__(self): super(TestPlugin, self).__init__() + self.is_test_plugin = True def commands(self): - cmd = ui.Subcommand('test') - cmd.func = lambda *args: None - return [cmd] + test = ui.Subcommand('test') + test.func = lambda *args: None + plugin = ui.Subcommand('plugin') + plugin.func = lambda *args: None + return [test, plugin] diff --git a/test/test_ui.py b/test/test_ui.py index 83b3b2e57..69a5a5754 100644 --- a/test/test_ui.py +++ b/test/test_ui.py @@ -31,6 +31,7 @@ from beets import importer from beets.mediafile import MediaFile from beets import config from beets.util import confit +from beets import plugins class ListTest(_common.TestCase): def setUp(self): @@ -597,6 +598,17 @@ class ConfigTest(_common.TestCase): ui._raw_main(['--config', cli_config_path, 'test']) self.assertEqual(config['anoption'].get(), 'cli overwrite') + def test_cli_config_file_loads_plugin_commands(self): + plugin_path = os.path.join(_common.RSRC, 'beetsplug') + + cli_config_path = os.path.join(self.temp_dir, 'config.yaml') + with open(cli_config_path, 'w') as file: + file.write('pluginpath: %s\n' % plugin_path) + file.write('plugins: test') + + ui._raw_main(['--config', cli_config_path, 'plugin']) + self.assertTrue(plugins.find_plugins()[0].is_test_plugin) + class ShowdiffTest(_common.TestCase): def setUp(self):