summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2019-07-09 11:43:06 +0200
committerFlorian Bruhin <me@the-compiler.org>2019-07-09 11:43:06 +0200
commit07f0eac999297a88b85df1fd063f11c7fd336521 (patch)
treed9ad054fc13b7f526e86a30681b97755bd6f0817
parent4fdfdf95dc9c714a04adcbdf0c6e23f3a164309c (diff)
parent8cfbf80934b6b6ef1b3fde48195b01d084cadc68 (diff)
downloadqutebrowser-07f0eac999297a88b85df1fd063f11c7fd336521.tar.gz
qutebrowser-07f0eac999297a88b85df1fd063f11c7fd336521.zip
Merge remote-tracking branch 'origin/pr/4286'
-rw-r--r--qutebrowser/config/configcommands.py6
-rw-r--r--qutebrowser/config/configinit.py2
-rw-r--r--qutebrowser/qutebrowser.py1
-rw-r--r--qutebrowser/utils/standarddir.py15
-rw-r--r--tests/helpers/fixtures.py13
-rw-r--r--tests/unit/config/test_configcommands.py22
-rw-r--r--tests/unit/config/test_configinit.py6
-rw-r--r--tests/unit/utils/test_standarddir.py18
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: