From d39b16150436f15ed33374d565391c78c4fd0576 Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Mon, 1 Aug 2022 12:27:44 -0400
Subject: [PATCH 1/7] DX-2699 add `StartStream` and `StopStream` verbs
---
bandwidth/voice/bxml/verbs/start_stream.py | 57 ++++++++++++++++++++++
bandwidth/voice/bxml/verbs/stop_stream.py | 37 ++++++++++++++
2 files changed, 94 insertions(+)
create mode 100644 bandwidth/voice/bxml/verbs/start_stream.py
create mode 100644 bandwidth/voice/bxml/verbs/stop_stream.py
diff --git a/bandwidth/voice/bxml/verbs/start_stream.py b/bandwidth/voice/bxml/verbs/start_stream.py
new file mode 100644
index 00000000..e639555e
--- /dev/null
+++ b/bandwidth/voice/bxml/verbs/start_stream.py
@@ -0,0 +1,57 @@
+"""
+start_stream.py
+
+Representation of Bandwidth's start stream BXML verb
+
+@copyright Bandwidth INC
+"""
+
+from lxml import etree
+
+from .base_verb import AbstractBxmlVerb
+
+START_STREAM_TAG = "StartStream"
+
+
+class StartStream(AbstractBxmlVerb):
+
+ def __init__(self, destination, name=None, streamEventUrl=None, streamEventMethod=None, username=None, password=None):
+ """
+ Initializes the PlayAudio class with the following parameters
+
+ :param str destination: A websocket URI to send the stream to
+ :param str name: A name to refer to this stream by
+ :param str streamEventUrl: URL to send the associated Webhook events to during this stream's lifetime
+ :param str streamEventMethod: The HTTP method to use for the request to `streamEventUrl`. `GET` or `POST`
+ :param str username: The username to send in the HTTP request to `streamEventUrl`
+ :param str password: The password to send in the HTTP request to `streamEventUrl`
+ """
+ self.destination = destination
+ self.name = name
+ self.streamEventUrl = streamEventUrl
+ self.streamEventMethod = streamEventMethod
+ self.username = username
+ self.password = password
+
+ def to_etree_element(self):
+ """
+ Converts the class into an etree element. Used for other verb classes to build xml
+
+ :return etree.Element: The etree Element representing this class
+ """
+ root = etree.Element(START_STREAM_TAG)
+ root.set("destination", self.destination)
+ if self.name is not None:
+ root.set("name", self.name)
+ if self.streamEventUrl is not None:
+ root.set("streamEventUrl", self.streamEventUrl)
+ if self.streamEventMethod is not None:
+ root.set("streamEventMethod", self.streamEventMethod)
+ if self.username is not None:
+ root.set("username", self.username)
+ if self.password is not None:
+ root.set("password", self.password)
+ return root
+
+ def to_bxml(self):
+ return etree.tostring(self.to_etree_element()).decode()
diff --git a/bandwidth/voice/bxml/verbs/stop_stream.py b/bandwidth/voice/bxml/verbs/stop_stream.py
new file mode 100644
index 00000000..031fba3a
--- /dev/null
+++ b/bandwidth/voice/bxml/verbs/stop_stream.py
@@ -0,0 +1,37 @@
+"""
+start_stream.py
+
+Representation of Bandwidth's start stream BXML verb
+
+@copyright Bandwidth INC
+"""
+
+from lxml import etree
+
+from .base_verb import AbstractBxmlVerb
+
+STOP_STREAM_TAG = "StopStream"
+
+
+class StopStream(AbstractBxmlVerb):
+
+ def __init__(self, name):
+ """
+ Initializes the PlayAudio class with the following parameters
+
+ :param str name: The name of the stream to stop
+ """
+ self.name = name
+
+ def to_etree_element(self):
+ """
+ Converts the class into an etree element. Used for other verb classes to build xml
+
+ :return etree.Element: The etree Element representing this class
+ """
+ root = etree.Element(STOP_STREAM_TAG)
+ root.set("name", self.name)
+ return root
+
+ def to_bxml(self):
+ return etree.tostring(self.to_etree_element()).decode()
From 47c1a363bcdfa1ee3fd3d6d5aa91631ce36f6660 Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Mon, 1 Aug 2022 12:39:59 -0400
Subject: [PATCH 2/7] Add tests
---
bandwidth/tests/test_bxml.py | 23 +++++++++++++++++++++++
bandwidth/voice/bxml/verbs/__init__.py | 2 ++
2 files changed, 25 insertions(+)
diff --git a/bandwidth/tests/test_bxml.py b/bandwidth/tests/test_bxml.py
index 66d8ac62..16c24c43 100644
--- a/bandwidth/tests/test_bxml.py
+++ b/bandwidth/tests/test_bxml.py
@@ -408,4 +408,27 @@ def test_generate_transfer_bxml_verb(self):
'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4')
assert actual == expected
+ def test_start_and_stop_stream_bxml_verbs(self):
+ start_stream_expected = ''
+ start_stream_response = Response()
+ start_stream = StartStream(
+ destination='https://www/test/com/stream',
+ name='test_stream',
+ streamEventUrl='https://www.test.com/event',
+ streamEventMethod='POST',
+ username='username',
+ password='password'
+ )
+ start_stream_response.add_verb(start_stream)
+
+ stop_stream_expected = ''
+ stop_stream_response = Response()
+ stop_stream = StopStream(
+ name='test_stream'
+ )
+ stop_stream_response.add_verb(stop_stream)
+
+ assert start_stream_expected == start_stream_response.to_bxml()
+ assert stop_stream_expected == stop_stream_response.to_bxml()
+
diff --git a/bandwidth/voice/bxml/verbs/__init__.py b/bandwidth/voice/bxml/verbs/__init__.py
index 9e153007..27c4d0bb 100644
--- a/bandwidth/voice/bxml/verbs/__init__.py
+++ b/bandwidth/voice/bxml/verbs/__init__.py
@@ -20,3 +20,5 @@
from .start_gather import StartGather
from .tag import Tag
from .sip_uri import SipUri
+from .start_stream import StartStream
+from .stop_stream import StopStream
From 0679e9224668c8df5962c3abccddce5e72a1dfcc Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Mon, 1 Aug 2022 13:16:05 -0400
Subject: [PATCH 3/7] Fix URL Typos in test values
---
bandwidth/tests/test_bxml.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/bandwidth/tests/test_bxml.py b/bandwidth/tests/test_bxml.py
index 16c24c43..bc2f2263 100644
--- a/bandwidth/tests/test_bxml.py
+++ b/bandwidth/tests/test_bxml.py
@@ -409,10 +409,10 @@ def test_generate_transfer_bxml_verb(self):
assert actual == expected
def test_start_and_stop_stream_bxml_verbs(self):
- start_stream_expected = ''
+ start_stream_expected = ''
start_stream_response = Response()
start_stream = StartStream(
- destination='https://www/test/com/stream',
+ destination='https://www.test.com/stream',
name='test_stream',
streamEventUrl='https://www.test.com/event',
streamEventMethod='POST',
From 800db7d07fb15eaf81035fff41e6f2727ad9ce85 Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Mon, 1 Aug 2022 13:20:50 -0400
Subject: [PATCH 4/7] Apply Comments from Code Review
---
bandwidth/tests/test_bxml.py | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/bandwidth/tests/test_bxml.py b/bandwidth/tests/test_bxml.py
index bc2f2263..c1dc80a9 100644
--- a/bandwidth/tests/test_bxml.py
+++ b/bandwidth/tests/test_bxml.py
@@ -408,9 +408,9 @@ def test_generate_transfer_bxml_verb(self):
'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4')
assert actual == expected
- def test_start_and_stop_stream_bxml_verbs(self):
- start_stream_expected = ''
- start_stream_response = Response()
+ def test_start_stream_bxml_verbs(self):
+ expected = ''
+ response = Response()
start_stream = StartStream(
destination='https://www.test.com/stream',
name='test_stream',
@@ -419,16 +419,20 @@ def test_start_and_stop_stream_bxml_verbs(self):
username='username',
password='password'
)
- start_stream_response.add_verb(start_stream)
+ response.add_verb(start_stream)
+ actual = response.to_bxml()
+
+ assert expected == actual
- stop_stream_expected = ''
- stop_stream_response = Response()
+ def test_stop_stream_bxml_verbs(self):
+ expected = ''
+ response = Response()
stop_stream = StopStream(
name='test_stream'
)
- stop_stream_response.add_verb(stop_stream)
+ response.add_verb(stop_stream)
+ actual = response.to_bxml()
- assert start_stream_expected == start_stream_response.to_bxml()
- assert stop_stream_expected == stop_stream_response.to_bxml()
+ assert expected == actual
From 18609e2b8313ed6941f012c537c80ac5f6ae14f7 Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Mon, 1 Aug 2022 13:21:53 -0400
Subject: [PATCH 5/7] `verbs` -> `verb`
---
bandwidth/tests/test_bxml.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/bandwidth/tests/test_bxml.py b/bandwidth/tests/test_bxml.py
index c1dc80a9..88586571 100644
--- a/bandwidth/tests/test_bxml.py
+++ b/bandwidth/tests/test_bxml.py
@@ -408,7 +408,7 @@ def test_generate_transfer_bxml_verb(self):
'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4')
assert actual == expected
- def test_start_stream_bxml_verbs(self):
+ def test_start_stream_bxml_verb(self):
expected = ''
response = Response()
start_stream = StartStream(
@@ -424,7 +424,7 @@ def test_start_stream_bxml_verbs(self):
assert expected == actual
- def test_stop_stream_bxml_verbs(self):
+ def test_stop_stream_bxml_verb(self):
expected = ''
response = Response()
stop_stream = StopStream(
From c67638f41becc04daaf59db3a98b7e3aa01f997d Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Wed, 3 Aug 2022 13:46:02 -0400
Subject: [PATCH 6/7] Add `tracks`
---
bandwidth/tests/test_bxml.py | 3 ++-
bandwidth/voice/bxml/verbs/start_stream.py | 6 +++++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/bandwidth/tests/test_bxml.py b/bandwidth/tests/test_bxml.py
index 88586571..015cbc99 100644
--- a/bandwidth/tests/test_bxml.py
+++ b/bandwidth/tests/test_bxml.py
@@ -409,11 +409,12 @@ def test_generate_transfer_bxml_verb(self):
assert actual == expected
def test_start_stream_bxml_verb(self):
- expected = ''
+ expected = ''
response = Response()
start_stream = StartStream(
destination='https://www.test.com/stream',
name='test_stream',
+ tracks='inbound'
streamEventUrl='https://www.test.com/event',
streamEventMethod='POST',
username='username',
diff --git a/bandwidth/voice/bxml/verbs/start_stream.py b/bandwidth/voice/bxml/verbs/start_stream.py
index e639555e..26090519 100644
--- a/bandwidth/voice/bxml/verbs/start_stream.py
+++ b/bandwidth/voice/bxml/verbs/start_stream.py
@@ -15,12 +15,13 @@
class StartStream(AbstractBxmlVerb):
- def __init__(self, destination, name=None, streamEventUrl=None, streamEventMethod=None, username=None, password=None):
+ def __init__(self, destination, name=None, tracks=None, streamEventUrl=None, streamEventMethod=None, username=None, password=None):
"""
Initializes the PlayAudio class with the following parameters
:param str destination: A websocket URI to send the stream to
:param str name: A name to refer to this stream by
+ :param str tracks: The part of the call to send a stream from. `inbound`, `outbound` or `both`.
:param str streamEventUrl: URL to send the associated Webhook events to during this stream's lifetime
:param str streamEventMethod: The HTTP method to use for the request to `streamEventUrl`. `GET` or `POST`
:param str username: The username to send in the HTTP request to `streamEventUrl`
@@ -28,6 +29,7 @@ def __init__(self, destination, name=None, streamEventUrl=None, streamEventMetho
"""
self.destination = destination
self.name = name
+ self.tracks = tracks
self.streamEventUrl = streamEventUrl
self.streamEventMethod = streamEventMethod
self.username = username
@@ -43,6 +45,8 @@ def to_etree_element(self):
root.set("destination", self.destination)
if self.name is not None:
root.set("name", self.name)
+ if self.tracks is not None:
+ root.set("tracks", self.tracks)
if self.streamEventUrl is not None:
root.set("streamEventUrl", self.streamEventUrl)
if self.streamEventMethod is not None:
From 8ae353c571297c522c730305b8de9780fbd58447 Mon Sep 17 00:00:00 2001
From: AJ Rice <53190766+ajrice6713@users.noreply.github.com>
Date: Wed, 3 Aug 2022 13:47:39 -0400
Subject: [PATCH 7/7] Missing `,`
---
bandwidth/tests/test_bxml.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bandwidth/tests/test_bxml.py b/bandwidth/tests/test_bxml.py
index 015cbc99..482d7d6e 100644
--- a/bandwidth/tests/test_bxml.py
+++ b/bandwidth/tests/test_bxml.py
@@ -414,7 +414,7 @@ def test_start_stream_bxml_verb(self):
start_stream = StartStream(
destination='https://www.test.com/stream',
name='test_stream',
- tracks='inbound'
+ tracks='inbound',
streamEventUrl='https://www.test.com/event',
streamEventMethod='POST',
username='username',