Changeset 19:48bd45f41903 in ralphm-patches


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.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pubsub-create-configure.patch

    r14 r19  
    1 diff -r 53bd69434e51 wokkel/data_form.py
    2 --- a/wokkel/data_form.py       Mon Apr 27 17:53:05 2009 +0200
    3 +++ b/wokkel/data_form.py       Fri May 01 08:34:36 2009 +0200
    4 @@ -251,10 +251,10 @@
     1diff -r 9a749c388cda wokkel/data_form.py
     2--- a/wokkel/data_form.py       Tue Dec 29 14:55:13 2009 +0100
     3+++ b/wokkel/data_form.py       Tue Dec 29 15:06:54 2009 +0100
     4@@ -253,10 +253,10 @@
    55             field['var'] = self.var
    66 
     
    1414+                value = unicode(value)
    1515 
    16              field.addElement('value', content=value)
    17  
    18 @@ -489,3 +489,25 @@
    19              values[name] = value
    20  
    21          return values
     16             field.addElement('value', content=unicode(value))
     17 
     18@@ -564,3 +564,25 @@
     19             else:
     20                 # Unknown field, ignoring
     21                 pass
    2222+
    2323+
     
    4242+
    4343+    return None
    44 diff -r 53bd69434e51 wokkel/pubsub.py
    45 --- a/wokkel/pubsub.py  Mon Apr 27 17:53:05 2009 +0200
    46 +++ b/wokkel/pubsub.py  Fri May 01 08:34:36 2009 +0200
    47 @@ -233,7 +233,7 @@
     44diff -r 9a749c388cda wokkel/pubsub.py
     45--- a/wokkel/pubsub.py  Tue Dec 29 14:55:13 2009 +0100
     46+++ b/wokkel/pubsub.py  Tue Dec 29 15:06:54 2009 +0100
     47@@ -234,7 +234,7 @@
    4848         'optionsSet': ['nodeOrEmpty', 'jid', 'options'],
    4949         'subscriptions': [],
     
    5454         'configureGet': ['nodeOrEmpty'],
    5555         'configureSet': ['nodeOrEmpty', 'configure'],
    56 @@ -251,30 +251,6 @@
     56@@ -252,30 +252,6 @@
    5757         self.verb = verb
    5858 
     
    8585         """
    8686         Parse the required node identifier out of the verbElement.
    87 @@ -365,7 +341,7 @@
     87@@ -366,7 +342,7 @@
    8888         """
    8989         Parse node type out of a request for the default node configuration.
     
    9494             values = form.getValues()
    9595             self.nodeType = values.get('pubsub#node_type', 'leaf')
    96 @@ -377,7 +353,7 @@
     96@@ -378,7 +354,7 @@
    9797         """
    9898         Parse options out of a request for setting the node configuration.
     
    103103             if form.formType == 'submit':
    104104                 self.options = form.getValues()
    105 @@ -389,6 +365,46 @@
     105@@ -390,6 +366,46 @@
    106106             raise BadRequest(text="Missing configuration form")
    107107 
     
    150150     def _parse_itemIdentifiers(self, verbElement):
    151151         """
    152 @@ -436,7 +452,7 @@
     152@@ -437,7 +453,7 @@
    153153 
    154154 
     
    159159             if form.formType == 'submit':
    160160                 self.options = form.getValues()
    161 @@ -447,6 +463,7 @@
    162          else:
    163              raise BadRequest(text="Missing options form")
     161@@ -468,6 +484,7 @@
     162             self._render_options(optionsElement)
     163 
    164164 
    165165+
     
    167167         """
    168168         Parse the publish-subscribe verb and parameters out of a request.
    169 @@ -630,7 +647,8 @@
     169@@ -663,7 +680,8 @@
    170170         pass
    171171 
     
    177177         Create a publish subscribe node.
    178178 
    179 @@ -638,11 +656,14 @@
     179@@ -671,11 +689,14 @@
    180180         @type service: L{JID}
    181181         @param nodeIdentifier: Optional suggestion for the id of the node.
     
    192192         def cb(iq):
    193193             try:
    194 @@ -915,8 +936,6 @@
     194@@ -952,8 +973,6 @@
    195195             d = self.getNodes(requestor, target)
    196196         else:
     
    201201         d.addCallback(lambda nodes: [disco.DiscoItem(target, node)
    202202                                      for node in nodes])
    203 @@ -1062,6 +1081,13 @@
     203@@ -1081,6 +1100,13 @@
    204204         return processedValues
    205205 
     
    215215         if request.nodeType not in ('leaf', 'collection'):
    216216             raise error.StanzaError('not-acceptable')
    217 diff -r 53bd69434e51 wokkel/test/test_pubsub.py
    218 --- a/wokkel/test/test_pubsub.py        Mon Apr 27 17:53:05 2009 +0200
    219 +++ b/wokkel/test/test_pubsub.py        Fri May 01 08:34:36 2009 +0200
     217diff -r 9a749c388cda wokkel/test/test_pubsub.py
     218--- a/wokkel/test/test_pubsub.py        Tue Dec 29 14:55:13 2009 +0100
     219+++ b/wokkel/test/test_pubsub.py        Tue Dec 29 15:06:54 2009 +0100
    220220@@ -19,7 +19,7 @@
    221221 from wokkel.test.helpers import TestableRequestHandlerMixin, XmlStreamStub
     
    268268         """
    269269         Test sending delete request.
    270 @@ -935,6 +969,7 @@
     270@@ -966,6 +1000,7 @@
    271271         self.assertEqual(JID('user@example.org'), request.sender)
    272272         self.assertEqual(JID('pubsub.example.org'), request.recipient)
     
    276276 
    277277     def test_fromElementCreateInstant(self):
    278 @@ -955,6 +990,77 @@
     278@@ -986,6 +1021,77 @@
    279279         self.assertIdentical(None, request.nodeIdentifier)
    280280 
     
    354354         """
    355355         Test parsing a request for the default node configuration.
    356 @@ -1740,6 +1846,51 @@
     356@@ -1771,6 +1877,51 @@
    357357         return d
    358358 
     
    406406         """
    407407         A default request should result in
    408 @@ -1773,7 +1924,7 @@
     408@@ -1804,7 +1955,7 @@
    409409             self.assertEqual(NS_PUBSUB_OWNER, element.uri)
    410410             self.assertEqual(NS_PUBSUB_OWNER, element.default.uri)
     
    415415         self.resource.getConfigurationOptions = getConfigurationOptions
    416416         self.resource.default = default
    417 @@ -1902,7 +2053,7 @@
     417@@ -1933,7 +2084,7 @@
    418418             self.assertEqual(NS_PUBSUB_OWNER, element.uri)
    419419             self.assertEqual(NS_PUBSUB_OWNER, element.configure.uri)
  • 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.