Skip to content

Commit 5a01caa

Browse files
Merge pull request #132 from Bandwidth/DX-2913
DX-2913, DX-2916, DX-2917 `<StartStream>`, `<StopStream>`, and `<StreamParam>` refactored
2 parents 7f11ee8 + b909bfd commit 5a01caa

File tree

9 files changed

+241
-4
lines changed

9 files changed

+241
-4
lines changed

bandwidth/model/bxml/verbs/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
from .bridge import Bridge
2-
from .pause import Pause
3-
from .pause_recording import PauseRecording
42
from .hangup import Hangup
53
from .gather import Gather
4+
from .pause import Pause
5+
from .pause_recording import PauseRecording
66
from .phone_number import PhoneNumber
77
from .play_audio import PlayAudio
88
from .record import Record
99
from .start_recording import StartRecording
1010
from .sip_uri import SipUri
11+
from .start_stream import StartStream
12+
from .stop_stream import StopStream
13+
from .stream_param import StreamParam
1114
from .stop_recording import StopRecording
1215
from .speak_sentence import SpeakSentence
1316
from .tag import Tag

bandwidth/model/bxml/verbs/pause_recording.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ class PauseRecording(TerminalVerb):
1313
def __init__(self):
1414
"""Initialize a <PauseRecording> verb
1515
"""
16-
super().__init__(tag="PauseRecording", content=None)
16+
super().__init__(tag="PauseRecording")
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"""
2+
start_stream.py
3+
4+
Bandwidth's StartStream BXML verb
5+
6+
@copyright Bandwidth INC
7+
"""
8+
from typing import List
9+
10+
from ..verb import Verb
11+
from ..verbs.stream_param import StreamParam
12+
13+
14+
class StartStream(Verb):
15+
16+
def __init__(
17+
self, destination: str, stream_params: List[StreamParam] = [],
18+
name: str=None, tracks: str=None,
19+
stream_event_url: str=None,
20+
stream_event_method: str=None,
21+
username: str=None, password: str=None,
22+
):
23+
"""Initialize a <Transfer> verb
24+
25+
Args:
26+
name (str, optional): A name to refer to this stream by. Used when sending <StopStream>. If not provided, it will default to the generated stream id as sent in the Media Stream Started webhook.
27+
tracks (str, optional): The part of the call to send a stream from. inbound, outbound or both. Default is inbound.
28+
destination (str, optional): A websocket URI to send the stream to. The audio from the specified tracks will be sent via websocket to this URL as base64-encoded PCMU/G711 audio. See below for more details on the websocket packet format.
29+
stream_event_url (str, optional): URL to send the associated Webhook events to during this stream's lifetime. Does not accept BXML. May be a relative URL.
30+
stream_event_method (str, optional): The HTTP method to use for the request to streamEventUrl. GET or POST. Default value is POST.
31+
username (str, optional): The username to send in the HTTP request to streamEventUrl. If specified, the URLs must be TLS-encrypted (i.e., https).
32+
password (str, optional): The password to send in the HTTP request to streamEventUrl. If specified, the URLs must be TLS-encrypted (i.e., https).
33+
34+
Nested Verbs:
35+
StreamParam: (optional) You may specify up to 12 <StreamParam/> elements nested within a <StartStream> tag. These elements define optional user specified parameters that will be sent to the destination URL when the stream is first started.
36+
37+
"""
38+
self.destination = destination
39+
self.stream_params = stream_params
40+
self.name = name
41+
self.tracks = tracks
42+
self.stream_event_url = stream_event_url
43+
self.stream_event_method = stream_event_method
44+
self.username = username
45+
self.password = password
46+
super().__init__(
47+
tag="StartStream",
48+
nested_verbs=self.stream_params
49+
)
50+
51+
@property
52+
def _attributes(self):
53+
return {
54+
"destination": self.destination,
55+
"name": self.name,
56+
"tracks": self.tracks,
57+
"streamEventUrl": self.stream_event_url,
58+
"streamEventMethod": self.stream_event_method,
59+
"username": self.username,
60+
"password": self.password,
61+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""
2+
stop_stream.py
3+
4+
Bandwidth's StopStream BXML verb
5+
6+
@copyright Bandwidth INC
7+
"""
8+
from ..terminal_verb import TerminalVerb
9+
10+
11+
class StopStream(TerminalVerb):
12+
13+
def __init__(
14+
self, name: str
15+
):
16+
"""Initialize a <StopStream> verb
17+
18+
Args:
19+
name (str): The name of the stream to stop. This is either the user selected name when sending the <StartStream> verb, or the system generated name returned in the Media Stream Started webhook if <StartStream> was sent with no name attribute.
20+
"""
21+
self.name = name
22+
super().__init__(
23+
tag="StopStream",
24+
)
25+
26+
@property
27+
def _attributes(self):
28+
return {
29+
"name": self.name,
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""
2+
stream_param.py
3+
4+
Bandwidth's StreamParam BXML verb
5+
6+
@copyright Bandwidth INC
7+
"""
8+
from ..terminal_verb import TerminalVerb
9+
10+
11+
class StreamParam(TerminalVerb):
12+
13+
def __init__(
14+
self, name: str, value: str
15+
):
16+
"""Initialize a <StreamParam> verb
17+
18+
Args:
19+
name (str): The name of this parameter, up to 256 characters.
20+
value (str): The value of this parameter, up to 2048 characters.
21+
"""
22+
self.name = name
23+
self.value = value
24+
super().__init__(
25+
tag="StreamParam"
26+
)
27+
28+
@property
29+
def _attributes(self):
30+
return {
31+
"name": self.name,
32+
"value": self.value,
33+
}

bandwidth/model/bxml/verbs/transfer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ def __init__(
7777
self.diversion_reason = diversion_reason
7878
super().__init__(
7979
tag="Transfer",
80-
content=None,
8180
nested_verbs=self.transfer_to
8281
)
8382

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""
2+
test_start_stream.py
3+
4+
Unit tests for the <StartStream> BXML verb
5+
6+
@copyright Bandwidth Inc.
7+
"""
8+
import os
9+
import pytest
10+
import unittest
11+
12+
from bandwidth.model.bxml.verbs import StartStream, StreamParam
13+
14+
class TestStartStream(unittest.TestCase):
15+
16+
def setUp(self):
17+
self.stream_param1 = StreamParam(
18+
name="name1",
19+
value="value1"
20+
)
21+
22+
self.stream_param2 = StreamParam(
23+
name="name2",
24+
value="value2"
25+
)
26+
27+
self.start_stream = StartStream(
28+
stream_params=[self.stream_param1],
29+
name = "stream1",
30+
tracks = "inbound",
31+
destination = "testurl.com",
32+
stream_event_url="eventurl.com",
33+
stream_event_method= "POST",
34+
username = "user",
35+
password = "pass"
36+
)
37+
38+
def test_to_bxml(self):
39+
if os.environ['PYTHON_VERSION'] == '3.7':
40+
expected = '<StartStream destination="testurl.com" name="stream1" password="pass" streamEventMethod="POST" streamEventUrl="eventurl.com" tracks="inbound" username="user"><StreamParam name="name1" value="value1" /></StartStream>'
41+
else:
42+
expected = '<StartStream destination="testurl.com" name="stream1" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><StreamParam name="name1" value="value1" /></StartStream>'
43+
assert(expected == self.start_stream.to_bxml())
44+
45+
def test_add_verb(self):
46+
if os.environ['PYTHON_VERSION'] == '3.7':
47+
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>'
48+
else:
49+
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>'
50+
self.start_stream.add_verb(self.stream_param2)
51+
assert(expected == self.start_stream.to_bxml())

test/unit/bxml/test_stop_stream.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
test_stop_stream.py
3+
4+
Unit tests for the <StopStream> BXML verb
5+
6+
@copyright Bandwidth Inc.
7+
"""
8+
import pytest
9+
import unittest
10+
11+
from bandwidth.model.bxml.verb import Verb
12+
from bandwidth.model.bxml.verbs.stop_stream import StopStream
13+
14+
15+
class TestTag(unittest.TestCase):
16+
17+
def setUp(self):
18+
self.stop_stream = StopStream(name="conf")
19+
self.test_verb = Verb(tag="test")
20+
21+
def test_to_bxml(self):
22+
expected = '<StopStream name="conf" />'
23+
assert(expected == self.stop_stream.to_bxml())
24+
25+
def test_add_verb(self):
26+
with pytest.raises(AttributeError):
27+
self.stop_stream.add_verb(self.test_verb)
28+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
test_stream_param.py
3+
4+
Unit tests for the <StreamParam> BXML verb
5+
6+
@copyright Bandwidth Inc.
7+
"""
8+
import os
9+
import pytest
10+
import unittest
11+
12+
13+
from bandwidth.model.bxml.verb import Verb
14+
from bandwidth.model.bxml.verbs import StreamParam
15+
16+
class TestStreamParam(unittest.TestCase):
17+
18+
def setUp(self):
19+
self.stream_param = StreamParam(
20+
name="name1",
21+
value="value1"
22+
)
23+
self.test_verb = Verb(tag="test")
24+
25+
26+
def test_to_bxml(self):
27+
expected = '<StreamParam name="name1" value="value1" />'
28+
assert(expected == self.stream_param.to_bxml())
29+
30+
def test_add_verb(self):
31+
with pytest.raises(AttributeError):
32+
self.stream_param.add_verb(self.test_verb)

0 commit comments

Comments
 (0)