From f533e3b75183c084270df3d6c2b61bc4b46b3764 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 3 Oct 2017 07:29:44 +0200 Subject: [PATCH] Move config toggling to :config-cycle This removes :set option! and allows :config-cycle option instead. --- doc/help/commands.asciidoc | 2 +- qutebrowser/config/configcommands.py | 43 +++++++------- tests/unit/config/test_configcommands.py | 73 +++++++++++++----------- 3 files changed, 61 insertions(+), 57 deletions(-) diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 7e340e9ca..a0edf609d 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -792,7 +792,7 @@ Syntax: +:set [*--temp*] [*--print*] ['option'] ['value']+ Set an option. -If the option name ends with '?', the value of the option is shown instead. If the option name ends with '!' and it is a boolean value, toggle it. +If the option name ends with '?', the value of the option is shown instead. ==== positional arguments * +'option'+: The name of the option. diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index e5cde8900..afbbf48fe 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -47,8 +47,6 @@ class ConfigCommands: If the option name ends with '?', the value of the option is shown instead. - If the option name ends with '!' and it is a boolean value, toggle it. - Args: option: The name of the option. value: The value to set. @@ -66,15 +64,7 @@ class ConfigCommands: return with self._handle_config_error(): - if option.endswith('!') and option != '!' and value is None: - option = option[:-1] - opt = self._config.get_opt(option) - if not isinstance(opt.typ, configtypes.Bool): - raise cmdexc.CommandError( - "set: Can't toggle non-bool setting {}".format(option)) - old_value = self._config.get_obj(option) - self._config.set_obj(option, not old_value, save_yaml=not temp) - elif value is None: + if value is None: raise cmdexc.CommandError("set: The following arguments " "are required: value") else: @@ -95,21 +85,30 @@ class ConfigCommands: temp: Set value temporarily until qutebrowser is closed. print_: Print the value after setting. """ - if len(values) < 2: - raise configexc.CommandError("Need at least two values") with self._handle_config_error(): - # Use the next valid value from values, or the first if the current - # value does not appear in the list - old_value = self._config.get_obj(option, mutable=False) opt = self._config.get_opt(option) + old_value = self._config.get_obj(option, mutable=False) + + if not values and isinstance(opt.typ, configtypes.Bool): + values = ['true', 'false'] + + if len(values) < 2: + raise cmdexc.CommandError("Need at least two values for " + "non-boolean settings.") + + # Use the next valid value from values, or the first if the current + # value does not appear in the list + with self._handle_config_error(): values = [opt.typ.from_str(val) for val in values] - try: - idx = values.index(old_value) - idx = (idx + 1) % len(values) - value = values[idx] - except ValueError: - value = values[0] + try: + idx = values.index(old_value) + idx = (idx + 1) % len(values) + value = values[idx] + except ValueError: + value = values[0] + + with self._handle_config_error(): self._config.set_obj(option, value, save_yaml=not temp) if print_: diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py index 3a50100ce..1c88d1750 100644 --- a/tests/unit/config/test_configcommands.py +++ b/tests/unit/config/test_configcommands.py @@ -113,36 +113,6 @@ class TestSet: msg = message_mock.getmsg(usertypes.MessageLevel.info) assert msg.text == 'url.auto_search = dns' - def test_set_toggle(self, commands, config_stub): - """Run ':set auto_save.session!'. - - Should toggle the value. - """ - assert not config_stub.val.auto_save.session - commands.set(0, 'auto_save.session!') - assert config_stub.val.auto_save.session - assert config_stub._yaml['auto_save.session'] - - def test_set_toggle_nonbool(self, commands, config_stub): - """Run ':set url.auto_search!'. - - Should show an error - """ - assert config_stub.val.url.auto_search == 'naive' - with pytest.raises(cmdexc.CommandError, match="set: Can't toggle " - "non-bool setting url.auto_search"): - commands.set(0, 'url.auto_search!') - assert config_stub.val.url.auto_search == 'naive' - - def test_set_toggle_print(self, commands, config_stub, message_mock): - """Run ':set -p auto_save.session!'. - - Should toggle the value and show the new value. - """ - commands.set(0, 'auto_save.session!', print_=True) - msg = message_mock.getmsg(usertypes.MessageLevel.info) - assert msg.text == 'auto_save.session = true' - def test_set_invalid_option(self, commands): """Run ':set foo bar'. @@ -180,14 +150,13 @@ class TestSet: "value"): commands.set(win_id=0, option=option) - @pytest.mark.parametrize('suffix', '?!') - def test_invalid(self, commands, suffix): - """Run ':set foo?' / ':set foo!'. + def test_invalid(self, commands): + """Run ':set foo?'. Should show an error. """ with pytest.raises(cmdexc.CommandError, match="set: No option 'foo'"): - commands.set(win_id=0, option='foo' + suffix) + commands.set(win_id=0, option='foo?') class TestCycle: @@ -222,6 +191,42 @@ class TestCycle: commands.config_cycle(opt, '[foo]', '[bar]') assert config_stub.get(opt) == ['foo'] + def test_toggle(self, commands, config_stub): + """Run ':config-cycle auto_save.session'. + + Should toggle the value. + """ + assert not config_stub.val.auto_save.session + commands.config_cycle('auto_save.session') + assert config_stub.val.auto_save.session + assert config_stub._yaml['auto_save.session'] + + @pytest.mark.parametrize('args', [ + ['url.auto_search'], ['url.auto_search', 'foo'] + ]) + def test_toggle_nonbool(self, commands, config_stub, args): + """Run :config-cycle without a bool and 0/1 value. + + :config-cycle url.auto_search + :config-cycle url.auto_search foo + + Should show an error. + """ + assert config_stub.val.url.auto_search == 'naive' + with pytest.raises(cmdexc.CommandError, match="Need at least " + "two values for non-boolean settings."): + commands.config_cycle(*args) + assert config_stub.val.url.auto_search == 'naive' + + def test_set_toggle_print(self, commands, config_stub, message_mock): + """Run ':config-cycle -p auto_save.session'. + + Should toggle the value and show the new value. + """ + commands.config_cycle('auto_save.session', print_=True) + msg = message_mock.getmsg(usertypes.MessageLevel.info) + assert msg.text == 'auto_save.session = true' + class TestBind: