mblox 0.0.2 → 0.0.3

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/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/README.md CHANGED
@@ -33,17 +33,21 @@ Configuration
33
33
  # You can also configure some logging options
34
34
  # In a Rails environment, config.logger will default to Rails.logger and config.log_at will default to :debug
35
35
  # config.log_at means the level at which Mblox will log.
36
- # If config.log_at == :debug and your logger's log level is :info, logging will be suppressed because it is below the log level of the logger.
36
+ # For instance, if config.log_at == :debug, Mblox will log only if the logger's log level is :debug
37
+ # Note that if config.log_at == :debug and your logger's log level is :info,
38
+ # logging will be suppressed because it is below the log level of the logger.
37
39
  config.logger = Logger.new(STDOUT)
38
40
  config.log_at :info
39
41
 
40
42
  # What to do if messages are longer than 160 characters. Default is :raise_error
43
+ # Other options are :truncate and :split
41
44
  config.on_message_too_long = :truncate
42
45
  end
43
46
 
44
47
  Once your application is configured, send messages:
45
48
 
46
- phone_number = 2225555555 # The number you're sending to. Must be a 10-digit number, including the area code. Can be a String or Fixnum.
49
+ # The number to sending to must be a 10-digit number, including the area code. Can be a String or Fixnum.
50
+ phone_number = 2225555555 # or: phone_number = "2225555555"
47
51
  Mblox::Sms.new(phone_number, "your message").send
48
52
 
49
53
  ## Testing
@@ -19,7 +19,7 @@ module Mblox
19
19
  end
20
20
 
21
21
  def on_message_too_long= action
22
- raise ArgumentError, "Mblox.config.on_message_too_long must be either :truncate or :raise_error" unless [:truncate, :raise_error].include?(action)
22
+ raise ArgumentError, "Mblox.config.on_message_too_long must be either :truncate, :split or :raise_error" unless [:truncate, :raise_error, :split].include?(action)
23
23
  @on_message_too_long = action
24
24
  end
25
25
 
@@ -5,22 +5,29 @@ require "net/https"
5
5
 
6
6
  module Mblox
7
7
  class Sms
8
+ MAX_LENGTH = 160
9
+ MAX_SECTION_LENGTH = MAX_LENGTH - "(MSG XXX/XXX): ".size
10
+
8
11
  attr_reader :phone, :message
12
+
13
+ ON_MESSAGE_TOO_LONG_HANDLER = {
14
+ :raise_error => Proc.new { raise SmsError, "Message cannot be longer than #{MAX_LENGTH} characters" },
15
+ :truncate => Proc.new { |message| Mblox.log "Truncating message due to length. Message was: \"#{message}\" but will now be \"#{message = message[0,MAX_LENGTH]}\""; [message] },
16
+ :split => Proc.new { |message| split_message(message) }
17
+ }
18
+
9
19
  def initialize(phone,message)
10
20
  phone = phone.to_s
11
21
  raise SmsError, "Phone number must be ten digits" unless /\A[0-9]{10}\z/.match(phone)
12
22
  raise SmsError, "Phone number cannot begin with 0 or 1" if ['0','1'].include?(phone[0].to_s)
13
23
  raise SmsError, "Message cannot be blank" if message.empty?
14
- if message.size > 160
15
- raise SmsError, "Message cannot be longer than 160 characters" if :raise_error == Mblox.config.on_message_too_long
16
- message = message[0,160] if :truncate == Mblox.config.on_message_too_long
17
- end
24
+ Mblox.log "WARNING: Some characters may be lost because the message must be broken into at least 1000 sections" if message.size > (999 * MAX_SECTION_LENGTH)
25
+ @message = (message.size > MAX_LENGTH) ? ON_MESSAGE_TOO_LONG_HANDLER[Mblox.config.on_message_too_long].call(message) : [message.dup]
18
26
  @phone = "1#{phone}"
19
- @message = message.dup
20
27
  end
21
28
 
22
29
  def send
23
- commit build
30
+ @message.collect { |message| commit build(message) }
24
31
  end
25
32
  private
26
33
  def commit(request_body)
@@ -43,7 +50,7 @@ module Mblox
43
50
  "RequestResult: \"#{result_header['RequestResultCode']}:#{result_header['RequestResultText']}\" / SubscriberResult: \"#{subscriber_result['SubscriberResultCode']}:#{subscriber_result['SubscriberResultText']}\""
44
51
  end
45
52
 
46
- def build
53
+ def build(message)
47
54
  builder = Builder::XmlMarkup.new
48
55
  builder.instruct!(:xml, :encoding => "ISO-8859-1")
49
56
  builder.NotificationRequest(:Version => "3.5") do |nr|
@@ -53,7 +60,7 @@ module Mblox
53
60
  end
54
61
  nr.NotificationList(:BatchID => "1") do |nl|
55
62
  nl.Notification(:SequenceNumber => "1", :MessageType => "SMS") do |n|
56
- n.Message(@message)
63
+ n.Message(message)
57
64
  n.Profile(Mblox.config.profile_id)
58
65
  n.SenderID(Mblox.config.sender_id, :Type => 'Shortcode')
59
66
  n.Tariff(Mblox.config.tariff)
@@ -65,5 +72,23 @@ module Mblox
65
72
  end
66
73
  end
67
74
  end
75
+
76
+ def self.section_counter(size)
77
+ size / MAX_SECTION_LENGTH + ((size % MAX_SECTION_LENGTH).zero? ? 0 : 1)
78
+ end
79
+
80
+ def self.split_message(message)
81
+ sections = section_counter(message.size)
82
+ Mblox.log "Splitting message into #{sections} messages due to length."
83
+ split_message = []
84
+ (sections - 1).times do |i|
85
+ first_char = i * MAX_SECTION_LENGTH
86
+ Mblox.log "Section ##{i + 1} of ##{sections} contains characters #{first_char + 1} thru #{first_char + MAX_SECTION_LENGTH} of #{message.size}"
87
+ split_message << "(MSG #{i+1}/#{sections}): #{message[first_char, MAX_SECTION_LENGTH]}"
88
+ end
89
+ first_char = (sections-1)*MAX_SECTION_LENGTH
90
+ Mblox.log "Section ##{sections} of ##{sections} contains characters #{first_char + 1} thru #{message.size} of #{message.size}"
91
+ split_message << "(MSG #{sections}/#{sections}): #{message[first_char..-1]}"
92
+ end
68
93
  end
69
94
  end
@@ -1,3 +1,3 @@
1
1
  module Mblox
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -11,12 +11,16 @@ describe "configuration" do
11
11
  expect { Mblox.config.on_message_too_long = :truncate }.to_not raise_error
12
12
  end
13
13
 
14
+ it "should allow the value :split" do
15
+ expect { Mblox.config.on_message_too_long = :split }.to_not raise_error
16
+ end
17
+
14
18
  it "should allow the value :raise_error" do
15
19
  expect { Mblox.config.on_message_too_long = :raise_error }.to_not raise_error
16
20
  end
17
21
 
18
22
  it "should not allow other values and should remain in a valid state" do
19
- expect { Mblox.config.on_message_too_long = :do_nothing }.to raise_error(ArgumentError, "Mblox.config.on_message_too_long must be either :truncate or :raise_error")
23
+ expect { Mblox.config.on_message_too_long = :do_nothing }.to raise_error(ArgumentError, "Mblox.config.on_message_too_long must be either :truncate, :split or :raise_error")
20
24
  expect(Mblox.config.on_message_too_long).to eq(:raise_error)
21
25
  end
22
26
  end
@@ -33,7 +33,7 @@ describe "message" do
33
33
  message = "A"+"ABCDEFGHIJ"*16
34
34
  Mblox.config.on_message_too_long = :truncate
35
35
  expect { @mblox = Mblox::Sms.new("2"*10, message) }.to_not raise_error
36
- expect(@mblox.message).to eq(message[0,160])
36
+ expect(@mblox.message).to eq([message[0,160]])
37
37
  end
38
38
 
39
39
  it "cannot be longer than 160 characters if configured to raise error" do
@@ -41,28 +41,51 @@ describe "message" do
41
41
  expect { Mblox::Sms.new("2"*10, "A"*161) }.to raise_error(Mblox::SmsError, "Message cannot be longer than 160 characters")
42
42
  end
43
43
 
44
- it "should be safe from changing" do
44
+ it "should be split into multiple messages when longer than 160 characters if configured to split and even split" do
45
+ message = "ABCDEFGHIJ"*58
46
+ Mblox.config.on_message_too_long = :split
47
+ expect { @mblox = Mblox::Sms.new("2"*10, message) }.to_not raise_error
48
+ expect(@mblox.message).to eq(["(MSG 1/4): #{message[0,145]}", "(MSG 2/4): #{message[145,145]}", "(MSG 3/4): #{message[290,145]}", "(MSG 4/4): #{message[435,145]}"])
49
+ expect(@mblox.send).to eq(Array.new(4, result_unroutable))
50
+ end
51
+
52
+ it "should be split into multiple messages when longer than 160 characters if configured to split and not even split" do
53
+ message = "ABCDEFGHIJ"*32
54
+ Mblox.config.on_message_too_long = :split
55
+ expect { @mblox = Mblox::Sms.new("2"*10, message) }.to_not raise_error
56
+ expect(@mblox.message).to eq(["(MSG 1/3): #{message[0,145]}", "(MSG 2/3): #{message[145,145]}", "(MSG 3/3): #{message[290..-1]}"])
57
+ expect(@mblox.send).to eq(Array.new(3, result_unroutable))
58
+ end
59
+
60
+ it "should be safe from changing when short" do
45
61
  msg = the_message
46
62
  mblox = Mblox::Sms.new(TEST_NUMBER,msg)
47
63
  msg[1..3] = ''
48
- expect(mblox.message).to eq(the_message)
64
+ expect(mblox.message).to eq([the_message])
65
+ end
66
+
67
+ it "should be safe from changing when long" do
68
+ msg = the_message * 10
69
+ mblox = Mblox::Sms.new(TEST_NUMBER,msg)
70
+ msg[1..3] = ''
71
+ expect(mblox.message[0][11, 20]).to eq(the_message[0,20])
49
72
  end
50
73
  end
51
74
 
52
75
  describe "SMS messages" do
53
76
  it "should be sent when the phone number is a Fixnum" do
54
- expect(Mblox::Sms.new(TEST_NUMBER.to_i,the_message).send).to eq(result_ok)
77
+ expect(Mblox::Sms.new(TEST_NUMBER.to_i,the_message).send).to eq([result_ok])
55
78
  end
56
79
 
57
80
  it "should be sent when the phone number is a String" do
58
- expect(Mblox::Sms.new(TEST_NUMBER.to_s,the_message).send).to eq(result_ok)
81
+ expect(Mblox::Sms.new(TEST_NUMBER.to_s,the_message).send).to eq([result_ok])
59
82
  end
60
83
 
61
84
  it "should allow 160-character messages" do
62
- expect(Mblox::Sms.new(TEST_NUMBER,"A"*160).send).to eq(result_ok)
85
+ expect(Mblox::Sms.new(TEST_NUMBER,"A"*160).send).to eq([result_ok])
63
86
  end
64
87
 
65
88
  it "should fail when sent to a landline" do
66
- expect(Mblox::Sms.new("6176354500",the_message).send).to eq(result_unroutable)
89
+ expect(Mblox::Sms.new("6176354500",the_message).send).to eq([result_unroutable])
67
90
  end
68
91
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mblox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-01 00:00:00.000000000 Z
12
+ date: 2013-08-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -115,6 +115,7 @@ extensions: []
115
115
  extra_rdoc_files: []
116
116
  files:
117
117
  - .gitignore
118
+ - .rspec
118
119
  - Gemfile
119
120
  - LICENSE.txt
120
121
  - README.md
@@ -143,12 +144,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
144
  - - ! '>='
144
145
  - !ruby/object:Gem::Version
145
146
  version: '0'
147
+ segments:
148
+ - 0
149
+ hash: 965711471
146
150
  required_rubygems_version: !ruby/object:Gem::Requirement
147
151
  none: false
148
152
  requirements:
149
153
  - - ! '>='
150
154
  - !ruby/object:Gem::Version
151
155
  version: '0'
156
+ segments:
157
+ - 0
158
+ hash: 965711471
152
159
  requirements: []
153
160
  rubyforge_project:
154
161
  rubygems_version: 1.8.24
@@ -162,18 +169,21 @@ summary: ! '# Mblox This gem is for subscribers to Mblox to send SMS messages.
162
169
  = ... config.partner_name = ... config.tariff = ... config.service_id = ... # You
163
170
  can also configure some logging options # In a Rails environment, config.logger
164
171
  will default to Rails.logger and config.log_at will default to :debug # config.log_at
165
- means the level at which Mblox will log. # If config.log_at == :debug and your logger''s
166
- log level is :info, logging will be suppressed because it is below the log level
167
- of the logger. config.logger = Logger.new(STDOUT) config.log_at :info # What to
168
- do if messages are longer than 160 characters. Default is :raise_error config.on_message_too_long
169
- = :truncate end Once your application is configured, send messages: phone_number
170
- = 2225555555 # The number you''re sending to. Must be a 10-digit number, including
171
- the area code. Can be a String or Fixnum. Mblox::Sms.new(phone_number, "your message").send ##
172
- Testing Copy config.yml.example to config.yml and set all the values in that file. Run: rspec You
173
- should recieve 3 SMS messages to your phone within several seconds. ## Contributing 1.
174
- Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit
175
- your changes (`git commit -am ''Add some feature''`) 4. Push to the branch (`git
176
- push origin my-new-feature`) 5. Create new Pull Request'
172
+ means the level at which Mblox will log. # For instance, if config.log_at == :debug,
173
+ Mblox will log only if the logger''s log level is :debug # Note that if config.log_at
174
+ == :debug and your logger''s log level is :info, # logging will be suppressed
175
+ because it is below the log level of the logger. config.logger = Logger.new(STDOUT)
176
+ config.log_at :info # What to do if messages are longer than 160 characters. Default
177
+ is :raise_error # Other options are :truncate and :split config.on_message_too_long
178
+ = :truncate end Once your application is configured, send messages: # The number
179
+ to sending to must be a 10-digit number, including the area code. Can be a String
180
+ or Fixnum. phone_number = 2225555555 # or: phone_number = "2225555555" Mblox::Sms.new(phone_number,
181
+ "your message").send ## Testing Copy config.yml.example to config.yml and set
182
+ all the values in that file. Run: rspec You should recieve 3 SMS messages to
183
+ your phone within several seconds. ## Contributing 1. Fork it 2. Create your feature
184
+ branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am
185
+ ''Add some feature''`) 4. Push to the branch (`git push origin my-new-feature`)
186
+ 5. Create new Pull Request'
177
187
  test_files:
178
188
  - spec/configuration_spec.rb
179
189
  - spec/log_spec.rb