Refactor configcache to cache

Also fix and improve configcache tests
This commit is contained in:
Jay Kamat 2018-09-05 18:35:50 -07:00
parent d4cf5045ab
commit 8e82adc306
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5
7 changed files with 45 additions and 45 deletions

View File

@ -34,7 +34,7 @@ from qutebrowser.keyinput import keyutils
val = None val = None
instance = None instance = None
key_instance = None key_instance = None
configcache = None cache = None
# Keeping track of all change filters to validate them later. # Keeping track of all change filters to validate them later.
change_filters = [] change_filters = []

View File

@ -23,7 +23,8 @@
from qutebrowser.config import config from qutebrowser.config import config
class ConfigCache(): class ConfigCache:
"""A 'high-performance' cache for the config system. """A 'high-performance' cache for the config system.
Useful for areas which call out to the config system very frequently, DO Useful for areas which call out to the config system very frequently, DO
@ -35,15 +36,15 @@ class ConfigCache():
""" """
def __init__(self) -> None: def __init__(self) -> None:
self.cache = {} self._cache = {}
config.instance.changed.connect(self.config_changed) config.instance.changed.connect(self._on_config_changed)
def config_changed(self, attr: str) -> None: def _on_config_changed(self, attr: str) -> None:
if attr in self.cache: if attr in self._cache:
self.cache[attr] = config.instance.get(attr) self._cache[attr] = config.instance.get(attr)
def __getitem__(self, attr: str): def __getitem__(self, attr: str):
if attr not in self.cache: if attr not in self._cache:
assert not config.instance.get_opt(attr).supports_pattern assert not config.instance.get_opt(attr).supports_pattern
self.cache[attr] = config.instance.get(attr) self._cache[attr] = config.instance.get(attr)
return self.cache[attr] return self._cache[attr]

View File

@ -45,7 +45,7 @@ def early_init(args):
config.instance = config.Config(yaml_config=yaml_config) config.instance = config.Config(yaml_config=yaml_config)
config.val = config.ConfigContainer(config.instance) config.val = config.ConfigContainer(config.instance)
config.key_instance = config.KeyConfig(config.instance) config.key_instance = config.KeyConfig(config.instance)
config.configcache = configcache.ConfigCache() config.cache = configcache.ConfigCache()
yaml_config.setParent(config.instance) yaml_config.setParent(config.instance)
for cf in config.change_filters: for cf in config.change_filters:

View File

@ -719,9 +719,9 @@ class TabbedBrowser(QWidget):
except TabDeletedError: except TabDeletedError:
# We can get signals for tabs we already deleted... # We can get signals for tabs we already deleted...
return return
start = config.configcache['colors.tabs.indicator.start'] start = config.cache['colors.tabs.indicator.start']
stop = config.configcache['colors.tabs.indicator.stop'] stop = config.cache['colors.tabs.indicator.stop']
system = config.configcache['colors.tabs.indicator.system'] system = config.cache['colors.tabs.indicator.system']
color = utils.interpolate_color(start, stop, perc, system) color = utils.interpolate_color(start, stop, perc, system)
self.widget.set_tab_indicator_color(idx, color) self.widget.set_tab_indicator_color(idx, color)
self.widget.update_tab_title(idx) self.widget.update_tab_title(idx)

View File

@ -139,9 +139,9 @@ class TabWidget(QTabWidget):
""" """
tab = self.widget(idx) tab = self.widget(idx)
if tab.data.pinned: if tab.data.pinned:
fmt = config.configcache['tabs.title.format_pinned'] fmt = config.cache['tabs.title.format_pinned']
else: else:
fmt = config.configcache['tabs.title.format'] fmt = config.cache['tabs.title.format']
if (field is not None and if (field is not None and
(fmt is None or ('{' + field + '}') not in fmt)): (fmt is None or ('{' + field + '}') not in fmt)):
@ -604,7 +604,7 @@ class TabBar(QTabBar):
minimum_size = self.minimumTabSizeHint(index) minimum_size = self.minimumTabSizeHint(index)
height = minimum_size.height() height = minimum_size.height()
if self.vertical: if self.vertical:
confwidth = str(config.configcache['tabs.width']) confwidth = str(config.cache['tabs.width'])
if confwidth.endswith('%'): if confwidth.endswith('%'):
main_window = objreg.get('main-window', scope='window', main_window = objreg.get('main-window', scope='window',
window=self._win_id) window=self._win_id)
@ -614,7 +614,7 @@ class TabBar(QTabBar):
width = int(confwidth) width = int(confwidth)
size = QSize(max(minimum_size.width(), width), height) size = QSize(max(minimum_size.width(), width), height)
else: else:
if config.configcache['tabs.pinned.shrink']: if config.cache['tabs.pinned.shrink']:
pinned = self._tab_pinned(index) pinned = self._tab_pinned(index)
pinned_count, pinned_width = self._pinned_statistics() pinned_count, pinned_width = self._pinned_statistics()
else: else:
@ -658,9 +658,9 @@ class TabBar(QTabBar):
setting += '.odd' if (idx + 1) % 2 else '.even' setting += '.odd' if (idx + 1) % 2 else '.even'
tab.palette.setColor(QPalette.Window, tab.palette.setColor(QPalette.Window,
config.configcache[setting + '.bg']) config.cache[setting + '.bg'])
tab.palette.setColor(QPalette.WindowText, tab.palette.setColor(QPalette.WindowText,
config.configcache[setting + '.fg']) config.cache[setting + '.fg'])
indicator_color = self.tab_indicator_color(idx) indicator_color = self.tab_indicator_color(idx)
tab.palette.setColor(QPalette.Base, indicator_color) tab.palette.setColor(QPalette.Base, indicator_color)
@ -805,7 +805,7 @@ class TabBarStyle(QCommonStyle):
elif element == QStyle.CE_TabBarTabLabel: elif element == QStyle.CE_TabBarTabLabel:
if not opt.icon.isNull() and layouts.icon.isValid(): if not opt.icon.isNull() and layouts.icon.isValid():
self._draw_icon(layouts, opt, p) self._draw_icon(layouts, opt, p)
alignment = (config.configcache['tabs.title.alignment'] | alignment = (config.cache['tabs.title.alignment'] |
Qt.AlignVCenter | Qt.TextHideMnemonic) Qt.AlignVCenter | Qt.TextHideMnemonic)
self._style.drawItemText(p, layouts.text, alignment, opt.palette, self._style.drawItemText(p, layouts.text, alignment, opt.palette,
opt.state & QStyle.State_Enabled, opt.state & QStyle.State_Enabled,
@ -878,8 +878,8 @@ class TabBarStyle(QCommonStyle):
Return: Return:
A Layout object with two QRects. A Layout object with two QRects.
""" """
padding = config.configcache['tabs.padding'] padding = config.cache['tabs.padding']
indicator_padding = config.configcache['tabs.indicator.padding'] indicator_padding = config.cache['tabs.indicator.padding']
text_rect = QRect(opt.rect) text_rect = QRect(opt.rect)
if not text_rect.isValid(): if not text_rect.isValid():
@ -890,7 +890,7 @@ class TabBarStyle(QCommonStyle):
text_rect.adjust(padding.left, padding.top, -padding.right, text_rect.adjust(padding.left, padding.top, -padding.right,
-padding.bottom) -padding.bottom)
indicator_width = config.configcache['tabs.indicator.width'] indicator_width = config.cache['tabs.indicator.width']
if indicator_width == 0: if indicator_width == 0:
indicator_rect = QRect() indicator_rect = QRect()
else: else:
@ -933,9 +933,9 @@ class TabBarStyle(QCommonStyle):
icon_state = (QIcon.On if opt.state & QStyle.State_Selected icon_state = (QIcon.On if opt.state & QStyle.State_Selected
else QIcon.Off) else QIcon.Off)
# reserve space for favicon when tab bar is vertical (issue #1968) # reserve space for favicon when tab bar is vertical (issue #1968)
position = config.configcache['tabs.position'] position = config.cache['tabs.position']
if (position in [QTabWidget.East, QTabWidget.West] and if (position in [QTabWidget.East, QTabWidget.West] and
config.configcache['tabs.favicons.show'] != 'never'): config.cache['tabs.favicons.show'] != 'never'):
tab_icon_size = icon_size tab_icon_size = icon_size
else: else:
actual_size = opt.icon.actualSize(icon_size, icon_mode, icon_state) actual_size = opt.icon.actualSize(icon_size, icon_mode, icon_state)

View File

@ -254,7 +254,7 @@ def config_stub(stubs, monkeypatch, configdata_init, yaml_config_stub):
monkeypatch.setattr(config, 'val', container) monkeypatch.setattr(config, 'val', container)
cache = configcache.ConfigCache() cache = configcache.ConfigCache()
monkeypatch.setattr(config, 'configcache', cache) monkeypatch.setattr(config, 'cache', cache)
try: try:
configtypes.Font.monospace_fonts = container.fonts.monospace configtypes.Font.monospace_fonts = container.fonts.monospace

View File

@ -17,32 +17,31 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>. # along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
"""Tests for qutebrowser.misc.autoupdate.""" """Tests for qutebrowser.config.configcache."""
import pytest import pytest
from qutebrowser.config import config from qutebrowser.config import config
class TestConfigCache: def test_configcache_except_pattern(config_stub):
@pytest.fixture
def ccache(self, config_stub):
return config.configcache
def test_configcache_except_pattern(self, ccache):
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
assert ccache['content.javascript.enabled'] assert config.cache['content.javascript.enabled']
def test_configcache_error_set(self, ccache):
def test_configcache_error_set(config_stub):
with pytest.raises(TypeError): with pytest.raises(TypeError):
ccache['content.javascript.enabled'] = True config.cache['content.javascript.enabled'] = True
def test_configcache_get(self, ccache):
assert not ccache['auto_save.session']
assert not ccache['auto_save.session']
def test_configcache_get_after_set(self, ccache): def test_configcache_get(config_stub):
assert not ccache['auto_save.session'] assert len(config.cache._cache) == 0
config.val.auto_save.session = True assert not config.cache['auto_save.session']
assert ccache['auto_save.session'] assert len(config.cache._cache) == 1
assert not config.cache['auto_save.session']
def test_configcache_get_after_set(config_stub):
assert not config.cache['auto_save.session']
config_stub.val.auto_save.session = True
assert config.cache['auto_save.session']