Finish ConfigPyWriter and tests
This commit is contained in:
parent
231b0522ca
commit
ade0e1bd0b
@ -257,7 +257,7 @@ class ConfigPyWriter:
|
|||||||
def write(self, filename):
|
def write(self, filename):
|
||||||
"""Write the config to the given file."""
|
"""Write the config to the given file."""
|
||||||
with open(filename, 'w', encoding='utf-8') as f:
|
with open(filename, 'w', encoding='utf-8') as f:
|
||||||
f.write('\n'.join(self._gen_text()))
|
f.write('\n'.join(self._gen_lines()))
|
||||||
|
|
||||||
def _line(self, line):
|
def _line(self, line):
|
||||||
"""Get an (optionally commented) line."""
|
"""Get an (optionally commented) line."""
|
||||||
@ -269,7 +269,7 @@ class ConfigPyWriter:
|
|||||||
else:
|
else:
|
||||||
return line
|
return line
|
||||||
|
|
||||||
def _gen_text(self):
|
def _gen_lines(self):
|
||||||
"""Generate a config.py with the given settings/bindings.
|
"""Generate a config.py with the given settings/bindings.
|
||||||
|
|
||||||
Yields individual lines.
|
Yields individual lines.
|
||||||
@ -279,11 +279,12 @@ class ConfigPyWriter:
|
|||||||
yield from self._gen_bindings()
|
yield from self._gen_bindings()
|
||||||
|
|
||||||
def _gen_header(self):
|
def _gen_header(self):
|
||||||
"""Generate the intiial header of the config."""
|
"""Generate the initial header of the config."""
|
||||||
yield self._line("# Autogenerated config.py")
|
yield self._line("# Autogenerated config.py")
|
||||||
yield self._line("# Documentation:")
|
yield self._line("# Documentation:")
|
||||||
yield self._line("# qute://help/configuring.html")
|
yield self._line("# qute://help/configuring.html")
|
||||||
yield self._line("# qute://help/settings.html\n")
|
yield self._line("# qute://help/settings.html")
|
||||||
|
yield ''
|
||||||
if self._commented:
|
if self._commented:
|
||||||
# When generated from an autoconfig.yml with commented=False,
|
# When generated from an autoconfig.yml with commented=False,
|
||||||
# we don't want to load that autoconfig.yml anymore.
|
# we don't want to load that autoconfig.yml anymore.
|
||||||
@ -291,11 +292,13 @@ class ConfigPyWriter:
|
|||||||
"still loaded.")
|
"still loaded.")
|
||||||
yield self._line("# Remove it to not load settings done via the "
|
yield self._line("# Remove it to not load settings done via the "
|
||||||
"GUI.")
|
"GUI.")
|
||||||
yield self._line("config.load_autoconfig()\n")
|
yield self._line("config.load_autoconfig()")
|
||||||
|
yield ''
|
||||||
else:
|
else:
|
||||||
yield self._line("# Uncomment this to still load settings "
|
yield self._line("# Uncomment this to still load settings "
|
||||||
"configured via autoconfig.yml")
|
"configured via autoconfig.yml")
|
||||||
yield self._line("# config.load_autoconfig()\n")
|
yield self._line("# config.load_autoconfig()")
|
||||||
|
yield ''
|
||||||
|
|
||||||
def _gen_options(self):
|
def _gen_options(self):
|
||||||
"""Generate the options part of the config."""
|
"""Generate the options part of the config."""
|
||||||
@ -318,7 +321,8 @@ class ConfigPyWriter:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
yield self._line("# - {}".format(val))
|
yield self._line("# - {}".format(val))
|
||||||
|
|
||||||
yield self._line('c.{} = {!r}\n'.format(opt.name, value))
|
yield self._line('c.{} = {!r}'.format(opt.name, value))
|
||||||
|
yield ''
|
||||||
|
|
||||||
def _gen_bindings(self):
|
def _gen_bindings(self):
|
||||||
"""Generate the bindings part of the config."""
|
"""Generate the bindings part of the config."""
|
||||||
|
@ -21,11 +21,13 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import unittest.mock
|
import unittest.mock
|
||||||
|
import textwrap
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from qutebrowser.config import config, configfiles, configexc, configdata
|
from qutebrowser.config import (config, configfiles, configexc, configdata,
|
||||||
from qutebrowser.utils import utils
|
configtypes)
|
||||||
|
from qutebrowser.utils import utils, usertypes
|
||||||
|
|
||||||
from PyQt5.QtCore import QSettings
|
from PyQt5.QtCore import QSettings
|
||||||
|
|
||||||
@ -527,6 +529,138 @@ class TestConfigPy:
|
|||||||
assert error.traceback is not None
|
assert error.traceback is not None
|
||||||
|
|
||||||
|
|
||||||
|
class TestConfigPyWriter:
|
||||||
|
|
||||||
|
def test_output(self):
|
||||||
|
desc = ("This is an option description.\n\n"
|
||||||
|
"Nullam eu ante vel est convallis dignissim. Fusce suscipit, "
|
||||||
|
"wisi nec facilisis facilisis, est dui fermentum leo, quis "
|
||||||
|
"tempor ligula erat quis odio.")
|
||||||
|
opt = configdata.Option(
|
||||||
|
name='opt', typ=configtypes.Int(), default='def',
|
||||||
|
backends=[usertypes.Backend.QtWebEngine], raw_backends=None,
|
||||||
|
description=desc)
|
||||||
|
options = [(opt, 'val')]
|
||||||
|
bindings = {'normal': {',x': 'message-info normal'},
|
||||||
|
'caret': {',y': 'message-info caret'}}
|
||||||
|
|
||||||
|
writer = configfiles.ConfigPyWriter(options, bindings, commented=False)
|
||||||
|
text = '\n'.join(writer._gen_lines())
|
||||||
|
|
||||||
|
assert text == textwrap.dedent("""
|
||||||
|
# Autogenerated config.py
|
||||||
|
# Documentation:
|
||||||
|
# qute://help/configuring.html
|
||||||
|
# qute://help/settings.html
|
||||||
|
|
||||||
|
# Uncomment this to still load settings configured via autoconfig.yml
|
||||||
|
# config.load_autoconfig()
|
||||||
|
|
||||||
|
# This is an option description. Nullam eu ante vel est convallis
|
||||||
|
# dignissim. Fusce suscipit, wisi nec facilisis facilisis, est dui
|
||||||
|
# fermentum leo, quis tempor ligula erat quis odio.
|
||||||
|
# Type: Int
|
||||||
|
c.opt = 'val'
|
||||||
|
|
||||||
|
# Bindings for normal mode
|
||||||
|
config.bind(',x', 'message-info normal')
|
||||||
|
|
||||||
|
# Bindings for caret mode
|
||||||
|
config.bind(',y', 'message-info caret', mode='caret')
|
||||||
|
""").strip()
|
||||||
|
|
||||||
|
def test_binding_options_hidden(self):
|
||||||
|
opt1 = configdata.DATA['bindings.default']
|
||||||
|
opt2 = configdata.DATA['bindings.commands']
|
||||||
|
options = [(opt1, {'normal': {'x': 'message-info x'}}),
|
||||||
|
(opt2, {})]
|
||||||
|
writer = configfiles.ConfigPyWriter(options, bindings={},
|
||||||
|
commented=False)
|
||||||
|
text = '\n'.join(writer._gen_lines())
|
||||||
|
assert 'bindings.default' not in text
|
||||||
|
assert 'bindings.commands' not in text
|
||||||
|
|
||||||
|
def test_commented(self):
|
||||||
|
opt = configdata.Option(
|
||||||
|
name='opt', typ=configtypes.Int(), default='def',
|
||||||
|
backends=[usertypes.Backend.QtWebEngine], raw_backends=None,
|
||||||
|
description='Hello World')
|
||||||
|
options = [(opt, 'val')]
|
||||||
|
bindings = {'normal': {',x': 'message-info normal'},
|
||||||
|
'caret': {',y': 'message-info caret'}}
|
||||||
|
|
||||||
|
writer = configfiles.ConfigPyWriter(options, bindings, commented=True)
|
||||||
|
lines = list(writer._gen_lines())
|
||||||
|
|
||||||
|
assert "## Autogenerated config.py" in lines
|
||||||
|
assert "# config.load_autoconfig()" in lines
|
||||||
|
assert "# c.opt = 'val'" in lines
|
||||||
|
assert "## Bindings for normal mode" in lines
|
||||||
|
assert "# config.bind(',x', 'message-info normal')" in lines
|
||||||
|
caret_bind = ("# config.bind(',y', 'message-info caret', "
|
||||||
|
"mode='caret')")
|
||||||
|
assert caret_bind in lines
|
||||||
|
|
||||||
|
def test_valid_values(self):
|
||||||
|
opt1 = configdata.Option(
|
||||||
|
name='opt1', typ=configtypes.BoolAsk(), default='ask',
|
||||||
|
backends=[usertypes.Backend.QtWebEngine], raw_backends=None,
|
||||||
|
description='Hello World')
|
||||||
|
opt2 = configdata.Option(
|
||||||
|
name='opt2', typ=configtypes.ColorSystem(), default='rgb',
|
||||||
|
backends=[usertypes.Backend.QtWebEngine], raw_backends=None,
|
||||||
|
description='All colors are beautiful!')
|
||||||
|
|
||||||
|
options = [(opt1, 'ask'), (opt2, 'rgb')]
|
||||||
|
|
||||||
|
writer = configfiles.ConfigPyWriter(options, bindings={},
|
||||||
|
commented=False)
|
||||||
|
text = '\n'.join(writer._gen_lines())
|
||||||
|
|
||||||
|
expected = textwrap.dedent("""
|
||||||
|
# Hello World
|
||||||
|
# Type: BoolAsk
|
||||||
|
# Valid values:
|
||||||
|
# - true
|
||||||
|
# - false
|
||||||
|
# - ask
|
||||||
|
c.opt1 = 'ask'
|
||||||
|
|
||||||
|
# All colors are beautiful!
|
||||||
|
# Type: ColorSystem
|
||||||
|
# Valid values:
|
||||||
|
# - rgb: Interpolate in the RGB color system.
|
||||||
|
# - hsv: Interpolate in the HSV color system.
|
||||||
|
# - hsl: Interpolate in the HSL color system.
|
||||||
|
# - none: Don't show a gradient.
|
||||||
|
c.opt2 = 'rgb'
|
||||||
|
""")
|
||||||
|
assert expected in text
|
||||||
|
|
||||||
|
def test_empty(self):
|
||||||
|
writer = configfiles.ConfigPyWriter(options=[], bindings={},
|
||||||
|
commented=False)
|
||||||
|
text = '\n'.join(writer._gen_lines())
|
||||||
|
expected = textwrap.dedent("""
|
||||||
|
# Autogenerated config.py
|
||||||
|
# Documentation:
|
||||||
|
# qute://help/configuring.html
|
||||||
|
# qute://help/settings.html
|
||||||
|
|
||||||
|
# Uncomment this to still load settings configured via autoconfig.yml
|
||||||
|
# config.load_autoconfig()
|
||||||
|
""").lstrip()
|
||||||
|
assert text == expected
|
||||||
|
|
||||||
|
def test_write(self, tmpdir):
|
||||||
|
pyfile = tmpdir / 'config.py'
|
||||||
|
writer = configfiles.ConfigPyWriter(options=[], bindings={},
|
||||||
|
commented=False)
|
||||||
|
writer.write(str(pyfile))
|
||||||
|
lines = pyfile.read_text('utf-8').splitlines()
|
||||||
|
assert '# Autogenerated config.py' in lines
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def init_patch(qapp, fake_save_manager, config_tmpdir, data_tmpdir,
|
def init_patch(qapp, fake_save_manager, config_tmpdir, data_tmpdir,
|
||||||
config_stub, monkeypatch):
|
config_stub, monkeypatch):
|
||||||
|
Loading…
Reference in New Issue
Block a user