Do validation and reading from configparser correctly
This commit is contained in:
parent
a5f8bdf7fc
commit
5bd40e732c
@ -120,12 +120,9 @@ class Config(QObject):
|
|||||||
self._configdir = configdir
|
self._configdir = configdir
|
||||||
self._interpolation = ExtendedInterpolation()
|
self._interpolation = ExtendedInterpolation()
|
||||||
self._proxies = {}
|
self._proxies = {}
|
||||||
for secname, section in self.sections.items():
|
for secname in self.sections.keys():
|
||||||
self._proxies[secname] = SectionProxy(self, secname)
|
self._proxies[secname] = SectionProxy(self, secname)
|
||||||
try:
|
self._from_cp(self._configparser)
|
||||||
section.from_cp(self._configparser[secname])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
"""Get a section from the config."""
|
"""Get a section from the config."""
|
||||||
@ -198,6 +195,18 @@ class Config(QObject):
|
|||||||
lines.append(keyval)
|
lines.append(keyval)
|
||||||
return lines
|
return lines
|
||||||
|
|
||||||
|
def _from_cp(self, cp):
|
||||||
|
"""Read the config from a configparser instance.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
cp: The configparser instande to read the values from.
|
||||||
|
"""
|
||||||
|
for secname in self.sections.keys():
|
||||||
|
if secname not in cp:
|
||||||
|
continue
|
||||||
|
for k, v in cp[secname].items():
|
||||||
|
self.set('conf', secname, k, v)
|
||||||
|
|
||||||
def has_option(self, section, option):
|
def has_option(self, section, option):
|
||||||
"""Check if option exists in section.
|
"""Check if option exists in section.
|
||||||
|
|
||||||
@ -312,15 +321,16 @@ class Config(QObject):
|
|||||||
changed: If the config was changed.
|
changed: If the config was changed.
|
||||||
style_changed: When style caches need to be invalidated.
|
style_changed: When style caches need to be invalidated.
|
||||||
"""
|
"""
|
||||||
if value:
|
value = self._interpolation.before_set(self, section, option, value)
|
||||||
value = self._interpolation.before_set(self, section, option,
|
|
||||||
value)
|
|
||||||
try:
|
try:
|
||||||
sect = self.sections[section]
|
sect = self.sections[section]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise NoSectionError(section)
|
raise NoSectionError(section)
|
||||||
|
mapping = {key: val.value for key, val in sect.values.items()}
|
||||||
|
interpolated = self._interpolation.before_get(self, section, option,
|
||||||
|
value, mapping)
|
||||||
try:
|
try:
|
||||||
sect.setv(layer, option, value)
|
sect.setv(layer, option, value, interpolated)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise NoOptionError(option, section)
|
raise NoOptionError(option, section)
|
||||||
else:
|
else:
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
"""Setting sections used for qutebrowser."""
|
"""Setting sections used for qutebrowser."""
|
||||||
|
|
||||||
import logging
|
|
||||||
from collections import OrderedDict, ChainMap
|
from collections import OrderedDict, ChainMap
|
||||||
|
|
||||||
from qutebrowser.config.value import SettingValue
|
from qutebrowser.config.value import SettingValue
|
||||||
@ -78,7 +77,7 @@ class Section:
|
|||||||
"""Get value keys."""
|
"""Get value keys."""
|
||||||
return self.values.keys()
|
return self.values.keys()
|
||||||
|
|
||||||
def setv(self, layer, key, value):
|
def setv(self, layer, key, value, interpolated):
|
||||||
"""Set the value on a layer.
|
"""Set the value on a layer.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -86,13 +85,10 @@ class Section:
|
|||||||
ValueLayers dict.
|
ValueLayers dict.
|
||||||
key: The key of the element to set.
|
key: The key of the element to set.
|
||||||
value: The value to set.
|
value: The value to set.
|
||||||
|
interpolated: The interpolated value, for checking.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
def from_cp(self, sect):
|
|
||||||
"""Initialize the values from a configparser section."""
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def dump_userconfig(self):
|
def dump_userconfig(self):
|
||||||
"""Dump the part of the config which was changed by the user.
|
"""Dump the part of the config which was changed by the user.
|
||||||
|
|
||||||
@ -124,13 +120,8 @@ class KeyValue(Section):
|
|||||||
self.values[k] = v
|
self.values[k] = v
|
||||||
self.descriptions[k] = desc
|
self.descriptions[k] = desc
|
||||||
|
|
||||||
def setv(self, layer, key, value):
|
def setv(self, layer, key, value, interpolated):
|
||||||
self.values[key].setv(layer, value)
|
self.values[key].setv(layer, value, interpolated)
|
||||||
|
|
||||||
def from_cp(self, sect):
|
|
||||||
for k, v in sect.items():
|
|
||||||
logging.debug("'{}' = '{}'".format(k, v))
|
|
||||||
self.values[k].setv('conf', v)
|
|
||||||
|
|
||||||
def dump_userconfig(self):
|
def dump_userconfig(self):
|
||||||
changed = []
|
changed = []
|
||||||
@ -183,22 +174,15 @@ class ValueList(Section):
|
|||||||
self.values = ChainMap(self.layers['temp'], self.layers['conf'],
|
self.values = ChainMap(self.layers['temp'], self.layers['conf'],
|
||||||
self.layers['default'])
|
self.layers['default'])
|
||||||
|
|
||||||
def setv(self, layer, key, value):
|
def setv(self, layer, key, value, interpolated):
|
||||||
|
self.keytype().validate(key)
|
||||||
if key in self.layers[layer]:
|
if key in self.layers[layer]:
|
||||||
self.layers[layer][key].setv(layer, value)
|
self.layers[layer][key].setv(layer, value, interpolated)
|
||||||
else:
|
else:
|
||||||
val = SettingValue(self.valtype)
|
val = SettingValue(self.valtype)
|
||||||
val.setv(layer, value)
|
val.setv(layer, value, interpolated)
|
||||||
self.layers[layer][key] = val
|
self.layers[layer][key] = val
|
||||||
|
|
||||||
def from_cp(self, sect):
|
|
||||||
keytype = self.keytype()
|
|
||||||
valtype = self.valtype()
|
|
||||||
for k, v in sect.items():
|
|
||||||
keytype.validate(k)
|
|
||||||
valtype.validate(v)
|
|
||||||
self.setv('conf', k, v)
|
|
||||||
|
|
||||||
def dump_userconfig(self):
|
def dump_userconfig(self):
|
||||||
changed = []
|
changed = []
|
||||||
mapping = ChainMap(self.layers['temp'], self.layers['conf'])
|
mapping = ChainMap(self.layers['temp'], self.layers['conf'])
|
||||||
|
@ -90,13 +90,14 @@ class SettingValue:
|
|||||||
v = self.value
|
v = self.value
|
||||||
return self.typ.transform(v)
|
return self.typ.transform(v)
|
||||||
|
|
||||||
def setv(self, layer, value):
|
def setv(self, layer, value, interpolated):
|
||||||
"""Set the value on a layer.
|
"""Set the value on a layer.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
layer: The layer to set the value on, an element name of the
|
layer: The layer to set the value on, an element name of the
|
||||||
ValueLayers dict.
|
ValueLayers dict.
|
||||||
value: The value to set.
|
value: The value to set.
|
||||||
|
interpolated: The interpolated value, for typechecking.
|
||||||
"""
|
"""
|
||||||
self.typ.validate(value)
|
self.typ.validate(interpolated)
|
||||||
self._values[layer] = value
|
self._values[layer] = value
|
||||||
|
Loading…
Reference in New Issue
Block a user