properties are check now in getowner
get_modified_values works good with force_store_value
This commit is contained in:
@ -483,14 +483,15 @@ class _CommonConfig(SubConfig):
|
||||
"read write is a global config's setting, see `settings.py`"
|
||||
self.cfgimpl_get_settings().read_write()
|
||||
|
||||
def getowner(self, opt):
|
||||
def getowner(self, opt, force_permissive=False):
|
||||
"""convenience method to retrieve an option's owner
|
||||
from the config itself
|
||||
"""
|
||||
if not isinstance(opt, Option) and not isinstance(opt, SymLinkOption):
|
||||
raise TypeError(_('opt in getowner must be an option not {0}'
|
||||
'').format(type(opt)))
|
||||
return self.cfgimpl_get_values().getowner(opt)
|
||||
return self.cfgimpl_get_values().getowner(opt,
|
||||
force_permissive=force_permissive)
|
||||
|
||||
def unwrap_from_path(self, path, force_permissive=False):
|
||||
"""convenience method to extract and Option() object from the Config()
|
||||
|
@ -1461,6 +1461,10 @@ def validate_requires_arg(requires, name):
|
||||
raise ValueError(_("malformed requirements for option: {0}"
|
||||
" require must have option, expected and"
|
||||
" action keys").format(name))
|
||||
if action == 'force_store_value':
|
||||
raise ValueError(_("malformed requirements for option: {0}"
|
||||
" action cannot be force_store_value"
|
||||
).format(name))
|
||||
inverse = require.get('inverse', False)
|
||||
if inverse not in [True, False]:
|
||||
raise ValueError(_('malformed requirements for option: {0}'
|
||||
@ -1543,10 +1547,10 @@ def validate_callback(callback, callback_params, type_):
|
||||
if not isinstance(option, Option) and not \
|
||||
isinstance(option, SymLinkOption):
|
||||
raise ValueError(_('{0}_params must have an option'
|
||||
' not a {0} for first argument'
|
||||
).format(type_, type(option)))
|
||||
' not a {0} for first argument'
|
||||
).format(type_, type(option)))
|
||||
if force_permissive not in [True, False]:
|
||||
raise ValueError(_('{0}_params must have a boolean'
|
||||
' not a {0} for second argument'
|
||||
).format(type_, type(
|
||||
force_permissive)))
|
||||
' not a {0} for second argument'
|
||||
).format(type_, type(
|
||||
force_permissive)))
|
||||
|
@ -365,7 +365,10 @@ class Settings(object):
|
||||
self._p_.reset_properties(_path)
|
||||
self._getcontext().cfgimpl_reset_cache()
|
||||
|
||||
def _getproperties(self, opt=None, path=None, is_apply_req=True):
|
||||
def _getproperties(self, opt=None, path=None, _is_apply_req=True):
|
||||
"""
|
||||
be careful, _is_apply_req doesn't copy properties
|
||||
"""
|
||||
if opt is None:
|
||||
props = copy(self._p_.getproperties(path, default_properties))
|
||||
else:
|
||||
@ -379,15 +382,16 @@ class Settings(object):
|
||||
is_cached, props = self._p_.getcache(path, ntime)
|
||||
if is_cached:
|
||||
return copy(props)
|
||||
props = copy(self._p_.getproperties(path, opt._properties))
|
||||
if is_apply_req:
|
||||
props = self._p_.getproperties(path, opt._properties)
|
||||
if _is_apply_req:
|
||||
props = copy(props)
|
||||
props |= self.apply_requires(opt, path)
|
||||
if 'cache' in self:
|
||||
if 'expire' in self:
|
||||
if ntime is None:
|
||||
ntime = int(time())
|
||||
ntime = ntime + expires_time
|
||||
self._p_.setcache(path, copy(props), ntime)
|
||||
if 'cache' in self:
|
||||
if 'expire' in self:
|
||||
if ntime is None:
|
||||
ntime = int(time())
|
||||
ntime = ntime + expires_time
|
||||
self._p_.setcache(path, copy(props), ntime)
|
||||
return props
|
||||
|
||||
def append(self, propname):
|
||||
@ -640,6 +644,15 @@ class Settings(object):
|
||||
def get_modified_permissives(self):
|
||||
return self._p_.get_modified_permissives()
|
||||
|
||||
def get_with_property(self, propname):
|
||||
opts, paths = self._getcontext().cfgimpl_get_description(
|
||||
)._cache_paths
|
||||
for index in range(0, len(paths)):
|
||||
opt = opts[index]
|
||||
path = paths[index]
|
||||
if propname in self._getproperties(opt, path, False):
|
||||
yield (opt, path)
|
||||
|
||||
def __getstate__(self):
|
||||
return {'_p_': self._p_, '_owner': str(self._owner)}
|
||||
|
||||
|
@ -88,6 +88,11 @@ class Values(object):
|
||||
return value
|
||||
|
||||
def get_modified_values(self):
|
||||
context = self._getcontext()
|
||||
if context._impl_descr is not None:
|
||||
for opt, path in context.cfgimpl_get_settings(
|
||||
).get_with_property('force_store_value'):
|
||||
self._getowner(opt, path, force_permissive=True)
|
||||
return self._p_.get_modified_values()
|
||||
|
||||
def __contains__(self, opt):
|
||||
@ -196,7 +201,7 @@ class Values(object):
|
||||
# if value has callback and is not set
|
||||
# or frozen with force_default_on_freeze
|
||||
if opt.impl_has_callback() and (
|
||||
self._is_default_owner(path) or
|
||||
self._is_default_owner(opt, path, validate_properties=False) or
|
||||
(is_frozen and 'force_default_on_freeze' in setting[opt])):
|
||||
lenmaster = None
|
||||
no_value_slave = False
|
||||
@ -241,7 +246,8 @@ class Values(object):
|
||||
value = Multi(value, self.context, opt, path, validate=validate)
|
||||
if config_error is None and validate:
|
||||
opt.impl_validate(value, context, 'validator' in setting)
|
||||
if config_error is None and self._is_default_owner(path) and \
|
||||
if config_error is None and \
|
||||
self._is_default_owner(opt, path, validate_properties=False) and \
|
||||
'force_store_value' in setting[opt]:
|
||||
self.setitem(opt, value, path, is_write=False,
|
||||
force_permissive=force_permissive)
|
||||
@ -303,23 +309,27 @@ class Values(object):
|
||||
value = list(value)
|
||||
self._p_.setvalue(path, value, owner)
|
||||
|
||||
def getowner(self, opt):
|
||||
def getowner(self, opt, force_permissive=False):
|
||||
"""
|
||||
retrieves the option's owner
|
||||
|
||||
:param opt: the `option.Option` object
|
||||
:param force_permissive: behaves as if the permissive property
|
||||
was present
|
||||
:returns: a `setting.owners.Owner` object
|
||||
"""
|
||||
if isinstance(opt, SymLinkOption):
|
||||
opt = opt._opt
|
||||
path = self._get_opt_path(opt)
|
||||
return self._getowner(path)
|
||||
return self._getowner(opt, path, force_permissive=force_permissive)
|
||||
|
||||
def _getowner(self, path):
|
||||
owner = self._p_.getowner(path, owners.default)
|
||||
def _getowner(self, opt, path, validate_properties=True, force_permissive=False):
|
||||
meta = self._getcontext().cfgimpl_get_meta()
|
||||
if validate_properties:
|
||||
self._getitem(opt, path, True, force_permissive, None, True)
|
||||
owner = self._p_.getowner(path, owners.default)
|
||||
if owner is owners.default and meta is not None:
|
||||
owner = meta.cfgimpl_get_values()._getowner(path)
|
||||
owner = meta.cfgimpl_get_values()._getowner(opt, path)
|
||||
return owner
|
||||
|
||||
def setowner(self, opt, owner):
|
||||
@ -333,25 +343,25 @@ class Values(object):
|
||||
raise TypeError(_("invalid generic owner {0}").format(str(owner)))
|
||||
|
||||
path = self._get_opt_path(opt)
|
||||
self._setowner(path, owner)
|
||||
self._setowner(opt, path, owner)
|
||||
|
||||
def _setowner(self, path, owner):
|
||||
if self._getowner(path) == owners.default:
|
||||
def _setowner(self, opt, path, owner):
|
||||
if self._getowner(opt, path) == owners.default:
|
||||
raise ConfigError(_('no value for {0} cannot change owner to {1}'
|
||||
'').format(path, owner))
|
||||
self._p_.setowner(path, owner)
|
||||
|
||||
def is_default_owner(self, opt):
|
||||
def is_default_owner(self, opt, validate_properties=True):
|
||||
"""
|
||||
:param config: *must* be only the **parent** config
|
||||
(not the toplevel config)
|
||||
:return: boolean
|
||||
"""
|
||||
path = self._get_opt_path(opt)
|
||||
return self._is_default_owner(path)
|
||||
return self._is_default_owner(opt, path, validate_properties)
|
||||
|
||||
def _is_default_owner(self, path):
|
||||
return self._getowner(path) == owners.default
|
||||
def _is_default_owner(self, opt, path, validate_properties=True):
|
||||
return self._getowner(opt, path, validate_properties) == owners.default
|
||||
|
||||
def reset_cache(self, only_expired):
|
||||
"""
|
||||
@ -550,7 +560,8 @@ class Multi(list):
|
||||
if not force and self.opt.impl_get_multitype() == multitypes.master:
|
||||
for slave in self.opt.impl_get_master_slaves():
|
||||
path = values._get_opt_path(slave)
|
||||
if not values._is_default_owner(path):
|
||||
if not values._is_default_owner(slave, path,
|
||||
validate_properties=False):
|
||||
if slave.impl_has_callback():
|
||||
dvalue = values._getcallback_value(slave, index=index)
|
||||
else:
|
||||
@ -631,7 +642,7 @@ class Multi(list):
|
||||
if self.opt.impl_get_multitype() == multitypes.master:
|
||||
for slave in self.opt.impl_get_master_slaves():
|
||||
values = context.cfgimpl_get_values()
|
||||
if not values.is_default_owner(slave):
|
||||
if not values.is_default_owner(slave, validate_properties=False):
|
||||
#get multi without valid properties
|
||||
values.getitem(slave, validate=False,
|
||||
validate_properties=False
|
||||
|
Reference in New Issue
Block a user