diff --git a/diceware/__init__.py b/diceware/__init__.py index 98346397a245d6caf7ccd3335af171b109f14f00..8df4fcd349201a50a8650937491fc663a8bf6e17 100644 --- a/diceware/__init__.py +++ b/diceware/__init__.py @@ -79,7 +79,8 @@ def get_random_sources(): def handle_options(args): """Handle commandline options. """ - random_sources = get_random_sources().keys() + plugins = get_random_sources() + random_sources = plugins.keys() wordlist_names = get_wordlist_names() defaults = get_config_dict() parser = argparse.ArgumentParser( @@ -127,6 +128,9 @@ def handle_options(args): '--version', action='store_true', help='output version information and exit.', ) + for plugin in plugins.values(): + if hasattr(plugin, "update_argparser"): + parser = plugin.update_argparser(parser) parser.set_defaults(**defaults) args = parser.parse_args(args) return args diff --git a/tests/test_diceware.py b/tests/test_diceware.py index 05ad22944022f000589c4194a47500e08e69e052..2f8cc3a301e470b3990e914b5bde876f5edecfa9 100644 --- a/tests/test_diceware.py +++ b/tests/test_diceware.py @@ -147,6 +147,18 @@ class TestHandleOptions(object): assert options.delimiter == "my-delim" assert options.caps is False + def test_handle_options_allows_plugins_updating(self, monkeypatch): + # we allow plugins to update our argparser, before being used + import diceware + class FakePlugin(object): + @classmethod + def update_argparser(cls, parser): + parser.add_argument('--foo', default=2, type=int) + return parser + monkeypatch.setattr(diceware, 'get_random_sources', lambda: dict(foo=FakePlugin)) + options = handle_options([]) + assert options.foo == 2 + class TestDicewareModule(object):