Merge branch 'master' into orm

Conflicts:
	tiramisu/setting.py
This commit is contained in:
Emmanuel Garette 2014-01-09 20:32:17 +01:00
commit cde04d654a
4 changed files with 45 additions and 6 deletions

View File

@ -10,8 +10,6 @@ Tiramisu is made of almost three main objects :
- :class:`tiramisu.option.OptionDescription` is the shema, the option's structure - :class:`tiramisu.option.OptionDescription` is the shema, the option's structure
- :class:`tiramisu.config.Config` which is the whole configuration entry point - :class:`tiramisu.config.Config` which is the whole configuration entry point
.. image:: config.png
Accessing the `Option`'s Accessing the `Option`'s
------------------------- -------------------------
@ -47,9 +45,13 @@ object is returned, and if no `Option` has been declared in the
The `Option` objects (in this case the :class:`~tiramisu.option.BoolOption`), The `Option` objects (in this case the :class:`~tiramisu.option.BoolOption`),
are organized into a tree into nested are organized into a tree into nested
:class:`~tiramisu.option.OptionDescription` objects. Every option has a name, :class:`~tiramisu.option.OptionDescription` objects.
as does every option group. The parts of the full name of the option are
separated by dots: e.g. ``cfg.optgroup.optname``. .. image:: config.png
Every option has a name, as does every option group. The parts
of the full name of the option are separated by dots: e.g.
``cfg.optgroup.optname``.
Let's make the protocol of accessing a `Config`'s attribute explicit Let's make the protocol of accessing a `Config`'s attribute explicit
(because explicit is better than implicit): (because explicit is better than implicit):
@ -362,6 +364,10 @@ read/write or read only mode::
>>> c.cfgimpl_get_settings().remove('unknown') >>> c.cfgimpl_get_settings().remove('unknown')
>>> print c.od1.var3 >>> print c.od1.var3
value value
Many properties can be defined at the same time on an option::
>>> c.cfgimpl_get_settings().extend(['unknown1', 'unknown2'])
Properties can also be defined on an option group (that is, on an Properties can also be defined on an option group (that is, on an
:term:`option description`) let's hide a group and try to access to it:: :term:`option description`) let's hide a group and try to access to it::

View File

@ -75,6 +75,16 @@ def test_group_is_hidden():
prop = err.proptype prop = err.proptype
assert 'hidden' in prop assert 'hidden' in prop
def test_extend_properties():
descr = make_description()
config = Config(descr)
setting = config.cfgimpl_get_settings()
config.read_write()
gc = config.unwrap_from_path('gc')
config.unwrap_from_path('gc.dummy')
setting[gc].extend(['hidden', 'user_defined_property'])
assert 'hidden' in setting[gc]
assert 'user_defined_property' in setting[gc]
def test_group_is_hidden_multi(): def test_group_is_hidden_multi():
descr = make_description() descr = make_description()

View File

@ -713,4 +713,6 @@ def mandatory_warnings(config):
except PropertiesOptionError as err: except PropertiesOptionError as err:
if err.proptype == ['mandatory']: if err.proptype == ['mandatory']:
yield path yield path
except ConfigError:
pass
config.cfgimpl_reset_cache(only=('values',)) config.cfgimpl_reset_cache(only=('values',))

View File

@ -260,6 +260,11 @@ class Property(object):
self._properties = prop self._properties = prop
def append(self, propname): def append(self, propname):
"""Appends a property named propname
:param propname: a predefined or user defined property name
:type propname: string
"""
if self._opt is not None and self._opt.impl_getrequires() is not None \ if self._opt is not None and self._opt.impl_getrequires() is not None \
and propname in self._opt.impl_getrequires(): and propname in self._opt.impl_getrequires():
raise ValueError(_('cannot append {0} property for option {1}: ' raise ValueError(_('cannot append {0} property for option {1}: '
@ -269,12 +274,28 @@ class Property(object):
self._setting._setproperties(self._properties, self._opt, self._path) self._setting._setproperties(self._properties, self._opt, self._path)
def remove(self, propname): def remove(self, propname):
"""Removes a property named propname
:param propname: a predefined or user defined property name
:type propname: string
"""
if propname in self._properties: if propname in self._properties:
self._properties.remove(propname) self._properties.remove(propname)
self._setting._setproperties(self._properties, self._opt, self._setting._setproperties(self._properties, self._opt,
self._path) self._path)
def extend(self, propnames):
"""Extends properties to the existing properties
:param propnames: an iterable made of property names
:type propnames: iterable of string
"""
for propname in propnames:
self.append(propname)
def reset(self): def reset(self):
"""resets the properties (does not **clear** the properties,
default properties are still present)
"""
self._setting.reset(_path=self._path) self._setting.reset(_path=self._path)
def __contains__(self, propname): def __contains__(self, propname):
@ -286,7 +307,7 @@ class Property(object):
#____________________________________________________________ #____________________________________________________________
class Settings(object): class Settings(object):
"``Config()``'s configuration options" "``config.Config()``'s configuration options settings"
__slots__ = ('context', '_owner', '_p_', '__weakref__') __slots__ = ('context', '_owner', '_p_', '__weakref__')
def __init__(self, context, storage): def __init__(self, context, storage):