tropo-webapi-ruby 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -9,7 +9,7 @@ your own web servers.
9
9
 
10
10
  == Requirements
11
11
 
12
- * Ruby v1.8.6+ or JRuby v1.4.0+
12
+ * Unit tests passed on: Ruby MRI v1.8.6/1.8.7 and JRuby v1.5.0
13
13
  * RubyGems
14
14
 
15
15
  Note: If using with ActiveSupport, v2.3.5 or better of ActiveSupport is required.
@@ -185,6 +185,44 @@ Using the great RESTful Web Services framework Sinatra for Ruby.
185
185
  Tropo::Generator.reject
186
186
  end
187
187
 
188
+ ==== Setting a default voice for speech synthesis (text-to-speech/TTS)
189
+
190
+ post '/speak.json' do
191
+ t = Tropo::Generator.new(:voice => 'kate')
192
+ t.say 'Hello!' # Will speak as kate now
193
+
194
+ # or
195
+
196
+ t = Tropo::Generator.new
197
+ t.voice = 'kate'
198
+ t.say 'Hello!' # Will speak as kate now
199
+ end
200
+
201
+ ==== Setting a default recognizer for speech recognition (ASR)
202
+
203
+ post '/ask.json' do
204
+ t = Tropo::Generator.new(:recognizer => 'fr-fr')
205
+ t.ask({ :name => 'account_number', # Will now use the French speech recognition engine
206
+ :bargein => 'true',
207
+ :timeout => 30,
208
+ :require => 'true' }) do
209
+ say :value => "S'il vous plaît dire votre numéro de compte", :voice => 'florence'
210
+ choices :value => '[5 DIGITS]'
211
+ end
212
+
213
+ # or
214
+
215
+ t = Tropo::Generator.new
216
+ t.recognizer = 'fr-fr'
217
+ t.ask({ :name => 'account_number', # Will now use the French speech recognition engine
218
+ :bargein => 'true',
219
+ :timeout => 30,
220
+ :require => 'true' }) do
221
+ say :value => "S'il vous plaît dire votre numéro de compte", :voice => 'florence'
222
+ choices :value => '[5 DIGITS]'
223
+ end
224
+ end
225
+
188
226
  === Additional Examples
189
227
 
190
228
  May be found by checking out the project from Github, and then looking in $PROJECT_HOME/examples and $PROJECT_HOME/spec/tropo-webapi-ruby_spec.rb.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -1,2 +1,5 @@
1
1
  $: << File.expand_path(File.dirname(__FILE__))
2
2
  %w(uri json hashie time tropo-webapi-ruby/tropo-webapi-ruby-helpers tropo-webapi-ruby/tropo-webapi-ruby).each { |lib| require lib }
3
+
4
+ # Add the instance_exec method to the object class for Ruby 1.8.6 support
5
+ require 'tropo-webapi-ruby/object_patch' if RUBY_VERSION == '1.8.6'
@@ -144,7 +144,7 @@ module Tropo
144
144
  def decamelize(camel_string)
145
145
  camel_string.gsub(/[A-Z]/) { |char| '_' + char.downcase }
146
146
  end
147
-
147
+
148
148
  ##
149
149
  # Formats the @response instance variable to JSON before making it available to the accessor
150
150
  #
@@ -153,6 +153,18 @@ module Tropo
153
153
  @response.to_json
154
154
  end
155
155
 
156
+ ##
157
+ # Determines if there is a voice or recognizer specified, if not set it to the default specified and if not default leave it alone
158
+ # this is for the speech synthesis and speech recognition language to use on a say/ask methods
159
+ #
160
+ # @params [Hash] the array of values to check if a voice and recognizer are present
161
+ # @return [Hash] Will return the params with the appropriate voice/recognizer values set
162
+ def set_language(params)
163
+ params.merge!({ :recognizer => @recognizer }) if params[:recognizer].nil? && @recognizer
164
+ params.merge!({ :voice => @voice }) if params[:voice].nil? && @voice
165
+ params
166
+ end
167
+
156
168
  ##
157
169
  # Returns an hash from a collapsed array, using the values of 'key' or 'name' as the collpassed hash key
158
170
  #
@@ -4,8 +4,10 @@ module Tropo
4
4
  include Tropo::Helpers
5
5
 
6
6
  ##
7
- # Set a couple of Booleans to indicate the session type as a convenience
8
- attr_reader :voice_session, :text_session
7
+ # Set a couple of Booleans to indicate the session type as a convenience
8
+ # Set a default voice for speech synthesis
9
+ # Set a default recognizer for speech recognition
10
+ attr_reader :voice_session, :text_session, :voice, :recognizer
9
11
 
10
12
  ##
11
13
  # Defines the actions on self so that we may call them individually
@@ -23,13 +25,18 @@ module Tropo
23
25
  #
24
26
  # @overload initialize()
25
27
  # @overload initialize(params)
28
+ # @param [String] voice sets the value of the default voice
26
29
  # @param [Object] pass in an object that may be accessed inside the block
27
30
  # @overload initialize(params, &block)
28
31
  # @param [Object] pass in an object that may be accessed inside the block
32
+ # @param [String] voice sets the value of the default voice
29
33
  # @param [Block] a block of code to execute (optional)
30
34
  # @return [Object] a new Generator object
31
- def initialize(params=nil, &block)
35
+ def initialize(params={}, &block)
32
36
  @response = { :tropo => Array.new }
37
+ @voice = params[:voice] if params[:voice]
38
+ @recognizer = params[:recognizer] if params[:recognizer]
39
+
33
40
  if block_given?
34
41
  # Lets us know were are in the midst of building a block, so we only rendor the JSON
35
42
  # response at the end of executing the block, rather than at each action
@@ -64,6 +71,7 @@ module Tropo
64
71
  # @return [String, nil] the JSON string to be passed back to Tropo or nil
65
72
  # if the method has been called from inside a block
66
73
  def ask(params={}, &block)
74
+ params = set_language(params)
67
75
  if block_given?
68
76
  create_nested_hash('ask', params)
69
77
  instance_exec(&block)
@@ -157,7 +165,7 @@ module Tropo
157
165
  # @option params [optional, String] :exit_tone whether to play a beep when this user exits a conference
158
166
  # @return [String, nil] the JSON string to be passed back to Tropo or nil
159
167
  # if the method has been called from inside a block
160
- def conference(params={}, &block)
168
+ def conference(params={}, &block)
161
169
  if block_given?
162
170
  create_nested_hash('conference', params)
163
171
  instance_exec(&block)
@@ -287,6 +295,14 @@ module Tropo
287
295
  transformed_response = Hashie::Mash.new(transformed_response)
288
296
  end
289
297
 
298
+ ##
299
+ # Sets the default recognizer for the object
300
+ #
301
+ # @param [String] recognizer the value to set the default voice to
302
+ def recognizer=(recognizer)
303
+ @recognizer = recognizer
304
+ end
305
+
290
306
  ##
291
307
  # Plays a prompt (audio file or text to speech) and optionally waits for a response from the caller that is recorded.
292
308
  # If collected, responses may be in the form of DTMF or speech recognition using a simple grammar format defined below.
@@ -414,10 +430,12 @@ module Tropo
414
430
 
415
431
  if params.kind_of? Array
416
432
  params.each do |param|
433
+ param = set_language(param)
417
434
  hash = build_action('say', param)
418
435
  response[:say] << hash
419
436
  end
420
437
  else
438
+ params = set_language(params)
421
439
  hash = build_action('say', params)
422
440
  response[:say] << hash
423
441
  end
@@ -513,5 +531,12 @@ module Tropo
513
531
  render_response if @building.nil?
514
532
  end
515
533
 
534
+ ##
535
+ # Sets the default voice for the object
536
+ #
537
+ # @param [String] voice the value to set the default voice to
538
+ def voice=(voice)
539
+ @voice = voice
540
+ end
516
541
  end
517
542
  end
@@ -487,7 +487,7 @@ describe "Tropo" do
487
487
 
488
488
  it "should generate a valid JSON string for a record method with a transcription request" do
489
489
  hash_result = {"tropo"=>[{"record"=>{"name"=>"foo", "transcription"=>{"email_format"=>"encoded", "url"=>"mailto:jose@voxeo.com", "id"=>"bling"}, "say"=>[{"value"=>"Please say your account number"}], "beep"=>true, "url"=>"http://sendme.com/tropo", "exitTone"=>"#", "sendTones"=>false, "choices"=>{"value"=>"[5 DIGITS]"}}}]}
490
- tropo = Tropo::Generator.record({ :name => 'foo',
490
+ tropo = Tropo::Generator.record({ :name => 'foo',
491
491
  :url => 'http://sendme.com/tropo',
492
492
  :beep => true,
493
493
  :send_tones => false,
@@ -519,4 +519,95 @@ describe "Tropo" do
519
519
  :choices => { :value => yes_no_choices}
520
520
  JSON.parse(t.response).should == hash_result
521
521
  end
522
+
523
+ it "should set the voice variable when called" do
524
+ t = Tropo::Generator.new
525
+ t.voice.should == nil
526
+
527
+ t = Tropo::Generator.new(:voice => 'barnie')
528
+ t.voice.should == 'barnie'
529
+
530
+ t = Tropo::Generator.new
531
+ t.voice = 'barnie'
532
+ t.voice.should == 'barnie'
533
+ end
534
+
535
+ it "should handle the setting of the voice parameter based on defaults" do
536
+ t = Tropo::Generator.new
537
+ t.say 'Hi there!'
538
+ JSON.parse(t.response)['tropo'][0]['say'][0]['voice'].should == nil
539
+
540
+ t = Tropo::Generator.new
541
+ t.say 'Hi there!', :voice => 'barnie'
542
+ JSON.parse(t.response)['tropo'][0]['say'][0]['voice'].should == 'barnie'
543
+
544
+ t = Tropo::Generator.new(:voice => 'barnie')
545
+ t.say 'Hi there!'
546
+ t.say 'Wow!'
547
+ JSON.parse(t.response)['tropo'][0]['say'][0]['voice'].should == 'barnie'
548
+ JSON.parse(t.response)['tropo'][1]['say'][0]['voice'].should == 'barnie'
549
+
550
+ t = Tropo::Generator.new(:voice => 'barnie')
551
+ t.say 'Hi there!'
552
+ t.say 'Wow!', :voice => 'jack'
553
+ JSON.parse(t.response)['tropo'][0]['say'][0]['voice'].should == 'barnie'
554
+ JSON.parse(t.response)['tropo'][1]['say'][0]['voice'].should == 'jack'
555
+
556
+ t = Tropo::Generator.new
557
+ t.voice = 'barnie'
558
+ t.say 'Hi there!'
559
+ t.say 'Wow!', :voice => 'jack'
560
+ JSON.parse(t.response)['tropo'][0]['say'][0]['voice'].should == 'barnie'
561
+ JSON.parse(t.response)['tropo'][1]['say'][0]['voice'].should == 'jack'
562
+ end
563
+
564
+ it "should set the recognizer variable when called" do
565
+ t = Tropo::Generator.new
566
+ t.recognizer.should == nil
567
+
568
+ t = Tropo::Generator.new(:recognizer => 'fr-fr')
569
+ t.recognizer.should == 'fr-fr'
570
+
571
+ t = Tropo::Generator.new
572
+ t.recognizer = 'fr-fr'
573
+ t.recognizer.should == 'fr-fr'
574
+ end
575
+
576
+ it "should handle the setting of the recognizer parameter based on defaults" do
577
+ t = Tropo::Generator.new
578
+ t.ask({ :name => 'foo',
579
+ :bargein => 'true',
580
+ :timeout => 30,
581
+ :require => 'true' })
582
+ JSON.parse(t.response)['tropo'][0]['ask']['recognizer'].should == nil
583
+
584
+ t = Tropo::Generator.new(:recognizer => 'fr-fr')
585
+ t.ask({ :name => 'foo',
586
+ :bargein => 'true',
587
+ :timeout => 30,
588
+ :require => 'true' })
589
+ JSON.parse(t.response)['tropo'][0]['ask']['recognizer'].should == 'fr-fr'
590
+
591
+ t = Tropo::Generator.new
592
+ t.recognizer = 'fr-fr'
593
+ t.ask({ :name => 'foo',
594
+ :bargein => 'true',
595
+ :timeout => 30,
596
+ :require => 'true' })
597
+ JSON.parse(t.response)['tropo'][0]['ask']['recognizer'].should == 'fr-fr'
598
+
599
+ t = Tropo::Generator.new
600
+ t.recognizer = 'fr-fr'
601
+ t.ask({ :name => 'foo',
602
+ :bargein => 'true',
603
+ :timeout => 30,
604
+ :require => 'true' })
605
+ t.ask({ :name => 'foo',
606
+ :bargein => 'true',
607
+ :timeout => 30,
608
+ :require => 'true',
609
+ :recognizer => 'de-de' })
610
+ JSON.parse(t.response)['tropo'][0]['ask']['recognizer'].should == 'fr-fr'
611
+ JSON.parse(t.response)['tropo'][1]['ask']['recognizer'].should == 'de-de'
612
+ end
522
613
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{tropo-webapi-ruby}
8
- s.version = "0.1.7"
8
+ s.version = "0.1.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jason Goecke"]
12
- s.date = %q{2010-04-29}
12
+ s.date = %q{2010-05-14}
13
13
  s.description = %q{Ruby library for interacting with the Tropo Web API via REST & JSON}
14
14
  s.email = %q{jsgoecke@voxeo.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tropo-webapi-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Goecke
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-29 00:00:00 -07:00
12
+ date: 2010-05-14 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency