smshelper 0.1.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.
@@ -0,0 +1,30 @@
1
+ #TODO: different base_uri's for get_balance and send_message
2
+ module SmsTools
3
+ class Routomessaging < Base
4
+ base_uri "http://smsc5.routotelecom.com"
5
+
6
+ def initialize(*args)
7
+ @uname, @passwd = args.shift, args.shift
8
+ end
9
+
10
+ #send_message TO, MESSAGE, FROM
11
+ def send_message(*args)
12
+ add_query_options! :user => @uname, :pass => @passwd, :type => 'LongSMS'
13
+
14
+ (post 'SMSsend', :extra_query => {
15
+ :number => args.shift,
16
+ :message => args.shift,
17
+ :ownnum => args.shift})
18
+ end
19
+
20
+ def get_balance
21
+ # TODO: change base_uri before executing the query
22
+ # self.base_uri 'http://smsc6.routotelecom.com'
23
+ add_query_options! :username => @uname, :password => @passwd, :base_uri => 'http://smsc6.routotelecom.com'
24
+
25
+ (post 'balance.php').to_s.chomp
26
+ end
27
+ end
28
+ end
29
+
30
+ #
@@ -0,0 +1,45 @@
1
+ module Smshelper
2
+ module Api
3
+ class Smstrade < Base
4
+ base_uri 'http://gateway.smstrade.de'
5
+
6
+ def initialize(*args)
7
+ config = args.shift
8
+ add_query_options! :key => config.smstrade[:api_key]
9
+ super
10
+ end
11
+
12
+ def send_message(message)
13
+
14
+ if message.utf_8
15
+ message.to_hex_be
16
+ q = {:messagetype => 'unicode', :concat => '1', :message_id => '1'}
17
+ else
18
+ q = {:concat => '1', :message_id => '1'}
19
+ end
20
+
21
+ options = {
22
+ :to => message.recipient,
23
+ :message => message.text,
24
+ :from => message.sender}
25
+ options = options.merge(@extra_options) unless @extra_options.nil?
26
+ resp = (post '', :extra_query => options.merge(q)).split(/\n/)
27
+ process_response_code(resp.first) ? (@sent_message_ids << resp.last) : (raise ErrorDuringSend, @response_code.smstrade(resp.first))
28
+ end
29
+
30
+ def get_balance
31
+ resp = (post 'credits')
32
+ {'EUR' => resp.parsed_response}
33
+ end
34
+
35
+ def get_status(message_id)
36
+ raise NotImplementedError, "Sms status checks unsupported by #{self.class.name}"
37
+ end
38
+
39
+ private
40
+ def process_response_code(code)
41
+ (code == '100') ? true : false
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,55 @@
1
+ module Smshelper
2
+ module Api
3
+ class Smswarehouse < Base
4
+ base_uri "http://websms.smswarehouse.com:7800"
5
+ endpoint "websms"
6
+
7
+ def initialize(config)
8
+ @uname, @passwd = config.smswarehouse[:uname], config.smswarehouse[:passwd]
9
+ super
10
+ end
11
+
12
+ def send_message(message)
13
+
14
+ if message.utf_8
15
+ message.to_hex
16
+ @q = {:type => '0', :esm => '64', :dcs => '8'}
17
+ # raise NotImplementedError, "UTF-8 unsupported by #{self.class.name}"
18
+ else
19
+ @q = {:type => '5', :esm => '64', :dcs => '0'}
20
+ end
21
+
22
+ options = {
23
+ :user => @uname,
24
+ :pass => @passwd,
25
+ :mno => message.recipient,
26
+ :text => message.text,
27
+ :sid => message.sender}
28
+
29
+ resp = (post "webmsg", :extra_query => @q.merge(options)).split('::').last.strip
30
+ @sent_message_ids << resp
31
+ resp
32
+ end
33
+
34
+ def get_balance
35
+ @q = {:userid => @uname, :password => @passwd}
36
+ {'EUR' => (post "balanceReport", :extra_query => @q).split(/\n/).last.split('::').last.strip}
37
+ end
38
+
39
+ def get_status(message_id)
40
+ options = {:userid => @uname, :password => @passwd}
41
+ resp = (post 'websmsstatus', :extra_query => {:respid => message_id.to_s}.merge(options)).split('-')[1].strip
42
+ @sent_message_statuses[message_id] = []
43
+ [resp].each_with_index do |status, index|
44
+ @sent_message_statuses[message_id] << {"part #{index}" => resp}
45
+ end
46
+ {message_id => @sent_message_statuses[message_id]}
47
+ end
48
+
49
+ private
50
+ def process_response_code(code)
51
+ (code == 'DELIVRD') ? true : false
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,45 @@
1
+ module Smshelper
2
+ module Api
3
+ class Textmagic < Base
4
+
5
+ # base_uri 'https://www.textmagic.com/app'
6
+
7
+ def initialize(*args)
8
+ config = args.shift
9
+ @api = TextMagic::API.new config.textmagic[:uname], config.textmagic[:passwd]
10
+ super
11
+ end
12
+
13
+ def send_message(message)
14
+ @sent_message_ids << (@api.send message.text, message.recipient, :from => message.sender)
15
+ end
16
+
17
+ def get_balance
18
+ {'Credits' => @api.account.balance}
19
+ end
20
+
21
+ def get_status(message_id)
22
+ @sent_message_statuses[message_id] = []
23
+ @sent_message_statuses[message_id] << {"Part 01" => @api.message_status(message_id)}
24
+ {message_id => @sent_message_statuses[message_id]}
25
+ end
26
+
27
+ # def send_message(*args)
28
+ # add_query_options! :username => @uname, :password => @passwd
29
+
30
+ # (post 'api', :extra_query => {
31
+ # :cmd => 'send',
32
+ # :phone => args.shift,
33
+ # :text => args.shift,
34
+ # :from => args.shift,
35
+ # :unicode => '0'})
36
+ # end
37
+
38
+ # def get_balance
39
+ # add_query_options! :username => @uname, :password => @passwd
40
+
41
+ # (post 'api', :extra_query => {:cmd => 'account'})
42
+ # end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,43 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Smshelper
3
+ module Api
4
+ class Webtext < Base
5
+ base_uri "http://www.webtext.com"
6
+ endpoint "api"
7
+
8
+ def initialize(*args)
9
+ config = args.shift
10
+ add_query_options! :api_id => config.webtext[:uname], :api_pwd => config.webtext[:passwd]
11
+ super
12
+ end
13
+
14
+ def send_message(message)
15
+ if message.utf_8
16
+ message.to_hex_be
17
+ q = {:unicode => '1', :hex => message.text}
18
+ else
19
+ q = {:txt => message.text}
20
+ end
21
+
22
+ options = {:dest => message.recipient, :tag => message.sender}
23
+ options = options.merge(@extra_options) unless @extra_options.nil?
24
+ resp = (post "send_text.html", :extra_query => options.merge(q))
25
+ process_response_code(resp.to_s) ? (@response_code.webtext(resp.to_s)) : (raise ErrorDuringSend, @response_code.webtext(resp))
26
+ # :validity => '2'
27
+ end
28
+
29
+ def get_balance
30
+ {'EUR' => (post "get_balance.html").to_s.split(':').last.strip}
31
+ end
32
+
33
+ def get_status(message_id)
34
+ raise NotImplementedError, "Sms status checks unsupported by #{self.class.name}"
35
+ end
36
+
37
+ private
38
+ def process_response_code(code)
39
+ (code == '000') ? true : false
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,13 @@
1
+ require 'smshelper/api/base'
2
+ require 'smshelper/api/response_codes'
3
+ # require 'smshelper/api/smswarehouse'
4
+ # require 'smshelper/api/routomessaging'
5
+ require 'smshelper/api/webtext'
6
+ require 'smshelper/api/bulksms'
7
+ require 'smshelper/api/clickatell'
8
+ require 'smshelper/api/textmagic'
9
+ require 'smshelper/api/smstrade'
10
+ require 'smshelper/api/esendex'
11
+ require 'smshelper/api/mediaburst'
12
+ require 'smshelper/api/nexmo'
13
+ # require 'smshelper/api/totext'
@@ -0,0 +1,20 @@
1
+ module Smshelper
2
+ class Config
3
+ attr_accessor :smswarehouse, :routomessaging, :webtext, :bulksms, :clickatell, :textmagic, :smstrade, :esendex, :mediaburst, :nexmo, :detectlanguage_dot_com, :alchemy_language
4
+
5
+ def initialize(interfaces = {})
6
+ @smswarehouse = interfaces[:smswarehouse]
7
+ @routomessaging = interfaces[:routomessaging]
8
+ @webtext = interfaces[:webtext]
9
+ @bulksms = interfaces[:bulksms]
10
+ @clickatell = interfaces[:clickatell]
11
+ @textmagic = interfaces[:textmagic]
12
+ @smstrade = interfaces[:smstrade]
13
+ @esendex = interfaces[:esendex]
14
+ @mediaburst = interfaces[:mediaburst]
15
+ @nexmo = interfaces[:nexmo]
16
+ @detectlanguage_dot_com = interfaces[:detectlanguage_dot_com]
17
+ @alchemy_language = interfaces[:alchemy_language]
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,55 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Smshelper
3
+ module Languagetools
4
+
5
+ class Base
6
+ def initialize(api_key)
7
+ @api_key = api_key
8
+ end
9
+ end
10
+
11
+ class DetectLanguageDotCom < Base
12
+ include APISmith::Client
13
+ base_uri "http://ws.detectlanguage.com"
14
+ endpoint "0.2"
15
+
16
+ def detect(text)
17
+ add_query_options! :key => @api_key
18
+ (post "detect", :extra_query => {:q => text})["data"]["detections"].first["language"]
19
+ end
20
+ end
21
+
22
+ class AlchemyLanguage < Base
23
+ include APISmith::Client
24
+ base_uri "http://access.alchemyapi.com/"
25
+ endpoint "calls/text"
26
+
27
+ def detect(text)
28
+ add_query_options! :outputMode => 'json', :apikey => @api_key
29
+ (post "TextGetLanguage", :extra_query => {:text => text})["language"]
30
+ end
31
+ end
32
+
33
+ class Charset
34
+ GSM_CHARSET = "@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞ\e\f^{}\\[~]|€ÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà".scan(/./u)
35
+ ESCAPED_CHARS = "{}\\~[]|€"
36
+ # Returns +true+ if the supplied text contains only characters from
37
+ # GSM 03.38 charset, otherwise it returns +false+.
38
+ def is_gsm(text)
39
+ text.scan(/./u).each { |c| return false unless GSM_CHARSET.include?(c) }
40
+ true
41
+ end
42
+
43
+ # Returns +true+ if the supplied text contains characters outside of
44
+ # GSM 03.38 charset, otherwise it returns +false+.
45
+ def is_unicode(text)
46
+ !is_gsm(text)
47
+ end
48
+
49
+ def real_length(text, unicode)
50
+ text.size + (unicode ? 0 : text.scan(/[\{\}\\~\[\]\|€]/).size)
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1 @@
1
+ require 'smshelper/languagetools/languagetools'
@@ -0,0 +1,32 @@
1
+ module Smshelper
2
+ class Message
3
+ #1st sms = 160 chars, 2nd+ = 153 chars.
4
+ attr_accessor :recipient, :text, :sender
5
+ attr_reader :utf_8
6
+
7
+ def initialize(attributes = {})
8
+ @recipient = attributes[:recipient]
9
+ @text = attributes[:text]
10
+ @sender = attributes[:sender]
11
+ @lt_dl, @lt_al = attributes[:api].detectlanguage_dot_com, attributes[:api].alchemy_language
12
+
13
+ (wtf_lang(@text) == (:en || :english)) ? (@utf_8 = false) : (@utf_8 = true)
14
+ end
15
+
16
+ #TODO: Id the language with both APIs, fallback to charset != gsm if api isn't available
17
+ def wtf_lang(text)
18
+ dl = Smshelper::Languagetools::DetectLanguageDotCom.new @lt_dl
19
+ lang = dl.detect text
20
+ return lang.to_sym
21
+ end
22
+
23
+ def to_hex
24
+ @text = @text.unpack('U*').collect {|x| sprintf '%02X', x}.join
25
+ end
26
+
27
+ def to_hex_be
28
+ @text = @text.unpack('U*').collect {|x| sprintf '%04X', x}.join
29
+ end
30
+
31
+ end
32
+ end
data/lib/smshelper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'savon'
2
+ require 'textmagic'
3
+ require 'log4r'
4
+ require 'mediaburst'
5
+ require 'api_smith'
6
+
7
+ require 'smshelper/api'
8
+ require 'smshelper/languagetools'
9
+ require 'smshelper/message'
10
+ require 'smshelper/config'
11
+
12
+ module Smshelper
13
+ class NotImplementedError < ArgumentError
14
+ end
15
+
16
+ class ErrorDuringSend < ArgumentError
17
+ end
18
+ end
data/smshelper.gemspec ADDED
@@ -0,0 +1,97 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "smshelper"
8
+ s.version = "0.1.3"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Voip Scout"]
12
+ s.date = "2012-03-19"
13
+ s.description = "works with esendex, textmagic, smstrade, bulksms, routomessaging, smswarehouse, mediaburst, clickatell, webtext"
14
+ s.email = "voipscout@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/smshelper.rb",
28
+ "lib/smshelper/api.rb",
29
+ "lib/smshelper/api/base.rb",
30
+ "lib/smshelper/api/bulksms.rb",
31
+ "lib/smshelper/api/clickatell.rb",
32
+ "lib/smshelper/api/esendex.rb",
33
+ "lib/smshelper/api/mediaburst.rb",
34
+ "lib/smshelper/api/nexmo.rb",
35
+ "lib/smshelper/api/response_codes.rb",
36
+ "lib/smshelper/api/routomessaging.rb",
37
+ "lib/smshelper/api/smstrade.rb",
38
+ "lib/smshelper/api/smswarehouse.rb",
39
+ "lib/smshelper/api/textmagic.rb",
40
+ "lib/smshelper/api/webtext.rb",
41
+ "lib/smshelper/config.rb",
42
+ "lib/smshelper/languagetools.rb",
43
+ "lib/smshelper/languagetools/languagetools.rb",
44
+ "lib/smshelper/message.rb",
45
+ "smshelper.gemspec",
46
+ "spec/smshelper_spec.rb",
47
+ "spec/spec_helper.rb"
48
+ ]
49
+ s.homepage = "http://github.com/voipscout/smshelper"
50
+ s.licenses = ["MIT"]
51
+ s.require_paths = ["lib"]
52
+ s.rubygems_version = "1.8.15"
53
+ s.summary = "sms helper gem"
54
+
55
+ if s.respond_to? :specification_version then
56
+ s.specification_version = 3
57
+
58
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
+ s.add_runtime_dependency(%q<api_smith>, [">= 0"])
60
+ s.add_runtime_dependency(%q<savon>, [">= 0"])
61
+ s.add_runtime_dependency(%q<log4r>, [">= 0"])
62
+ s.add_runtime_dependency(%q<textmagic>, [">= 0"])
63
+ s.add_runtime_dependency(%q<mediaburst>, [">= 0"])
64
+ s.add_development_dependency(%q<pry>, [">= 0"])
65
+ s.add_development_dependency(%q<rspec>, [">= 0"])
66
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
67
+ s.add_development_dependency(%q<bundler>, [">= 0"])
68
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
69
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
70
+ else
71
+ s.add_dependency(%q<api_smith>, [">= 0"])
72
+ s.add_dependency(%q<savon>, [">= 0"])
73
+ s.add_dependency(%q<log4r>, [">= 0"])
74
+ s.add_dependency(%q<textmagic>, [">= 0"])
75
+ s.add_dependency(%q<mediaburst>, [">= 0"])
76
+ s.add_dependency(%q<pry>, [">= 0"])
77
+ s.add_dependency(%q<rspec>, [">= 0"])
78
+ s.add_dependency(%q<rdoc>, [">= 0"])
79
+ s.add_dependency(%q<bundler>, [">= 0"])
80
+ s.add_dependency(%q<jeweler>, [">= 0"])
81
+ s.add_dependency(%q<simplecov>, [">= 0"])
82
+ end
83
+ else
84
+ s.add_dependency(%q<api_smith>, [">= 0"])
85
+ s.add_dependency(%q<savon>, [">= 0"])
86
+ s.add_dependency(%q<log4r>, [">= 0"])
87
+ s.add_dependency(%q<textmagic>, [">= 0"])
88
+ s.add_dependency(%q<mediaburst>, [">= 0"])
89
+ s.add_dependency(%q<pry>, [">= 0"])
90
+ s.add_dependency(%q<rspec>, [">= 0"])
91
+ s.add_dependency(%q<rdoc>, [">= 0"])
92
+ s.add_dependency(%q<bundler>, [">= 0"])
93
+ s.add_dependency(%q<jeweler>, [">= 0"])
94
+ s.add_dependency(%q<simplecov>, [">= 0"])
95
+ end
96
+ end
97
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Smshelper" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'smshelper'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smshelper
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.3
6
+ platform: ruby
7
+ authors:
8
+ - Voip Scout
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-19 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: api_smith
16
+ version_requirements: &5144 !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ! '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ none: false
22
+ requirement: *5144
23
+ prerelease: false
24
+ type: :runtime
25
+ - !ruby/object:Gem::Dependency
26
+ name: savon
27
+ version_requirements: &5162 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ none: false
33
+ requirement: *5162
34
+ prerelease: false
35
+ type: :runtime
36
+ - !ruby/object:Gem::Dependency
37
+ name: log4r
38
+ version_requirements: &5178 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ none: false
44
+ requirement: *5178
45
+ prerelease: false
46
+ type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ name: textmagic
49
+ version_requirements: &5194 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ none: false
55
+ requirement: *5194
56
+ prerelease: false
57
+ type: :runtime
58
+ - !ruby/object:Gem::Dependency
59
+ name: mediaburst
60
+ version_requirements: &5210 !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ none: false
66
+ requirement: *5210
67
+ prerelease: false
68
+ type: :runtime
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ version_requirements: &5226 !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ none: false
77
+ requirement: *5226
78
+ prerelease: false
79
+ type: :development
80
+ - !ruby/object:Gem::Dependency
81
+ name: rspec
82
+ version_requirements: &5244 !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ none: false
88
+ requirement: *5244
89
+ prerelease: false
90
+ type: :development
91
+ - !ruby/object:Gem::Dependency
92
+ name: rdoc
93
+ version_requirements: &5260 !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ none: false
99
+ requirement: *5260
100
+ prerelease: false
101
+ type: :development
102
+ - !ruby/object:Gem::Dependency
103
+ name: bundler
104
+ version_requirements: &5276 !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ none: false
110
+ requirement: *5276
111
+ prerelease: false
112
+ type: :development
113
+ - !ruby/object:Gem::Dependency
114
+ name: jeweler
115
+ version_requirements: &5292 !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ none: false
121
+ requirement: *5292
122
+ prerelease: false
123
+ type: :development
124
+ - !ruby/object:Gem::Dependency
125
+ name: simplecov
126
+ version_requirements: &5308 !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ none: false
132
+ requirement: *5308
133
+ prerelease: false
134
+ type: :development
135
+ description: works with esendex, textmagic, smstrade, bulksms, routomessaging, smswarehouse, mediaburst, clickatell, webtext
136
+ email: voipscout@gmail.com
137
+ executables: []
138
+ extensions: []
139
+ extra_rdoc_files:
140
+ - LICENSE.txt
141
+ - README.rdoc
142
+ files:
143
+ - .document
144
+ - .rspec
145
+ - Gemfile
146
+ - LICENSE.txt
147
+ - README.rdoc
148
+ - Rakefile
149
+ - VERSION
150
+ - lib/smshelper.rb
151
+ - lib/smshelper/api.rb
152
+ - lib/smshelper/api/base.rb
153
+ - lib/smshelper/api/bulksms.rb
154
+ - lib/smshelper/api/clickatell.rb
155
+ - lib/smshelper/api/esendex.rb
156
+ - lib/smshelper/api/mediaburst.rb
157
+ - lib/smshelper/api/nexmo.rb
158
+ - lib/smshelper/api/response_codes.rb
159
+ - lib/smshelper/api/routomessaging.rb
160
+ - lib/smshelper/api/smstrade.rb
161
+ - lib/smshelper/api/smswarehouse.rb
162
+ - lib/smshelper/api/textmagic.rb
163
+ - lib/smshelper/api/webtext.rb
164
+ - lib/smshelper/config.rb
165
+ - lib/smshelper/languagetools.rb
166
+ - lib/smshelper/languagetools/languagetools.rb
167
+ - lib/smshelper/message.rb
168
+ - smshelper.gemspec
169
+ - spec/smshelper_spec.rb
170
+ - spec/spec_helper.rb
171
+ homepage: http://github.com/voipscout/smshelper
172
+ licenses:
173
+ - MIT
174
+ post_install_message:
175
+ rdoc_options: []
176
+ require_paths:
177
+ - lib
178
+ required_ruby_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ segments:
183
+ - 0
184
+ hash: 2
185
+ version: '0'
186
+ none: false
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ! '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ none: false
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 1.8.15
196
+ signing_key:
197
+ specification_version: 3
198
+ summary: sms helper gem
199
+ test_files: []
200
+ ...