any_sms 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4ea6a7e81eb0c54c44900ee3389fc9db1e150b54
4
+ data.tar.gz: 250a5d9943723104eb332ec503fb5a38a313a623
5
+ SHA512:
6
+ metadata.gz: 3ff7f28fb99ff628fe20bcfe44c59d6fe0e2cda9ec6c876af2d23d84694febc9a9b58e388404c5612a955758a31011637e78e58331bfe437361a4b3cf84bb92f
7
+ data.tar.gz: b51a1f1302d4eaf978fe5485924b145665ec9fb1597693098f35aaf25252107f504bd15efe630d5bbbeb64d27c396074fcfac80b28b80b887e3d977cf7a8a9fe
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,16 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.1
3
+
4
+ Style/StringLiterals:
5
+ EnforcedStyle: double_quotes
6
+ ConsistentQuotesInMultiline: true
7
+
8
+ Metrics/LineLength:
9
+ Max: 90
10
+
11
+ Style/ClassAndModuleChildren:
12
+ Enabled: false
13
+
14
+ # I need to use singleton so gem stays simple
15
+ Style/ClassVars:
16
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ sudo: false
2
+ cache: bundler
3
+ language: ruby
4
+ rvm: 2.3.1
5
+ install:
6
+ - bundle install --retry=3
7
+ script:
8
+ - bundle exec rake
9
+ - bundle exec rubocop
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,19 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ require "guard/rspec/dsl"
3
+ dsl = Guard::RSpec::Dsl.new(self)
4
+
5
+ # RSpec files
6
+ rspec = dsl.rspec
7
+ watch(rspec.spec_helper) { rspec.spec_dir }
8
+ watch(rspec.spec_support) { rspec.spec_dir }
9
+ watch(rspec.spec_files)
10
+
11
+ # Lib files
12
+ watch(%r{^lib/any_sms.rb$}) { rspec.spec_dir }
13
+ watch(%r{^lib/(.+)\.rb$}) { |m| rspec.spec.call(m[1]) }
14
+ watch(%r{^spec/support/(.+)\.rb$}) { |m| rspec.spec.call(m[1]) }
15
+ end
16
+
17
+ guard "yard" do
18
+ watch(%r{lib/.+\.rb})
19
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Fedcomp
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,276 @@
1
+ # AnySMS
2
+
3
+ [![Build Status](https://travis-ci.org/Fedcomp/any_sms.svg?branch=master)](https://travis-ci.org/Fedcomp/any_sms)
4
+ [![Gem Version](https://badge.fury.io/rb/any_sms.svg)](https://badge.fury.io/rb/any_sms)
5
+
6
+ Unified way to send SMS in ruby!
7
+ Allows you to switch SMS services
8
+ without having to rewrite any code that actually sends SMS.
9
+ Supports multiple backends.
10
+ Sending SMS is not pain anymore!
11
+
12
+ ## Installation and usage
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem "any_sms"
18
+ ```
19
+
20
+ Then somewhere in your initialization code:
21
+
22
+ ```ruby
23
+ require "any_sms"
24
+ require "logger"
25
+
26
+ AnySMS.configure do |config|
27
+ config.register_backend :my_backend_name,
28
+ AnySMS::Backend::Logger,
29
+ logger: Logger.new(STDOUT),
30
+ severity: :info
31
+
32
+ config.default_backend = :my_backend_name
33
+ end
34
+ ```
35
+
36
+ Now, whenever you need to send SMS, just do:
37
+
38
+ ```ruby
39
+ phone = "+10000000000"
40
+ text = "My sms text"
41
+
42
+ # Should print to console [SMS] +10000000000: text
43
+ AnySMS.send_sms(phone, text)
44
+ ```
45
+
46
+ Now your code is capable of sending sms.
47
+ Later you may add any sms-backend you want, or even write your own.
48
+
49
+ ### Adding real sms backend
50
+
51
+ If you followed steps above, you code still doesn't *really* send sms.
52
+ It uses `AnySMS::Backend::Logger`
53
+ which actually just print sms contents to console.
54
+ To actually send sms you need *gem-provider*
55
+ or your own simple class.
56
+
57
+ Here's a list of my implementations for some sms services.
58
+
59
+ <table>
60
+ <tr>
61
+ <th>Gem name</th>
62
+ <th>Sms service name</th>
63
+ </tr>
64
+ <tr>
65
+ <td>
66
+ <a href="https://github.com/Fedcomp/any_sms-backend-aws">
67
+ any_sms-backend-aws
68
+ </a>
69
+ </td>
70
+ <td><a href="https://aws.amazon.com/ru/documentation/sns/">Amazon Web Services SNS</a></td>
71
+ </tr>
72
+ <tr>
73
+ <td>
74
+ <a href="https://github.com/Fedcomp/any_sms-backend-smsru">
75
+ any_sms-backend-smsru
76
+ </a> (russian)
77
+ </td>
78
+ <td><a href="https://sms.ru">sms.ru</a></td>
79
+ </tr>
80
+ </table>
81
+
82
+ These gems documentation should be self explanatory.
83
+
84
+ ### Writing your own sms backend
85
+
86
+ Here's simple class that can be used by AnySMS:
87
+
88
+ ```ruby
89
+ require "any_sms"
90
+
91
+ class AnySMS::Backend::MyCustomBackend < AnySMS::Backend::Base
92
+ def initialize(params = {})
93
+ # your initialization which parses params if needed.
94
+ # the params here is the ones you set in initializer
95
+
96
+ # (you may also use keyword arguments instead)
97
+ @token = params.delete(:token)
98
+ end
99
+
100
+ def send_sms(phone, sms_text)
101
+ # your code to call your sms service
102
+ # or somehow else send actual sms
103
+
104
+ # if everything went fine, you may use helper from base class:
105
+ respond_with_status :success
106
+
107
+ # any other than :success response considered as failure
108
+ respond_with_status :not_enough_funds
109
+
110
+ # optionally you may return some metadata
111
+ respond_with_status :success, meta: { funds_left: 42 }
112
+ end
113
+ end
114
+ ```
115
+
116
+ Then in initializer:
117
+
118
+ ```ruby
119
+ require "any_sms"
120
+ require_relative "mycustombackend"
121
+
122
+ AnySMS.configure do |c|
123
+ c.register_backend :my_custom_backend,
124
+ AnySMS::Backend::MyCustomBackend,
125
+ token: ENV["token"]
126
+
127
+ c.default_backend = :my_custom_backend
128
+ end
129
+ ```
130
+
131
+ Usage:
132
+
133
+ ```ruby
134
+ # somewhere in your code
135
+ result = AnySMS.send_sms(phone, text)
136
+
137
+ if result.success?
138
+ # do stuff
139
+ else
140
+ # request failed
141
+ fail_status = result.status
142
+ # :not_enough_funds for example
143
+ end
144
+
145
+ # (optionally) Read metadata if any.
146
+ # Not recommended for control flow.
147
+ result.meta
148
+ ```
149
+
150
+ ### Multiple backends
151
+
152
+ You can specify which backend to use per call:
153
+
154
+ ```ruby
155
+ require "any_sms"
156
+ require_relative "mycustombackend"
157
+
158
+ AnySMS.configure do |c|
159
+ c.register_backend :my_custom_backend,
160
+ AnySMS::Backend::MyCustomBackend,
161
+ token: ENV["token"]
162
+
163
+ c.register_backend :null_sender, AnySMS::Backend::NullSender
164
+ c.default_backend = :my_custom_backend
165
+ end
166
+
167
+ phone = "799999999"
168
+ text = "My sms text"
169
+
170
+ # Uses default backend
171
+ AnySMS.send_sms(phone, text)
172
+
173
+ # Uses backend you specify
174
+ AnySMS.send_sms(phone, text, backend: :null_sender)
175
+ ```
176
+
177
+ ### Real life example
178
+
179
+ If you develop application in group,
180
+ you probably don't want them all to send real SMS,
181
+ and instead you would prefer to emulate sending,
182
+ including SMS text preview (like SMS codes for registration).
183
+
184
+ However, on production you want
185
+ to actually send them using your service.
186
+ Here's how you can achieve that:
187
+
188
+ ```ruby
189
+ require "any_sms"
190
+ require_relative "mycustombackend"
191
+ require_relative "mycustombackend2"
192
+
193
+ AnySMS.configure do |c|
194
+ if development?
195
+ c.register_backend :my_custom_backend,
196
+ AnySMS::Backend::Logger,
197
+ logger: Logger.new(STDOUT),
198
+ severity: :info
199
+
200
+ # You can also, for example, specify different formatter for second one
201
+ logger = Logger.new(STDOUT)
202
+ logger.formatter = proc do |severity, datetime, progname, msg|
203
+ "[MYBackend2]: #{msg}\n"
204
+ end
205
+
206
+ c.register_backend :my_custom_backend2,
207
+ AnySMS::Backend::Logger,
208
+ logger: logger,
209
+ severity: :info
210
+ end
211
+
212
+ if test?
213
+ # Null sender does nothing when called for sending sms
214
+ c.register_backend :my_custom_backend, AnySMS::Backend::NullSender
215
+ c.register_backend :my_custom_backend2, AnySMS::Backend::NullSender
216
+ end
217
+
218
+ if production?
219
+ c.register_backend :my_custom_backend,
220
+ AnySMS::Backend::MyCustomBackend,
221
+ token: ENV["token"]
222
+
223
+ c.register_backend :my_custom_backend2,
224
+ AnySMS::Backend::MyCustomBackend2,
225
+ token: ENV["token2"]
226
+ end
227
+
228
+ c.default_backend = :my_custom_backend
229
+ end
230
+
231
+ phone = "799999999"
232
+ text = "My sms text"
233
+
234
+ # Uses default backend
235
+ AnySMS.send_sms(phone, text)
236
+
237
+ # Uses backend you specify
238
+ AnySMS.send_sms(phone, text, backend: :my_custom_backend2)
239
+
240
+ # depending on your initializer it may use different backends (like in this example)
241
+ # in different environments.
242
+ ```
243
+
244
+ Of course `development?`, `test?` and `production?` are not real methods.
245
+ You have to detect environment yourself somehow.
246
+
247
+ While possible, i strongly discourage to use more than two backends
248
+ (One default, another is required in certain situations for some reason).
249
+ It may make your code mess ;)
250
+
251
+ ## Testing
252
+
253
+ I am planning to make rspec matcher to test if sms was sent.
254
+ For now you may just mock `AnySMS.send_sms` and check it was executed.
255
+
256
+ ## Contributing
257
+
258
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Fedcomp/any_sms
259
+
260
+ ## Submitting a Pull Request
261
+ 1. Fork the [official repository](https://github.com/Fedcomp/any_sms).
262
+ 2. Create a topic branch.
263
+ 3. Implement your feature or bug fix.
264
+ 4. Add, commit, and push your changes.
265
+ 5. Submit a pull request.
266
+
267
+ * Please add tests if you changed code. Contributions without tests won't be accepted.
268
+ * If you don't know how to add tests, please put in a PR and leave a comment
269
+ asking for help.
270
+ * Please don't update the Gem version.
271
+
272
+ ( Inspired by https://github.com/thoughtbot/factory_girl/blob/master/CONTRIBUTING.md )
273
+
274
+ ## License
275
+
276
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/any_sms.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "any_sms/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "any_sms"
7
+ spec.version = AnySMS::VERSION
8
+ spec.authors = ["Fedcomp"]
9
+ spec.email = ["aglergen@gmail.com"]
10
+
11
+ spec.summary = "Easily send sms using various sms backends!"
12
+
13
+ spec.homepage = "https://github.com/Fedcomp/any_sms"
14
+ spec.license = "MIT"
15
+
16
+ unless spec.respond_to?(:metadata)
17
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
18
+ end
19
+
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+
22
+ spec.files = `git ls-files -z`
23
+ .split("\x0")
24
+ .reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.12"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+
33
+ spec.add_development_dependency "guard", "~> 2.14"
34
+ spec.add_development_dependency "guard-rspec", "~> 4.7"
35
+ spec.add_development_dependency "pry-byebug", "~> 3.4"
36
+ spec.add_development_dependency "rubocop"
37
+ spec.add_development_dependency "guard-yard"
38
+ end
@@ -0,0 +1,37 @@
1
+ module AnySMS::Backend
2
+ # Base class for any sms provider service.
3
+ # Provides basic structure and helper methods.
4
+ # While not necessary to be subclassed now, may be necessary later.
5
+ class Base
6
+ # In initializer you may
7
+ # accept secrets which were defined in initializer
8
+ # or other configuration options if any.
9
+ #
10
+ # @param params [Hash] List of arguments received from configure code.
11
+ def initialize(params = {}); end
12
+
13
+ # Interface for sending sms.
14
+ # Every subclass should implement method itself.
15
+ # Raises error in default implementation.
16
+ #
17
+ # @param _phone [String] Phone number to send sms (not used in this implementation)
18
+ # @param _text [String] Sms text (not used in this implementation)
19
+ def send_sms(_phone, _text)
20
+ raise NotImplementedError,
21
+ "You should create your own class for every sms service you use"
22
+ end
23
+
24
+ protected
25
+
26
+ # Returns AnySMS::Reponse object with status and meta
27
+ #
28
+ # @param status [Symbol]
29
+ # Query status, any other than :success considered as failure
30
+ # @param meta [Hash]
31
+ # Optional metadata you can return from api or implementation
32
+ # @return [AnySMS::Reponse] Response object with meta and status
33
+ def respond_with_status(status, meta: nil)
34
+ AnySMS::Response.new(status: status, meta: meta)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ # Sms backend for logging outgoing sms instead of actually sending them
2
+ class AnySMS::Backend::Logger < AnySMS::Backend::Base
3
+ # Log level validation, all invalid values lead to ArgumentError.
4
+ # Has anyone heard how to receive log levels from ruby logger itself?
5
+ LOG_SEVERITY = [:debug, :info, :warn, :error, :fatal, :unknown].freeze
6
+
7
+ # @param logger [::Logger] Class implementing logger interface
8
+ # @param severity [Symbol] Severity to log with
9
+ def initialize(logger: Logger.new(STDOUT), severity: :info)
10
+ @logger = logger
11
+ @severity = severity
12
+
13
+ raise ArgumentError, "Invalid log severity" unless LOG_SEVERITY.include?(@severity)
14
+
15
+ return if @logger.respond_to?(@severity)
16
+ raise ArgumentError, "Class should implement logger interface"
17
+ end
18
+
19
+ # Method that sends phone and text to logger
20
+ #
21
+ # @param phone [String] Phone number to send sms
22
+ # @param text [String] Sms text
23
+ def send_sms(phone, text)
24
+ @logger.send(@severity, "[SMS] #{phone}: #{text}")
25
+ respond_with_status :success
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # Sms backend for mocking sending.
2
+ # Purely for usage in tests.
3
+ class AnySMS::Backend::NullSender < AnySMS::Backend::Base
4
+ # Method that emulates sms sending. Does nothing.
5
+ #
6
+ # @param _phone [String] Phone number to send sms (not used in this implementation)
7
+ # @param _text [String] Sms text (not used in this implementation)
8
+ def send_sms(_phone, _text)
9
+ respond_with_status :success
10
+ end
11
+ end
@@ -0,0 +1,86 @@
1
+ # :nodoc:
2
+ module AnySMS
3
+ # @return [AnySMS::Configuration] object with configuration options
4
+ def self.config
5
+ @@config ||= Configuration.new
6
+ end
7
+
8
+ # Allows to configure AnySMS options and register backends
9
+ def self.configure
10
+ yield(config)
11
+ end
12
+
13
+ # resets AnySMS configuration to default
14
+ def self.reset!
15
+ @@config = nil
16
+ end
17
+
18
+ # Configuration object for AnySMS
19
+ class Configuration
20
+ # returns key of the default sms backend
21
+ attr_reader :default_backend
22
+
23
+ # returns list of registered sms backends
24
+ attr_reader :backends
25
+
26
+ def initialize
27
+ register_backend :null_sender, AnySMS::Backend::NullSender
28
+ self.default_backend = :null_sender
29
+ end
30
+
31
+ # Specify default sms backend. It must be registered.
32
+ #
33
+ # @param value [Symbol] Backend key which will be used as default
34
+ def default_backend=(value)
35
+ raise ArgumentError, "default_backend must be a symbol!" unless value.is_a? Symbol
36
+
37
+ unless @backends.keys.include? value
38
+ raise ArgumentError, "Unregistered backend cannot be set as default!"
39
+ end
40
+
41
+ @default_backend = value
42
+ end
43
+
44
+ # Register sms provider backend
45
+ #
46
+ # @param key [Symbol] Key for acessing backend in any part of AnySMS
47
+ # @param classname [Class] Real class implementation of sms backend
48
+ # @param params [Hash]
49
+ # Optional params for backend. Useful for passing tokens and options
50
+ def register_backend(key, classname, params = {})
51
+ raise ArgumentError, "backend key must be a symbol!" unless key.is_a? Symbol
52
+
53
+ unless classname.class == Class
54
+ raise ArgumentError, "backend class must be class (not instance or string)"
55
+ end
56
+
57
+ unless classname.method_defined? :send_sms
58
+ raise ArgumentError, "backend must provide method send_sms"
59
+ end
60
+
61
+ define_backend(key, classname, params)
62
+ end
63
+
64
+ # Removes registered sms backend
65
+ #
66
+ # @param key [Symbol] Key of already registered backend
67
+ def remove_backend(key)
68
+ if key == default_backend
69
+ raise ArgumentError, "Removing default_backend is prohibited"
70
+ end
71
+
72
+ @backends.delete key
73
+ true
74
+ end
75
+
76
+ private
77
+
78
+ def define_backend(key, classname, params)
79
+ @backends ||= {}
80
+ @backends[key] = {
81
+ class: classname,
82
+ params: params
83
+ }
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,68 @@
1
+ require "rspec/matchers"
2
+
3
+ # rubocop:disable Metrics/BlockLength
4
+ RSpec::Matchers.define :send_sms do |options|
5
+ supports_block_expectations
6
+
7
+ match do |block|
8
+ options ||= {}
9
+ @phone = options.delete(:to)
10
+ @text = options.delete(:text)
11
+
12
+ # we need to know actual phone and text for failure message
13
+ called = false
14
+ allow(AnySMS).to receive(:send_sms) do |actual_phone, actual_text|
15
+ puts "called"
16
+ @actual_phone = actual_phone
17
+ @actual_text = actual_text
18
+ called = true
19
+
20
+ result
21
+ end
22
+
23
+ block.call
24
+
25
+ expect(called).to be(true)
26
+ if @phone && @text
27
+ expect(@actual_phone).to eq(@phone)
28
+ expect(@actual_text).to eq(@text)
29
+ end
30
+
31
+ true
32
+ end
33
+
34
+ chain :and_return do |return_options|
35
+ @result = AnySMS::Response.new(return_options)
36
+ end
37
+
38
+ failure_message do
39
+ message = "expected block to send "
40
+
41
+ if @phone && @text
42
+ message += "sms message" \
43
+ " to phone number \"#{@phone}\"" \
44
+ " with text \"#{@text}\""
45
+ else
46
+ message += "any sms message"
47
+ end
48
+
49
+ "#{message}, nothing was sent"
50
+ end
51
+
52
+ failure_message_when_negated do
53
+ "expected block to not send any sms message, " \
54
+ "instead sent sms to phone number \"#{@actual_phone}\" " \
55
+ "with message \"#{@actual_text}\""
56
+ end
57
+
58
+ # Not tested
59
+ description do
60
+ "send sms"
61
+ end
62
+
63
+ private
64
+
65
+ def result
66
+ @result ||= AnySMS::Response.new(status: :success)
67
+ end
68
+ end
@@ -0,0 +1,28 @@
1
+ # Response object.
2
+ # Generated on each AnySMS.send_sms by backend implementations.
3
+ class AnySMS::Response
4
+ # see initialize
5
+ attr_reader :status
6
+
7
+ # see initialize
8
+ attr_accessor :meta
9
+
10
+ # @param status [Symbol]
11
+ # Status of sms request. Anything other than *:success* considered as failure.
12
+ # @param meta [Hash]
13
+ # Meta information which optionally can be returned by backend.
14
+ def initialize(status:, meta: nil)
15
+ @status = status
16
+ @meta = meta
17
+ end
18
+
19
+ # @return [Boolean] whether request was succesful or not.
20
+ def success?
21
+ @status == :success
22
+ end
23
+
24
+ # @return [Boolean] whether request has failed or not.
25
+ def failed?
26
+ !success?
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ # :nodoc:
2
+ module AnySMS
3
+ class << self
4
+ # Core of the gem, method responsible for sending sms
5
+ #
6
+ # @param phone [String] Phone number for sms
7
+ # @param text [String] Text for sms
8
+ # @param args [Hash] Additional options for delivery. Currently only :backend
9
+ def send_sms(phone, text, args = {})
10
+ backend_name = args.delete(:backend)
11
+ backend_class(backend_name).new(backend_params(backend_name))
12
+ .send_sms(phone, text)
13
+ end
14
+
15
+ private
16
+
17
+ def backend_class(name)
18
+ return default_backend_class if name.nil?
19
+
20
+ if AnySMS.config.backends[name].nil?
21
+ raise ArgumentError, "#{name} backend is not registered"
22
+ end
23
+
24
+ AnySMS.config.backends[name][:class]
25
+ end
26
+
27
+ def default_backend_class
28
+ AnySMS.config.backends[AnySMS.config.default_backend][:class]
29
+ end
30
+
31
+ def backend_params(name)
32
+ return default_backend_params if name.nil?
33
+ AnySMS.config.backends[name][:params]
34
+ end
35
+
36
+ def default_backend_params
37
+ AnySMS.config.backends[AnySMS.config.default_backend][:params]
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ module AnySMS
2
+ VERSION = "0.3.0".freeze
3
+ end
data/lib/any_sms.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "any_sms/version"
2
+ require "any_sms/backend/base"
3
+ require "any_sms/backend/null_sender"
4
+ require "any_sms/backend/logger"
5
+ require "any_sms/configuration"
6
+ require "any_sms/response"
7
+ require "any_sms/sending"
8
+
9
+ # :nodoc:
10
+ module AnySMS
11
+ end
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: any_sms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Fedcomp
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-12-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.14'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.14'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.4'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description:
126
+ email:
127
+ - aglergen@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".rubocop.yml"
135
+ - ".travis.yml"
136
+ - Gemfile
137
+ - Guardfile
138
+ - LICENSE.txt
139
+ - README.md
140
+ - Rakefile
141
+ - any_sms.gemspec
142
+ - lib/any_sms.rb
143
+ - lib/any_sms/backend/base.rb
144
+ - lib/any_sms/backend/logger.rb
145
+ - lib/any_sms/backend/null_sender.rb
146
+ - lib/any_sms/configuration.rb
147
+ - lib/any_sms/matchers/send_sms.rb
148
+ - lib/any_sms/response.rb
149
+ - lib/any_sms/sending.rb
150
+ - lib/any_sms/version.rb
151
+ homepage: https://github.com/Fedcomp/any_sms
152
+ licenses:
153
+ - MIT
154
+ metadata:
155
+ allowed_push_host: https://rubygems.org
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubyforge_project:
172
+ rubygems_version: 2.5.1
173
+ signing_key:
174
+ specification_version: 4
175
+ summary: Easily send sms using various sms backends!
176
+ test_files: []