silent_bob 0.1.7

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,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f354e5012fca522e0cd4020aec9d2dd0a5bddb32543d25456f855d80e22795b2
4
+ data.tar.gz: 262b628c2a3e53b24e5cb9173db28757c150ac42faeb199e00420df1fa87ad41
5
+ SHA512:
6
+ metadata.gz: 60242b3925ede51a4e951d7e62b3710edeb19c2cc2a5c8f3466eca2b5b7e7d5c6b470ed8a29b47fcc431287bcdbfb668388b92a117a8e5b3ea384789f7886ed7
7
+ data.tar.gz: 635cc7f574329818d06277d80e737e9954b8699beceac82287afa13b914bc8be001a95e45a86989b6005df1d5cf30b17f14e0a5ad9db84b510a0d138939f01f4
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
@@ -0,0 +1,15 @@
1
+ stages:
2
+ - deploy
3
+
4
+ publish_gem:
5
+ stage: deploy
6
+ image: ruby:2.6.4
7
+ script:
8
+ - 'mkdir ~/.gem'
9
+ - 'echo -e "---\r\n:rubygems_api_key: $RUBYGEMS_API_KEY" > ~/.gem/credentials'
10
+ - 'chmod 0600 ~/.gem/credentials'
11
+ - 'gem build silent_bob'
12
+ - 'gem push "silent_bob-$(git describe --tags).gem"'
13
+ allow_failure: true
14
+ only:
15
+ - tags
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,82 @@
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rspec
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.6
7
+ Exclude:
8
+ - 'bin/**/*' # Auto-generated
9
+
10
+ Metrics/ParameterLists:
11
+ Max: 7
12
+
13
+ RSpec/MultipleMemoizedHelpers:
14
+ Max: 15
15
+
16
+ Layout/LineLength:
17
+ Max: 100
18
+
19
+ Style/Documentation:
20
+ Enabled: false
21
+
22
+ Style/ClassAndModuleChildren:
23
+ EnforcedStyle: nested
24
+
25
+ Style/FrozenStringLiteralComment:
26
+ Enabled: false
27
+
28
+ Style/AutoResourceCleanup:
29
+ Enabled: true
30
+
31
+ Style/CollectionMethods:
32
+ Enabled: true
33
+
34
+ Style/MethodCalledOnDoEndBlock:
35
+ Enabled: true
36
+
37
+ Style/OptionHash:
38
+ Enabled: true
39
+
40
+ Metrics/BlockLength:
41
+ Exclude:
42
+ - 'spec/**/*.rb'
43
+
44
+ Style/BlockDelimiters:
45
+ Exclude:
46
+ - 'spec/**/*.rb'
47
+
48
+ Bundler/OrderedGems:
49
+ Enabled: false
50
+
51
+ RSpec/NestedGroups:
52
+ Max: 8
53
+
54
+ RSpec/NamedSubject:
55
+ Enabled: false
56
+
57
+ RSpec/MultipleExpectations:
58
+ Max: 3
59
+
60
+ RSpec/LetSetup:
61
+ Enabled: false
62
+
63
+ RSpec/ExampleLength:
64
+ Max: 10
65
+
66
+ Rails/FilePath:
67
+ EnforcedStyle: arguments
68
+
69
+ Lint/RaiseException:
70
+ Enabled: true
71
+
72
+ Lint/StructNewOverride:
73
+ Enabled: true
74
+
75
+ Style/HashEachMethods:
76
+ Enabled: true
77
+
78
+ Style/HashTransformKeys:
79
+ Enabled: true
80
+
81
+ Style/HashTransformValues:
82
+ Enabled: true
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in silent_bob.gemspec
6
+ gemspec
@@ -0,0 +1,79 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ silent_bob (0.1.7)
5
+ http (~> 4.3)
6
+ mail (~> 2.5)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.0.3.4)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ zeitwerk (~> 2.2, >= 2.2.2)
17
+ addressable (2.7.0)
18
+ public_suffix (>= 2.0.2, < 5.0)
19
+ concurrent-ruby (1.1.7)
20
+ diff-lcs (1.4.4)
21
+ domain_name (0.5.20190701)
22
+ unf (>= 0.0.5, < 1.0.0)
23
+ factory_bot (5.2.0)
24
+ activesupport (>= 4.2.0)
25
+ ffi (1.13.1-x64-mingw32)
26
+ ffi-compiler (1.0.1)
27
+ ffi (>= 1.0.0)
28
+ rake
29
+ http (4.4.1)
30
+ addressable (~> 2.3)
31
+ http-cookie (~> 1.0)
32
+ http-form_data (~> 2.2)
33
+ http-parser (~> 1.2.0)
34
+ http-cookie (1.0.3)
35
+ domain_name (~> 0.5)
36
+ http-form_data (2.3.0)
37
+ http-parser (1.2.2)
38
+ ffi-compiler
39
+ i18n (1.8.5)
40
+ concurrent-ruby (~> 1.0)
41
+ mail (2.7.1)
42
+ mini_mime (>= 0.1.1)
43
+ mini_mime (1.0.2)
44
+ minitest (5.14.2)
45
+ public_suffix (4.0.6)
46
+ rake (10.5.0)
47
+ rspec (3.10.0)
48
+ rspec-core (~> 3.10.0)
49
+ rspec-expectations (~> 3.10.0)
50
+ rspec-mocks (~> 3.10.0)
51
+ rspec-core (3.10.0)
52
+ rspec-support (~> 3.10.0)
53
+ rspec-expectations (3.10.0)
54
+ diff-lcs (>= 1.2.0, < 2.0)
55
+ rspec-support (~> 3.10.0)
56
+ rspec-mocks (3.10.0)
57
+ diff-lcs (>= 1.2.0, < 2.0)
58
+ rspec-support (~> 3.10.0)
59
+ rspec-support (3.10.0)
60
+ thread_safe (0.3.6)
61
+ tzinfo (1.2.8)
62
+ thread_safe (~> 0.1)
63
+ unf (0.1.4)
64
+ unf_ext
65
+ unf_ext (0.0.7.7-x64-mingw32)
66
+ zeitwerk (2.4.2)
67
+
68
+ PLATFORMS
69
+ x64-mingw32
70
+
71
+ DEPENDENCIES
72
+ bundler (~> 1.17)
73
+ factory_bot (~> 5.1)
74
+ rake (~> 10.0)
75
+ rspec (~> 3.0)
76
+ silent_bob!
77
+
78
+ BUNDLED WITH
79
+ 1.17.3
@@ -0,0 +1,59 @@
1
+ # SilentBob
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/silent_bob`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'silent_bob'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install silent_bob
22
+
23
+ ## Usage
24
+
25
+ 1: Initialize default config
26
+ ```ruby
27
+ config = SilentBob::Configuration.new(url: 'http://127.0.0.1:4000', user_name: 'test',
28
+ password: 'cheburek')
29
+ SilentBob::ConfigurationKeeper.default_config = config
30
+ ```
31
+ 2: Send email or sms (needed params listed at `initialize` method)
32
+ ```ruby
33
+ SilentBob::SmsSender.new(to: '78881214455', body: 'sms-text').call
34
+ ```
35
+
36
+ ## You can always use a custom config when needed.
37
+
38
+ ```ruby
39
+ # in this case sms won't be sent instead message will be sent to Slack
40
+ config = SilentBob::Configuration.new(url: 'http://127.0.0.1:4000', user_name: 'test',
41
+ password: 'cheburek', slack_replacement: true)
42
+ SilentBob::SmsSender.new(to: '78881214455', body: 'sms-text', configuration: config).call
43
+ ```
44
+
45
+ ## ActionMailer delivery
46
+
47
+ To connect `SilentBob` to `ActionMailer`
48
+
49
+ ```ruby
50
+ ActionMailer::Base.add_delivery_method :revo_jay, SilentBob::Delivery
51
+ ```
52
+
53
+ In this case `SilentBob::ConfigurationKeeper.default_config` **must be initialized**
54
+
55
+ ## Development
56
+
57
+ 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.
58
+
59
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
@@ -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
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "silent_bob"
5
+
6
+ require "irb"
7
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,22 @@
1
+ require 'silent_bob/version'
2
+ require 'openssl'
3
+ require 'http'
4
+ require 'singleton'
5
+ require 'base64'
6
+ require 'silent_bob/configuration'
7
+ require 'silent_bob/configuration_keeper'
8
+ require 'silent_bob/delivery'
9
+ require 'silent_bob/client'
10
+ require 'silent_bob/email_sender'
11
+ require 'silent_bob/sms_sender'
12
+ require 'silent_bob/health_check'
13
+
14
+ module SilentBob
15
+ class Error < StandardError; end
16
+
17
+ class ConfigurationNotFound < StandardError; end
18
+
19
+ class WrongPhoneNumber < StandardError; end
20
+
21
+ Result = Struct.new(:success?, :response, keyword_init: true)
22
+ end
@@ -0,0 +1,30 @@
1
+ module SilentBob
2
+ class Client
3
+ attr_reader :configuration, :params
4
+
5
+ # Takes configuration and message params(hash)
6
+ # * <tt>configuration:</tt> `SilentBob::Configuration` object
7
+ # * <tt>params:</tt> Params represented by `Hash` that would be passed as json params
8
+ def initialize(configuration:, params:)
9
+ @configuration = configuration.to_h
10
+ @params = params
11
+ end
12
+
13
+ def call
14
+ response = make_request
15
+
16
+ Result.new(success?: response.status.success?, response: response.body.to_s)
17
+ end
18
+
19
+ private
20
+
21
+ def make_request
22
+ HTTP.basic_auth(configuration[:basic_auth])
23
+ .post(messages_url, json: params, ssl_context: configuration[:ssl_context])
24
+ end
25
+
26
+ def messages_url
27
+ "#{configuration[:url]}/messages"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module SilentBob
2
+ class Configuration
3
+ CONFIG_OPTIONS = %i[url user_name password slack_replacement ssl_context].freeze
4
+
5
+ attr_accessor(*CONFIG_OPTIONS)
6
+
7
+ # Takes configuration params to work with SilentBob app
8
+ # * <tt>url:</tt> Base SilentBob url
9
+ # * <tt>user_name:</tt> User name for basic auth
10
+ # * <tt>password:</tt> Password for basic auth
11
+ # * <tt>slack_replacement:</tt> Flag that tells SmsSender to send message by slack or sms
12
+ # * <tt>ssl_context:</tt> `OpenSSL::SSL::SSLContext` object
13
+ def initialize(url:, user_name:, password:, slack_replacement: false, ssl_context: nil)
14
+ @url = url
15
+ @user_name = user_name
16
+ @password = password
17
+ @slack_replacement = slack_replacement
18
+ @ssl_context = ssl_context || ssl_no_context
19
+ end
20
+
21
+ def to_h
22
+ {
23
+ url: url, slack: slack_replacement,
24
+ basic_auth: { user: user_name, pass: password },
25
+ ssl_context: ssl_context
26
+ }
27
+ end
28
+
29
+ private
30
+
31
+ def ssl_no_context
32
+ ctx = OpenSSL::SSL::SSLContext.new
33
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
34
+ ctx
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module SilentBob
2
+ class ConfigurationKeeper
3
+ class << self
4
+ def default_config=(configuration)
5
+ @@default_config = configuration
6
+ end
7
+
8
+ def default_config
9
+ @@default_config
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ module SilentBob
2
+ class Delivery
3
+ def initialize(_) end
4
+
5
+ def deliver!(mail)
6
+ raise ConfigurationNotFound unless ConfigurationKeeper.default_config
7
+
8
+ @mail = mail
9
+ Mail::CheckDeliveryParams.check(mail)
10
+
11
+ EmailSender.new(email_params).call
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :mail
17
+
18
+ def email_params
19
+ {
20
+ to: mail.to.first,
21
+ subject: mail.subject,
22
+ from: mail.from.first,
23
+ body: decoded_mail_body,
24
+ attachments: convert_attachments,
25
+ configuration: ConfigurationKeeper.default_config
26
+ }
27
+ end
28
+
29
+ def decoded_mail_body
30
+ return mail.html_part.decoded if mail.multipart?
31
+
32
+ (mail.mime_type =~ %r{^text/html$}i) && mail.body.decoded
33
+ rescue StandardError
34
+ nil
35
+ end
36
+
37
+ def convert_attachments
38
+ mail.attachments&.map do |attachment|
39
+ { name: attachment.filename, body: attachment.body }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,51 @@
1
+ module SilentBob
2
+ class EmailSender
3
+ MESSAGE_TYPE = 'email'.freeze
4
+
5
+ attr_reader :configuration, :subject, :to, :body, :attachments, :from
6
+
7
+ # Pass initialization params
8
+ # * <tt>configuration:</tt> `SilentBob::Configuration` object
9
+ # * <tt>to:</tt> Recipients email address
10
+ # * <tt>body:</tt> Email body in html format
11
+ # * <tt>subject:</tt> Email subject
12
+ # * <tt>attachments:</tt> Email attachments
13
+ # * <tt>from:</tt> Author's email address
14
+ def initialize(subject:, to:, body:, attachments: [], from: nil,
15
+ configuration: ConfigurationKeeper.default_config)
16
+ @configuration = configuration
17
+ @subject = subject
18
+ @to = to
19
+ @body = body
20
+ @attachments = attachments
21
+ @from = from
22
+ end
23
+
24
+ def call
25
+ raise ConfigurationNotFound unless configuration
26
+
27
+ Client.new(configuration: configuration, params: email_params).call
28
+ end
29
+
30
+ private
31
+
32
+ def email_params
33
+ {
34
+ message_type: MESSAGE_TYPE,
35
+ message: {
36
+ subject: subject,
37
+ to: to,
38
+ body: body,
39
+ attachments: handle_attachments(attachments),
40
+ from: from
41
+ }.compact
42
+ }
43
+ end
44
+
45
+ def handle_attachments(attachments)
46
+ attachments&.map do |attachment|
47
+ { name: attachment[:name], body: Base64.encode64(attachment[:body]) }
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,29 @@
1
+ module SilentBob
2
+ class HealthCheck
3
+ attr_reader :configuration
4
+
5
+ # Takes configuration
6
+ # * <tt>configuration:</tt> `SilentBob::Configuration` object
7
+ def initialize(configuration: ConfigurationKeeper.default_config)
8
+ @configuration = configuration
9
+ end
10
+
11
+ def call
12
+ raise ConfigurationNotFound unless configuration
13
+
14
+ config = configuration.to_h
15
+
16
+ response = HTTP
17
+ .basic_auth(config[:basic_auth])
18
+ .get(health_check_url(config), ssl_context: config[:ssl_context])
19
+
20
+ Result.new(success?: response.status.success?, response: response.body.to_s)
21
+ end
22
+
23
+ private
24
+
25
+ def health_check_url(config)
26
+ "#{config[:url]}/health_check"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ module SilentBob
2
+ class SmsSender
3
+ SMS_MESSAGE_TYPE = 'sms'.freeze
4
+ SLACK_MESSAGE_TYPE = 'slack'.freeze
5
+
6
+ attr_reader :configuration, :to, :body
7
+
8
+ # Pass initialization params
9
+ # * <tt>configuration:</tt> `SilentBob::Configuration` object
10
+ # * <tt>to:</tt> Mobile phone number (11 digits)
11
+ # * <tt>body:</tt> Sms message text
12
+ # === Examples
13
+ # SilentBob::SmsSender.new(configuration: config, to: '79991231212', body: 'text')
14
+ def initialize(to:, body:, configuration: ConfigurationKeeper.default_config)
15
+ @configuration = configuration
16
+ @to = to
17
+ @body = body
18
+ end
19
+
20
+ def call
21
+ raise ConfigurationNotFound unless configuration
22
+ raise WrongPhoneNumber if wrong_phone?
23
+
24
+ Client.new(configuration: configuration, params: sms_params).call
25
+ end
26
+
27
+ private
28
+
29
+ def sms_params
30
+ {
31
+ message_type: message_type,
32
+ message: {
33
+ to: to,
34
+ body: body
35
+ }
36
+ }
37
+ end
38
+
39
+ def message_type
40
+ configuration.to_h[:slack] ? SLACK_MESSAGE_TYPE : SMS_MESSAGE_TYPE
41
+ end
42
+
43
+ def wrong_phone?
44
+ to.length != 11
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module SilentBob
2
+ VERSION = '0.1.7'.freeze
3
+ end
@@ -0,0 +1,31 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'silent_bob/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'silent_bob'
7
+ spec.version = SilentBob::VERSION
8
+ spec.authors = ['Andrey Lobanov']
9
+ spec.email = ['soundtechproject@gmail.com']
10
+
11
+ spec.summary = 'Gem that provides ability to send messages through SilentBob service'
12
+ spec.description = ''
13
+ spec.homepage = 'https://mokka.ru'
14
+
15
+ # Specify which files should be added to the gem when it is released.
16
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ end
20
+ spec.bindir = 'exe'
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_runtime_dependency 'http', '~> 4.3'
25
+ spec.add_runtime_dependency 'mail', '~> 2.5'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.17'
28
+ spec.add_development_dependency 'factory_bot', '~> 5.1'
29
+ spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rspec', '~> 3.0'
31
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: silent_bob
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.7
5
+ platform: ruby
6
+ authors:
7
+ - Andrey Lobanov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-12-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: http
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mail
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.17'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.17'
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_bot
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description: ''
98
+ email:
99
+ - soundtechproject@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".gitlab-ci.yml"
106
+ - ".rspec"
107
+ - ".rubocop.yml"
108
+ - Gemfile
109
+ - Gemfile.lock
110
+ - README.md
111
+ - Rakefile
112
+ - bin/console
113
+ - bin/setup
114
+ - lib/silent_bob.rb
115
+ - lib/silent_bob/client.rb
116
+ - lib/silent_bob/configuration.rb
117
+ - lib/silent_bob/configuration_keeper.rb
118
+ - lib/silent_bob/delivery.rb
119
+ - lib/silent_bob/email_sender.rb
120
+ - lib/silent_bob/health_check.rb
121
+ - lib/silent_bob/sms_sender.rb
122
+ - lib/silent_bob/version.rb
123
+ - silent_bob.gemspec
124
+ homepage: https://mokka.ru
125
+ licenses: []
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubygems_version: 3.0.3
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Gem that provides ability to send messages through SilentBob service
146
+ test_files: []