meta_sms 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 80961d4503e372186a20a6d562bf239e52b1c96f
4
+ data.tar.gz: c32ae42928d4cfd813fbfe29698ce7bd06f34b05
5
+ SHA512:
6
+ metadata.gz: 0a66906b88fdc4638d1c5159937a2d95eff6a5efb0eeb901d735dba5a162defc463b2a42695e459b544d4b2175be83b5f0156b5f43ebefead2869bef981e25f7
7
+ data.tar.gz: b19ec1ad55cd053ae44a6913af2ced49173f2432b9f3ae37d15692244db32fd0771781d61deffe6307fbd31bd9bc388a488bcb9cd6cc9ea4c04155a4075f4068
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Shobhit Dixit
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = MetaSms
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'MetaSms'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
@@ -0,0 +1,22 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/active_record'
3
+
4
+ module MetaSms
5
+
6
+
7
+ # This creates MetaSms initializer for your application
8
+ # It will copy the config file template in config/initializers/meta_sms.rb
9
+ #
10
+ # @author Shobhit Dixit
11
+ class InstallGenerator < ::Rails::Generators::Base
12
+ include ::Rails::Generators::Migration
13
+ source_root File.expand_path("../templates", __FILE__)
14
+ desc "Creates MetaSms initializer for your application"
15
+
16
+ def copy_initializer
17
+ template "meta_sms_initializer.rb", "config/initializers/meta_sms.rb"
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,25 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/active_record'
3
+
4
+ module MetaSms
5
+
6
+ # This is a generator for SmsLogging migration
7
+ # It Generates (but does not run) a migration to add a sms_loggings table
8
+ #
9
+ # @author Shobhit Dixit
10
+ class MigrationsForLoggerGenerator < ::Rails::Generators::Base
11
+ include ::Rails::Generators::Migration
12
+ source_root File.expand_path("../templates/migrations", __FILE__)
13
+ desc "Generates (but does not run) a migration to add a sms_loggings table"
14
+
15
+ def create_migration_file
16
+ migration_template 'create_sms_loggings.rb', 'db/migrate/create_sms_loggings.rb'
17
+ end
18
+
19
+ def self.next_migration_number(dirname)
20
+ ::ActiveRecord::Generators::Base.next_migration_number(dirname)
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,19 @@
1
+ MetaSms.configure do |config|
2
+
3
+ # This gem is a wrapper to use smsbox api in rails to send sms.
4
+
5
+
6
+ # make this true if logging is required
7
+ # also run 'rails g meta_sms:migrations_for_logger' in order to add migrations for sms logger
8
+ # currently this gem supports only pg adapter for database
9
+ config.logging = false
10
+
11
+ # config.sms_provider_name = :smsbox
12
+ # config.smsbox_user_name = ''
13
+ # config.smsbox_key = ''
14
+ # config.route = 'Transactional'
15
+ # config.from = 'tpohub'
16
+ # config.type = 'TextSMS'
17
+
18
+
19
+ end
@@ -0,0 +1,13 @@
1
+ class CreateSmsLoggings < ActiveRecord::Migration
2
+ def change
3
+ create_table :sms_loggings do |t|
4
+ t.string :message_text
5
+ t.string :mobile_number
6
+ t.string :error_message
7
+ t.json :metadata
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,25 @@
1
+ module MetaSms
2
+ class << self
3
+ attr_accessor :config
4
+ end
5
+
6
+ def self.configure
7
+ self.config ||= Config.new
8
+ yield(config)
9
+ end
10
+
11
+ # TODO: write dynamic attr_accessor. as currently it is written only for smsbox
12
+ class Config
13
+ attr_accessor :sms_provider_name,:logging, :smsbox_user_name, :smsbox_key, :route,:from,:type
14
+
15
+ def initialize
16
+ @logging = false
17
+ @type = 'TextSMS'
18
+ @sms_provider_name = nil
19
+ @smsbox_user_name = nil
20
+ @smsbox_key = nil
21
+ @route = nil
22
+ @from = nil
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ module MetaSms
2
+
3
+ # This is a class for custom error in meta_sms.
4
+ # This method will be used to raise exceptions regarding meta_sms gem.
5
+ #
6
+ # @author Shobhit Dixit
7
+ class MetaSmsError < StandardError
8
+
9
+ def initialize(msg="")
10
+ super
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,56 @@
1
+ require 'meta_sms/providers/provider_utility'
2
+
3
+ module MetaSms
4
+
5
+ # ISmsProvider acts as an interface for all sms providers in this gem.
6
+ # It has a method send_sms, which every sms provider class must override or else error will be thrown.
7
+ # There is a constant REQUIRED_OPTIONS, which represents the required options in order to send message.
8
+ # for now, message_text and mobile_number is the only options that are required.
9
+ #
10
+ #
11
+ # => 'Sms provider class' refers to the class which is a sms service provider and which inherits ISmsProvider. eg: providers/sms_box.rb
12
+ # @author Shobhit Dixit
13
+ class ISmsProvider
14
+
15
+ REQUIRED_OPTIONS = [:message_text, :mobile_number]
16
+
17
+ # Initialize options
18
+ #
19
+ # @param [Hash] options
20
+ # @example {:message_text* => "Some text message", :mobile_number* => 7894561237, :logging => boolean, :metadata =>json }
21
+ # @note here message_text and mobile_number are required params and others are optional
22
+ # @author Shobhit Dixit
23
+ def initialize(options)
24
+ @options = options
25
+ end
26
+
27
+ # Method to overide in every sms provider class in order to send sms
28
+ #
29
+ # @raise NotImplementedError
30
+ # @author Shobhit Dixit
31
+ def send_sms
32
+ raise NotImplementedError, "send_sms"
33
+ end
34
+
35
+ # This method checks the presence of the value of the required options key
36
+ # This is called in sms provider class.
37
+ #
38
+ # @param [Symbol] required_option_key one of the keys of @options whose presence needs to be checked.
39
+ # @return [Object] returned object can be string or object depending upon the value of the key in @options.
40
+ # @author Shobhit Dixit
41
+ def check_required_option(required_option_key)
42
+ value = @options[required_option_key]
43
+ if value.blank?
44
+ ProviderUtility.raise_error_for_blank_value(required_option_key)
45
+ else
46
+ value
47
+ end
48
+ end
49
+
50
+ def check_for_valid_mobile_number(mobile_number)
51
+ mobile_number
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,59 @@
1
+ require "meta_sms/meta_sms_error"
2
+
3
+ module MetaSms
4
+
5
+ # This is a utility class for sms providers. This encapsulates some common class methods as
6
+ # => raise_low_balance_exception
7
+ # This method will be used to raise an exception if the balance in sms service provider account is low.
8
+ # This method can be called in the respective sms provider class. eg: sms_box.rb.
9
+ # => raise_error_for_blank_value
10
+ # This method is used to raise ArgumentError. This can be called in the sms_provider_interface (i_sms_provider) in order to raise the exception is value of any
11
+ # required option is blank.
12
+ # => check_required_config_param
13
+ # This method is used to check presence of required config variables. It can be called in the respective sms provider class. eg: sms_box.rb.
14
+ #
15
+ # @author Shobhit Dixit
16
+ class ProviderUtility
17
+
18
+ # This method is used to check presence of required config variables
19
+ #
20
+ # @param [String/Symbol] config_param parameters define in config file
21
+ # @raise ArgumentError if the value of the config param is blank
22
+ # @return [Object] Value can be string or an object depending upon the value config variable
23
+ # @author Shobhit Dixit
24
+ def self.check_required_config_param(config_param)
25
+ value = eval "MetaSms.config.#{config_param}"
26
+ if value.blank?
27
+ raise ArgumentError.new "Property #{config_param} is not found. Please check required parameters in initializer file (config/initializers/meta_sms.rb)."
28
+ end
29
+ value
30
+ end
31
+
32
+ # This method will raise ArgumentError
33
+ #
34
+ # @param [Symbol/String] key of the @options in i_sms_provider
35
+ # @raise ArgumentError
36
+ # @author Shobhit Dixit
37
+ def self.raise_error_for_blank_value(key)
38
+ raise ArgumentError.new "No #{key} found."
39
+ end
40
+
41
+ # This method will raise low balance error
42
+ #
43
+ # @raise StandardError
44
+ # @author Shobhit Dixit
45
+ def self.raise_low_balance_exception
46
+ raise MetaSmsError.new "Your balance is low for sending message."
47
+ end
48
+
49
+ # This method will raise authentication error
50
+ #
51
+ # @raise SecurityError
52
+ # @author Shobhit Dixit
53
+ def self.authentication_error
54
+ raise SecurityError.new 'Authentication Failed. Please Try Again.'
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,68 @@
1
+ require 'net/http'
2
+
3
+ module MetaSms
4
+
5
+ # This is a sms provider class which inherits ISmsProvider.
6
+ #
7
+ # @author Shobhit Dixit
8
+ class Smsbox < ISmsProvider
9
+
10
+ SMSBOX_PUBLIC_API_URI = "http://smsbox.in/SecureApi.aspx?"
11
+
12
+ # Smsbox required config params = smsbox_user_name, smsbox_key, route, from
13
+ # Smsbox optional config params = type, logging
14
+
15
+ REQ_CONFIG_PARAMS = [:smsbox_user_name, :smsbox_key, :route, :from]
16
+
17
+ # Description of method
18
+ # @overide
19
+ # @return [Type] description of returned object
20
+ # @author Shobhit Dixit
21
+ def send_sms
22
+ res = Net::HTTP.get parsed_uri
23
+ case res
24
+ when "Error : Authentication Failed. Please Try Again"
25
+ ProviderUtility.authentication_error
26
+ when "Error : Your balance is low for sending message."
27
+ ProviderUtility.raise_low_balance_exception
28
+ end
29
+ res
30
+ end
31
+
32
+ def parsed_uri
33
+ URI.parse(URI.encode(api_url.strip))
34
+ end
35
+
36
+ # This method will make an api url
37
+ #
38
+ # @return [String] api_url
39
+ # @author Shobhit Dixit
40
+ def api_url
41
+ "#{SMSBOX_PUBLIC_API_URI}usr=#{smsbox_user_name}&key=#{smsbox_key}&smstype=#{MetaSms.config.type}&to=#{mobile_number}&msg=#{message_text}&rout=#{route}&from=#{from}"
42
+ end
43
+
44
+
45
+ # This will dynamically generate methods at run time. Method name will be same as the REQ_CONFIG_PARAMS key.
46
+ # These methods are used in .api_url
47
+ #
48
+ # @see ProviderUtility.check_required_config_param
49
+ # @author Shobhit Dixit
50
+ REQ_CONFIG_PARAMS.each do |param|
51
+ define_method "#{param}" do
52
+ ProviderUtility.check_required_config_param param
53
+ end
54
+ end
55
+
56
+ # This will dynamically generate methods. Method name will be same as the REQUIRED_OPTIONS key.
57
+ # These methods are used in .api_url
58
+ #
59
+ # @see .check_required_option
60
+ # @author Shobhit Dixit
61
+ REQUIRED_OPTIONS.each do |option|
62
+ define_method "#{option}" do
63
+ check_required_option option
64
+ end
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,35 @@
1
+ module MetaSms
2
+
3
+ # This is an ActiveRecord class. It is used to save sms log in db.
4
+ #
5
+ # @author Shobhit Dixit
6
+ class SmsLogging < ActiveRecord::Base
7
+
8
+ # Description of method
9
+ #
10
+ # @param [String] result of .send_sms method in provider class
11
+ # @param [Hash] options provided in ISmsProvider
12
+ # @param [Error] error raised by .send_sms method in provider class
13
+ # @author Shobhit Dixit
14
+ def self.log_sms(result, options, error)
15
+ if ActiveRecord::Base.connection.table_exists? self.table_name
16
+ SmsLogging.create( SmsLogging.get_sms_logging_object(result, options, error) )
17
+ else
18
+ raise StandardError.new "No table exists. Please run 'rails g meta_sms:migrations_for_logger' and then run 'rake db:migrate'. To disable this warning, make config.logging=false, in config/initializers/meta_sms.rb."
19
+ end
20
+ end
21
+
22
+ def self.get_sms_logging_object(result, options, error)
23
+ sms_logging_object = {
24
+ message_text: options[:message_text],
25
+ mobile_number: options[:mobile_number],
26
+ error_message: error.try(:message)
27
+ }
28
+ metadata = options[:metadata]
29
+ sms_logging_object[:metadata] = {:response => result}.as_json
30
+ sms_logging_object[:metadata].merge(metadata) if metadata.present?
31
+ sms_logging_object
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ module MetaSms
2
+
3
+ # This class is to select sms service provider. Requiring of the provider class is also done dynamically.
4
+ # Selection and dynamic require is done on the basis of config variable MetaSms.config.sms_provider_name.
5
+ #
6
+ # @author Shobhit Dixit
7
+ class SmsProviderSelector
8
+
9
+ # constant to keep track of sms providers
10
+ # naming convention: keys of SMS_PROVIDERS shall be used in config of meta_sms.rb initializer
11
+ # and value should be same as the name of the class of sms provider.
12
+ # also, the name of the class will be snake cased to require the class file
13
+ # for eg, for smsbox, there is a file named smsbox.rb in providers folder and the name of the class is Smsbox.
14
+ # @author Shobhit Dixit
15
+ SMS_PROVIDERS = {
16
+ :smsbox => "Smsbox"
17
+ }
18
+
19
+ #
20
+ # @author Shobhit Dixit
21
+ def initialize
22
+ @sms_provider_class_name = SMS_PROVIDERS[MetaSms.config.sms_provider_name]
23
+ raise ArgumentError.new 'No or wrong provider found. Please add a correct provider name in config/initializers/meta_sms.rb' if @sms_provider_class_name.blank?
24
+ require "meta_sms/providers/#{@sms_provider_class_name.underscore}"
25
+ end
26
+
27
+ def provider_class
28
+ (eval @sms_provider_class_name)
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ module MetaSms
2
+
3
+ # This is a utility class for meta_sms. This encapsulates some common class methods as
4
+ # #logging?
5
+ # This method will be used to check whether logging of sms is required or not.
6
+ #
7
+ # @author Shobhit Dixit
8
+ class Utility
9
+
10
+ # @return [Boolean] true if logging is true in config initializer or in @options, else false
11
+ # @author Shobhit Dixit
12
+ def self.logging?(logging=nil)
13
+ logging == true || MetaSms.config.logging == true
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,3 @@
1
+ module MetaSms
2
+ VERSION = "0.0.1"
3
+ end
data/lib/meta_sms.rb ADDED
@@ -0,0 +1,67 @@
1
+ require 'meta_sms/sms_provider_selector'
2
+ require 'meta_sms/providers/i_sms_provider'
3
+ require 'meta_sms/providers/smsbox'
4
+ require 'meta_sms/configuration'
5
+ require 'meta_sms/sms_logging'
6
+ require 'meta_sms/utility'
7
+
8
+ # This module is use to send sms through sms providers as sms box.
9
+ # It contains a class method #send_sms which takes a hash as argument.
10
+ # #send_sms will send sms, log sms if logging is enabled ((in options or config.logging) and migrations_for_logger is generated and migrated.)
11
+ # Some inportant classes of module MetaSms are:
12
+ # => Config
13
+ # Config is for containg the config variables required in the process of sending sms and logging results in db.
14
+ # => SmsProviderSelector
15
+ # MetaSms#send_sms uses SmsProviderSelector class to select the provider from the given lists of provider in the gem
16
+ # on the basis of the configuration variable, sms_provider_name.
17
+ # => ISmsProvider
18
+ # It acts as an interface for all the providers. So, in order to use sms provider class, we shall create an object
19
+ # of sms provider, which in turn use the constructor of ISmsProvider. This constructor takes options as an argument.
20
+ # options is a hash in which :message_text and :mobile_number is the required keys. Other optional keys can be
21
+ # :logging, :metadata. Here, :message_text will be the message sen to the user with mobile number as :mobile_number.
22
+ # :logging represents whether logging of this message is required in the database or not. There is a config variable
23
+ # logging, which also determines the same. So, logging will be true, if any of these value is true. :metadata can be
24
+ # any json data that client wants to save in the db along with the log.
25
+ # => Smsbox
26
+ # Smsbox is the sms provider class. It will have a method send_sms, which overrides the method of its parent class, ISmsProvider.
27
+ # Smsbox.send_sms will send message if required options and required configuration variable are present else, it will
28
+ # raise error. MetaSms#send_sms will rescue the error, write the log and then throw the rescued error.
29
+ # @note Here error from sms_logging is not handled.
30
+ # => SmsLogging
31
+ # This is an active record responsible to log data into database. It will save the sms log into a sms_loggings table.
32
+ # SmsLogging#log_sms is the method which does saving job. This method will raise StandardError if
33
+ # config.logging or options[:logging] is true and you have not executed, 'rails g meta_sms:migrations_for_logger'.
34
+ #
35
+ #
36
+ # @author Shobhit Dixit
37
+ module MetaSms
38
+
39
+ # This class method is use to send sms through this gem.
40
+ #
41
+ # @param [Hash] options
42
+ # @example {:message_text* => "Some text message", :mobile_number* => 7894561237, :logging => boolean, :metadata =>json }
43
+ # @note here message_text and mobile_number are required params and others are optional
44
+ #
45
+ # @raise MetaSmsError (for now, only-if balance is low)
46
+ # @raise SecurityError (for when service provider Authentication Failed)
47
+ # @raise StandardError (for when logging is true but no table for sms_loggings)
48
+ # @return [Type] description of returned object
49
+ # @author Shobhit Dixit
50
+ def self.send_sms(options)
51
+ provider_class = SmsProviderSelector.new.provider_class
52
+ pc = provider_class.new(options)
53
+ error = nil
54
+ begin
55
+ result = pc.send_sms
56
+ rescue MetaSmsError => meta_sms_error
57
+ error = meta_sms_error
58
+ rescue SecurityError => security_error
59
+ error = security_error
60
+ end
61
+ # This will raise an standard error if no table is present and logging is true.
62
+ SmsLogging.log_sms(result, options, error) if Utility.logging?(options[:logging])
63
+ raise error if error.present?
64
+ result
65
+ end
66
+
67
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :meta_sms do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta_sms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Shobhit Dixit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-09-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.9.6
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12.0'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 12.0.0
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '12.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 12.0.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: rubycritic
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.2'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.2'
89
+ - !ruby/object:Gem::Dependency
90
+ name: pg
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '='
94
+ - !ruby/object:Gem::Version
95
+ version: 0.19.0
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '='
101
+ - !ruby/object:Gem::Version
102
+ version: 0.19.0
103
+ description: Description of MetaSms.
104
+ email:
105
+ - shobhit.dixit@metacube.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - MIT-LICENSE
111
+ - README.rdoc
112
+ - Rakefile
113
+ - lib/generators/meta_sms/install_generator.rb
114
+ - lib/generators/meta_sms/migrations_for_logger_generator.rb
115
+ - lib/generators/meta_sms/templates/meta_sms_initializer.rb
116
+ - lib/generators/meta_sms/templates/migrations/create_sms_loggings.rb
117
+ - lib/meta_sms.rb
118
+ - lib/meta_sms/configuration.rb
119
+ - lib/meta_sms/meta_sms_error.rb
120
+ - lib/meta_sms/providers/i_sms_provider.rb
121
+ - lib/meta_sms/providers/provider_utility.rb
122
+ - lib/meta_sms/providers/smsbox.rb
123
+ - lib/meta_sms/sms_logging.rb
124
+ - lib/meta_sms/sms_provider_selector.rb
125
+ - lib/meta_sms/utility.rb
126
+ - lib/meta_sms/version.rb
127
+ - lib/tasks/meta_sms_tasks.rake
128
+ homepage: https://github.com/shobhit-m/meta_sms
129
+ licenses:
130
+ - MIT
131
+ metadata: {}
132
+ post_install_message:
133
+ rdoc_options: []
134
+ require_paths:
135
+ - lib
136
+ required_ruby_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ requirements: []
147
+ rubyforge_project:
148
+ rubygems_version: 2.6.12
149
+ signing_key:
150
+ specification_version: 4
151
+ summary: MetaSms is a gem used to send sms via rails application.
152
+ test_files: []