trails 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,3 @@
1
- .autotest
2
1
  History.txt
3
2
  Manifest.txt
4
3
  README.txt
data/README.txt CHANGED
@@ -14,7 +14,7 @@ Support for SMS, twiml MimeType alias, functional test helpers.
14
14
 
15
15
  class ApplicationController < ActionController::Base
16
16
  ..
17
- include Twilio::CallHandling
17
+ include Trails::Twilio::CallHandling
18
18
  ..
19
19
  end
20
20
 
@@ -1,5 +1,5 @@
1
1
  module Trails
2
- VERSION = '1.1.2'
2
+ VERSION = '1.1.3'
3
3
  end
4
4
  begin
5
5
  TwilioRest
@@ -104,9 +104,11 @@ module Trails
104
104
  caller = as_twilio_opts[:caller] || '4155551212'
105
105
  called = as_twilio_opts[:called] || '6155556161'
106
106
  from = as_twilio_opts[:from] || '6665554321'
107
+ to = as_twilio_opts[:to] || '3334445678'
107
108
  params['Caller'] = caller
108
109
  params['Called'] = called
109
110
  params['From'] = from
111
+ params['To'] = to
110
112
  params['SmsMessageSid'] = 'DummyMessageSid' if( as_twilio_opts[:sms] )
111
113
  end
112
114
 
@@ -52,8 +52,7 @@ module Trails
52
52
  'Method' => opts['Method'] || opts[:method] || 'GET',
53
53
  'Timeout' => opts['Timeout'] || opts[:timeout] || 15
54
54
  }
55
- api_version = opts[:api_version] || '2008-08-01'
56
- make_request( File.join( base_uri, 'Calls' ), 'POST', params )
55
+ request( 'Calls', 'POST', params )
57
56
  end
58
57
 
59
58
  MAX_SMS_LENGTH = 160
@@ -72,22 +71,22 @@ module Trails
72
71
  'Body' => body,
73
72
  'Method' => opts[:method] || 'POST'
74
73
  }
75
- url = File.join( base_uri, 'SMS/Messages' )
76
- make_request(url, 'POST', params )
74
+ request( 'SMS/Messages', 'POST', params )
77
75
  end
78
76
 
77
+ # Sample Response:
78
+ # [{"SmsFallbackUrl"=>nil, "SmsUrl"=>nil, "PhoneNumber"=>"4253954994", "AccountSid"=>"AC6c25b3d8b4f0a2a4e49e4936398a2180", "Capabilities"=>{"SMS"=>"false", "Voice"=>"false"}, "Method"=>"POST", "Sid"=>"PNc939a026d5a332d22c23ca94a161ce29", "DateUpdated"=>"Sat, 20 Mar 2010 17:52:33 -0700", "DateCreated"=>"Sat, 20 Mar 2010 17:52:33 -0700", "Url"=>nil, "FriendlyName"=>"(425) 395-4994", "VoiceFallbackUrl"=>nil, "SmsFallbackMethod"=>"POST", "VoiceCallerIdLookup"=>"false", "SmsMethod"=>"POST", "VoiceFallbackMethod"=>"POST"}]
79
79
  def incoming_numbers( reset = false )
80
80
  if( @incoming_numbers.nil? || reset )
81
81
  response =
82
- make_request( File.join( base_uri, 'IncomingPhoneNumbers' ), 'GET' )
82
+ request( 'IncomingPhoneNumbers', 'GET' )
83
83
 
84
84
  if( 200 == response.code.to_i )
85
- @raw_incoming_numbers = Hpricot( response.body )
85
+ @raw_incoming_numbers = Hash.from_xml( response.body )
86
86
  else
87
87
  raise "got response code #{response.code} and body #{response.body}"
88
88
  end
89
- @incoming_numbers = @raw_incoming_numbers.search( '//phonenumber').
90
- collect{|j| j.inner_html}
89
+ @incoming_numbers = [@raw_incoming_numbers['TwilioResponse']['IncomingPhoneNumbers']['IncomingPhoneNumber']].flatten # returns an array even when it's a single entry
91
90
  end
92
91
  return @incoming_numbers
93
92
  end
@@ -95,8 +94,7 @@ module Trails
95
94
  def outgoing_numbers( reset = false )
96
95
  if( @outgoing_numbers.nil? || reset )
97
96
  response =
98
- make_request( "/2008-08-01/Accounts/#{@sid}/OutgoingCallerIds",
99
- 'GET' )
97
+ request( 'OutgoingCallerIds', 'GET' )
100
98
  @outgoing_numbers_raw = Hpricot( response.body ) if( 200 == response.code.to_i )
101
99
  @outgoing_numbers = @outgoing_numbers_raw.search( '//phonenumber').
102
100
  collect{|j| j.inner_html}
@@ -104,6 +102,55 @@ module Trails
104
102
  return @outgoing_numbers
105
103
  end
106
104
 
105
+ # options: [:area_code, :friendly_name, :url, :sms_url]
106
+ # sameple return:
107
+ # {"SmsFallbackUrl"=>nil,
108
+ # "SmsUrl"=>nil,
109
+ # "PhoneNumber"=>"4253954994",
110
+ # "AccountSid"=>"AC6c25b3d8b4f0a2a4e49e4936398a2180",
111
+ # "Capabilities"=>{"SMS"=>"false",
112
+ # "Voice"=>"false"},
113
+ # "Method"=>"POST",
114
+ # "Sid"=>"PNc939a026d5a332d22c23ca94a161ce29",
115
+ # "DateUpdated"=>"Sat,
116
+ # 20 Mar 2010 17:52:33 -0700",
117
+ # "DateCreated"=>"Sat,
118
+ # 20 Mar 2010 17:52:33 -0700",
119
+ # "Url"=>nil,
120
+ # "FriendlyName"=>"(425) 395-4994",
121
+ # "VoiceFallbackUrl"=>nil,
122
+ # "SmsFallbackMethod"=>"POST",
123
+ # "VoiceCallerIdLookup"=>"false",
124
+ # "SmsMethod"=>"POST",
125
+ # "VoiceFallbackMethod"=>"POST"}
126
+ def provision_number( options = {} )
127
+ params = {}
128
+ [:area_code, :friendly_name, :url, :sms_url].each do |key|
129
+ params[key.to_s.camelize] = options[key] if options.has_key?( key )
130
+ end
131
+
132
+ response = request( 'IncomingPhoneNumbers/Local', 'POST', params )
133
+ if( 201 == response.code.to_i )
134
+ raw_number_response = Hash.from_xml( response.body )
135
+ else
136
+ raise "while trying to acquire a new number, got response #{response.code} and body: #{response.body}"
137
+ end
138
+ raw_number_response["TwilioResponse"]["IncomingPhoneNumber"]
139
+ end
140
+
141
+ def release_number( sid )
142
+ request( File.join( 'IncomingPhoneNumbers', sid ), 'DELETE' )
143
+ end
144
+
145
+ # just specify the resource (e.g. 'Calls' ) and it will
146
+ # append it to the base uri ("/#{api_version}/Accounts/#{sid}/")
147
+ # and then call twilio.
148
+ def request( resource, method = 'GET', params = {})
149
+ url = File.join( base_uri, resource )
150
+ make_request( url, method, params )
151
+ end
152
+
153
+
107
154
  protected
108
155
 
109
156
 
@@ -5,7 +5,7 @@ module Trails
5
5
  raise "can\'t include #{self} in #{klass} - not a Controller?" unless
6
6
  klass.respond_to?( :before_filter )
7
7
  Mime::Type.register_alias( "text/html", :twiml ) unless Mime.const_defined?( 'TWIML' )
8
- klass.send( :before_filter, :setup_incoming_call )
8
+ klass.send( :prepend_before_filter, :setup_incoming_call )
9
9
  klass.send( :attr_reader, :incoming_call )
10
10
  klass.send( :alias_method_chain, :protect_against_forgery?, :twilio )
11
11
  klass.send( :append_view_path, File.expand_path( File.join( File.dirname( __FILE__ ),
@@ -29,7 +29,7 @@ module Trails
29
29
 
30
30
  def setup_incoming_call
31
31
  return unless is_twilio_call?
32
- logger.debug( "at the beginning, request.params = #{request.parameters}" )
32
+ logger.debug{ "at the beginning, request.params = #{request.parameters}" }
33
33
  request.format = :twiml
34
34
  response.content_type = 'text/xml'
35
35
 
@@ -8,7 +8,7 @@ module Trails
8
8
  end
9
9
 
10
10
  def twilio_data
11
- @twilio_data ||= request.params.slice( INCOMING_VARS ).dup
11
+ request.params.slice( *INCOMING_VARS ).dup
12
12
  end
13
13
 
14
14
  def is_sms?
@@ -47,14 +47,14 @@ module Trails
47
47
  'To', #
48
48
  'Body', # 160 chars
49
49
 
50
- ]
50
+ ].freeze
51
51
  public
52
52
  INCOMING_VARS.uniq.each do |pname|
53
53
  mname = pname.gsub( /[A-Z]/ ) { |s| "_#{s.downcase}" }.gsub( /^_/, '' )
54
54
  # some extra debugging code here:
55
55
  # ActionController::Base.logger.debug{ "defining method: #{mname} for param #{pname}" }
56
56
  define_method( mname ) do
57
- return request.params[ pname ]
57
+ return request.params[ pname ] || request.env["HTTP_X_TWILIO_#{pname.upcase}"]
58
58
  end # define_method
59
59
  end # each
60
60
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hemant Bhanoo
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-18 00:00:00 -07:00
12
+ date: 2010-04-11 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.0.3
23
+ version: 2.0.4
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: gemcutter
@@ -56,7 +56,6 @@ extra_rdoc_files:
56
56
  - Manifest.txt
57
57
  - README.txt
58
58
  files:
59
- - .autotest
60
59
  - History.txt
61
60
  - Manifest.txt
62
61
  - README.txt
data/.autotest DELETED
@@ -1,23 +0,0 @@
1
- # -*- ruby -*-
2
-
3
- require 'autotest/restart'
4
-
5
- # Autotest.add_hook :initialize do |at|
6
- # at.extra_files << "../some/external/dependency.rb"
7
- #
8
- # at.libs << ":../some/external"
9
- #
10
- # at.add_exception 'vendor'
11
- #
12
- # at.add_mapping(/dependency.rb/) do |f, _|
13
- # at.files_matching(/test_.*rb$/)
14
- # end
15
- #
16
- # %w(TestA TestB).each do |klass|
17
- # at.extra_class_map[klass] = "test/test_misc.rb"
18
- # end
19
- # end
20
-
21
- # Autotest.add_hook :run_command do |at|
22
- # system "rake build"
23
- # end