Changeset 19:48bd45f41903 in ralphm-patches for pubsub-subscription-options.patch


Ignore:
Timestamp:
Dec 29, 2009, 3:35:35 PM (11 years ago)
Author:
Ralph Meijer <ralphm@…>
Branch:
default
Message:

Further adjustments on type checking, a first test for parsing subscription
options.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pubsub-subscription-options.patch

    r17 r19  
    11diff -r 2919e60d3588 wokkel/data_form.py
    22--- a/wokkel/data_form.py       Mon Dec 28 12:13:34 2009 +0100
    3 +++ b/wokkel/data_form.py       Mon Dec 28 21:17:39 2009 +0100
     3+++ b/wokkel/data_form.py       Tue Dec 29 15:34:35 2009 +0100
    44@@ -76,6 +76,7 @@
    55             option['label'] = self.label
     
    1010     def fromElement(element):
    1111         valueElements = list(domish.generateElementsQNamed(element.children,
    12 @@ -256,7 +257,7 @@
     12@@ -212,7 +213,7 @@
     13 
     14         if self.values:
     15             if (self.fieldType not in ('hidden', 'jid-multi', 'list-multi',
     16-                                 'text-multi') and
     17+                                       'text-multi') and
     18                 len(self.values) > 1):
     19                 raise TooManyValuesError()
     20 
     21@@ -233,6 +234,7 @@
     22 
     23             self.values = newValues
     24 
     25+
     26     def toElement(self, asForm=False):
     27         """
     28         Return the DOM representation of this Field.
     29@@ -256,7 +258,7 @@
    1330             elif self.fieldType in ('jid-single', 'jid-multi'):
    1431                 value = value.full()
     
    1936         if asForm:
    2037             if self.fieldType in ('list-single', 'list-multi'):
    21 @@ -322,16 +323,16 @@
     38@@ -322,16 +324,16 @@
    2239 
    2340 
     
    4259             kwargs['options'] = options
    4360 
    44 @@ -416,6 +417,44 @@
     61@@ -416,6 +418,44 @@
    4562         self.fieldList.append(field)
    4663 
     
    87104         form = domish.Element((NS_X_DATA, 'x'))
    88105         form['type'] = self.formType
    89 @@ -489,3 +528,11 @@
     106@@ -489,3 +529,38 @@
    90107             values[name] = value
    91108 
     
    93110+
    94111+
    95 +    def typeCheck(self, fieldDefs=None):
     112+    def typeCheck(self, fieldDefs):
     113+        """
     114+        Check values of fields according to the field definition.
     115+
     116+        This method walks all named fields to check their values against their
     117+        type. The field definition in C{fieldDefs} is used to check the field
     118+        type. Unknown fields are ignored.
     119+
     120+        If the field type is C{None} (when not set by the receiving entity),
     121+        the field definition is used to set the field's type before checking
     122+        the values.
     123+
     124+        @param fieldDefs: Field definitions as a dictionary. See
     125+            L{wokkel.iwokkel.IPubSubService.getConfigurationOptions}
     126+        @type fieldDefs: C{dict}.
     127+        """
     128+
    96129+        for name, field in self.fields.iteritems():
    97 +            if fieldDefs and name in fieldDefs:
    98 +                field.fieldType = fieldDefs[name]['type']
    99 +
    100 +            field.typeCheck()
     130+            if name in fieldDefs:
     131+                if field.fieldType is None:
     132+                    field.fieldType = fieldDefs[name]['type']
     133+                elif field.fieldType != fieldDefs[name]['type']:
     134+                    raise TypeError("Field type for %r is %r, expected %r" %
     135+                                    (name,
     136+                                     field.fieldType,
     137+                                     fieldDefs[name]['type']))
     138+                else:
     139+                    # Field type is correct
     140+                    pass
     141+                field.typeCheck()
     142+            else:
     143+                # Unknown field, ignoring
     144+                pass
    101145diff -r 2919e60d3588 wokkel/pubsub.py
    102146--- a/wokkel/pubsub.py  Mon Dec 28 12:13:34 2009 +0100
    103 +++ b/wokkel/pubsub.py  Mon Dec 28 21:17:39 2009 +0100
     147+++ b/wokkel/pubsub.py  Tue Dec 29 15:34:35 2009 +0100
    104148@@ -228,7 +228,7 @@
    105149     # Map request verb to parameter handler names
     
    111155         'optionsGet': ['nodeOrEmpty', 'jid'],
    112156         'optionsSet': ['nodeOrEmpty', 'jid', 'options'],
    113 @@ -445,30 +445,62 @@
     157@@ -445,32 +445,71 @@
    114158                 self.options = {}
    115159             else:
     
    121165+
    122166+    def _parse_optionsWithSubscribe(self, verbElement):
    123 +        # _parse_options will be called with the options element.
    124 +        # No special processing is required here.
    125 +        pass
     167+        for element in verbElement.parent.elements():
     168+            if element.name == 'options' and element.uri == NS_PUBSUB:
     169+                form = PubSubRequest._findForm(element,
     170+                                               NS_PUBSUB_SUBSCRIBE_OPTIONS)
     171+                if form:
     172+                    self.optionsForm = form
     173+                    if form.formType == 'submit':
     174+                        self.options = form.getValues()
     175+                    else:
     176+                        BadRequest(text="Unexpected form type %r" % form.formType)
    126177+
    127178+
     
    165216 
    166217-        for parameter in self._parameters[verb]:
    167 -            getattr(self, '_parse_%s' % parameter)(child)
    168218+        if len(verbs) > 1:
    169219+            if 'optionsSet' in verbs and 'subscribe' in verbs:
    170220+                self.verb = 'subscribe'
     221+                child = children[verbs.index('subscribe')]
    171222+            else:
    172223+                raise NotImplementedError()
     
    174225+            self.verb = verbs[0]
    175226+
    176 +        for verb, child in zip(verbs, children):
    177 +            for parameter in self._parameters[verb]:
    178 +                getattr(self, '_parse_%s' % parameter)(child)
    179 +
    180  
    181  
     227+        for parameter in self._parameters[self.verb]:
     228             getattr(self, '_parse_%s' % parameter)(child)
     229 
     230 
     231+
    182232     def send(self, xs):
    183 @@ -674,7 +706,8 @@
     233         """
     234         Send this request to its recipient.
     235@@ -674,7 +713,8 @@
    184236         return request.send(self.xmlstream)
    185237 
     
    191243         Subscribe to a publish subscribe node.
    192244 
    193 @@ -685,11 +718,14 @@
     245@@ -685,11 +725,14 @@
    194246         @param subscriber: The entity to subscribe to the node. This entity
    195247                            will get notifications of new published items.
     
    206258 
    207259         def cb(iq):
    208 @@ -1012,29 +1048,11 @@
     260@@ -1012,29 +1055,11 @@
    209261             return None
    210262 
     
    241293diff -r 2919e60d3588 wokkel/test/test_pubsub.py
    242294--- a/wokkel/test/test_pubsub.py        Mon Dec 28 12:13:34 2009 +0100
    243 +++ b/wokkel/test/test_pubsub.py        Mon Dec 28 21:17:39 2009 +0100
     295+++ b/wokkel/test/test_pubsub.py        Tue Dec 29 15:34:35 2009 +0100
    244296@@ -447,6 +447,37 @@
    245297         return d
     
    280332         """
    281333         Test sending subscription request from a specific JID.
    282 @@ -1895,7 +1926,7 @@
     334@@ -718,6 +749,39 @@
     335         self.assertEqual(NS_PUBSUB_ERRORS, err.appCondition.uri)
     336         self.assertEqual('jid-required', err.appCondition.name)
     337 
     338+
     339+    def test_fromElementSubscribeWithOptions(self):
     340+        """
     341+        Test parsing a subscription request.
     342+        """
     343+
     344+        xml = """
     345+        <iq type='set' to='pubsub.example.org'
     346+                       from='user@example.org'>
     347+          <pubsub xmlns='http://jabber.org/protocol/pubsub'>
     348+            <subscribe node='test' jid='user@example.org/Home'/>
     349+            <options>
     350+              <x xmlns="jabber:x:data" type='submit'>
     351+                <field var='FORM_TYPE' type='hidden'>
     352+                  <value>http://jabber.org/protocol/pubsub#subscribe_options</value>
     353+                </field>
     354+                <field var='pubsub#deliver' type='boolean'
     355+                       label='Enable delivery?'>
     356+                  <value>1</value>
     357+                </field>
     358+              </x>
     359+            </options>
     360+          </pubsub>
     361+        </iq>
     362+        """
     363+
     364+        request = pubsub.PubSubRequest.fromElement(parseXml(xml))
     365+        self.assertEqual('subscribe', request.verb)
     366+        request.optionsForm.typeCheck({'pubsub#deliver': {'type': 'boolean'}})
     367+        request.options = request.optionsForm.getValues()
     368+        self.assertEqual({'pubsub#deliver': True}, request.options)
     369+
     370+
     371     def test_fromElementUnsubscribe(self):
     372         """
     373         Test parsing an unsubscription request.
     374@@ -1895,7 +1959,7 @@
    283375             return defer.succeed({'pubsub#deliver_payloads': '0',
    284376                                   'pubsub#persist_items': '1',
Note: See TracChangeset for help on using the changeset viewer.