diff options
author | Florian Bruhin <me@the-compiler.org> | 2019-07-09 11:43:06 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2019-07-09 11:43:06 +0200 |
commit | 07f0eac999297a88b85df1fd063f11c7fd336521 (patch) | |
tree | d9ad054fc13b7f526e86a30681b97755bd6f0817 | |
parent | 4fdfdf95dc9c714a04adcbdf0c6e23f3a164309c (diff) | |
parent | 8cfbf80934b6b6ef1b3fde48195b01d084cadc68 (diff) | |
download | qutebrowser-07f0eac999297a88b85df1fd063f11c7fd336521.tar.gz qutebrowser-07f0eac999297a88b85df1fd063f11c7fd336521.zip |
Merge remote-tracking branch 'origin/pr/4286'
-rw-r--r-- | qutebrowser/config/configcommands.py | 6 | ||||
-rw-r--r-- | qutebrowser/config/configinit.py | 2 | ||||
-rw-r--r-- | qutebrowser/qutebrowser.py | 1 | ||||
-rw-r--r-- | qutebrowser/utils/standarddir.py | 15 | ||||
-rw-r--r-- | tests/helpers/fixtures.py | 13 | ||||
-rw-r--r-- | tests/unit/config/test_configcommands.py | 22 | ||||
-rw-r--r-- | tests/unit/config/test_configinit.py | 6 | ||||
-rw-r--r-- | tests/unit/utils/test_standarddir.py | 18 |
8 files changed, 79 insertions, 4 deletions
diff --git a/qutebrowser/config/configcommands.py b/qutebrowser/config/configcommands.py index d674401e1..11990eaa7 100644 --- a/qutebrowser/config/configcommands.py +++ b/qutebrowser/config/configcommands.py @@ -394,7 +394,7 @@ class ConfigCommands: clear: Clear current settings first. """ if filename is None: - filename = os.path.join(standarddir.config(), 'config.py') + filename = standarddir.config_py() else: filename = os.path.expanduser(filename) @@ -427,7 +427,7 @@ class ConfigCommands: if not no_source: ed.file_updated.connect(on_file_updated) - filename = os.path.join(standarddir.config(), 'config.py') + filename = standarddir.config_py() ed.edit_file(filename) @cmdutils.register(instance='config-commands') @@ -441,7 +441,7 @@ class ConfigCommands: defaults: Write the defaults instead of values configured via :set. """ if filename is None: - filename = os.path.join(standarddir.config(), 'config.py') + filename = standarddir.config_py() else: if not os.path.isabs(filename): filename = os.path.join(standarddir.config(), filename) diff --git a/qutebrowser/config/configinit.py b/qutebrowser/config/configinit.py index 97771000c..9dc15d6e9 100644 --- a/qutebrowser/config/configinit.py +++ b/qutebrowser/config/configinit.py @@ -59,7 +59,7 @@ def early_init(args: argparse.Namespace) -> None: config.instance, config.key_instance) objreg.register('config-commands', config_commands) - config_file = os.path.join(standarddir.config(), 'config.py') + config_file = standarddir.config_py() try: if os.path.exists(config_file): diff --git a/qutebrowser/qutebrowser.py b/qutebrowser/qutebrowser.py index 50f35173f..cde9de52f 100644 --- a/qutebrowser/qutebrowser.py +++ b/qutebrowser/qutebrowser.py @@ -62,6 +62,7 @@ def get_argparser(): description=qutebrowser.__description__) parser.add_argument('-B', '--basedir', help="Base directory for all " "storage.") + parser.add_argument('-C', '--config-py', help="Path to config.py.") parser.add_argument('-V', '--version', help="Show version and quit.", action='store_true') parser.add_argument('-s', '--set', help="Set a temporary setting for " diff --git a/qutebrowser/utils/standarddir.py b/qutebrowser/utils/standarddir.py index 8936cb8f8..186a42ae3 100644 --- a/qutebrowser/utils/standarddir.py +++ b/qutebrowser/utils/standarddir.py @@ -46,6 +46,7 @@ class _Location(enum.Enum): cache = 5 download = 6 runtime = 7 + config_py = 8 APPNAME = 'qutebrowser' @@ -96,6 +97,11 @@ def _init_config(args): _create(path) _locations[_Location.config] = path + config_py_file = os.path.join(_locations[_Location.config], 'config.py') + if getattr(args, 'config_py', None) is not None: + config_py_file = os.path.abspath(args.config_py) + _locations[_Location.config_py] = config_py_file + def config(auto=False): """Get the location for the config directory. @@ -108,6 +114,15 @@ def config(auto=False): return _locations[_Location.config] +def config_py() -> str: + """Get the location for config.py. + + Usually, config.py is in standarddir.config(), but this can be overridden + with the --config-py argument. + """ + return _locations[_Location.config_py] + + def _init_data(args): """Initialize the location for data.""" typ = QStandardPaths.DataLocation diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py index 10fc4702f..d752456e6 100644 --- a/tests/helpers/fixtures.py +++ b/tests/helpers/fixtures.py @@ -545,10 +545,23 @@ def config_tmpdir(monkeypatch, tmpdir): Use this to avoid creating a 'real' config dir (~/.config/qute_test). """ + monkeypatch.setattr( + standarddir, 'config_py', + lambda **_kwargs: str(tmpdir / 'config' / 'config.py')) return standarddir_tmpdir('config', monkeypatch, tmpdir) @pytest.fixture +def config_py_arg(tmpdir, monkeypatch): + """Set the config_py arg with a custom value for init.""" + f = tmpdir / 'temp_config.py' + monkeypatch.setattr( + standarddir, 'config_py', + lambda **_kwargs: str(f)) + return f + + +@pytest.fixture def data_tmpdir(monkeypatch, tmpdir): """Set tmpdir/data as the datadir. diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py index 1b91943c5..9a31c622e 100644 --- a/tests/unit/config/test_configcommands.py +++ b/tests/unit/config/test_configcommands.py @@ -493,6 +493,13 @@ class TestSource: assert ignore_case == (usertypes.IgnoreCase.smart if clear else usertypes.IgnoreCase.always) + def test_config_py_arg_source(self, commands, config_py_arg, config_stub): + assert config_stub.val.content.javascript.enabled + config_py_arg.write_text('c.content.javascript.enabled = False\n', + encoding='utf-8') + commands.config_source() + assert not config_stub.val.content.javascript.enabled + def test_errors(self, commands, config_tmpdir): pyfile = config_tmpdir / 'config.py' pyfile.write_text('c.foo = 42', encoding='utf-8') @@ -555,6 +562,15 @@ class TestEdit: mock.assert_called_once_with(unittest.mock.ANY) assert not config_stub.val.content.javascript.enabled + def test_config_py_with_sourcing(self, commands, config_stub, patch_editor, config_py_arg): + assert config_stub.val.content.javascript.enabled + conf = 'c.content.javascript.enabled = False' + mock = patch_editor(conf) + commands.config_edit() + mock.assert_called_once_with(unittest.mock.ANY) + assert not config_stub.val.content.javascript.enabled + assert config_py_arg.read_text('utf-8').splitlines() == [conf] + def test_error(self, commands, config_stub, patch_editor, message_mock, caplog): patch_editor('c.foo = 42') @@ -627,6 +643,12 @@ class TestWritePy: with pytest.raises(cmdutils.CommandError): commands.config_write_py(str(tmpdir / 'foo' / 'config.py')) + def test_config_py_arg(self, commands, config_py_arg): + config_py_arg.ensure() + commands.config_write_py(str(config_py_arg), force=True) + lines = config_py_arg.read_text('utf-8').splitlines() + assert '# Autogenerated config.py' in lines + class TestBind: diff --git a/tests/unit/config/test_configinit.py b/tests/unit/config/test_configinit.py index 3c8363c7a..93ca334ef 100644 --- a/tests/unit/config/test_configinit.py +++ b/tests/unit/config/test_configinit.py @@ -65,6 +65,12 @@ def configdata_init(monkeypatch): class TestEarlyInit: + def test_config_py_path(self, args, init_patch, config_py_arg): + config_py_arg.write('c.colors.hints.bg = "red"\n') + configinit.early_init(args) + expected = 'colors.hints.bg = red' + assert config.instance.dump_userconfig() == expected + @pytest.mark.parametrize('config_py', [True, 'error', False]) def test_config_py(self, init_patch, config_tmpdir, caplog, args, config_py): diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py index 8f8f67baa..82f58653a 100644 --- a/tests/unit/utils/test_standarddir.py +++ b/tests/unit/utils/test_standarddir.py @@ -253,6 +253,24 @@ class TestArguments: standarddir._init_dirs(args) assert standarddir.config() == str(basedir / 'config') + def test_config_py_arg(self, tmpdir): + basedir = tmpdir / 'basedir' + basedir.ensure(dir=True) + with tmpdir.as_cwd(): + args = types.SimpleNamespace( + basedir='foo', config_py='basedir/config.py') + standarddir._init_dirs(args) + assert standarddir.config_py() == str(basedir / 'config.py') + + def test_config_py_no_arg(self, tmpdir): + basedir = tmpdir / 'basedir' + basedir.ensure(dir=True) + with tmpdir.as_cwd(): + args = types.SimpleNamespace(basedir='basedir') + standarddir._init_dirs(args) + assert standarddir.config_py() == str( + basedir / 'config' / 'config.py') + class TestInitCacheDirTag: |