From f2bf6072ec447cf5cc331b4057b29078b1c932b5 Mon Sep 17 00:00:00 2001 From: Robert Robinson Date: Mon, 14 Sep 2015 16:35:47 -0600 Subject: Add plugin (cherry picked from commit 2296d56) --- sleekxmpp/plugins/xep_0122/data_validation.py | 19 +++ sleekxmpp/plugins/xep_0122/stanza.py | 34 +++-- tests/test_stanza_xep_0122.py | 196 ++++++++++++++------------ 3 files changed, 150 insertions(+), 99 deletions(-) create mode 100644 sleekxmpp/plugins/xep_0122/data_validation.py diff --git a/sleekxmpp/plugins/xep_0122/data_validation.py b/sleekxmpp/plugins/xep_0122/data_validation.py new file mode 100644 index 00000000..6f6cbe8c --- /dev/null +++ b/sleekxmpp/plugins/xep_0122/data_validation.py @@ -0,0 +1,19 @@ +from sleekxmpp.xmlstream import register_stanza_plugin +from sleekxmpp.plugins import BasePlugin +from sleekxmpp.plugins.xep_0004 import stanza +from sleekxmpp.plugins.xep_0004.stanza import FormField +from sleekxmpp.plugins.xep_0122.stanza import FormValidation + + +class XEP_0122(BasePlugin): + """ + XEP-0004: Data Forms + """ + + name = 'xep_0122' + description = 'XEP-0122: Data Forms Validation' + dependencies = set(['xep_0004']) + stanza = stanza + + def plugin_init(self): + register_stanza_plugin(FormField, FormValidation, iterable=True) diff --git a/sleekxmpp/plugins/xep_0122/stanza.py b/sleekxmpp/plugins/xep_0122/stanza.py index bf8545c8..bc3c177a 100644 --- a/sleekxmpp/plugins/xep_0122/stanza.py +++ b/sleekxmpp/plugins/xep_0122/stanza.py @@ -13,13 +13,17 @@ class FormValidation(ElementBase): datatype='xs:dateTime'/> 2003-10-06T11:22:00-07:00 + + Questions: + Should this look at the datatype value and convert the range values as appropriate? + Should this stanza provide a pass/fail for a value from the field, or convert field value to datatype? """ namespace = 'http://jabber.org/protocol/xdata-validate' name = 'validate' plugin_attrib = 'validate' - interfaces = set(('datatype', 'basic', 'open', 'range', 'regex', )) - sub_interfaces = set(('basic', 'open', 'range', 'regex', )) + interfaces = {'datatype', 'basic', 'open', 'range', 'regex', } + sub_interfaces = {'basic', 'open', 'range', 'regex', } plugin_attrib_map = {} plugin_tag_map = {} @@ -33,22 +37,28 @@ class FormValidation(ElementBase): if value: self._add_field('basic') else: - self['basic'] = False + del self['basic'] def set_open(self, value): if value: self._add_field('open') + else: + del self['open'] def set_regex(self, regex): if regex: _regex = self._add_field('regex') _regex.text = regex + else: + del self['regex'] def set_range(self, value, minimum=None, maximum=None): if value: _range = self._add_field('range') _range.attrib['min'] = str(minimum) _range.attrib['max'] = str(maximum) + else: + del self['range'] def remove_all(self, except_tag=None): for a in self.sub_interfaces: @@ -65,18 +75,20 @@ class FormValidation(ElementBase): def get_regex(self): present = self.xml.find('{%s}regex' % self.namespace) - if present: + if present is not None: return present.text return False def get_range(self): - present = self.xml.find('{%s}regex' % self.namespace) - if present: - return dict(present.attrib) + present = self.xml.find('{%s}range' % self.namespace) + if present is not None: + attributes = present.attrib + return_value = dict() + if 'min' in attributes: + return_value['minimum'] = attributes['min'] + if 'max' in attributes: + return_value['maximum'] = attributes['max'] + return return_value return False - - -FormValidation.getBasic = FormValidation.get_basic -FormValidation.setBasic = FormValidation.set_basic diff --git a/tests/test_stanza_xep_0122.py b/tests/test_stanza_xep_0122.py index 6e1e4d7b..5576c45f 100644 --- a/tests/test_stanza_xep_0122.py +++ b/tests/test_stanza_xep_0122.py @@ -1,8 +1,7 @@ import unittest + from sleekxmpp import Message from sleekxmpp.test import SleekTest -from sleekxmpp.thirdparty import OrderedDict - import sleekxmpp.plugins.xep_0004 as xep_0004 import sleekxmpp.plugins.xep_0122 as xep_0122 from sleekxmpp.xmlstream import register_stanza_plugin @@ -46,92 +45,113 @@ class TestDataForms(SleekTest): """) - # def test_open_validation(self): - # """Testing using multiple instructions elements in a data form.""" - # msg = self.Message() - # form = msg['form'] - # field = form.addField(var='f1', - # ftype='text-single', - # label='Text', - # desc='A text field', - # required=True, - # value='Some text!') - # - # validation = field['validate'] - # validation.set_open(True) - # - # self.check(msg, """ - # - # - # - # A text field - # - # Some text! - # - # - # - # - # - # - # """) - # - # def test_regex_validation(self): - # """Testing using multiple instructions elements in a data form.""" - # msg = self.Message() - # form = msg['form'] - # field = form.addField(var='f1', - # ftype='text-single', - # label='Text', - # desc='A text field', - # required=True, - # value='Some text!') - # - # validation = field['validate'] - # validation.set_regex('[0-9]+') - # - # self.check(msg, """ - # - # - # - # A text field - # - # Some text! - # - # [0-9]+ - # - # - # - # - # """) - # - # def test_range_validation(self): - # """Testing using multiple instructions elements in a data form.""" - # msg = self.Message() - # form = msg['form'] - # field = form.addField(var='f1', - # ftype='text-single', - # label='Text', - # desc='A text field', - # required=True, - # value='Some text!') - # - # validation = field['validate'] - # validation.set_range(True, minimum=0, maximum=10) - # - # self.check(msg, """ - # - # - # - # A text field - # - # Some text! - # - # - # - # - # - # - # """) + self.assertTrue(validation.get_basic()) + self.assertFalse(validation.get_open()) + self.assertFalse(validation.get_range()) + self.assertFalse(validation.get_regex()) + + def test_open_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + validation = field['validate'] + validation.set_open(True) + + self.check(msg, """ + + + + A text field + + Some text! + + + + + + + """) + + self.assertFalse(validation.get_basic()) + self.assertTrue(validation.get_open()) + self.assertFalse(validation.get_range()) + self.assertFalse(validation.get_regex()) + + def test_regex_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + regex_value = '[0-9]+' + + validation = field['validate'] + validation.set_regex(regex_value) + + self.check(msg, """ + + + + A text field + + Some text! + + [0-9]+ + + + + + """) + + self.assertFalse(validation.get_basic()) + self.assertFalse(validation.get_open()) + self.assertFalse(validation.get_range()) + self.assertTrue(validation.get_regex()) + + self.assertEqual(regex_value, validation.get_regex()) + + def test_range_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + validation = field['validate'] + validation.set_range(True, minimum=0, maximum=10) + + self.check(msg, """ + + + + A text field + + Some text! + + + + + + + """) + + self.assertDictEqual(dict(minimum=str(0), maximum=str(10)), validation.get_range()) suite = unittest.TestLoader().loadTestsFromTestCase(TestDataForms) -- cgit v1.2.3