Class: SmsValidation::Sms

Inherits:
Object
  • Object
show all
Defined in:
lib/sms_validation/sms.rb

Defined Under Namespace

Classes: InvalidMessageError, InvalidPhoneNumberError, MessageTooLongError

Constant Summary collapse

MAX_LENGTH =
160
MAX_SECTION_LENGTH =
MAX_LENGTH - "(MSG XXX/XXX): ".size
MESSAGE_WHEN_SPLIT_MESSAGE =
"This message was split because it is too long to fit into a single SMS.  Instead of #message, use #messages or change SmsValidation.configuration.on_message_too_long to something other than :split"
"~\`!\"#\$\%&'\(\)*+,-.\/:;<=>?@_£¤¥§¿i¡ÄÅÃÆÇÉÑÖØÜßâáäåãæçèéìíñòöøóùüú\n\r\t ©"
ILLEGAL_CHARACTERS =
/([^a-zA-Z0-9#{LEGAL_CHARACTERS}\\])/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(phone, message) ⇒ Sms

Returns a new instance of Sms.



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/sms_validation/sms.rb', line 17

def initialize(phone, message)
  phone = phone.to_s
  raise InvalidPhoneNumberError, "Phone number must be ten digits" unless /\A[0-9]{10}\z/.match(phone)
  raise InvalidPhoneNumberError, "Phone number cannot begin with a \"#{phone[0]}\"" if ['0','1'].include?(phone[0].to_s)
  raise InvalidMessageError, "Message cannot be blank" if message.empty?
  SmsValidation.configuration.logger.warn { "WARNING: Some characters may be lost because the message must be broken into at least 1000 sections" } if message.size > (999 * MAX_SECTION_LENGTH)
  illegal_characters = message.scan(ILLEGAL_CHARACTERS).to_a
  raise InvalidMessageError, "Message cannot contain the following special characters: #{illegal_characters.uniq.join(', ')}" unless illegal_characters.size.zero?
  @messages = (message.size > MAX_LENGTH) ? SmsValidation::Sms.__send__(SmsValidation.configuration.on_message_too_long, message) : [message.dup]
  @phone = "1#{phone}"
end

Instance Attribute Details

#messagesObject (readonly)

Returns the value of attribute messages.



15
16
17
# File 'lib/sms_validation/sms.rb', line 15

def messages
  @messages
end

#phoneObject (readonly)

Returns the value of attribute phone.



15
16
17
# File 'lib/sms_validation/sms.rb', line 15

def phone
  @phone
end

Class Method Details

.raise_error(message) ⇒ Object



37
38
39
# File 'lib/sms_validation/sms.rb', line 37

def raise_error(message)
  raise MessageTooLongError, "Message cannot be longer than #{MAX_LENGTH} characters"
end

.section_counter(size) ⇒ Object



47
48
49
# File 'lib/sms_validation/sms.rb', line 47

def section_counter(size)
  size / MAX_SECTION_LENGTH + ((size % MAX_SECTION_LENGTH).zero? ? 0 : 1)
end

.split(message) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/sms_validation/sms.rb', line 51

def split(message)
  sections = section_counter(message.size)
  SmsValidation.log { "Splitting message into #{sections} messages due to length." }
  split_message = (sections - 1).times.collect do |i|
    first_char = i * MAX_SECTION_LENGTH
    SmsValidation.log { "Section ##{i + 1} of ##{sections} contains characters #{first_char + 1} thru #{first_char + MAX_SECTION_LENGTH} of #{message.size}" }
    "(MSG #{i+1}/#{sections}): #{message[first_char, MAX_SECTION_LENGTH]}"
  end
  first_char = (sections-1)*MAX_SECTION_LENGTH
  SmsValidation.log { "Section ##{sections} of ##{sections} contains characters #{first_char + 1} thru #{message.size} of #{message.size}" }
  split_message << "(MSG #{sections}/#{sections}): #{message[first_char..-1]}"
end

.truncate(message) ⇒ Object



41
42
43
44
45
# File 'lib/sms_validation/sms.rb', line 41

def truncate(message)
  truncated_message = message[0,MAX_LENGTH]
  SmsValidation.log { "Truncating message due to length.  Message was: \"#{message}\" but will now be \"#{truncated_message}\"" }
  [truncated_message]
end

Instance Method Details

#messageObject



29
30
31
32
33
34
# File 'lib/sms_validation/sms.rb', line 29

def message
  @message ||= begin
    raise StandardError, MESSAGE_WHEN_SPLIT_MESSAGE unless 1 == messages.size
    messages.first
  end
end