less commit + better meta support

This commit is contained in:
Emmanuel Garette 2017-07-16 23:11:12 +02:00
parent 7fb0ee2575
commit 90a2072fc5
8 changed files with 167 additions and 68 deletions

View file

@ -11,6 +11,10 @@ from tiramisu.error import ConfigError, ConflictError
owners.addowner('meta') owners.addowner('meta')
def return_value(value=None):
return value
def raise_exception(): def raise_exception():
raise Exception('test') raise Exception('test')
@ -528,3 +532,70 @@ def test_meta_exception_meta():
meta = MetaConfig([conf1, conf2]) meta = MetaConfig([conf1, conf2])
meta.read_write() meta.read_write()
raises(Exception, "conf1.make_dict()") raises(Exception, "conf1.make_dict()")
def test_meta_callback():
val1 = StrOption('val1', "", 'val')
val2 = StrOption('val2', "", callback=return_value, callback_params={'': ((val1, False),)})
val3 = StrOption('val3', "", callback=return_value, callback_params={'': ('yes',)})
val4 = StrOption('val4', "", callback=return_value, callback_params={'value': ((val1, False),)})
val5 = StrOption('val5', "", callback=return_value, callback_params={'value': ('yes',)})
maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5])
cfg = Config(maconfig, name='cfg')
meta = MetaConfig([cfg])
meta.read_write()
assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'val', 'val1': 'val', 'val5': 'yes', 'val4': 'val'}
meta.cfg.val1 = 'new'
assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'}
del(meta.cfg.val1)
meta.val1 = 'new'
assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new'}
#del(meta.val1)
meta.cfg.val4 = 'new1'
assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'}
del(meta.cfg.val4)
meta.val4 = 'new1'
assert meta.cfg.make_dict() == {'val3': 'yes', 'val2': 'new', 'val1': 'new', 'val5': 'yes', 'val4': 'new1'}
del(meta.val4)
def test_meta_callback_slave():
val = StrOption('val', "", default='val')
val1 = StrOption('val1', "", multi=True, callback=return_value, callback_params={'': ((val, False),)})
val3 = StrOption('val2', "", multi=True, callback=return_value, callback_params={'': ((val1, False),)})
val4 = StrOption('val3', "", multi=True, callback=return_value, callback_params={'': ((val1, False),)})
interface1 = OptionDescription('val1', '', [val1, val3, val4])
interface1.impl_set_group_type(groups.master)
maconfig = OptionDescription('rootconfig', '', [val, interface1])
cfg = Config(maconfig, name='cfg')
meta = MetaConfig([cfg])
meta.read_write()
assert meta.cfg.make_dict() == {'val1.val2': ['val'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
meta.cfg.val = 'val1'
assert meta.cfg.make_dict() == {'val1.val2': ['val1'], 'val1.val1': ['val1'], 'val1.val3': ['val1'], 'val': 'val1'}
del(meta.cfg.val)
meta.val = 'val1'
assert meta.cfg.make_dict() == {'val1.val2': ['val1'], 'val1.val1': ['val1'], 'val1.val3': ['val1'], 'val': 'val1'}
del(meta.val)
meta.cfg.val1.val2 = ['val2']
assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
del(meta.cfg.val1.val2)
assert meta.cfg.make_dict() == {'val1.val2': ['val'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
meta.val1.val2 = ['val2']
assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
meta.cfg.val1.val3 = ['val6']
assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val'], 'val1.val3': ['val6'], 'val': 'val'}
del(meta.val1.val2)
del(meta.cfg.val1.val3)
meta.cfg.val1.val1 = ['val3']
assert meta.cfg.make_dict() == {'val1.val2': ['val3'], 'val1.val1': ['val3'], 'val1.val3': ['val3'], 'val': 'val'}
del(meta.cfg.val1.val1)
assert meta.cfg.make_dict() == {'val1.val2': ['val'], 'val1.val1': ['val'], 'val1.val3': ['val'], 'val': 'val'}
meta.val1.val1 = ['val3']
assert meta.cfg.make_dict() == {'val1.val2': ['val3'], 'val1.val1': ['val3'], 'val1.val3': ['val3'], 'val': 'val'}
meta.cfg.val1.val2 = ['val2']
assert meta.cfg.make_dict() == {'val1.val2': ['val2'], 'val1.val1': ['val3'], 'val1.val3': ['val3'], 'val': 'val'}
meta.cfg.val1.val1.append('rah')
assert meta.cfg.make_dict() == {'val1.val2': ['val2', 'rah'], 'val1.val1': ['val3', 'rah'], 'val1.val3': ['val3', 'rah'], 'val': 'val'}
meta.val1.val1 = ['val4']
assert meta.cfg.make_dict() == {'val1.val2': ['val2', 'rah'], 'val1.val1': ['val3', 'rah'], 'val1.val3': ['val3', 'rah'], 'val': 'val'}

View file

@ -290,7 +290,7 @@ class SubConfig(object):
not_raises=not_raises) not_raises=not_raises)
def setattr(self, name, value, force_permissive=False, not_raises=False, index=None, def setattr(self, name, value, force_permissive=False, not_raises=False, index=None,
_setting_properties=undefined): _setting_properties=undefined, _commit=True):
if name.startswith('_impl_'): if name.startswith('_impl_'):
return object.__setattr__(self, name, value) return object.__setattr__(self, name, value)
context = self._cfgimpl_get_context() context = self._cfgimpl_get_context()
@ -302,7 +302,8 @@ class SubConfig(object):
_setting_properties=_setting_properties) _setting_properties=_setting_properties)
return homeconfig.setattr(name, value, force_permissive, return homeconfig.setattr(name, value, force_permissive,
not_raises, index=index, not_raises, index=index,
_setting_properties=_setting_properties) _setting_properties=_setting_properties,
_commit=_commit)
child = self.cfgimpl_get_description().__getattr__(name, child = self.cfgimpl_get_description().__getattr__(name,
context=context) context=context)
if isinstance(child, OptionDescription) or isinstance(child, SynDynOptionDescription): if isinstance(child, OptionDescription) or isinstance(child, SynDynOptionDescription):
@ -312,13 +313,15 @@ class SubConfig(object):
path = context.cfgimpl_get_description().impl_get_path_by_opt( path = context.cfgimpl_get_description().impl_get_path_by_opt(
child._impl_getopt()) child._impl_getopt())
context.setattr(path, value, force_permissive, not_raises, index=index, context.setattr(path, value, force_permissive, not_raises, index=index,
_setting_properties=_setting_properties) _setting_properties=_setting_properties,
_commit=_commit)
else: else:
subpath = self._get_subpath(name) subpath = self._get_subpath(name)
self.cfgimpl_get_values().setitem(child, value, subpath, self.cfgimpl_get_values().setitem(child, value, subpath,
force_permissive=force_permissive, force_permissive=force_permissive,
not_raises=not_raises, index=index, not_raises=not_raises, index=index,
_setting_properties=_setting_properties) _setting_properties=_setting_properties,
_commit=_commit)
def __delattr__(self, name): def __delattr__(self, name):
context = self._cfgimpl_get_context() context = self._cfgimpl_get_context()
@ -871,16 +874,19 @@ class GroupConfig(_CommonConfig):
for child in self._impl_children: for child in self._impl_children:
child.cfgimpl_reset_cache(only_expired=only_expired, only=only, opt=opt, path=path) child.cfgimpl_reset_cache(only_expired=only_expired, only=only, opt=opt, path=path)
def set_value(self, path, value): def set_value(self, path, value, _commit=True):
"""Setattr not in current GroupConfig, but in each children """Setattr not in current GroupConfig, but in each children
""" """
for child in self._impl_children: for child in self._impl_children:
if isinstance(child, MetaConfig): if isinstance(child, MetaConfig):
child.set_value(path, value, only_config=True) child.set_value(path, value, only_config=True, _commit=False)
elif isinstance(child, GroupConfig): elif isinstance(child, GroupConfig):
child.set_value(path, value) child.set_value(path, value, _commit=False)
else: else:
child.setattr(path, value, not_raises=True) child.setattr(path, value, not_raises=True, _commit=False)
if _commit:
self.cfgimpl_get_values()._p_.commit()
def find_firsts(self, byname=None, bypath=undefined, byoption=undefined, def find_firsts(self, byname=None, bypath=undefined, byoption=undefined,
byvalue=undefined, raise_if_not_found=True, _sub=False, byvalue=undefined, raise_if_not_found=True, _sub=False,
@ -975,7 +981,7 @@ class MetaConfig(GroupConfig):
def set_value(self, path, value, force_default=False, def set_value(self, path, value, force_default=False,
force_dont_change_value=False, force_default_if_same=False, force_dont_change_value=False, force_default_if_same=False,
only_config=False): only_config=False, _commit=True):
"""only_config: could be set if you want modify value in all Config included in """only_config: could be set if you want modify value in all Config included in
this MetaConfig this MetaConfig
""" """
@ -984,12 +990,13 @@ class MetaConfig(GroupConfig):
raise ValueError(_('force_default, force_default_if_same or ' raise ValueError(_('force_default, force_default_if_same or '
'force_dont_change_value cannot be set with' 'force_dont_change_value cannot be set with'
' only_config')) ' only_config'))
return super(MetaConfig, self).set_value(path, value) return super(MetaConfig, self).set_value(path, value, _commit=_commit)
if force_default or force_default_if_same or force_dont_change_value: if force_default or force_default_if_same or force_dont_change_value:
if force_default and force_dont_change_value: if force_default and force_dont_change_value:
raise ValueError(_('force_default and force_dont_change_value' raise ValueError(_('force_default and force_dont_change_value'
' cannot be set together')) ' cannot be set together'))
opt = self.cfgimpl_get_description().impl_get_opt_by_path(path) opt = self.cfgimpl_get_description().impl_get_opt_by_path(path)
setting_properties = self.cfgimpl_get_settings()._getproperties(read_write=False)
for child in self._impl_children: for child in self._impl_children:
if force_default_if_same or force_default: if force_default_if_same or force_default:
if force_default_if_same: if force_default_if_same:
@ -999,14 +1006,16 @@ class MetaConfig(GroupConfig):
child_value = child.getattr(path) child_value = child.getattr(path)
if force_default or value == child_value: if force_default or value == child_value:
child.cfgimpl_get_values().reset(opt, path=path, child.cfgimpl_get_values().reset(opt, path=path,
validate=False) validate=False,
_setting_properties=setting_properties,
_commit=False)
continue continue
if force_dont_change_value: if force_dont_change_value:
child_value = child.getattr(path) child_value = child.getattr(path, _setting_properties=setting_properties)
if value != child_value: if value != child_value:
setattr(child, path, child_value) child.setattr(path, child_value, _commit=False)
setattr(self, path, value) self.setattr(path, value, _commit=_commit)
def new_config(self, session_id=None, persistent=False, name=undefined): def new_config(self, session_id=None, persistent=False, name=undefined):
return Config(self._impl_descr, _duplicate=True, session_id=session_id, name=name, return Config(self._impl_descr, _duplicate=True, session_id=session_id, name=name,

View file

@ -99,9 +99,10 @@ class MasterSlaves(object):
else: else:
return opt == self._p_._sm_getmaster() or opt in self._p_._sm_getslaves() return opt == self._p_._sm_getmaster() or opt in self._p_._sm_getslaves()
def reset(self, opt, values, setting_properties): def reset(self, opt, values, setting_properties, _commit=True):
for slave in self.getslaves(opt): for slave in self.getslaves(opt):
values.reset(slave, validate=False, _setting_properties=setting_properties) values.reset(slave, validate=False, _setting_properties=setting_properties,
_commit=_commit)
def pop(self, opt, values, index): def pop(self, opt, values, index):
for slave in self.getslaves(opt): for slave in self.getslaves(opt):

View file

@ -204,6 +204,7 @@ class OptionDescription(BaseOption, StorageOptionDescription):
def impl_build_force_store_values(self, config, force_store_values): def impl_build_force_store_values(self, config, force_store_values):
session = config._impl_values._p_.getsession() session = config._impl_values._p_.getsession()
value_set = False
for subpath, option in self._cache_force_store_values: for subpath, option in self._cache_force_store_values:
if option.impl_is_master_slaves('slave'): if option.impl_is_master_slaves('slave'):
# problem with index # problem with index
@ -218,8 +219,12 @@ class OptionDescription(BaseOption, StorageOptionDescription):
validate=False, validate=False,
trusted_cached_properties=False, trusted_cached_properties=False,
validate_properties=True) validate_properties=True)
value_set = True
config._impl_values._p_.setvalue(subpath, value, config._impl_values._p_.setvalue(subpath, value,
owners.forced, None, session) owners.forced, None, session, False)
if value_set:
config._impl_values._p_.commit()
# ____________________________________________________________ # ____________________________________________________________
def impl_set_group_type(self, group_type): def impl_set_group_type(self, group_type):

View file

@ -32,6 +32,9 @@ class Values(Cache):
# should init cache too # should init cache too
super(Values, self).__init__(storage) super(Values, self).__init__(storage)
def commit(self):
pass
def getsession(self): def getsession(self):
pass pass
@ -63,7 +66,7 @@ class Values(Cache):
values.append(tuple(lst)) values.append(tuple(lst))
return vidx return vidx
# value # value
def setvalue(self, path, value, owner, index, session): def setvalue(self, path, value, owner, index, session, commit):
"""set value for a path """set value for a path
a specified value must be associated to an owner a specified value must be associated to an owner
""" """
@ -94,7 +97,7 @@ class Values(Cache):
""" """
return path in self._values[0] return path in self._values[0]
def resetvalue(self, path, session): def resetvalue(self, path, session, commit):
"""remove value means delete value in storage """remove value means delete value in storage
""" """
def _resetvalue(nb): def _resetvalue(nb):

View file

@ -21,8 +21,6 @@ from os.path import basename, splitext, join, isfile
import sqlite3 import sqlite3
from glob import glob from glob import glob
from ..util import SerializeObject from ..util import SerializeObject
global idx
idx = 0
class Setting(SerializeObject): class Setting(SerializeObject):
@ -94,15 +92,17 @@ class Storage(object):
self.execute(settings_table, commit=False) self.execute(settings_table, commit=False)
self.execute(permissives_table) self.execute(permissives_table)
def commit(self):
#print('ca commit')
self._conn.commit()
def execute(self, sql, params=None, commit=True): def execute(self, sql, params=None, commit=True):
global idx #print(sql, params)
idx += 1
print(idx, sql, params)
if params is None: if params is None:
params = tuple() params = tuple()
self._cursor.execute(sql, params) self._cursor.execute(sql, params)
if commit: if commit:
self._conn.commit() self.commit()
def select(self, sql, params=None, only_one=True): def select(self, sql, params=None, only_one=True):
self.execute(sql, params=params, commit=False) self.execute(sql, params=params, commit=False)

View file

@ -43,8 +43,11 @@ class Values(Sqlite3DB):
request += "LIMIT 1" request += "LIMIT 1"
return self._storage.select(request, params) return self._storage.select(request, params)
def commit(self):
self._storage.commit()
# value # value
def setvalue(self, path, value, owner, index, session): def setvalue(self, path, value, owner, index, session, commit):
"""set value for an option """set value for an option
a specified value must be associated to an owner a specified value must be associated to an owner
""" """
@ -58,7 +61,7 @@ class Values(Sqlite3DB):
str(owner), str(owner),
index, index,
self._session_id), self._session_id),
commit=True) commit=commit)
else: else:
self._storage.execute("DELETE FROM value WHERE path = ? AND session_id = ?", self._storage.execute("DELETE FROM value WHERE path = ? AND session_id = ?",
(path, self._session_id), (path, self._session_id),
@ -67,7 +70,7 @@ class Values(Sqlite3DB):
"(?, ?, ?, ?)", (path, self._sqlite_encode(value), "(?, ?, ?, ?)", (path, self._sqlite_encode(value),
str(owner), str(owner),
self._session_id), self._session_id),
commit=True) commit=commit)
def getvalue(self, path, session, index=None): def getvalue(self, path, session, index=None):
"""get value for an option """get value for an option
@ -86,11 +89,12 @@ class Values(Sqlite3DB):
path = self._sqlite_encode_path(path) path = self._sqlite_encode_path(path)
return self._sqlite_select(path, index) is not None return self._sqlite_select(path, index) is not None
def resetvalue(self, path, session): def resetvalue(self, path, session, _commit):
"""remove value means delete value in storage """remove value means delete value in storage
""" """
path = self._sqlite_encode_path(path) path = self._sqlite_encode_path(path)
self._storage.execute("DELETE FROM value WHERE path = ? AND session_id = ?", (path, self._session_id)) self._storage.execute("DELETE FROM value WHERE path = ? AND session_id = ?", (path, self._session_id),
commit=_commit)
def get_modified_values(self): def get_modified_values(self):
"""return all values in a dictionary """return all values in a dictionary

View file

@ -58,30 +58,16 @@ class Values(object):
def _get_multi(self, opt, path): def _get_multi(self, opt, path):
return Multi([], self.context, opt, path) return Multi([], self.context, opt, path)
def _getdefaultvalue(self, opt, path, with_meta, index, submulti_index, validate): def _getdefaultvalue(self, opt, path, with_meta, index, submulti_index, validate,
# if value has callback and is not set _orig_context=undefined):
if opt.impl_has_callback(): if _orig_context is undefined:
callback, callback_params = opt.impl_get_callback() _orig_context = self._getcontext()
value = carry_out_calculation(opt, context=self._getcontext(),
callback=callback,
callback_params=callback_params,
index=index, validate=validate)
if isinstance(value, list) and index is not None:
#if return a list and index is set, return value only if
#it's a submulti without submulti_index and without list of list
if opt.impl_is_submulti() and submulti_index is undefined and \
(len(value) == 0 or not isinstance(value[0], list)):
return value
if not opt.impl_is_submulti() and len(value) > index:
return value[index]
else:
return value
if with_meta: if with_meta:
meta = self._getcontext().cfgimpl_get_meta() meta = self._getcontext().cfgimpl_get_meta()
if meta is not None: if meta is not None:
value = meta.cfgimpl_get_values( value = meta.cfgimpl_get_values(
)._get_cached_value(opt, path, index=index, submulti_index=submulti_index, )._get_cached_value(opt, path, index=index, submulti_index=submulti_index,
from_masterslave=True) from_masterslave=True, _orig_context=_orig_context)
if isinstance(value, Exception): if isinstance(value, Exception):
if not isinstance(value, PropertiesOptionError): # pragma: no cover if not isinstance(value, PropertiesOptionError): # pragma: no cover
raise value raise value
@ -103,6 +89,23 @@ class Values(object):
value = new_value value = new_value
del new_value del new_value
return value return value
# if value has callback and is not set
if opt.impl_has_callback():
callback, callback_params = opt.impl_get_callback()
value = carry_out_calculation(opt, context=_orig_context,
callback=callback,
callback_params=callback_params,
index=index, validate=validate)
if isinstance(value, list) and index is not None:
#if return a list and index is set, return value only if
#it's a submulti without submulti_index and without list of list
if opt.impl_is_submulti() and submulti_index is undefined and \
(len(value) == 0 or not isinstance(value[0], list)):
return value
if not opt.impl_is_submulti() and len(value) > index:
return value[index]
else:
return value
# now try to get default value # now try to get default value
value = opt.impl_getdefault() value = opt.impl_getdefault()
if opt.impl_is_multi() and index is not None: if opt.impl_is_multi() and index is not None:
@ -116,7 +119,7 @@ class Values(object):
return value return value
def _getvalue(self, opt, path, self_properties, index, submulti_index, def _getvalue(self, opt, path, self_properties, index, submulti_index,
with_meta, masterlen, session, validate): with_meta, masterlen, session, validate, _orig_context):
"""actually retrieves the value """actually retrieves the value
:param opt: the `option.Option()` object :param opt: the `option.Option()` object
@ -141,7 +144,7 @@ class Values(object):
else: else:
return value return value
return self._getdefaultvalue(opt, path, with_meta, index, return self._getdefaultvalue(opt, path, with_meta, index,
submulti_index, validate) submulti_index, validate, _orig_context)
def get_modified_values(self): def get_modified_values(self):
return self._p_.get_modified_values() return self._p_.get_modified_values()
@ -165,7 +168,7 @@ class Values(object):
"""overrides the builtins `del()` instructions""" """overrides the builtins `del()` instructions"""
self.reset(opt) self.reset(opt)
def reset(self, opt, path=None, validate=True, _setting_properties=None): def reset(self, opt, path=None, validate=True, _setting_properties=None, _commit=True):
context = self._getcontext() context = self._getcontext()
setting = context.cfgimpl_get_settings() setting = context.cfgimpl_get_settings()
if path is None: if path is None:
@ -186,7 +189,7 @@ class Values(object):
if isinstance(ret, Exception): if isinstance(ret, Exception):
raise ret raise ret
if opt.impl_is_master_slaves('master'): if opt.impl_is_master_slaves('master'):
opt.impl_get_master_slaves().reset(opt, self, _setting_properties) opt.impl_get_master_slaves().reset(opt, self, _setting_properties, _commit=_commit)
if hasvalue: if hasvalue:
if 'force_store_value' in setting._getproperties(opt=opt, if 'force_store_value' in setting._getproperties(opt=opt,
path=path, path=path,
@ -196,9 +199,9 @@ class Values(object):
value = self._getdefaultvalue(opt, path, True, undefined, undefined, validate) value = self._getdefaultvalue(opt, path, True, undefined, undefined, validate)
if isinstance(value, Exception): # pragma: no cover if isinstance(value, Exception): # pragma: no cover
raise value raise value
self._setvalue(opt, path, value, force_owner=owners.forced) self._setvalue(opt, path, value, force_owner=owners.forced, commit=_commit)
else: else:
self._p_.resetvalue(path, session) self._p_.resetvalue(path, session, _commit)
context.cfgimpl_reset_cache(opt=opt, path=path, only=('values', 'properties')) context.cfgimpl_reset_cache(opt=opt, path=path, only=('values', 'properties'))
def _isempty(self, opt, value, force_allow_empty_list=False, index=None): def _isempty(self, opt, value, force_allow_empty_list=False, index=None):
@ -239,7 +242,7 @@ class Values(object):
setting_properties=undefined, self_properties=undefined, setting_properties=undefined, self_properties=undefined,
index=None, submulti_index=undefined, from_masterslave=False, index=None, submulti_index=undefined, from_masterslave=False,
with_meta=True, masterlen=undefined, check_frozen=False, with_meta=True, masterlen=undefined, check_frozen=False,
session=None, display_warnings=True): session=None, display_warnings=True, _orig_context=undefined):
context = self._getcontext() context = self._getcontext()
settings = context.cfgimpl_get_settings() settings = context.cfgimpl_get_settings()
if path is None: if path is None:
@ -252,7 +255,8 @@ class Values(object):
read_write=False, read_write=False,
setting_properties=setting_properties, setting_properties=setting_properties,
index=index) index=index)
if 'cache' in setting_properties and self._p_.hascache(path, index): if 'cache' in setting_properties and self._p_.hascache(path, index) and \
_orig_context is undefined:
if 'expire' in setting_properties: if 'expire' in setting_properties:
ntime = int(time()) ntime = int(time())
is_cached, value = self._p_.getcache(path, ntime, index) is_cached, value = self._p_.getcache(path, ntime, index)
@ -295,13 +299,14 @@ class Values(object):
submulti_index=submulti_index, submulti_index=submulti_index,
check_frozen=check_frozen, check_frozen=check_frozen,
session=session, session=session,
display_warnings=display_warnings) display_warnings=display_warnings,
_orig_context=_orig_context)
if isinstance(val, Exception): if isinstance(val, Exception):
return val return val
# cache doesn't work with SubMulti yet # cache doesn't work with SubMulti yet
if not isinstance(val, SubMulti) and 'cache' in setting_properties and \ if not isinstance(val, SubMulti) and 'cache' in setting_properties and \
validate and validate_properties and force_permissive is False \ validate and validate_properties and force_permissive is False \
and trusted_cached_properties is True: and trusted_cached_properties is True and _orig_context is undefined:
if 'expire' in setting_properties: if 'expire' in setting_properties:
if ntime is None: if ntime is None:
ntime = int(time()) ntime = int(time())
@ -316,7 +321,8 @@ class Values(object):
with_meta=True, with_meta=True,
masterlen=undefined, masterlen=undefined,
check_frozen=False, check_frozen=False,
session=None, display_warnings=True): session=None, display_warnings=True,
_orig_context=undefined):
"""same has getitem but don't touch the cache """same has getitem but don't touch the cache
index is None for slave value, if value returned is not a list, just return [] index is None for slave value, if value returned is not a list, just return []
""" """
@ -326,7 +332,7 @@ class Values(object):
if session is None: if session is None:
session = self._p_.getsession() session = self._p_.getsession()
value = self._getvalue(opt, path, self_properties, index, submulti_index, value = self._getvalue(opt, path, self_properties, index, submulti_index,
with_meta, masterlen, session, validate) with_meta, masterlen, session, validate, _orig_context)
if isinstance(value, Exception): if isinstance(value, Exception):
value_error = True value_error = True
if isinstance(value, ConfigError): if isinstance(value, ConfigError):
@ -400,7 +406,7 @@ class Values(object):
def setitem(self, opt, value, path, force_permissive=False, def setitem(self, opt, value, path, force_permissive=False,
check_frozen=True, not_raises=False, index=None, check_frozen=True, not_raises=False, index=None,
_setting_properties=undefined): _setting_properties=undefined, _commit=True):
# check_frozen is, for example, used with "force_store_value" # check_frozen is, for example, used with "force_store_value"
# user didn't change value, so not write # user didn't change value, so not write
# valid opt # valid opt
@ -430,9 +436,9 @@ class Values(object):
raise err raise err
opt.impl_validate(value, fake_context, display_error=False, opt.impl_validate(value, fake_context, display_error=False,
setting_properties=_setting_properties) setting_properties=_setting_properties)
self._setvalue(opt, path, value, index=index) self._setvalue(opt, path, value, index=index, commit=_commit)
def _setvalue(self, opt, path, value, force_owner=undefined, index=None): def _setvalue(self, opt, path, value, force_owner=undefined, index=None, commit=True):
context = self._getcontext() context = self._getcontext()
context.cfgimpl_reset_cache(opt=opt, path=path, only=('values', 'properties')) context.cfgimpl_reset_cache(opt=opt, path=path, only=('values', 'properties'))
if force_owner is undefined: if force_owner is undefined:
@ -453,13 +459,13 @@ class Values(object):
#FIXME pourquoi là et pas dans masterslaves ?? #FIXME pourquoi là et pas dans masterslaves ??
if opt.impl_is_master_slaves('slave'): if opt.impl_is_master_slaves('slave'):
if index is not None: if index is not None:
self._p_.setvalue(path, value, owner, index, session) self._p_.setvalue(path, value, owner, index, session, commit)
else: else:
self._p_.resetvalue(path, session) self._p_.resetvalue(path, session, commit)
for idx, val in enumerate(value): for idx, val in enumerate(value):
self._p_.setvalue(path, val, owner, idx, session) self._p_.setvalue(path, val, owner, idx, session, commit)
else: else:
self._p_.setvalue(path, value, owner, None, session) self._p_.setvalue(path, value, owner, None, session, commit)
del(session) del(session)
def validate(self, opt, value, path, check_frozen=True, force_permissive=False, def validate(self, opt, value, path, check_frozen=True, force_permissive=False,