4info 1.2.5 → 1.3.0
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/4info.gemspec +3 -3
- data/README.markdown +17 -1
- data/VERSION +1 -1
- data/lib/configuration.rb +39 -0
- data/lib/contactable.rb +42 -10
- data/lib/four_info.rb +10 -7
- data/lib/request.rb +16 -25
- data/lib/response.rb +5 -0
- data/lib/templates/confirm.haml +1 -1
- data/lib/templates/deliver.haml +5 -1
- data/lib/templates/unblock.haml +1 -1
- data/test/four_info_contactable_test.rb +30 -0
- data/test/four_info_module_test.rb +17 -0
- data/test/test_helper.rb +6 -0
- metadata +3 -3
- data/test/sms.yml +0 -6
data/4info.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{4info}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jack Danger Canty"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-20}
|
13
13
|
s.description = %q{A complete Ruby API for handling SMS messages via 4info.com}
|
14
14
|
s.email = %q{gitcommit@6brand.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
"VERSION",
|
24
24
|
"init.rb",
|
25
25
|
"lib/4info.rb",
|
26
|
+
"lib/configuration.rb",
|
26
27
|
"lib/contactable.rb",
|
27
28
|
"lib/controller.rb",
|
28
29
|
"lib/four_info.rb",
|
@@ -36,7 +37,6 @@ Gem::Specification.new do |s|
|
|
36
37
|
"test/four_info_contactable_test.rb",
|
37
38
|
"test/four_info_controller_test.rb",
|
38
39
|
"test/four_info_module_test.rb",
|
39
|
-
"test/sms.yml",
|
40
40
|
"test/test_helper.rb"
|
41
41
|
]
|
42
42
|
s.homepage = %q{http://github.com/JackDanger/4info}
|
data/README.markdown
CHANGED
@@ -37,6 +37,22 @@ Because it can be expensive to send TXTs accidentally, it's required that you ma
|
|
37
37
|
|
38
38
|
Skipping this step (or adding any other value) will prevent TXTs from actually being sent.
|
39
39
|
|
40
|
+
You'll also want to configure your setup with your client_id and client_key. Put this in the same file as above or in a separate initializer if you wish:
|
41
|
+
|
42
|
+
FourInfo.configure do |config|
|
43
|
+
# these two are required:
|
44
|
+
# (replace them with your actual account info)
|
45
|
+
config.client_id = 12345
|
46
|
+
config.client_key = 'ABC123'
|
47
|
+
|
48
|
+
# the rest are optional:
|
49
|
+
config.short_code = 00001 # if you have a custom short code
|
50
|
+
config.proxy_address = 'my.proxy.com'
|
51
|
+
config.proxy_port = '80'
|
52
|
+
config.proxy_username = 'user'
|
53
|
+
config.proxy_password = 'password'
|
54
|
+
end
|
55
|
+
|
40
56
|
Phone number formatting
|
41
57
|
---
|
42
58
|
|
@@ -46,7 +62,7 @@ Whatever is stored in the sms_phone_number_column will be subject to normalized
|
|
46
62
|
user.sms_phone_number # => 2065551234
|
47
63
|
|
48
64
|
If you want to preserve the format of the number exactly as the user entered it you'll want
|
49
|
-
to save
|
65
|
+
to save that in a different attribute.
|
50
66
|
|
51
67
|
|
52
68
|
Confirming Phone Number And Sending Messages
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module FourInfo
|
2
|
+
class << self
|
3
|
+
def mode
|
4
|
+
@@mode ||= :test
|
5
|
+
end
|
6
|
+
|
7
|
+
def mode=(new_mode)
|
8
|
+
@@mode = new_mode
|
9
|
+
end
|
10
|
+
|
11
|
+
def configured?
|
12
|
+
return false unless configuration
|
13
|
+
configuration.client_id && configuration.client_key
|
14
|
+
end
|
15
|
+
|
16
|
+
def configuration
|
17
|
+
@@configuration
|
18
|
+
end
|
19
|
+
|
20
|
+
def configure(&block)
|
21
|
+
@@configuration = Configuration.new(&block)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Configuration
|
26
|
+
|
27
|
+
attr_accessor :client_id
|
28
|
+
attr_accessor :client_key
|
29
|
+
attr_accessor :short_code
|
30
|
+
attr_accessor :proxy_address
|
31
|
+
attr_accessor :proxy_port
|
32
|
+
attr_accessor :proxy_username
|
33
|
+
attr_accessor :proxy_password
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
yield self
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/contactable.rb
CHANGED
@@ -79,18 +79,14 @@ module FourInfo
|
|
79
79
|
return true if sms_confirmed?
|
80
80
|
return false if four_info_sms_phone_number.blank?
|
81
81
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
save
|
88
|
-
else
|
89
|
-
# "Confirmation Failed: #{response['message'].inspect}"
|
90
|
-
false
|
91
|
-
end
|
82
|
+
# If we're using a custom short code we'll
|
83
|
+
# need to create a custom configuration message
|
84
|
+
FourInfo.configuration.short_code ?
|
85
|
+
confirm_four_info_sms_with_custom_message :
|
86
|
+
confirm_four_info_sms_with_default_message
|
92
87
|
end
|
93
88
|
|
89
|
+
|
94
90
|
# Sends an unblock request via xml to the 4info gateway.
|
95
91
|
# If request succeeds, changes the contactable record's
|
96
92
|
# sms_blocked_column to false.
|
@@ -125,5 +121,41 @@ module FourInfo
|
|
125
121
|
return false if four_info_sms_confirmed_phone_number.blank?
|
126
122
|
four_info_sms_confirmed_phone_number == four_info_sms_phone_number
|
127
123
|
end
|
124
|
+
|
125
|
+
protected
|
126
|
+
def confirm_four_info_sms_with_custom_message
|
127
|
+
confirmation_code = FourInfo.generate_confirmation_code
|
128
|
+
|
129
|
+
# Use this class' confirmation_message method if it
|
130
|
+
# exists, otherwise use the generic message
|
131
|
+
message = (self.class.respond_to?(:confirmation_message) ?
|
132
|
+
self.class :
|
133
|
+
FourInfo).confirmation_message(confirmation_code)
|
134
|
+
|
135
|
+
response = FourInfo::Request.new.deliver_message(message, four_info_sms_phone_number)
|
136
|
+
|
137
|
+
if response.success?
|
138
|
+
update_four_info_sms_confirmation confirmation_code
|
139
|
+
else
|
140
|
+
false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def confirm_four_info_sms_with_default_message
|
145
|
+
response = FourInfo::Request.new.confirm(four_info_sms_phone_number)
|
146
|
+
|
147
|
+
if response.success?
|
148
|
+
update_four_info_sms_confirmation response.confirmation_code
|
149
|
+
else
|
150
|
+
false
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def update_four_info_sms_confirmation(new_code)
|
155
|
+
self.four_info_sms_confirmation_code = new_code
|
156
|
+
self.four_info_sms_confirmation_attempted = Time.now.utc
|
157
|
+
self.four_info_sms_confirmed_phone_number = nil
|
158
|
+
save
|
159
|
+
end
|
128
160
|
end
|
129
161
|
end
|
data/lib/four_info.rb
CHANGED
@@ -5,13 +5,6 @@ module FourInfo
|
|
5
5
|
URI.parse 'http://gateway.4info.net/msg'
|
6
6
|
end
|
7
7
|
|
8
|
-
def mode
|
9
|
-
@@mode ||= :test
|
10
|
-
end
|
11
|
-
def mode=(new_mode)
|
12
|
-
@@mode = new_mode
|
13
|
-
end
|
14
|
-
|
15
8
|
def log(msg)
|
16
9
|
if defined?(Rails)
|
17
10
|
Rails.logger.info msg
|
@@ -37,9 +30,19 @@ module FourInfo
|
|
37
30
|
nil
|
38
31
|
end
|
39
32
|
end
|
33
|
+
|
34
|
+
def confirmation_message(confirmation_code)
|
35
|
+
"4INFO alert confirm. code: #{confirmation_code} Enter code on web to verify phone. Msg&data rates may apply. Freq set by u. T&C & support at www.4info.com. Txt HELP for help"
|
36
|
+
end
|
37
|
+
|
38
|
+
def generate_confirmation_code
|
39
|
+
chars = (0..9).to_a + ('A'..'Z').to_a
|
40
|
+
(0...6).collect { chars[Kernel.rand(chars.length)] }.join
|
41
|
+
end
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
45
|
+
require File.join(File.dirname(__FILE__), 'configuration')
|
43
46
|
require File.join(File.dirname(__FILE__), 'contactable')
|
44
47
|
require File.join(File.dirname(__FILE__), 'controller')
|
45
48
|
require File.join(File.dirname(__FILE__), 'request')
|
data/lib/request.rb
CHANGED
@@ -1,34 +1,19 @@
|
|
1
1
|
module FourInfo
|
2
2
|
class Request
|
3
3
|
|
4
|
-
# Haml templates for XML
|
5
|
-
@@templates = Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), 'templates', '*.haml')))
|
6
|
-
|
7
|
-
# YML config files
|
8
|
-
@@test_mode_config_file = File.join(File.dirname(__FILE__), '..', 'test', 'sms.yml')
|
9
|
-
@@likely_config_files = [
|
10
|
-
File.join(File.dirname(__FILE__), '..', 'sms.yml'),
|
11
|
-
defined?(Rails) ? File.join(Rails.root, 'config', 'sms.yml') : '',
|
12
|
-
File.join('config', 'sms.yml'),
|
13
|
-
'sms.yml'
|
14
|
-
]
|
15
|
-
|
16
4
|
attr_accessor :config
|
17
5
|
attr_accessor :number
|
18
6
|
attr_accessor :message
|
19
7
|
|
20
8
|
def initialize
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
raise "Missing config File! Please add sms.yml to ./config or the 4info directory" unless config_file
|
26
|
-
|
27
|
-
@config = YAML.load(File.read(config_file))['4info'].with_indifferent_access
|
9
|
+
unless FourInfo.configured?
|
10
|
+
raise "You need to configure FourInfo before using it!"
|
11
|
+
end
|
12
|
+
self.config = FourInfo.configuration
|
28
13
|
end
|
29
14
|
|
30
15
|
def deliver_message(message, number)
|
31
|
-
self.number
|
16
|
+
self.number = FourInfo.internationalize(number)
|
32
17
|
self.message = message
|
33
18
|
|
34
19
|
xml = template(:deliver).render(self)
|
@@ -36,7 +21,7 @@ module FourInfo
|
|
36
21
|
end
|
37
22
|
|
38
23
|
def confirm(number)
|
39
|
-
self.number
|
24
|
+
self.number = FourInfo.internationalize(number)
|
40
25
|
|
41
26
|
xml = template(:confirm).render(self)
|
42
27
|
Response.new(perform(xml))
|
@@ -52,7 +37,9 @@ module FourInfo
|
|
52
37
|
protected
|
53
38
|
|
54
39
|
def template(name)
|
55
|
-
|
40
|
+
# Haml templates for XML
|
41
|
+
templates = Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), 'templates', '*.haml')))
|
42
|
+
file = templates.detect {|t| File.basename(t).chomp('.haml').to_sym == name.to_sym }
|
56
43
|
raise ArgumentError, "Missing 4Info template: #{name}" unless file
|
57
44
|
Haml::Engine.new(File.read(file))
|
58
45
|
end
|
@@ -72,9 +59,13 @@ module FourInfo
|
|
72
59
|
end
|
73
60
|
|
74
61
|
def start
|
75
|
-
net = config
|
76
|
-
Net::HTTP
|
77
|
-
|
62
|
+
net = config.proxy_address ?
|
63
|
+
Net::HTTP::Proxy(
|
64
|
+
config.proxy_address,
|
65
|
+
config.proxy_port,
|
66
|
+
config.proxy_username,
|
67
|
+
config.proxy_password) :
|
68
|
+
Net::HTTP
|
78
69
|
net.start(FourInfo.gateway.host, FourInfo.gateway.port) do |http|
|
79
70
|
yield http
|
80
71
|
end
|
data/lib/response.rb
CHANGED
data/lib/templates/confirm.haml
CHANGED
data/lib/templates/deliver.haml
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
!!! XML
|
2
|
-
%request{ :clientId => config
|
2
|
+
%request{ :clientId => config.client_id, :clientKey => config.client_key, :type => "MESSAGE" }
|
3
3
|
%message
|
4
|
+
- if config.short_code
|
5
|
+
%sender
|
6
|
+
%type= 6
|
7
|
+
%id= config.short_code
|
4
8
|
%recipient
|
5
9
|
%type= 5
|
6
10
|
%id= number
|
data/lib/templates/unblock.haml
CHANGED
@@ -140,6 +140,36 @@ class FourInfoContactableTest < ActiveSupport::TestCase
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
143
|
+
context "confirming phone number with a custom short code" do
|
144
|
+
context "with expectations" do
|
145
|
+
setup {
|
146
|
+
FourInfo.configure do |config|
|
147
|
+
config.short_code = '0005'
|
148
|
+
config.client_id = 1
|
149
|
+
config.client_key = 'ABC123'
|
150
|
+
end
|
151
|
+
message = "long message blah blah MYCODE blah"
|
152
|
+
FourInfo.expects(:generate_confirmation_code).returns('MYCODE').once
|
153
|
+
FourInfo.expects(:confirmation_message).returns(message).once
|
154
|
+
FourInfo::Request.any_instance.expects(:deliver_message).with(message, @user.four_info_sms_phone_number).once
|
155
|
+
@user.send_sms_confirmation!
|
156
|
+
}
|
157
|
+
end
|
158
|
+
context "(normal)" do
|
159
|
+
setup {
|
160
|
+
FourInfo.configure do |config|
|
161
|
+
config.short_code = '0005'
|
162
|
+
config.client_id = 1
|
163
|
+
config.client_key = 'ABC123'
|
164
|
+
end
|
165
|
+
FourInfo::Request.any_instance.stubs(:perform).returns(SendMsgSuccess)
|
166
|
+
@worked = @user.send_sms_confirmation!
|
167
|
+
}
|
168
|
+
should "work" do
|
169
|
+
assert @worked
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
143
173
|
context "confirming phone number when the confirmation fails for some reason" do
|
144
174
|
setup {
|
145
175
|
FourInfo::Request.any_instance.stubs(:perform).returns(ValidationError)
|
@@ -36,4 +36,21 @@ class FourInfoModuleTest < ActiveSupport::TestCase
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
context "generating codes" do
|
41
|
+
setup { @code = FourInfo.generate_confirmation_code }
|
42
|
+
should "be 6 digits" do
|
43
|
+
assert_equal 6, @code.length
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "confirmation message" do
|
48
|
+
setup {
|
49
|
+
@code = 'ABC123'
|
50
|
+
@message = FourInfo.confirmation_message(@code)
|
51
|
+
}
|
52
|
+
should "include code" do
|
53
|
+
assert @message.include?(@code)
|
54
|
+
end
|
55
|
+
end
|
39
56
|
end
|
data/test/test_helper.rb
CHANGED
@@ -8,6 +8,12 @@ require 'active_support/test_case'
|
|
8
8
|
require 'shoulda'
|
9
9
|
require File.join(File.dirname(__FILE__), "..", 'lib', 'four_info')
|
10
10
|
|
11
|
+
# default test configuration
|
12
|
+
FourInfo.configure do |config|
|
13
|
+
config.client_id = '1'
|
14
|
+
config.client_key = 'ABCDEF'
|
15
|
+
end
|
16
|
+
|
11
17
|
FourInfo.mode = :test
|
12
18
|
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
13
19
|
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: 4info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Danger Canty
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-20 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -68,6 +68,7 @@ files:
|
|
68
68
|
- VERSION
|
69
69
|
- init.rb
|
70
70
|
- lib/4info.rb
|
71
|
+
- lib/configuration.rb
|
71
72
|
- lib/contactable.rb
|
72
73
|
- lib/controller.rb
|
73
74
|
- lib/four_info.rb
|
@@ -81,7 +82,6 @@ files:
|
|
81
82
|
- test/four_info_contactable_test.rb
|
82
83
|
- test/four_info_controller_test.rb
|
83
84
|
- test/four_info_module_test.rb
|
84
|
-
- test/sms.yml
|
85
85
|
- test/test_helper.rb
|
86
86
|
has_rdoc: true
|
87
87
|
homepage: http://github.com/JackDanger/4info
|