diff --git a/tests/unit/twiml/__init__.py b/tests/unit/twiml/__init__.py index 65873e0927..1bc5a944df 100644 --- a/tests/unit/twiml/__init__.py +++ b/tests/unit/twiml/__init__.py @@ -3,7 +3,7 @@ from nose.tools import raises from six import text_type -from twilio.twiml import TwiMLException, TwiML +from twilio.twiml import format_language, TwiMLException, TwiML class TwilioTest(unittest.TestCase): @@ -14,3 +14,19 @@ def strip(self, xml): def test_append_fail(self): t = TwiML() t.append('foobar') + + def test_format_language_none(self): + language = None + self.assertEqual(language, format_language(language)) + + def test_format_language_valid(self): + language = 'en-US' + self.assertEqual(language, format_language(language)) + + def test_format_language_coerced(self): + language = 'EN_us' + self.assertEqual('en-US', format_language(language)) + + @raises(TwiMLException) + def test_format_language_fail(self): + format_language('this is invalid') diff --git a/twilio/twiml/__init__.py b/twilio/twiml/__init__.py index 6c7c05a94c..8e17325c7f 100644 --- a/twilio/twiml/__init__.py +++ b/twilio/twiml/__init__.py @@ -1,3 +1,4 @@ +import re import xml.etree.ElementTree as ET @@ -9,6 +10,21 @@ def lower_camel(string): return result[0].lower() + result[1:] +def format_language(language): + """ + Attempt to format language parameter as 'ww-WW'. + + :param string language: language parameter + """ + if not language: + return language + + if not re.match('^[a-zA-Z]{2}[_-][a-zA-Z]{2}$', language): + raise TwiMLException('Invalid value for language parameter.') + + return language[0:2].lower() + '-' + language[3:5].upper() + + class TwiMLException(Exception): pass diff --git a/twilio/twiml/voice_response.py b/twilio/twiml/voice_response.py index 59d2593aef..c6151c8121 100644 --- a/twilio/twiml/voice_response.py +++ b/twilio/twiml/voice_response.py @@ -1,7 +1,7 @@ import json from six import string_types -from twilio.twiml import TwiML +from twilio.twiml import TwiML, format_language class VoiceResponse(TwiML): @@ -111,6 +111,7 @@ def gather(self, hints=None, barge_in=None, acknowledge_sound_url=None, + input=None, **kwargs): """ Add a new element @@ -126,6 +127,7 @@ def gather(self, :param hints: speech recognition hints :param barge_in: stop playing media upon speech :param acknowledge_sound_url: url to hit when sound starts + :param input: type Twilio should accept "dtfm", "speech", "dtfm speech" :param kwargs: additional attributes :return: element """ @@ -135,6 +137,13 @@ def gather(self, timeout=timeout, finish_on_key=finish_on_key, num_digits=num_digits, + partial_result_callback=partial_result_callback, + partial_result_callback_method=partial_result_callback_method, + language=format_language(language), + hints=hints, + barge_in=barge_in, + acknowledge_sound_url=acknowledge_sound_url, + input=input, **kwargs ))