Add support for a new type of stanza interface: bool
The set of bool_interfaces provides default behaviour for checking/setting the presence of empty subelements. The prime example of this would be: bool_interfaces = set(['required']) This would mean that ``stanza['required']`` would return ``True`` for: <stanza> <required /> </stanza> and ``False`` for: <stanza /> Likewise, assigning ``stanza['required'] = True`` would add an empty ``<required />`` element, and setting it to ``False`` would remove such an element if it exists.
This commit is contained in:
parent
ee6a9b981a
commit
a1ddd88208
@ -228,6 +228,13 @@ class ElementBase(object):
|
|||||||
#: needing to define custom methods.
|
#: needing to define custom methods.
|
||||||
sub_interfaces = tuple()
|
sub_interfaces = tuple()
|
||||||
|
|
||||||
|
#: A subset of :attr:`interfaces` which maps the presence of
|
||||||
|
#: subelements to boolean values. Using this set allows for quickly
|
||||||
|
#: checking for the existence of empty subelements like ``<required />``.
|
||||||
|
#:
|
||||||
|
#: .. versionadded:: 1.1
|
||||||
|
bool_interfaces = tuple()
|
||||||
|
|
||||||
#: In some cases you may wish to override the behaviour of one of the
|
#: In some cases you may wish to override the behaviour of one of the
|
||||||
#: parent stanza's interfaces. The ``overrides`` list specifies the
|
#: parent stanza's interfaces. The ``overrides`` list specifies the
|
||||||
#: interface name and access method to be overridden. For example,
|
#: interface name and access method to be overridden. For example,
|
||||||
@ -489,9 +496,11 @@ class ElementBase(object):
|
|||||||
4. The result of calling ``getFoo``.
|
4. The result of calling ``getFoo``.
|
||||||
5. The contents of the ``foo`` subelement, if ``foo`` is listed
|
5. The contents of the ``foo`` subelement, if ``foo`` is listed
|
||||||
in :attr:`sub_interfaces`.
|
in :attr:`sub_interfaces`.
|
||||||
6. The value of the ``foo`` attribute of the XML object.
|
6. True or False depending on the existence of a ``foo``
|
||||||
7. The plugin named ``'foo'``
|
subelement and ``foo`` is in :attr:`bool_interfaces`.
|
||||||
8. An empty string.
|
7. The value of the ``foo`` attribute of the XML object.
|
||||||
|
8. The plugin named ``'foo'``
|
||||||
|
9. An empty string.
|
||||||
|
|
||||||
:param string attrib: The name of the requested stanza interface.
|
:param string attrib: The name of the requested stanza interface.
|
||||||
"""
|
"""
|
||||||
@ -517,6 +526,9 @@ class ElementBase(object):
|
|||||||
else:
|
else:
|
||||||
if attrib in self.sub_interfaces:
|
if attrib in self.sub_interfaces:
|
||||||
return self._get_sub_text(attrib)
|
return self._get_sub_text(attrib)
|
||||||
|
elif attrib in self.bool_interfaces:
|
||||||
|
elem = self.xml.find('{%s}%s' % (self.namespace, attrib))
|
||||||
|
return elem is not None
|
||||||
else:
|
else:
|
||||||
return self._get_attr(attrib)
|
return self._get_attr(attrib)
|
||||||
elif attrib in self.plugin_attrib_map:
|
elif attrib in self.plugin_attrib_map:
|
||||||
@ -550,10 +562,12 @@ class ElementBase(object):
|
|||||||
4. Call ``setFoo``, if it exists.
|
4. Call ``setFoo``, if it exists.
|
||||||
5. Set the text of a ``foo`` element, if ``'foo'`` is
|
5. Set the text of a ``foo`` element, if ``'foo'`` is
|
||||||
in :attr:`sub_interfaces`.
|
in :attr:`sub_interfaces`.
|
||||||
6. Set the value of a top level XML attribute named ``foo``.
|
6. Add or remove an empty subelement ``foo``
|
||||||
7. Attempt to pass the value to a plugin named ``'foo'`` using
|
if ``foo`` is in :attr:`bool_interfaces`.
|
||||||
|
7. Set the value of a top level XML attribute named ``foo``.
|
||||||
|
8. Attempt to pass the value to a plugin named ``'foo'`` using
|
||||||
the plugin's ``'foo'`` interface.
|
the plugin's ``'foo'`` interface.
|
||||||
8. Do nothing.
|
9. Do nothing.
|
||||||
|
|
||||||
:param string attrib: The name of the stanza interface to modify.
|
:param string attrib: The name of the stanza interface to modify.
|
||||||
:param value: The new value of the stanza interface.
|
:param value: The new value of the stanza interface.
|
||||||
@ -580,6 +594,11 @@ class ElementBase(object):
|
|||||||
else:
|
else:
|
||||||
if attrib in self.sub_interfaces:
|
if attrib in self.sub_interfaces:
|
||||||
return self._set_sub_text(attrib, text=value)
|
return self._set_sub_text(attrib, text=value)
|
||||||
|
elif attrib in self.bool_interfaces:
|
||||||
|
if value:
|
||||||
|
return self._set_sub_text(attrib, '', keep=True)
|
||||||
|
else:
|
||||||
|
return self._set_sub_text(attrib, '', keep=False)
|
||||||
else:
|
else:
|
||||||
self._set_attr(attrib, value)
|
self._set_attr(attrib, value)
|
||||||
else:
|
else:
|
||||||
@ -614,9 +633,11 @@ class ElementBase(object):
|
|||||||
3. Call ``delFoo``, if it exists.
|
3. Call ``delFoo``, if it exists.
|
||||||
4. Delete ``foo`` element, if ``'foo'`` is in
|
4. Delete ``foo`` element, if ``'foo'`` is in
|
||||||
:attr:`sub_interfaces`.
|
:attr:`sub_interfaces`.
|
||||||
5. Delete top level XML attribute named ``foo``.
|
5. Remove ``foo`` element if ``'foo'`` is in
|
||||||
6. Remove the ``foo`` plugin, if it was loaded.
|
:attr:`bool_interfaces`.
|
||||||
7. Do nothing.
|
6. Delete top level XML attribute named ``foo``.
|
||||||
|
7. Remove the ``foo`` plugin, if it was loaded.
|
||||||
|
8. Do nothing.
|
||||||
|
|
||||||
:param attrib: The name of the affected stanza interface.
|
:param attrib: The name of the affected stanza interface.
|
||||||
"""
|
"""
|
||||||
@ -640,6 +661,8 @@ class ElementBase(object):
|
|||||||
else:
|
else:
|
||||||
if attrib in self.sub_interfaces:
|
if attrib in self.sub_interfaces:
|
||||||
return self._del_sub(attrib)
|
return self._del_sub(attrib)
|
||||||
|
elif attrib in self.bool_interfaces:
|
||||||
|
return self._del_sub(attrib)
|
||||||
else:
|
else:
|
||||||
self._del_attr(attrib)
|
self._del_attr(attrib)
|
||||||
elif attrib in self.plugin_attrib_map:
|
elif attrib in self.plugin_attrib_map:
|
||||||
|
Loading…
Reference in New Issue
Block a user