clickatell 0.6.0 → 0.7.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/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.7.0
2
+
3
+ * Added support for sending SMS to multiple recipients.
4
+
1
5
  == 0.6.0
2
6
 
3
7
  * API host can now be customized (John Gibbons)
data/README.textile CHANGED
@@ -12,6 +12,9 @@ You will need your API_ID as well as your account username and password.
12
12
  api = Clickatell::API.authenticate('your_api_id', 'your_username', 'your_password')
13
13
  api.send_message('447771234567', 'Hello from clickatell')
14
14
 
15
+ To send a message to multiple recipients, simply pass in an array of numbers.
16
+
17
+ api.send_message(['447771234567', '447771234568'], 'Hello from clickatell')
15
18
 
16
19
  h2. Command-line SMS Utility
17
20
 
@@ -30,4 +33,8 @@ You can then use the sms utility to send a message to a single recipient:
30
33
 
31
34
  Alternatively, you can specify the username and password as a command line option. Run +sms+ without any arguments for a full list of options.
32
35
 
36
+ The sms utility also supports multiple, comma-separated recipients (up to 100).
37
+
38
+ sms 447771111111,447772222222 "Hello everyone"
39
+
33
40
  See http://clickatell.rubyforge.org for further instructions.
data/bin/sms CHANGED
@@ -30,11 +30,11 @@ begin
30
30
  puts "Status: #{Clickatell::API::MessageStatus[status]} (##{status})."
31
31
  exit 0
32
32
  else
33
- puts "Sending '#{options.message}' to #{options.recipient}..."
33
+ puts "Sending '#{options.message}' to #{[options.recipient].flatten.join(", ")}..."
34
34
  additional_opts = {}
35
35
  additional_opts[:from] = options.from if options.from
36
36
  msg_id = api.send_message(options.recipient, options.message, additional_opts)
37
- puts "Message sent successfully (message id: #{msg_id})."
37
+ puts "Message sent successfully (message id: #{[msg_id].flatten.join(", ")})."
38
38
  exit 0
39
39
  end
40
40
 
@@ -75,10 +75,12 @@ module Clickatell
75
75
  valid_options = opts.only(:from, :mo, :callback)
76
76
  valid_options.merge!(:req_feat => '48') if valid_options[:from]
77
77
  valid_options.merge!(:mo => '1') if opts[:set_mobile_originated]
78
+ recipient = recipient.join(",")if recipient.is_a?(Array)
78
79
  response = execute_command('sendmsg', 'http',
79
80
  {:to => recipient, :text => message_text}.merge(valid_options)
80
81
  )
81
- parse_response(response)['ID']
82
+ response = parse_response(response)
83
+ response.is_a?(Array) ? response.map { |r| r['ID'] } : response['ID']
82
84
  end
83
85
 
84
86
  def send_wap_push(recipient, media_url, notification_text='', opts={})
@@ -15,7 +15,15 @@ module Clickatell
15
15
  if http_response.body.scan(/ERR/).any?
16
16
  raise Clickatell::API::Error.parse(http_response.body)
17
17
  end
18
- YAML.load(http_response.body.scan(PARSE_REGEX).join("\n"))
18
+ results = http_response.body.split("\n").map do |line|
19
+ # YAML.load converts integer strings that have leading zeroes into integers
20
+ # using octal rather than decimal. This isn't what we want, so we'll strip out any
21
+ # leading zeroes in numbers here.
22
+ response_fields = line.scan(PARSE_REGEX)
23
+ response_fields = response_fields.collect { |field| field.gsub(/\b0+(\d+)\b/, '\1') }
24
+ YAML.load(response_fields.join("\n"))
25
+ end
26
+ results.length == 1 ? results.first : results
19
27
  end
20
28
 
21
29
  end
@@ -9,7 +9,8 @@ module Clickatell
9
9
  def parse(args)
10
10
  @options = self.default_options
11
11
  parser = OptionParser.new do |opts|
12
- opts.banner = "Usage: sms [options] recipient message"
12
+ opts.banner = "Usage: sms [options] recipient(s) message"
13
+ opts.separator " Recipients can be a comma-separated list, up to 100 max."
13
14
  opts.separator ""
14
15
  opts.separator "Specific options:"
15
16
 
@@ -73,6 +74,8 @@ module Clickatell
73
74
  puts parser
74
75
  exit
75
76
  end
77
+
78
+ @options.recipient = @options.recipient.split(",")
76
79
 
77
80
  return @options
78
81
 
@@ -1,7 +1,7 @@
1
1
  module Clickatell #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 6
4
+ MINOR = 7
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
data/spec/api_spec.rb CHANGED
@@ -121,6 +121,15 @@ module Clickatell
121
121
  @api.send_message('4477791234567', 'hello world & goodbye').should == 'message_id'
122
122
  end
123
123
 
124
+ it "should support sending messages to a multiple numbers, returning the message ids" do
125
+ @executor.expects(:execute).with('sendmsg', 'http',
126
+ :to => '4477791234567,447779999999',
127
+ :text => 'hello world & goodbye'
128
+ ).returns(response = stub('response'))
129
+ Response.stubs(:parse).with(response).returns([{'ID' => 'message_1_id'}, {'ID' => 'message_2_id'}])
130
+ @api.send_message(['4477791234567', '447779999999'], 'hello world & goodbye').should == ['message_1_id', 'message_2_id']
131
+ end
132
+
124
133
  it "should set the :from parameter and set the :req_feat to 48 when using a custom from string when sending a message" do
125
134
  @executor.expects(:execute).with('sendmsg', 'http', has_entries(:from => 'LUKE', :req_feat => '48')).returns(response = stub('response'))
126
135
  Response.stubs(:parse).with(response).returns('ID' => 'message_id')
@@ -16,9 +16,23 @@ module Clickatell
16
16
  Response.parse(stub('response', :body => 'k1: foo k2: bar')).should == {'k1' => 'foo', 'k2' => 'bar'}
17
17
  end
18
18
 
19
+ it "should return array of hashes for multi-line success response" do
20
+ Response.parse(stub('response', :body => "k1: foo\nk2: bar")).should == [{'k1' => 'foo'}, {'k2' => 'bar'}]
21
+ end
22
+
19
23
  it "should raise API::Error if response contains an error message" do
20
24
  proc { Response.parse(stub('response', :body => 'ERR: 001, Authentication failed')) }.should raise_error(Clickatell::API::Error)
21
25
  end
26
+
27
+ {
28
+ '001' => 1, '002' => 2, '003' => 3, '004' => 4,
29
+ '005' => 5, '006' => 6, '007' => 7, '008' => 8,
30
+ '009' => 9, '010' => 10, '011' => 11, '012' => 12
31
+ }.each do |status_str, status_int|
32
+ it "should parse a message status code of #{status_int} when the response body contains a status code of #{status_str}" do
33
+ Response.parse(stub('response', :body => "ID: 0d1d7dda17d5a24edf1555dc0b679d0e Status: #{status_str}")).should == {'ID' => '0d1d7dda17d5a24edf1555dc0b679d0e', 'Status' => status_int}
34
+ end
35
+ end
22
36
 
23
37
  describe "in test mode" do
24
38
  before(:each) do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clickatell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Redpath
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-25 00:00:00 +01:00
12
+ date: 2009-10-07 00:00:00 +01:00
13
13
  default_executable: sms
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -44,23 +44,21 @@ files:
44
44
  - spec/response_spec.rb
45
45
  - spec/spec.opts
46
46
  - spec/spec_helper.rb
47
- - lib/clickatell
48
- - lib/clickatell/api
49
47
  - lib/clickatell/api/command.rb
50
48
  - lib/clickatell/api/command_executor.rb
51
49
  - lib/clickatell/api/error.rb
52
50
  - lib/clickatell/api/message_status.rb
53
51
  - lib/clickatell/api.rb
54
52
  - lib/clickatell/response.rb
55
- - lib/clickatell/utility
56
53
  - lib/clickatell/utility/options.rb
57
54
  - lib/clickatell/utility.rb
58
55
  - lib/clickatell/version.rb
59
56
  - lib/clickatell.rb
60
- - lib/core-ext
61
57
  - lib/core-ext/hash.rb
62
58
  has_rdoc: true
63
59
  homepage: http://clickatell.rubyforge.org
60
+ licenses: []
61
+
64
62
  post_install_message:
65
63
  rdoc_options:
66
64
  - --main
@@ -82,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
80
  requirements: []
83
81
 
84
82
  rubyforge_project: clickatell
85
- rubygems_version: 1.3.1
83
+ rubygems_version: 1.3.5
86
84
  signing_key:
87
85
  specification_version: 2
88
86
  summary: Ruby interface to the Clickatell SMS gateway service.