clickatell 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/README.textile +39 -6
- data/clickatell.gemspec +84 -0
- data/lib/clickatell/api.rb +11 -2
- data/lib/clickatell/api/command_executor.rb +18 -5
- data/lib/clickatell/api/message_status.rb +12 -12
- data/lib/clickatell/version.rb +2 -2
- data/spec/api_spec.rb +6 -0
- data/spec/command_executor_spec.rb +30 -0
- data/test/clickatell_api_test.rb +94 -0
- metadata +20 -5
data/History.txt
CHANGED
data/README.textile
CHANGED
@@ -6,35 +6,68 @@ h2. Basic Usage
|
|
6
6
|
|
7
7
|
You will need your API_ID as well as your account username and password.
|
8
8
|
|
9
|
+
<pre>
|
10
|
+
<code>
|
9
11
|
require 'rubygems'
|
10
12
|
require 'clickatell'
|
11
|
-
|
13
|
+
|
12
14
|
api = Clickatell::API.authenticate('your_api_id', 'your_username', 'your_password')
|
13
15
|
api.send_message('447771234567', 'Hello from clickatell')
|
16
|
+
</code>
|
17
|
+
</pre>
|
14
18
|
|
15
19
|
To send a message to multiple recipients, simply pass in an array of numbers.
|
16
20
|
|
21
|
+
<pre>
|
22
|
+
<code>
|
17
23
|
api.send_message(['447771234567', '447771234568'], 'Hello from clickatell')
|
18
|
-
|
24
|
+
</code>
|
25
|
+
</pre>
|
26
|
+
|
27
|
+
h2. HTTP Proxy
|
28
|
+
|
29
|
+
You can configure the library to use a HTTP proxy when communicating with Clickatell.
|
30
|
+
|
31
|
+
<pre>
|
32
|
+
<code>
|
33
|
+
Clickatell::API.proxy_host = 'my.proxy.com'
|
34
|
+
Clickatell::API.proxy_port = 1234
|
35
|
+
Clickatell::API.proxy_username = 'joeschlub'
|
36
|
+
Clickatell::API.proxy_password = 'secret'
|
37
|
+
</code>
|
38
|
+
</pre>
|
39
|
+
|
19
40
|
h2. Command-line SMS Utility
|
20
41
|
|
21
|
-
The Clickatell gem also comes with a command-line utility that will allow you to send an SMS directly from the command-line.
|
42
|
+
The Clickatell gem also comes with a command-line utility that will allow you to send an SMS directly from the command-line.
|
22
43
|
|
23
44
|
You will need to create a YAML configuration file in your home directory, in a file called .clickatell that resembles the following:
|
24
45
|
|
46
|
+
<pre>
|
47
|
+
<code>
|
25
48
|
# ~/.clickatell
|
26
49
|
api_key: your_api_id
|
27
50
|
username: your_username
|
28
51
|
password: your_password
|
29
|
-
|
52
|
+
</code>
|
53
|
+
</pre>
|
54
|
+
|
30
55
|
You can then use the sms utility to send a message to a single recipient:
|
31
56
|
|
57
|
+
<pre>
|
58
|
+
<code>
|
32
59
|
sms 447771234567 'Hello from clickatell'
|
33
|
-
|
60
|
+
</code>
|
61
|
+
</pre>
|
62
|
+
|
34
63
|
Alternatively, you can specify the username and password as a command line option. Run +sms+ without any arguments for a full list of options.
|
35
64
|
|
36
65
|
The sms utility also supports multiple, comma-separated recipients (up to 100).
|
37
66
|
|
67
|
+
<pre>
|
68
|
+
<code>
|
38
69
|
sms 447771111111,447772222222 "Hello everyone"
|
70
|
+
</code>
|
71
|
+
</pre>
|
39
72
|
|
40
|
-
See http://clickatell.rubyforge.org for further instructions.
|
73
|
+
See http://clickatell.rubyforge.org for further instructions.
|
data/clickatell.gemspec
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{clickatell}
|
8
|
+
s.version = "0.8.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Luke Redpath"]
|
12
|
+
s.date = %q{2010-07-26}
|
13
|
+
s.default_executable = %q{sms}
|
14
|
+
s.email = %q{luke@lukeredpath.co.uk}
|
15
|
+
s.executables = ["sms"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"History.txt",
|
18
|
+
"License.txt",
|
19
|
+
"RDOC_README.txt"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".gitignore",
|
23
|
+
"History.txt",
|
24
|
+
"License.txt",
|
25
|
+
"RDOC_README.txt",
|
26
|
+
"README.textile",
|
27
|
+
"Rakefile",
|
28
|
+
"bin/sms",
|
29
|
+
"clickatell.gemspec",
|
30
|
+
"lib/clickatell.rb",
|
31
|
+
"lib/clickatell/api.rb",
|
32
|
+
"lib/clickatell/api/command.rb",
|
33
|
+
"lib/clickatell/api/command_executor.rb",
|
34
|
+
"lib/clickatell/api/error.rb",
|
35
|
+
"lib/clickatell/api/message_status.rb",
|
36
|
+
"lib/clickatell/response.rb",
|
37
|
+
"lib/clickatell/utility.rb",
|
38
|
+
"lib/clickatell/utility/options.rb",
|
39
|
+
"lib/clickatell/version.rb",
|
40
|
+
"lib/core-ext/hash.rb",
|
41
|
+
"scripts/txt2html",
|
42
|
+
"spec/api_spec.rb",
|
43
|
+
"spec/cli_options_test.rb",
|
44
|
+
"spec/command_executor_spec.rb",
|
45
|
+
"spec/hash_ext_spec.rb",
|
46
|
+
"spec/response_spec.rb",
|
47
|
+
"spec/spec.opts",
|
48
|
+
"spec/spec_helper.rb",
|
49
|
+
"website/images/footer_bg.gif",
|
50
|
+
"website/index.txt",
|
51
|
+
"website/javascripts/codehighlighter/code_highlighter.js",
|
52
|
+
"website/javascripts/codehighlighter/ruby.js",
|
53
|
+
"website/javascripts/rounded_corners_lite.inc.js",
|
54
|
+
"website/stylesheets/limechoc.css",
|
55
|
+
"website/stylesheets/rdoc.css",
|
56
|
+
"website/stylesheets/screen.css",
|
57
|
+
"website/template.rhtml"
|
58
|
+
]
|
59
|
+
s.homepage = %q{http://clickatell.rubyforge.org}
|
60
|
+
s.rdoc_options = ["--main", "RDOC_README.txt"]
|
61
|
+
s.require_paths = ["lib"]
|
62
|
+
s.rubygems_version = %q{1.3.7}
|
63
|
+
s.summary = %q{Ruby interface to the Clickatell SMS gateway service.}
|
64
|
+
s.test_files = [
|
65
|
+
"spec/api_spec.rb",
|
66
|
+
"spec/cli_options_test.rb",
|
67
|
+
"spec/command_executor_spec.rb",
|
68
|
+
"spec/hash_ext_spec.rb",
|
69
|
+
"spec/response_spec.rb",
|
70
|
+
"spec/spec_helper.rb",
|
71
|
+
"test/clickatell_api_test.rb"
|
72
|
+
]
|
73
|
+
|
74
|
+
if s.respond_to? :specification_version then
|
75
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
76
|
+
s.specification_version = 3
|
77
|
+
|
78
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
79
|
+
else
|
80
|
+
end
|
81
|
+
else
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
data/lib/clickatell/api.rb
CHANGED
@@ -24,6 +24,9 @@ module Clickatell
|
|
24
24
|
# Allow customizing URL
|
25
25
|
attr_accessor :api_service_host
|
26
26
|
|
27
|
+
# Set to your HTTP proxy details (off by default)
|
28
|
+
attr_accessor :proxy_host, :proxy_port, :proxy_username, :proxy_password
|
29
|
+
|
27
30
|
# Set to true to test message sending; this will not actually send
|
28
31
|
# messages but will collect sent messages in a testable collection.
|
29
32
|
# (off by default)
|
@@ -69,12 +72,13 @@ module Clickatell
|
|
69
72
|
# Additional options:
|
70
73
|
# :from - the from number/name
|
71
74
|
# :set_mobile_originated - mobile originated flag
|
72
|
-
#
|
75
|
+
# :client_message_id - user specified message id that can be used in place of Clickatell issued API message ID for querying message
|
73
76
|
# Returns a new message ID if successful.
|
74
77
|
def send_message(recipient, message_text, opts={})
|
75
|
-
valid_options = opts.only(:from, :mo, :callback)
|
78
|
+
valid_options = opts.only(:from, :mo, :callback, :climsgid)
|
76
79
|
valid_options.merge!(:req_feat => '48') if valid_options[:from]
|
77
80
|
valid_options.merge!(:mo => '1') if opts[:set_mobile_originated]
|
81
|
+
valid_options.merge!(:climsgid => opts[:client_message_id]) if opts[:client_message_id]
|
78
82
|
recipient = recipient.join(",")if recipient.is_a?(Array)
|
79
83
|
response = execute_command('sendmsg', 'http',
|
80
84
|
{:to => recipient, :text => message_text}.merge(valid_options)
|
@@ -98,6 +102,11 @@ module Clickatell
|
|
98
102
|
response = execute_command('querymsg', 'http', :apimsgid => message_id)
|
99
103
|
parse_response(response)['Status']
|
100
104
|
end
|
105
|
+
|
106
|
+
def message_charge(message_id)
|
107
|
+
response = execute_command('getmsgcharge', 'http', :apimsgid => message_id)
|
108
|
+
parse_response(response)['charge'].to_f
|
109
|
+
end
|
101
110
|
|
102
111
|
# Returns the number of credits remaining as a float.
|
103
112
|
def account_balance
|
@@ -31,7 +31,11 @@ module Clickatell
|
|
31
31
|
def execute(command_name, service, parameters={})
|
32
32
|
request_uri = command(command_name, service, parameters)
|
33
33
|
puts "[debug] Sending request to #{request_uri}" if @debug
|
34
|
-
get_response(request_uri)
|
34
|
+
result = get_response(request_uri)
|
35
|
+
if result.is_a?(Array)
|
36
|
+
result = result.first
|
37
|
+
end
|
38
|
+
result
|
35
39
|
end
|
36
40
|
|
37
41
|
protected
|
@@ -46,10 +50,19 @@ module Clickatell
|
|
46
50
|
sms_requests << uri
|
47
51
|
[FakeHttpResponse.new]
|
48
52
|
else
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
+
request = [uri.path, uri.query].join('?')
|
54
|
+
|
55
|
+
if API.proxy_host
|
56
|
+
http = Net::HTTP::Proxy(API.proxy_host, API.proxy_port, API.proxy_username, API.proxy_password)
|
57
|
+
http.start(uri.host) do |http|
|
58
|
+
resp, body = http.get(request)
|
59
|
+
end
|
60
|
+
else
|
61
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
62
|
+
http.use_ssl = (uri.scheme == 'https')
|
63
|
+
http.start do |http|
|
64
|
+
resp, body = http.get(request)
|
65
|
+
end
|
53
66
|
end
|
54
67
|
end
|
55
68
|
end
|
@@ -3,18 +3,18 @@ module Clickatell
|
|
3
3
|
|
4
4
|
class MessageStatus
|
5
5
|
STATUS_MAP = {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
6
|
+
'001' => 'Message unknown',
|
7
|
+
'002' => 'Message queued',
|
8
|
+
'003' => 'Delivered to gateway',
|
9
|
+
'004' => 'Received by recipient',
|
10
|
+
'005' => 'Error with message',
|
11
|
+
'006' => 'User cancelled messaged delivery',
|
12
|
+
'007' => 'Error delivering message',
|
13
|
+
'008' => 'OK',
|
14
|
+
'009' => 'Routing error',
|
15
|
+
'010' => 'Message expired',
|
16
|
+
'011' => 'Message queued for later delivery',
|
17
|
+
'012' => 'Out of credit'
|
18
18
|
}
|
19
19
|
|
20
20
|
def self.[](code)
|
data/lib/clickatell/version.rb
CHANGED
data/spec/api_spec.rb
CHANGED
@@ -147,6 +147,12 @@ module Clickatell
|
|
147
147
|
Response.stubs(:parse).with(response).returns('ID' => 'message_id')
|
148
148
|
@api.send_message('4477791234567', 'hello world', :callback => 1)
|
149
149
|
end
|
150
|
+
|
151
|
+
it "should set the client message id to the number passed in the options hash" do
|
152
|
+
@executor.expects(:execute).with('sendmsg', 'http', has_entry(:climsgid => 12345678)).returns(response=mock('response'))
|
153
|
+
Response.stubs(:parse).with(response).returns('ID' => 'message_id')
|
154
|
+
@api.send_message('4477791234567', 'hello world', :client_message_id => 12345678)
|
155
|
+
end
|
150
156
|
|
151
157
|
it "should ignore any invalid parameters when sending a message" do
|
152
158
|
@executor.expects(:execute).with('sendmsg', 'http', Not(has_key(:any_old_param))).returns(response = stub('response'))
|
@@ -22,6 +22,36 @@ module Clickatell
|
|
22
22
|
it "should not record requests" do
|
23
23
|
@executor.should_not respond_to(:sms_requests)
|
24
24
|
end
|
25
|
+
|
26
|
+
describe "without a proxy" do
|
27
|
+
before do
|
28
|
+
@http = mock()
|
29
|
+
@http.expects(:use_ssl=).with(false)
|
30
|
+
@http.expects(:start).returns([])
|
31
|
+
Net::HTTP.expects(:new).with(API::Command::API_SERVICE_HOST, 80).returns(@http)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should execute commands through the proxy" do
|
35
|
+
@executor.execute("foo", "http")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "with a proxy" do
|
40
|
+
before do
|
41
|
+
API.proxy_host = @proxy_host = "proxy.example.com"
|
42
|
+
API.proxy_port = @proxy_port = "1234"
|
43
|
+
API.proxy_username = @proxy_username = "joeschlub"
|
44
|
+
API.proxy_password = @proxy_password = "secret"
|
45
|
+
|
46
|
+
@http = mock()
|
47
|
+
@http.expects(:start).with(API::Command::API_SERVICE_HOST).returns([])
|
48
|
+
Net::HTTP.expects(:Proxy).with(@proxy_host, @proxy_port, @proxy_username, @proxy_password).returns(@http)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should execute commands through the proxy" do
|
52
|
+
@executor.execute("foo", "http")
|
53
|
+
end
|
54
|
+
end
|
25
55
|
end
|
26
56
|
|
27
57
|
describe "in test mode" do
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'clickatell/api'
|
3
|
+
|
4
|
+
class ClickatellApiTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "Clickatell::API" do
|
7
|
+
setup do
|
8
|
+
@client = mock('client')
|
9
|
+
@client.stubs(:session_id).returns('dummy_session_id')
|
10
|
+
|
11
|
+
@api = Clickatell::API.new(@client)
|
12
|
+
end
|
13
|
+
|
14
|
+
context "#ping" do
|
15
|
+
should "perform the ping command with the current session id" do
|
16
|
+
@client.expects(:perform_command).with('ping',
|
17
|
+
has_entry(:session_id => 'dummy_session_id')).returns(stub_response)
|
18
|
+
@api.ping
|
19
|
+
end
|
20
|
+
|
21
|
+
should "return true when successful" do
|
22
|
+
@client.stubs(:perform_command).with('ping', anything).returns(stub_response("OK:"))
|
23
|
+
assert @api.ping
|
24
|
+
end
|
25
|
+
|
26
|
+
should "return false when failed" do
|
27
|
+
@client.stubs(:perform_command).with('ping', anything).returns(stub_response("ERR:"))
|
28
|
+
assert !@api.ping
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "#send_message with a single recipient" do
|
33
|
+
should "perform the sendmsg command with the correct options" do
|
34
|
+
@client.expects(:perform_command).with('sendmsg',
|
35
|
+
has_entries(:to => '07999000000', :text => 'testing')).returns(stub_response)
|
36
|
+
|
37
|
+
@api.send_message('07999000000', 'testing')
|
38
|
+
end
|
39
|
+
|
40
|
+
should "allow a custom sender to be set" do
|
41
|
+
@client.expects(:perform_command).with('sendmsg',
|
42
|
+
has_entry(:from => 'SENDER')).returns(stub_response)
|
43
|
+
|
44
|
+
@api.send_message('07999000000', 'testing', :from => 'SENDER')
|
45
|
+
end
|
46
|
+
|
47
|
+
should "set the req_feat parameter when specifying a custom sender" do
|
48
|
+
@client.expects(:perform_command).with('sendmsg',
|
49
|
+
has_entry(:req_feat => '48')).returns(stub_response)
|
50
|
+
|
51
|
+
@api.send_message('07999000000', 'testing', :from => 'SENDER')
|
52
|
+
end
|
53
|
+
|
54
|
+
should "set the mobile originated flag if specified" do
|
55
|
+
@client.expects(:perform_command).with('sendmsg',
|
56
|
+
has_entry(:mo => '1')).returns(stub_response)
|
57
|
+
|
58
|
+
@api.send_message('07999000000', 'testing', :set_mobile_originated => true)
|
59
|
+
end
|
60
|
+
|
61
|
+
should "return a single message ID" do
|
62
|
+
@client.stubs(:perform_command).returns(stub_response(%{
|
63
|
+
ID: 99999123
|
64
|
+
}))
|
65
|
+
assert_equal %w{99999123}, @api.send_message('07999000000', 'testing')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "#send_message with multiple recipients" do
|
70
|
+
should "perform the sendmsg command with a comma-separated list of recipients" do
|
71
|
+
@client.expects(:perform_command).with('sendmsg',
|
72
|
+
has_entry(:to => '07999000000,07999000001,07999000002')).returns(stub_response)
|
73
|
+
|
74
|
+
@api.send_message(%w{07999000000 07999000001 07999000002}, 'testing')
|
75
|
+
end
|
76
|
+
|
77
|
+
should "return an array of message IDs" do
|
78
|
+
@client.stubs(:perform_command).returns(stub_response(%{
|
79
|
+
ID: 0000001
|
80
|
+
ID: 0000002
|
81
|
+
ID: 0000003
|
82
|
+
}))
|
83
|
+
expected = %w{0000001 0000002 0000003}
|
84
|
+
assert_equal expected, @api.send_message(%w{07999000000 07999000001 07999000002}, 'testing')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def stub_response(body = '', code = 200)
|
92
|
+
stub('Net::HTTP::Response', :code => 200, :body => body)
|
93
|
+
end
|
94
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clickatell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 63
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Luke Redpath
|
@@ -9,7 +15,7 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-07-26 00:00:00 +01:00
|
13
19
|
default_executable: sms
|
14
20
|
dependencies: []
|
15
21
|
|
@@ -31,6 +37,7 @@ files:
|
|
31
37
|
- README.textile
|
32
38
|
- Rakefile
|
33
39
|
- bin/sms
|
40
|
+
- clickatell.gemspec
|
34
41
|
- lib/clickatell.rb
|
35
42
|
- lib/clickatell/api.rb
|
36
43
|
- lib/clickatell/api/command.rb
|
@@ -59,6 +66,7 @@ files:
|
|
59
66
|
- website/stylesheets/rdoc.css
|
60
67
|
- website/stylesheets/screen.css
|
61
68
|
- website/template.rhtml
|
69
|
+
- test/clickatell_api_test.rb
|
62
70
|
has_rdoc: true
|
63
71
|
homepage: http://clickatell.rubyforge.org
|
64
72
|
licenses: []
|
@@ -70,21 +78,27 @@ rdoc_options:
|
|
70
78
|
require_paths:
|
71
79
|
- lib
|
72
80
|
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
73
82
|
requirements:
|
74
83
|
- - ">="
|
75
84
|
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
76
88
|
version: "0"
|
77
|
-
version:
|
78
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
79
91
|
requirements:
|
80
92
|
- - ">="
|
81
93
|
- !ruby/object:Gem::Version
|
94
|
+
hash: 3
|
95
|
+
segments:
|
96
|
+
- 0
|
82
97
|
version: "0"
|
83
|
-
version:
|
84
98
|
requirements: []
|
85
99
|
|
86
100
|
rubyforge_project:
|
87
|
-
rubygems_version: 1.3.
|
101
|
+
rubygems_version: 1.3.7
|
88
102
|
signing_key:
|
89
103
|
specification_version: 3
|
90
104
|
summary: Ruby interface to the Clickatell SMS gateway service.
|
@@ -95,3 +109,4 @@ test_files:
|
|
95
109
|
- spec/hash_ext_spec.rb
|
96
110
|
- spec/response_spec.rb
|
97
111
|
- spec/spec_helper.rb
|
112
|
+
- test/clickatell_api_test.rb
|