diff --git a/beets/ui/__init__.py b/beets/ui/__init__.py index cdc29cc28..cdcf778e2 100644 --- a/beets/ui/__init__.py +++ b/beets/ui/__init__.py @@ -695,6 +695,33 @@ class SubcommandsOptionParser(optparse.OptionParser): return options, subcommand, suboptions, subargs +# callback for an option with variable arguments +# parser.add_option("-c", "--callback", dest="vararg_attr", +# action="callback", callback=vararg_callback) + +def vararg_callback(option, opt_str, value, parser): + assert value is None + value = [] + + def floatable(str): + try: + float(str) + return True + except ValueError: + return False + + for arg in parser.rargs: + # stop on --foo like options + if arg[:2] == "--" and len(arg) > 2: + break + # stop on -a, but not on -3 or -3.0 + if arg[:1] == "-" and len(arg) > 1 and not floatable(arg): + break + value.append(arg) + + del parser.rargs[:len(value)] + setattr(parser.values, option.dest, value) + # The root parser and its main function. def _raw_main(args): diff --git a/docs/changelog.rst b/docs/changelog.rst index b3679293d..4ba970a5f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,10 @@ Changelog New features: +* :ref:`add_subcommands`: Added ``optparse`` callback utility function, allowing + plugin developers to add options with ``action=callback`` and + ``callback=beets.ui.varargs_callback`` and a variable number of arguments. + * :doc:`/plugins/duplicates`: The new ``keys`` option allows you to specify arbitrary fields over which to consider potential duplicates. diff --git a/docs/dev/plugins.rst b/docs/dev/plugins.rst index eacd3c271..6feb73326 100644 --- a/docs/dev/plugins.rst +++ b/docs/dev/plugins.rst @@ -44,6 +44,8 @@ containing your plugin). .. _virtualenv: http://pypi.python.org/pypi/virtualenv +.. _add_subcommands: + Add Commands to the CLI ^^^^^^^^^^^^^^^^^^^^^^^