8000 Bug in TwiML Verb generation · Issue #33 · twilio/twilio-python · GitHub
[go: up one dir, main page]

Skip to content
Bug in TwiML Verb generation #33
Closed
@erikcw

Description

@erikcw

There is a bug in the init() method of Verb class on line 25 that is stripping valid attributes from the XML output.
https://github.com/twilio/twilio-python/blob/master/twilio/twiml.py

The problem is in this loop of init()

for k, v in kwargs.items():
            if k == "sender":
                k = "from"
            if v:
                self.attrs[k] = v

That second conditional on the "v" variable drops all attributes that are False, 0, or an empty string (''). The Conference verb is supposed to accept both boolean values (for attributes such as beep) and emptry strings for waitUrl
http://www.twilio.com/docs/api/twiml/conference

A more correct implementation is probably something like this:

import types

for k, v in kwargs.items():
            if k == "sender":
                k = "from"
            if type(v) is not types.NoneType:
                self.attrs[k] = v

Here is a unit test that demonstrates the problem:
https://gist.github.com/1320881

Additionally, the Verb.xml() method does not handle booleans correctly. All of the Twilio documentation illustrates booleans being expected in all lower case.

The xml() method however uses the following line to generate attributes:

el.set(a, str(self.attrs[a]))

In Python, this converts True into "True" (not "true").

To produce XML output consistent with the Twilio documentation, you should do something like this:

import types

def xml(self):
        el = ET.Element(self.name)

        keys = self.attrs.keys()
        keys.sort()
        for a in keys:
            value = self.attrs[a]
            if type(value) is bool:
                value = str(value).lower()
            elif type(value) is types.NoneType:
                continue #skip attributes with a value of None
            else:
                value = str(value)
            el.set(a, value)

        if self.body:
            el.text = self.body

        for verb in self.verbs:
            el.append(verb.xml())

        return el

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0