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',