optimise mandatory_warnings

This commit is contained in:
2015-10-29 09:03:13 +01:00
parent 64e9171ea6
commit a0de1109f7
7 changed files with 307 additions and 135 deletions

View File

@ -330,19 +330,19 @@ class Settings(object):
# properties methods
def __contains__(self, propname):
"enables the pythonic 'in' syntaxic sugar"
return propname in self._getproperties()
return propname in self._getproperties(read_write=False)
def __repr__(self):
return str(list(self._getproperties()))
return str(list(self._getproperties(read_write=False)))
def __getitem__(self, opt):
path = opt.impl_getpath(self._getcontext())
return self._getitem(opt, path)
def _getitem(self, opt, path, self_properties=undefined):
def _getitem(self, opt, path, setting_properties=undefined):
return Property(self,
self._getproperties(opt, path,
self_properties=self_properties),
setting_properties=setting_properties),
opt, path)
def __setitem__(self, opt, value): # pragma: optional cover
@ -361,41 +361,45 @@ class Settings(object):
self._getcontext().cfgimpl_reset_cache()
def _getproperties(self, opt=None, path=None,
self_properties=undefined, read_write=True):
setting_properties=undefined, read_write=True,
apply_requires=True):
"""
"""
if opt is None:
props = self._p_.getproperties(path, default_properties)
else:
if self_properties is undefined:
self_properties = self._getproperties()
if setting_properties is undefined:
setting_properties = self._getproperties(read_write=False)
if path is None: # pragma: optional cover
raise ValueError(_('if opt is not None, path should not be'
' None in _getproperties'))
is_cached = False
if 'cache' in self_properties and 'expire' in self_properties:
ntime = int(time())
else:
ntime = None
if 'cache' in self_properties and self._p_.hascache(path):
is_cached, props = self._p_.getcache(path, ntime)
if apply_requires:
if 'cache' in setting_properties and 'expire' in setting_properties:
ntime = int(time())
else:
ntime = None
if 'cache' in setting_properties and self._p_.hascache(path):
is_cached, props = self._p_.getcache(path, ntime)
if not is_cached:
props = copy(self._p_.getproperties(path, opt.impl_getproperties()))
props |= self.apply_requires(opt, path)
if 'cache' in self_properties:
if 'expire' in self_properties:
ntime = ntime + expires_time
self._p_.setcache(path, props, ntime)
props = self._p_.getproperties(path, opt.impl_getproperties())
if apply_requires:
props = copy(props)
props |= self.apply_requires(opt, path, setting_properties)
if 'cache' in setting_properties:
if 'expire' in setting_properties:
ntime = ntime + expires_time
self._p_.setcache(path, props, ntime)
if read_write:
return copy(props)
else:
return props
props = copy(props)
return props
def append(self, propname):
"puts property propname in the Config's properties attribute"
props = self._p_.getproperties(None, default_properties)
props.add(propname)
self._setproperties(props, None)
if propname not in props:
props.add(propname)
self._setproperties(props, None)
def remove(self, propname):
"deletes property propname in the Config's properties attribute"
@ -422,7 +426,8 @@ class Settings(object):
#____________________________________________________________
def validate_properties(self, opt_or_descr, is_descr, is_write, path,
value=None, force_permissive=False,
force_properties=None, force_permissives=None,
force_properties=None,
setting_properties=undefined,
self_properties=undefined):
"""
validation upon the properties related to `opt_or_descr`
@ -432,8 +437,6 @@ class Settings(object):
was present
:param force_properties: set() with properties that is force to add
in global properties
:param force_permissives: set() with permissives that is force to add
in global permissives
:param is_descr: we have to know if we are in an option description,
just because the mandatory property
doesn't exist here
@ -443,25 +446,26 @@ class Settings(object):
(typically with the `frozen` property)
"""
# opt properties
if self_properties is undefined:
self_properties = self._getproperties(read_write=False)
properties = self._getproperties(opt_or_descr, path,
self_properties=self_properties)
if setting_properties is undefined:
setting_properties = self._getproperties(read_write=False)
if self_properties is not undefined:
properties = copy(self_properties)
else:
properties = self._getproperties(opt_or_descr, path,
setting_properties=setting_properties)
# remove opt permissive
# permissive affect option's permission with or without permissive
# global property
properties -= self._p_.getpermissive(path)
# remove global permissive if need
if force_permissive is True or 'permissive' in self_properties:
if force_permissive is True or 'permissive' in setting_properties:
properties -= self._p_.getpermissive()
if force_permissives is not None:
properties -= force_permissives
if force_properties is not None:
forced_properties = copy(self_properties)
forced_properties = copy(setting_properties)
forced_properties.update(force_properties)
else:
forced_properties = self_properties
forced_properties = setting_properties
# calc properties
properties &= forced_properties
@ -531,10 +535,16 @@ class Settings(object):
#____________________________________________________________
def _read(self, remove, append):
for prop in remove:
self.remove(prop)
for prop in append:
self.append(prop)
props = self._p_.getproperties(None, default_properties)
modified = False
if remove & props != set([]):
props = props - remove
modified = True
if append & props != append:
props = props | append
modified = True
if modified:
self._setproperties(props, None)
def read_only(self):
"convenience method to freeze, hide and disable"
@ -555,7 +565,7 @@ class Settings(object):
else:
self._p_.reset_all_cache()
def apply_requires(self, opt, path):
def apply_requires(self, opt, path, setting_properties):
"""carries out the jit (just in time) requirements between options
a requirement is a tuple of this form that comes from the option's
@ -616,7 +626,8 @@ class Settings(object):
" '{0}' with requirement on: "
"'{1}'").format(path, reqpath))
try:
value = context.getattr(reqpath, force_permissive=True)
value = context.getattr(reqpath, force_permissive=True,
_setting_properties=setting_properties)
except PropertiesOptionError as err:
if not transitive:
continue