sms_traffic_sdk 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
+ SHA256:
3
+ metadata.gz: 97b598c2448cc5371fb1d2dd91d0f5706473ea3657e5494e4e72edb53a304792
4
+ data.tar.gz: 4f42caff68f07f17e841119111b013dd40be2cda9b321bb8e7bdafa4509ddb2e
5
+ SHA512:
6
+ metadata.gz: 2b09f25a918672f487011f79861441f96b650625f1fc9cf0db213a9204b8cfab9f78b1d883b3ed76da5ba0d6b47d6bd1d52710c0cb902e386cffc0f625f76c13
7
+ data.tar.gz: fe2cfb46546cf8438b325e2a676e28792d2ff585a13ac75304af2a3079a2401f72acbb7c00c7af2f5fe3a2748a799d622f204dec1442b025215f96ccfd38239b
data/.env.template ADDED
@@ -0,0 +1,4 @@
1
+ SMS_TRAFFIC_HOST=SMS_TRAFFIC_HOST
2
+ SMS_TRAFFIC_LOGIN=SMS_TRAFFIC_LOGIN
3
+ SMS_TRAFFIC_PASSWORD=SMS_TRAFFIC_PASSWORD
4
+ SMS_TRAFFIC_ORIGINATOR=SMS_TRAFFIC_ORIGINATOR
data/.fasterer.yml ADDED
@@ -0,0 +1,2 @@
1
+ speedups:
2
+ fetch_with_argument_vs_block: false
@@ -0,0 +1,75 @@
1
+ name: Ruby Gem CI/CD
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+ release:
9
+ types: [created]
10
+ on:
11
+ push:
12
+ tags:
13
+ - 'v*'
14
+
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+ strategy:
19
+ matrix:
20
+ ruby-version: ['2.7', '3.0', '3.1', '3.2', '3.3']
21
+
22
+ steps:
23
+ - uses: actions/checkout@v2
24
+
25
+ - name: Set up Ruby
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: ${{ matrix.ruby-version }}
29
+
30
+ - name: Install Bundler for Ruby < 3.0
31
+ if: ${{ matrix.ruby-version < '3.0' }}
32
+ run: gem install bundler -v 2.4.22 --no-document
33
+
34
+ - name: Install Bundler for Ruby >= 3.0
35
+ if: ${{ matrix.ruby-version >= '3.0' }}
36
+ run: gem install bundler -v '~> 2.5' --no-document
37
+
38
+ - name: Install dependencies
39
+ run: bundle install --jobs 4 --retry 3
40
+
41
+ - name: Run tests and linting
42
+ run: bundle exec rake
43
+
44
+ - name: Upload coverage reports to Codecov
45
+ uses: codecov/codecov-action@v4.0.1
46
+ with:
47
+ token: ${{ secrets.CODECOV_TOKEN }}
48
+ file: ./coverage/.resultset.json
49
+ fail_ci_if_error: false
50
+
51
+ publish:
52
+ needs: build
53
+ runs-on: ubuntu-latest
54
+ steps:
55
+ - uses: actions/checkout@v2
56
+
57
+ - name: Set up Ruby for publish
58
+ uses: ruby/setup-ruby@v1
59
+ with:
60
+ ruby-version: '3.3'
61
+
62
+ - name: Install dependencies
63
+ run: |
64
+ gem install bundler --no-document
65
+ bundle install --jobs 4 --retry 3
66
+
67
+ - name: Build gem
68
+ run: |
69
+ gem build *.gemspec
70
+
71
+ - name: Push gem to RubyGems
72
+ run: |
73
+ gem push *.gem
74
+ env:
75
+ GEM_HOST_API_KEY: ${{secrets.GEM_HOST_API_KEY}}
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .idea/
11
+ .rspec_status
12
+ .env
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --require spec_helper
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,20 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.7.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+ Exclude:
6
+ - 'bin/**/*'
7
+
8
+ Style/Documentation:
9
+ Enabled: false
10
+
11
+ Style/FrozenStringLiteralComment:
12
+ EnforcedStyle: 'never'
13
+
14
+ Layout/HashAlignment:
15
+ EnforcedHashRocketStyle: table
16
+ EnforcedColonStyle: table
17
+
18
+ Metrics/BlockLength:
19
+ Exclude:
20
+ - 'spec/**/*'
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.3.3
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development, :test do
6
+ gem 'dotenv', '~> 2.7'
7
+ gem 'fasterer', '~> 0.9'
8
+ gem 'rack', '~> 3.1.7'
9
+ gem 'rake', '~> 13.2'
10
+ gem 'rspec', '~> 3.10'
11
+ gem 'rspec-mocks', '~> 3.10'
12
+ gem 'rubocop', '~> 1.18'
13
+ gem 'rubocop-performance', '~> 1.11'
14
+ gem 'rubocop-rspec', '~> 2.11'
15
+ gem 'simplecov', '~> 0.22'
16
+ gem 'webmock', '~> 3.14'
17
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 David Rybolovlev
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # SmsTraffic
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/sms_traffic.svg)](https://badge.fury.io/rb/sms_traffic)
4
+ [![Maintainability](https://api.codeclimate.com/v1/badges/bb4795be5024dd81d927/maintainability)](https://codeclimate.com/github/golifox/sms_traffic/maintainability)
5
+ [![Coverage](https://codecov.io/github/golifox/sms_traffic/graph/badge.svg?token=74C0YBJP3F)](https://codecov.io/github/golifox/sms_traffic)
6
+ [![CI](https://github.com/golifox/sms_traffic/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/golifox/sms_traffic/actions/workflows/ci.yml)
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'sms_traffic_sdk'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install sms_traffic_sdk
23
+
24
+ ## Usage
25
+
26
+
27
+ Define settings:
28
+
29
+ ```ruby
30
+ # initializers/sms_traffic.rb
31
+ require 'sms_traffic_sdk'
32
+
33
+ SmsTraffic.configure do |config|
34
+ config.login = 'login'
35
+ config.password = 'password'
36
+ config.originator = 'default_originator'
37
+ config.server = 'https://api.smstraffic.ru'
38
+ config.debug = true
39
+ config.debugger = Rails.logger
40
+ end
41
+ ```
42
+
43
+ Initialize sms:
44
+ ```ruby
45
+ sms = SmsTraffic::Sms.new('phone', 'text', 'originator') # initialize sms, originator by default from settings
46
+ # => #<SmsTraffic::Sms:0x0000 @errors=[], @message="text", @originator="default_originator", @phone="phone", @status="not-sent">
47
+
48
+ ```
49
+
50
+ Send it and get sent sms id and dispatch code:
51
+ ```ruby
52
+ sms.deliver # send sms. returns sms id or dispatch code if something went wrong
53
+ # => true
54
+ sms.id # get sms id
55
+ # => '123456789'
56
+ ```
57
+
58
+ Get current sms status and update it:
59
+ ```ruby
60
+ sms.status # get sms delivery status
61
+ # => 'sent'
62
+ sms.update_status # updates sms delivery status. returns status or status check response code on error
63
+ # => 'delivered'
64
+ ```
65
+
66
+ Get any sms status:
67
+ ```ruby
68
+ response = SmsTraffic.status(sms_id) # status - sms delivery status unless error or return error
69
+ reply = response.reply
70
+ # => #<SmsTraffic::Client::StatusReply:0x0000>
71
+ status = reply.status
72
+ # => "Delivered"
73
+ reply.hash
74
+ # =>
75
+ # {"error"=>nil,
76
+ # "submition_date"=>"2024-07-15 11:36:25",
77
+ # "send_date"=>"2024-07-15 11:36:25",
78
+ # "last_status_change_date"=>"2024-07-15 11:36:25",
79
+ # "sms_id"=>"865149797164801235",
80
+ # "status"=>"Delivered"}
81
+
82
+ ```
83
+
84
+ ## Development
85
+
86
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
87
+
88
+ To install this gem onto your local machine, run `bundle exec rake install`.
89
+
90
+ ## License
91
+
92
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
93
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ require 'rubocop/rake_task'
7
+
8
+ RuboCop::RakeTask.new
9
+
10
+ task default: %i[spec rubocop]
data/bin/console ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'dotenv'
5
+ require 'sms_traffic'
6
+
7
+ Dotenv.load('.env')
8
+
9
+ SmsTraffic.configure do |config|
10
+ config.host = ENV['SMS_TRAFFIC_HOST']
11
+ config.login = ENV['SMS_TRAFFIC_LOGIN']
12
+ config.password = ENV['SMS_TRAFFIC_PASSWORD']
13
+ config.originator = ENV['SMS_TRAFFIC_ORIGINATOR']
14
+ end
15
+
16
+
17
+ require 'irb'
18
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env ruby
2
+ require 'konsierge/sms_traffic'
@@ -0,0 +1,60 @@
1
+ module SmsTraffic
2
+ class Client
3
+ class DeliverReply < Client::Reply
4
+ OK_REPLY = 'OK'.freeze unless const_defined?(:OK_REPLY)
5
+
6
+ def ok?
7
+ fetch_value(hash, :result) == OK_REPLY
8
+ end
9
+
10
+ def error?
11
+ !ok?
12
+ end
13
+
14
+ def result
15
+ fetch_value(hash, :result)
16
+ end
17
+
18
+ def code
19
+ fetch_value(hash, :code)
20
+ end
21
+
22
+ def description
23
+ fetch_value(hash, :description)
24
+ end
25
+
26
+ def message_infos
27
+ fetch_value(hash, :message_infos)
28
+ end
29
+
30
+ def sms_id(phone = nil)
31
+ message_info = fetch_value(message_infos, :message_info)
32
+ return fetch_value(message_info, :sms_id) if message_info.is_a?(Hash)
33
+
34
+ raise ArgumentError, 'phone is required' unless phone
35
+
36
+ fetch_value(find_message_info(phone), :sms_id)
37
+ end
38
+
39
+ def sms_ids
40
+ message_info = fetch_value(message_infos, :message_info)
41
+
42
+ return [fetch_value(message_info, :sms_id)] if message_info.size == 1
43
+
44
+ message_info.each_with_object({}) do |info, hash|
45
+ hash[fetch_value(info, :phone)] = fetch_value(info, :sms_id)
46
+ end
47
+ end
48
+
49
+ def error_description
50
+ "#{result}: code: #{code}, description: #{description}" if error?
51
+ end
52
+
53
+ private
54
+
55
+ def find_message_info(phone)
56
+ fetch_value(message_infos, :message_info).find { |info| fetch_value(info, :phone) == phone }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,18 @@
1
+ module SmsTraffic
2
+ class Client
3
+ class Reply
4
+ attr_reader :xml, :hash
5
+
6
+ def initialize(xml, xml_parser: SmsTraffic.configuration.xml_parser)
7
+ @xml = xml.gsub!(/\s+/, ' ')
8
+ @hash = fetch_value(xml_parser.parse(xml), :reply)
9
+ end
10
+
11
+ private
12
+
13
+ def fetch_value(hash, key)
14
+ hash.fetch(key.to_s, nil) || hash.fetch(key.to_sym, nil)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'deliver_reply'
2
+ require_relative 'status_reply'
3
+
4
+ module SmsTraffic
5
+ class Client
6
+ class Response
7
+ attr_reader :origin, :reply, :code, :body, :message
8
+
9
+ REPLY_HASH_MAP = {
10
+ :status => StatusReply,
11
+ :deliver => DeliverReply,
12
+ nil => Reply
13
+ }.freeze
14
+
15
+ def initialize(response, type: nil)
16
+ @origin = response
17
+ @code = response.code.to_i
18
+ @body = response.body
19
+ @message = response.message
20
+
21
+ return unless success?
22
+
23
+ @reply = REPLY_HASH_MAP[type].new(body)
24
+ end
25
+
26
+ def success?
27
+ code == 200
28
+ end
29
+
30
+ def failure?
31
+ !success?
32
+ end
33
+
34
+ def error_description
35
+ "#{code}: #{message}" if failure?
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ module SmsTraffic
2
+ class Client
3
+ class StatusReply < Reply
4
+ def sms_array
5
+ fetch_value(hash, :sms).is_a?(Array) ? fetch_value(hash, :sms) : [hash]
6
+ end
7
+
8
+ def status(sms_id = nil)
9
+ return fetch_value(sms_array.first, :status) if sms_array.size == 1
10
+
11
+ raise ArgumentError, 'sms_id is required' if sms_id.nil?
12
+
13
+ statuses[sms_id.to_s]
14
+ end
15
+
16
+ # @return [Hash] statuses hash (key: sms_id, value: status)
17
+ # @example
18
+ #
19
+ # {
20
+ # '1234567890': 'DELIVERED',
21
+ # '0987654321': 'FAILED'
22
+ # }
23
+ def statuses
24
+ sms_array.each_with_object({}) do |sms, hash|
25
+ hash[fetch_value(sms, :sms_id)] = fetch_value(sms, :status)
26
+ end.compact
27
+ end
28
+
29
+ def error(sms_id = nil)
30
+ return fetch_value(sms_array.first, :error) if sms_array.size == 1
31
+
32
+ raise ArgumentError, 'sms_id is required' if sms_id.nil?
33
+
34
+ errors[sms_id.to_s]
35
+ end
36
+
37
+ def errors
38
+ sms_array.each_with_object({}) do |sms, hash|
39
+ hash[fetch_value(sms, :sms_id)] = fetch_value(sms, :error)&.strip
40
+ end.compact
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,79 @@
1
+ require 'net/http'
2
+
3
+ module SmsTraffic
4
+ class Client
5
+ class << self
6
+ attr_reader :uri
7
+
8
+ # @param phone [String] phone number
9
+ # @param message [String] message
10
+ # @param originator [String] originator (subject)
11
+ # @param options [Hash] additional options
12
+ def deliver(phone, message, originator = nil, **options)
13
+ originator ||= SmsTraffic.configuration.originator
14
+ form_data = deliver_params(phone, message, originator, **options)
15
+ response = perform_request(form_data)
16
+ Response.new(response, type: :deliver)
17
+ end
18
+
19
+ # @param message_id [String] message id
20
+ def status(*message_ids)
21
+ form_data = status_params(message_ids)
22
+ response = perform_request(form_data)
23
+ Response.new(response, type: :status)
24
+ end
25
+
26
+ private
27
+
28
+ # @return [Net::HTTP]
29
+ def connection
30
+ host, logger = SmsTraffic.configuration.values_at(:host, :logger)
31
+
32
+ @uri ||= URI.join(host, 'multi.php')
33
+ http = Net::HTTP.new(uri.host, uri.port)
34
+ http.read_timeout = 30
35
+ http.use_ssl = (uri.scheme == 'https')
36
+ http.set_debug_output(logger)
37
+ http
38
+ end
39
+
40
+ # @param form_data [Hash<Symbol, String|Integer>]
41
+ # @return [Net::HTTPResponse]
42
+ def perform_request(form_data)
43
+ connection.start do |http|
44
+ request = Net::HTTP::Post.new(uri.request_uri)
45
+ request.set_form_data(form_data)
46
+ http.request(request)
47
+ end
48
+ end
49
+
50
+ # @param phone [String] phone number or phone numbers separated by comma
51
+ # @param message [String] message
52
+ # @param originator [String] originator (subject)
53
+ # @param options [Hash] additional options
54
+ # @return [Hash<Symbol, String|Integer>]
55
+ def deliver_params(phone, message, originator, **options)
56
+ {
57
+ login: SmsTraffic.configuration.login,
58
+ password: SmsTraffic.configuration.password,
59
+ phones: phone,
60
+ message: message,
61
+ want_sms_ids: 1,
62
+ rus: 5,
63
+ originator: originator
64
+ }.merge(options)
65
+ end
66
+
67
+ # @param message_ids [Array<String>] message ids
68
+ # @return [Hash<Symbol, String|Integer>]
69
+ def status_params(*message_ids)
70
+ {
71
+ login: SmsTraffic.configuration.login,
72
+ password: SmsTraffic.configuration.password,
73
+ operation: 'status',
74
+ sms_id: message_ids.join(',')
75
+ }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,73 @@
1
+ require 'singleton'
2
+ require 'nori'
3
+
4
+ module SmsTraffic
5
+ class Configuration
6
+ include Singleton
7
+
8
+ attr_accessor :login, :password, :host, :originator, :debug, :logger, :xml_parser
9
+
10
+ def initialize
11
+ self.debug = default_configuration[:debug]
12
+ self.logger = default_configuration[:logger]
13
+ self.xml_parser = default_configuration[:xml_parser]
14
+ super
15
+ end
16
+
17
+ def reset!
18
+ default_configuration.each do |key, value|
19
+ send("#{key}=", value)
20
+ end
21
+ end
22
+
23
+ def validate!
24
+ validation_rules.each do |key, value|
25
+ raise ArgumentError, "#{key} should be defined for #{self}." if value.nil?
26
+ end
27
+ end
28
+
29
+ def to_h
30
+ {
31
+ login: login,
32
+ password: password,
33
+ host: host,
34
+ originator: originator,
35
+ debug: debug,
36
+ logger: logger,
37
+ xml_parser: xml_parser
38
+ }
39
+ end
40
+
41
+ def values_at(*keys)
42
+ to_h.values_at(*keys)
43
+ end
44
+
45
+ private
46
+
47
+ def default_configuration
48
+ {
49
+ login: nil,
50
+ password: nil,
51
+ host: nil,
52
+ originator: nil,
53
+ debug: false,
54
+ logger: $stdout,
55
+ xml_parser: default_xml_parser
56
+ }
57
+ end
58
+
59
+ def validation_rules
60
+ {
61
+ 'Login' => login,
62
+ 'Password' => password,
63
+ 'Server' => host,
64
+ 'Originator' => originator,
65
+ 'Debug logger' => debug && !logger ? nil : true
66
+ }
67
+ end
68
+
69
+ def default_xml_parser
70
+ @default_xml_parser ||= Nori.new(advanced_typecasting: true).freeze
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,59 @@
1
+ module SmsTraffic
2
+ class Sms
3
+ attr_accessor :phone, :message, :originator
4
+ attr_reader :id, :status, :errors
5
+
6
+ def initialize(phone, message, originator: nil)
7
+ @phone = phone
8
+ @message = message
9
+ @originator = originator || SmsTraffic.configuration.originator
10
+ @status = 'not-sent'
11
+ @errors = []
12
+ validate!
13
+ end
14
+
15
+ def deliver # rubocop:disable Metrics/MethodLength
16
+ # @type [Client::Response]
17
+ response = Client.deliver(phone, message, originator)
18
+
19
+ unless response.success?
20
+ @errors << response.error_description
21
+ return false
22
+ end
23
+
24
+ # @type [Client::Response::Reply]
25
+ reply = response.reply
26
+
27
+ if reply.ok?
28
+ @status = 'sent'
29
+ @id = reply.sms_id
30
+ true
31
+ else
32
+ @errors << reply.error_description
33
+ false
34
+ end
35
+ end
36
+
37
+ def update_status
38
+ return status if id.nil?
39
+
40
+ response = Client.status(id)
41
+ return response.code unless response.success?
42
+
43
+ @status = response.reply.status.downcase
44
+ end
45
+
46
+ private
47
+
48
+ def validate!
49
+ raise ArgumentError, "Phone should be assigned to #{self.class}." if phone.nil?
50
+
51
+ unless phone.to_s =~ /^[0-9]{11}$/
52
+ raise ArgumentError, 'Phone number should contain only numbers. Minimum length is 11.'
53
+ end
54
+
55
+ raise ArgumentError, "Message should be specified to #{self.class}." if message.nil?
56
+ raise ArgumentError, "Originator should be specified to #{self.class}." if originator.nil?
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module SmsTraffic
2
+ VERSION = '0.0.1'.freeze
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'zeitwerk'
2
+
3
+ loader = Zeitwerk::Loader.for_gem
4
+ loader.ignore("#{__dir__}/sms_traffic/version.rb")
5
+ loader.enable_reloading
6
+ loader.setup
7
+
8
+ require_relative 'sms_traffic/version'
9
+
10
+ module SmsTraffic
11
+ class << self
12
+ def configuration
13
+ @configuration ||= Configuration.instance
14
+ end
15
+
16
+ def configure(&_block)
17
+ yield(configuration) if block_given?
18
+ configuration.validate!
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require_relative 'lib/sms_traffic/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'sms_traffic_sdk'
8
+ spec.version = SmsTraffic::VERSION
9
+ spec.authors = ['David Rybolovlev']
10
+ spec.email = ['i@golifox.ru']
11
+
12
+ spec.summary = 'Send sms via SmsTraffic service.'
13
+ spec.description = 'Send sms via SmsTraffic service.'
14
+ spec.homepage = 'https://github.com/golifox/sms_traffic'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.required_ruby_version = '>= 2.7.0'
23
+
24
+ spec.add_dependency 'nokogiri', '~> 1.12'
25
+ spec.add_dependency 'nori', '~> 2.6'
26
+ spec.add_dependency 'zeitwerk', '~> 2.5'
27
+
28
+ spec.metadata['rubygems_mfa_required'] = 'true'
29
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sms_traffic_sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - David Rybolovlev
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-07-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :runtime
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: nori
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: zeitwerk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.5'
55
+ description: Send sms via SmsTraffic service.
56
+ email:
57
+ - i@golifox.ru
58
+ executables:
59
+ - konsierge-sms.rb
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".env.template"
64
+ - ".fasterer.yml"
65
+ - ".github/workflows/ci.yml"
66
+ - ".gitignore"
67
+ - ".rspec"
68
+ - ".rubocop.yml"
69
+ - ".tool-versions"
70
+ - Gemfile
71
+ - LICENSE
72
+ - README.md
73
+ - Rakefile
74
+ - bin/console
75
+ - bin/setup
76
+ - exe/konsierge-sms.rb
77
+ - lib/sms_traffic.rb
78
+ - lib/sms_traffic/client.rb
79
+ - lib/sms_traffic/client/deliver_reply.rb
80
+ - lib/sms_traffic/client/reply.rb
81
+ - lib/sms_traffic/client/response.rb
82
+ - lib/sms_traffic/client/status_reply.rb
83
+ - lib/sms_traffic/configuration.rb
84
+ - lib/sms_traffic/sms.rb
85
+ - lib/sms_traffic/version.rb
86
+ - sms_traffic_sdk.gemspec
87
+ homepage: https://github.com/golifox/sms_traffic
88
+ licenses:
89
+ - MIT
90
+ metadata:
91
+ rubygems_mfa_required: 'true'
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 2.7.0
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubygems_version: 3.5.11
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Send sms via SmsTraffic service.
111
+ test_files: []