Skip to content

Commit 363feb2

Browse files
DX2913, DX2916, DX2917
1 parent 80aadf7 commit 363feb2

File tree

7 files changed

+210
-1
lines changed

7 files changed

+210
-1
lines changed

bandwidth/model/bxml/verbs/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
from .phone_number import PhoneNumber
44
from .record import Record
55
from .sip_uri import SipUri
6+
from .start_stream import StartStream
7+
from .stop_stream import StopStream
8+
from .stream_param import StreamParam
69
from .tag import Tag
710
from .transfer import Transfer

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, attributes=None)
16+
super().__init__(tag="PauseRecording", content=None)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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+
content=None,
49+
nested_verbs=self.stream_params
50+
)
51+
52+
@property
53+
def _attributes(self):
54+
return {
55+
"destination": self.destination,
56+
"name": self.name,
57+
"tracks": self.tracks,
58+
"streamEventUrl": self.stream_event_url,
59+
"streamEventMethod": self.stream_event_method,
60+
"username": self.username,
61+
"password": self.password,
62+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
content=None
25+
)
26+
27+
@property
28+
def _attributes(self):
29+
return {
30+
"name": self.name,
31+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
content=None
27+
)
28+
29+
@property
30+
def _attributes(self):
31+
return {
32+
"name": self.name,
33+
"value": self.value,
34+
}
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" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><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" tracks="inbound" streamEventUrl="eventurl.com" streamEventMethod="POST" username="user" password="pass"><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+

0 commit comments

Comments
 (0)