Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ on:
type: choice
options:
- WARNING
- DEBUG
- DEBUG

jobs:
deploy:
Expand All @@ -22,7 +22,7 @@ jobs:
strategy:
matrix:
os: [windows-2022, windows-2019, ubuntu-18.04, ubuntu-20.04]
python-version: [3.7, 3.8, 3.9, "3.10"]
python-version: [3.8, 3.9, "3.10"]
env:
BW_ACCOUNT_ID: ${{ secrets.BW_ACCOUNT_ID }}
BW_USERNAME: ${{ secrets.BW_USERNAME }}
Expand Down
4 changes: 2 additions & 2 deletions bandwidth/model/bxml/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from . import response
from . import bxml
from .response import Response
from .bxml import Bxml
from . import verbs
13 changes: 6 additions & 7 deletions bandwidth/model/bxml/root.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,18 @@ def __len__(self) -> int:
int: Length of self._nested_verbs
"""
return len(self._nested_verbs)

def __getitem__(self, position: int) -> Verb:
"""Override default getitem method. Makes the object iterable.

Args:
position (int): Desired self._nested_verbs list position

Returns:
BxmlVerb: Desired BXML verb
BxmlVerb: Desired BXML verb
"""
return self._nested_verbs[position]

def _generate_xml(self) -> ET.Element:
"""Generates an XML dom

Expand All @@ -58,21 +58,20 @@ def _generate_xml(self) -> ET.Element:
root.append(verb._to_etree_element())
dom = ET.ElementTree(root)
return dom

def add_verb(self, verb: Verb) -> None:
"""Add a verb to the object's nested_verbs array

Args:
verb (BxmlVerb): BXML verb to nest within the parent. Becomes a child xml element.
"""
self._nested_verbs.append(verb)

def to_bxml(self) -> str:
"""Return the serialized BXML string

Returns:
str: Serialized BXML string
"""
xml_document = self._generate_xml()
return ET.tostring(xml_document._root, encoding='utf8', method='xml').decode("utf8")

return ET.tostring(xml_document._root, encoding='UTF-8', method='xml', xml_declaration=True).decode("utf8")
4 changes: 2 additions & 2 deletions bandwidth/model/bxml/verbs/conference.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,13 @@ def __init__(
self.tag = tag
self.callback_timeout = callback_timeout
super().__init__(
tag="Conference",
content=self.name
tag="Conference"
)

@property
def _attributes(self):
return {
"name": self.name,
"mute": self.mute,
"hold": self.hold,
"callIdsToCoach": self.call_ids_to_coach,
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
REQUIRES = [
"urllib3 >= 1.25.3",
"python-dateutil",
"lxml>=4.9.1",
]

setup(
Expand Down
2 changes: 1 addition & 1 deletion test/unit/bxml/test_base_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def test_root(self):
self.root.add_verb(self.verb1)
self.root.add_verb(self.verb2)

expected_bxml = "<?xml version='1.0' encoding='utf8'?>\n<TestRoot><TestVerb1>test</TestVerb1><TestVerb2 /></TestRoot>"
expected_bxml = "<?xml version='1.0' encoding='UTF-8'?>\n<TestRoot><TestVerb1>test</TestVerb1><TestVerb2 /></TestRoot>"
assert(type(self.root[0]) == Verb)
assert(len(self.root) == 2)
assert(expected_bxml == self.root.to_bxml())
Expand Down
5 changes: 1 addition & 4 deletions test/unit/bxml/test_bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,5 @@ def setUp(self):
self.test_verb = Verb(tag="test")

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Bridge bridgeCompleteUrl="https://example.com" tag="test">+19198675309</Bridge>'
else:
expected = '<Bridge bridgeCompleteUrl="https://example.com" tag="test">+19198675309</Bridge>'
expected = '<Bridge bridgeCompleteUrl="https://example.com" tag="test">+19198675309</Bridge>'
assert(expected == self.bridge.to_bxml())
4 changes: 2 additions & 2 deletions test/unit/bxml/test_bxml.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ class TestBxml(unittest.TestCase):
def setUp(self):
self.response = Bxml()

def test_response_init(self):
def test_bxml_init(self):
"""Test initializing the <Bxml> root
"""
expected_bxml = "<?xml version='1.0' encoding='utf8'?>\n<Bxml />"
expected_bxml = "<?xml version='1.0' encoding='UTF-8'?>\n<Bxml />"
assert self.response.to_bxml() == expected_bxml
5 changes: 1 addition & 4 deletions test/unit/bxml/test_conference.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,5 @@ def setUp(self):
self.test_verb = Verb(tag="test")

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Conference callIdsToCoach="example-call-id" callbackTimeout="5" conferenceEventFallbackMethod="POST" conferenceEventFallbackUrl="backupexample.com/eventurl" conferenceEventMethod="POST" conferenceEventUrl="example.com/eventurl" fallbackPassword="pass" fallbackUsername="user" hold="false" mute="true" password="pass" tag="tag" username="user">conf1</Conference>'
else:
expected = '<Conference mute="true" hold="false" callIdsToCoach="example-call-id" conferenceEventUrl="example.com/eventurl" conferenceEventMethod="POST" conferenceEventFallbackUrl="backupexample.com/eventurl" conferenceEventFallbackMethod="POST" username="user" password="pass" fallbackUsername="user" fallbackPassword="pass" tag="tag" callbackTimeout="5">conf1</Conference>'
expected = '<Conference name="conf1" mute="true" hold="false" callIdsToCoach="example-call-id" conferenceEventUrl="example.com/eventurl" conferenceEventMethod="POST" conferenceEventFallbackUrl="backupexample.com/eventurl" conferenceEventFallbackMethod="POST" username="user" password="pass" fallbackUsername="user" fallbackPassword="pass" tag="tag" callbackTimeout="5" />'
assert(expected == self.conference.to_bxml())
6 changes: 1 addition & 5 deletions test/unit/bxml/test_forward.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ def setUp(self):
)
self.test_verb = Verb(tag="test")


def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Forward _from="19195554322" callTimeout="15" diversionReason="away" diversionTreatment="propagate" to="19195554321" uui="93d6f3c0be5845960b744fa28015d8ede84bd1a4;encoding=base64,asdf;encoding=jwt" />'
else:
expected = '<Forward to="19195554321" _from="19195554322" callTimeout="15" diversionTreatment="propagate" diversionReason="away" uui="93d6f3c0be5845960b744fa28015d8ede84bd1a4;encoding=base64,asdf;encoding=jwt" />'
expected = '<Forward to="19195554321" _from="19195554322" callTimeout="15" diversionTreatment="propagate" diversionReason="away" uui="93d6f3c0be5845960b744fa28015d8ede84bd1a4;encoding=base64,asdf;encoding=jwt" />'
assert(expected == self.forward.to_bxml())
10 changes: 2 additions & 8 deletions test/unit/bxml/test_gather.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,10 @@ def setUp(self):
)

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Gather fallbackPassword="pass" fallbackUsername="user" firstDigitTimeout="3" gatherFallbackMethod="GET" gatherFallbackUrl="fallback-test.com" gatherMethod="POST" gatherUrl="test.com" interDigitTimeout="1" maxDigits="5" password="pass" repeatCount="2" tag="tag" terminatingDigits="2" username="user"><PlayAudio password="pass" username="user">https://audio.url/audio1.wav</PlayAudio></Gather>'
else:
expected = '<Gather gatherUrl="test.com" gatherMethod="POST" gatherFallbackUrl="fallback-test.com" gatherFallbackMethod="GET" username="user" password="pass" fallbackUsername="user" fallbackPassword="pass" tag="tag" terminatingDigits="2" maxDigits="5" interDigitTimeout="1" firstDigitTimeout="3" repeatCount="2"><PlayAudio username="user" password="pass">https://audio.url/audio1.wav</PlayAudio></Gather>'
expected = '<Gather gatherUrl="test.com" gatherMethod="POST" gatherFallbackUrl="fallback-test.com" gatherFallbackMethod="GET" username="user" password="pass" fallbackUsername="user" fallbackPassword="pass" tag="tag" terminatingDigits="2" maxDigits="5" interDigitTimeout="1" firstDigitTimeout="3" repeatCount="2"><PlayAudio username="user" password="pass">https://audio.url/audio1.wav</PlayAudio></Gather>'
assert(expected == self.gather.to_bxml())

def test_add_verb(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Gather fallbackPassword="pass" fallbackUsername="user" firstDigitTimeout="3" gatherFallbackMethod="GET" gatherFallbackUrl="fallback-test.com" gatherMethod="POST" gatherUrl="test.com" interDigitTimeout="1" maxDigits="5" password="pass" repeatCount="2" tag="tag" terminatingDigits="2" username="user"><PlayAudio password="pass" username="user">https://audio.url/audio1.wav</PlayAudio><SpeakSentence>Hello. Your number is &lt;say-as interpret-as="telephone"&gt;asdf&lt;/say-as&gt;, lets play a game. What is 10 + 3. Press the pound key when finished.</SpeakSentence></Gather>'
else:
expected = '<Gather gatherUrl="test.com" gatherMethod="POST" gatherFallbackUrl="fallback-test.com" gatherFallbackMethod="GET" username="user" password="pass" fallbackUsername="user" fallbackPassword="pass" tag="tag" terminatingDigits="2" maxDigits="5" interDigitTimeout="1" firstDigitTimeout="3" repeatCount="2"><PlayAudio username="user" password="pass">https://audio.url/audio1.wav</PlayAudio><SpeakSentence>Hello. Your number is &lt;say-as interpret-as="telephone"&gt;asdf&lt;/say-as&gt;, lets play a game. What is 10 + 3. Press the pound key when finished.</SpeakSentence></Gather>'
expected = '<Gather gatherUrl="test.com" gatherMethod="POST" gatherFallbackUrl="fallback-test.com" gatherFallbackMethod="GET" username="user" password="pass" fallbackUsername="user" fallbackPassword="pass" tag="tag" terminatingDigits="2" maxDigits="5" interDigitTimeout="1" firstDigitTimeout="3" repeatCount="2"><PlayAudio username="user" password="pass">https://audio.url/audio1.wav</PlayAudio><SpeakSentence>Hello. Your number is &lt;say-as interpret-as="telephone"&gt;asdf&lt;/say-as&gt;, lets play a game. What is 10 + 3. Press the pound key when finished.</SpeakSentence></Gather>'
self.gather.add_verb(self.speak_sentence)
assert(expected == self.gather.to_bxml())
6 changes: 1 addition & 5 deletions test/unit/bxml/test_phone_number.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,5 @@ def setUp(self):
self.test_verb = Verb(tag="test")

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<PhoneNumber tag="" transferAnswerMethod="POST" transferAnswerUrl="https://example.com/webhooks/transfer_answer">+19195551234</PhoneNumber>'
else:
expected = '<PhoneNumber transferAnswerUrl="https://example.com/webhooks/transfer_answer" transferAnswerMethod="POST" tag="">+19195551234</PhoneNumber>'

expected = '<PhoneNumber transferAnswerUrl="https://example.com/webhooks/transfer_answer" transferAnswerMethod="POST" tag="">+19195551234</PhoneNumber>'
assert(expected == self.phone_number.to_bxml())
5 changes: 1 addition & 4 deletions test/unit/bxml/test_play_audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,5 @@ def setUp(self):


def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<PlayAudio password="pass" username="user">https://audio.url/audio1.wav</PlayAudio>'
else:
expected = '<PlayAudio username="user" password="pass">https://audio.url/audio1.wav</PlayAudio>'
expected = '<PlayAudio username="user" password="pass">https://audio.url/audio1.wav</PlayAudio>'
assert(expected == self.play_audio.to_bxml())
2 changes: 1 addition & 1 deletion test/unit/bxml/test_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@ def setUp(self):
def test_response_init(self):
"""Test initializing the <Response> root
"""
expected_bxml = "<?xml version='1.0' encoding='utf8'?>\n<Response />"
expected_bxml = "<?xml version='1.0' encoding='UTF-8'?>\n<Response />"
assert self.response.to_bxml() == expected_bxml
6 changes: 1 addition & 5 deletions test/unit/bxml/test_ring.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,5 @@ def setUp(self):
self.test_verb = Verb(tag="test")

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Ring answerCall="True" duration="30" />'
else:
expected = '<Ring duration="30" answerCall="True" />'

expected = '<Ring duration="30" answerCall="True" />'
assert(expected == self.ring.to_bxml())
5 changes: 1 addition & 4 deletions test/unit/bxml/test_sip_uri.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,5 @@ def setUp(self):
self.test_verb = Verb(tag="test")

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<SipUri tag="test" transferAnswerMethod="POST" transferAnswerUrl="https://example.com/webhooks/transfer_answer" uui="abc123">sip:1-999-123-4567@voip-provider.example.net</SipUri>'
else:
expected = '<SipUri uui="abc123" transferAnswerUrl="https://example.com/webhooks/transfer_answer" transferAnswerMethod="POST" tag="test">sip:1-999-123-4567@voip-provider.example.net</SipUri>'
expected = '<SipUri uui="abc123" transferAnswerUrl="https://example.com/webhooks/transfer_answer" transferAnswerMethod="POST" tag="test">sip:1-999-123-4567@voip-provider.example.net</SipUri>'
assert(expected == self.sip_uri.to_bxml())
6 changes: 1 addition & 5 deletions test/unit/bxml/test_start_gather.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,5 @@ def setUp(self):
self.test_verb = Verb(tag="test")

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<StartGather dtmfMethod="POST" dtmfUrl="https://example.com/startgather" password="pass" tag="tag" username="user" />'
else:
expected = '<StartGather dtmfUrl="https://example.com/startgather" dtmfMethod="POST" username="user" password="pass" tag="tag" />'

expected = '<StartGather dtmfUrl="https://example.com/startgather" dtmfMethod="POST" username="user" password="pass" tag="tag" />'
assert(expected == self.start_gather.to_bxml())
6 changes: 1 addition & 5 deletions test/unit/bxml/test_start_recording.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,5 @@ def setUp(self):


def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<StartRecording fileFormat="wav" multiChannel="True" password="pass" recordingAvailableMethod="POST" recordingAvailableUrl="example.com" tag="tag" transcribe="True" transcriptionAvailableMethod="POST" transcriptionAvailableUrl="transcription-example.com" username="user" />'
else:
expected = '<StartRecording recordingAvailableUrl="example.com" recordingAvailableMethod="POST" transcribe="True" transcriptionAvailableUrl="transcription-example.com" transcriptionAvailableMethod="POST" username="user" password="pass" tag="tag" fileFormat="wav" multiChannel="True" />'

expected = '<StartRecording recordingAvailableUrl="example.com" recordingAvailableMethod="POST" transcribe="True" transcriptionAvailableUrl="transcription-example.com" transcriptionAvailableMethod="POST" username="user" password="pass" tag="tag" fileFormat="wav" multiChannel="True" />'
assert(expected == self.start_recording.to_bxml())
10 changes: 2 additions & 8 deletions test/unit/bxml/test_start_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,10 @@ def setUp(self):
)

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<StartStream destination="testurl.com" name="stream1" password="pass" streamEventMethod="POST" streamEventUrl="eventurl.com" tracks="inbound" username="user"><StreamParam name="name1" value="value1" /></StartStream>'
else:
expected = '<StartStream destination="testurl.com" name="stream1" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><StreamParam name="name1" value="value1" /></StartStream>'
expected = '<StartStream destination="testurl.com" name="stream1" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><StreamParam name="name1" value="value1" /></StartStream>'
assert(expected == self.start_stream.to_bxml())

def test_add_verb(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<StartStream destination="testurl.com" name="stream1" password="pass" streamEventMethod="POST" streamEventUrl="eventurl.com" tracks="inbound" username="user"><StreamParam name="name1" value="value1" /><StreamParam name="name2" value="value2" /></StartStream>'
else:
expected = '<StartStream destination="testurl.com" name="stream1" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><StreamParam name="name1" value="value1" /><StreamParam name="name2" value="value2" /></StartStream>'
expected = '<StartStream destination="testurl.com" name="stream1" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><StreamParam name="name1" value="value1" /><StreamParam name="name2" value="value2" /></StartStream>'
self.start_stream.add_verb(self.stream_param2)
assert(expected == self.start_stream.to_bxml())
10 changes: 2 additions & 8 deletions test/unit/bxml/test_transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,10 @@ def setUp(self):
)

def test_to_bxml(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Transfer callTimeout="15" tag="test" transferCallerId="+19195554321"><SipUri uui="test">sip@bw.com</SipUri></Transfer>'
else:
expected = '<Transfer transferCallerId="+19195554321" callTimeout="15" tag="test"><SipUri uui="test">sip@bw.com</SipUri></Transfer>'
expected = '<Transfer transferCallerId="+19195554321" callTimeout="15" tag="test"><SipUri uui="test">sip@bw.com</SipUri></Transfer>'
assert(expected == self.transfer.to_bxml())

def test_add_verb(self):
if os.environ['PYTHON_VERSION'] == '3.7':
expected = '<Transfer callTimeout="15" tag="test" transferCallerId="+19195554321"><SipUri uui="test">sip@bw.com</SipUri><PhoneNumber tag="test">+19195551234</PhoneNumber></Transfer>'
else:
expected = '<Transfer transferCallerId="+19195554321" callTimeout="15" tag="test"><SipUri uui="test">sip@bw.com</SipUri><PhoneNumber tag="test">+19195551234</PhoneNumber></Transfer>'
expected = '<Transfer transferCallerId="+19195554321" callTimeout="15" tag="test"><SipUri uui="test">sip@bw.com</SipUri><PhoneNumber tag="test">+19195551234</PhoneNumber></Transfer>'
self.transfer.add_transfer_recipient(self.phone_number)
assert(expected == self.transfer.to_bxml())