recoil 0.0.6 → 0.1.0
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 +4 -4
- data/.rubocop.yml +99 -0
- data/.travis.yml +11 -0
- data/README.md +1 -0
- data/Rakefile +1 -5
- data/bin/brakeman +16 -0
- data/bin/rspec +0 -0
- data/bin/rubocop +16 -0
- data/bin/setup +13 -0
- data/lib/recoil.rb +1 -1
- data/lib/recoil/email.rb +11 -5
- data/lib/recoil/interceptor.rb +1 -1
- data/lib/recoil/version.rb +1 -1
- data/recoil.gemspec +17 -12
- data/spec/recoil/email_spec.rb +23 -16
- data/spec/recoil/message/notification_spec.rb +9 -9
- data/spec/requests/receive_notification_spec.rb +11 -11
- data/spec/spec_helper.rb +16 -7
- metadata +71 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 87e82d8f7f24b7d3335c5bd3e7291f1ff80493c9
|
|
4
|
+
data.tar.gz: dc33eaacc67cd5ce873b4ce15a4d64727a03eda4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5d4757afa6e0e1923eb3de8f1a191d22b69283bf0cee1c0c1b78680195db9fd8300fc9c8d7f649cbdccee7dfe23e4c7caa203a8d6971106eb12910662feb3c1b
|
|
7
|
+
data.tar.gz: d5e023713d948071fd7b0abe3119b88e1673e0033e6f2e4b0199e080712ab3754e4fc4d058335ab931211e3cb159372f06f1dd17fba7595c5387fbb626cbb976
|
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require: rubocop-rspec
|
|
2
|
+
|
|
3
|
+
AllCops:
|
|
4
|
+
Exclude:
|
|
5
|
+
- bin/**/*
|
|
6
|
+
- spec/dummy/**/*
|
|
7
|
+
RunRailsCops: true
|
|
8
|
+
|
|
9
|
+
Style/CollectionMethods:
|
|
10
|
+
Enabled: true
|
|
11
|
+
PreferredMethods:
|
|
12
|
+
collect: 'map'
|
|
13
|
+
collect!: 'map!'
|
|
14
|
+
inject: 'inject'
|
|
15
|
+
detect: 'find'
|
|
16
|
+
find_all: 'select'
|
|
17
|
+
|
|
18
|
+
Style/StringLiterals:
|
|
19
|
+
EnforcedStyle: single_quotes
|
|
20
|
+
|
|
21
|
+
Style/Documentation:
|
|
22
|
+
Enabled: false
|
|
23
|
+
|
|
24
|
+
Style/GuardClause:
|
|
25
|
+
Enabled: false
|
|
26
|
+
|
|
27
|
+
Style/IfUnlessModifier:
|
|
28
|
+
MaxLineLength: 50
|
|
29
|
+
|
|
30
|
+
Style/PredicateName:
|
|
31
|
+
Enabled: false
|
|
32
|
+
|
|
33
|
+
Style/SignalException:
|
|
34
|
+
EnforcedStyle: only_raise
|
|
35
|
+
|
|
36
|
+
Style/AlignParameters:
|
|
37
|
+
EnforcedStyle: with_fixed_indentation
|
|
38
|
+
|
|
39
|
+
Style/TrivialAccessors:
|
|
40
|
+
IgnoreClassMethods: true
|
|
41
|
+
|
|
42
|
+
Lint/UselessAssignment:
|
|
43
|
+
Enabled: false
|
|
44
|
+
|
|
45
|
+
Metrics/LineLength:
|
|
46
|
+
Max: 403
|
|
47
|
+
|
|
48
|
+
Style/ClassVars:
|
|
49
|
+
Enabled: false
|
|
50
|
+
|
|
51
|
+
# Avoid chaining a method call on a do...end block.
|
|
52
|
+
Style/MethodCalledOnDoEndBlock:
|
|
53
|
+
Enabled: true
|
|
54
|
+
|
|
55
|
+
# Use %i or %I for arrays of symbols
|
|
56
|
+
Style/SymbolArray:
|
|
57
|
+
Enabled: true
|
|
58
|
+
|
|
59
|
+
# Consider `method *args` ambiguous and require `method(*args)`. The former is
|
|
60
|
+
# fine so disable this rule by default.
|
|
61
|
+
Lint/AmbiguousOperator:
|
|
62
|
+
Enabled: false
|
|
63
|
+
|
|
64
|
+
# We are all responsible adults. We know when we mean to write `if a = 5` and when
|
|
65
|
+
# we mean to write `if a == 5`.
|
|
66
|
+
Lint/AssignmentInCondition:
|
|
67
|
+
Enabled: false
|
|
68
|
+
|
|
69
|
+
# Prefer alias_method over alias. Disable because alias is fine.
|
|
70
|
+
Style/Alias:
|
|
71
|
+
Enabled: false
|
|
72
|
+
|
|
73
|
+
# Disallow the case equality operator (===). Disable because this is a useful and
|
|
74
|
+
# perfectly acceptable practice.
|
|
75
|
+
Style/CaseEquality:
|
|
76
|
+
Enabled: false
|
|
77
|
+
|
|
78
|
+
# Ensure multi-line blocks use `do/end` and single-line blocks use `{/}` as
|
|
79
|
+
# delimiters. This is fine rule, except in case of RSpec tests, where the
|
|
80
|
+
# `expect { ... }.to` is idiomatically written across multiple lines. Disable
|
|
81
|
+
# only in specs.
|
|
82
|
+
Style/BlockDelimiters:
|
|
83
|
+
Exclude:
|
|
84
|
+
- spec/**/*_spec.rb
|
|
85
|
+
|
|
86
|
+
# Ensure short conditionals are written on a single line. The only exception
|
|
87
|
+
# here is Rails initializers, which sometimes have entire blocks of code with a
|
|
88
|
+
# `if defined?` modifier, which is acceptable.
|
|
89
|
+
Style/IfUnlessModifier:
|
|
90
|
+
Exclude:
|
|
91
|
+
- 'config/initializers/*'
|
|
92
|
+
|
|
93
|
+
# The top-level `describe` call should reference a class or module that is
|
|
94
|
+
# under test. This is not the case in some kinds of integration tests that are
|
|
95
|
+
# not tied to a particular class or module. Disable this cop in those cases.
|
|
96
|
+
RSpec/DescribeClass:
|
|
97
|
+
Exclude:
|
|
98
|
+
- spec/requests/**/*
|
|
99
|
+
- spec/features/**/*
|
data/.travis.yml
ADDED
data/README.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# Recoil
|
|
2
2
|
[](http://badge.fury.io/rb/recoil)
|
|
3
|
+
[](https://travis-ci.org/brightin/recoil)
|
|
3
4
|
|
|
4
5
|
Rails delivery method. Send via Amazon SES, but with local blacklist.
|
|
5
6
|
|
data/Rakefile
CHANGED
|
@@ -6,14 +6,11 @@ end
|
|
|
6
6
|
|
|
7
7
|
require 'rdoc/task'
|
|
8
8
|
|
|
9
|
-
APP_RAKEFILE = File.expand_path(
|
|
9
|
+
APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
|
|
10
10
|
load 'rails/tasks/engine.rake'
|
|
11
11
|
|
|
12
|
-
|
|
13
12
|
load 'rails/tasks/statistics.rake'
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
14
|
Bundler::GemHelper.install_tasks
|
|
18
15
|
|
|
19
16
|
require 'rake/testtask'
|
|
@@ -25,5 +22,4 @@ Rake::TestTask.new(:test) do |t|
|
|
|
25
22
|
t.verbose = false
|
|
26
23
|
end
|
|
27
24
|
|
|
28
|
-
|
|
29
25
|
task default: :test
|
data/bin/brakeman
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# This file was generated by Bundler.
|
|
4
|
+
#
|
|
5
|
+
# The application 'brakeman' is installed as part of a gem, and
|
|
6
|
+
# this file is here to facilitate running it.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
require 'pathname'
|
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
|
11
|
+
Pathname.new(__FILE__).realpath)
|
|
12
|
+
|
|
13
|
+
require 'rubygems'
|
|
14
|
+
require 'bundler/setup'
|
|
15
|
+
|
|
16
|
+
load Gem.bin_path('brakeman', 'brakeman')
|
data/bin/rspec
CHANGED
|
File without changes
|
data/bin/rubocop
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
# This file was generated by Bundler.
|
|
4
|
+
#
|
|
5
|
+
# The application 'rubocop' is installed as part of a gem, and
|
|
6
|
+
# this file is here to facilitate running it.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
require 'pathname'
|
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
|
11
|
+
Pathname.new(__FILE__).realpath)
|
|
12
|
+
|
|
13
|
+
require 'rubygems'
|
|
14
|
+
require 'bundler/setup'
|
|
15
|
+
|
|
16
|
+
load Gem.bin_path('rubocop', 'rubocop')
|
data/bin/setup
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require 'pathname'
|
|
3
|
+
|
|
4
|
+
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
|
|
5
|
+
|
|
6
|
+
Dir.chdir APP_ROOT do
|
|
7
|
+
puts "== Installing dependencies =="
|
|
8
|
+
system "gem install bundler --conservative"
|
|
9
|
+
system "bundle check || bundle install"
|
|
10
|
+
|
|
11
|
+
puts "\n== Preparing database =="
|
|
12
|
+
system "bin/rake db:setup"
|
|
13
|
+
end
|
data/lib/recoil.rb
CHANGED
|
@@ -5,7 +5,7 @@ require 'recoil/message'
|
|
|
5
5
|
|
|
6
6
|
module Recoil
|
|
7
7
|
mattr_accessor :blacklist_threshold
|
|
8
|
-
@@blacklist_threshold = ->(
|
|
8
|
+
@@blacklist_threshold = ->(scope) { scope.where('created_at > ?', 2.weeks.ago).count > 10 }
|
|
9
9
|
|
|
10
10
|
def self.setup
|
|
11
11
|
yield self
|
data/lib/recoil/email.rb
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
module Recoil
|
|
2
|
-
Email = Struct.new(:
|
|
3
|
-
def
|
|
4
|
-
|
|
2
|
+
Email = Struct.new(:email) do
|
|
3
|
+
def blacklisted?
|
|
4
|
+
Recoil.blacklist_threshold.call(scope)
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
def
|
|
8
|
-
|
|
7
|
+
def to_s
|
|
8
|
+
email
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def scope
|
|
14
|
+
Bounce.where(email: email)
|
|
9
15
|
end
|
|
10
16
|
end
|
|
11
17
|
end
|
data/lib/recoil/interceptor.rb
CHANGED
data/lib/recoil/version.rb
CHANGED
data/recoil.gemspec
CHANGED
|
@@ -4,24 +4,29 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
4
4
|
require 'recoil/version'
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
|
-
s.name =
|
|
7
|
+
s.name = 'recoil'
|
|
8
8
|
s.version = Recoil::VERSION
|
|
9
|
-
s.authors = [
|
|
10
|
-
s.email = [
|
|
9
|
+
s.authors = ['Brightin']
|
|
10
|
+
s.email = ['developers@brightin.nl']
|
|
11
11
|
s.summary = 'Send emails with Amazon SES with automatic blacklisting'
|
|
12
12
|
s.description = 'Send emails with Amazon SES with automatic blacklisting'
|
|
13
|
-
s.homepage =
|
|
14
|
-
s.license =
|
|
13
|
+
s.homepage = 'http://www.brightin.nl'
|
|
14
|
+
s.license = 'MIT'
|
|
15
15
|
|
|
16
16
|
s.files = `git ls-files -z`.split("\x0")
|
|
17
17
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
|
18
|
-
s.require_paths = [
|
|
18
|
+
s.require_paths = ['lib']
|
|
19
19
|
|
|
20
20
|
s.add_dependency 'rails', '>= 4.0'
|
|
21
|
-
s.add_dependency 'aws-sdk', '
|
|
22
|
-
|
|
23
|
-
s.add_development_dependency
|
|
24
|
-
s.add_development_dependency
|
|
25
|
-
s.add_development_dependency
|
|
26
|
-
s.add_development_dependency
|
|
21
|
+
s.add_dependency 'aws-sdk', '< 2'
|
|
22
|
+
|
|
23
|
+
s.add_development_dependency 'brakeman'
|
|
24
|
+
s.add_development_dependency 'rspec'
|
|
25
|
+
s.add_development_dependency 'rspec-rails'
|
|
26
|
+
s.add_development_dependency 'rubocop'
|
|
27
|
+
s.add_development_dependency 'rubocop-rspec'
|
|
28
|
+
s.add_development_dependency 'simplecov'
|
|
29
|
+
s.add_development_dependency 'sqlite3'
|
|
30
|
+
s.add_development_dependency 'vcr', '~> 2.9.0'
|
|
31
|
+
s.add_development_dependency 'webmock', '~> 1.20.0'
|
|
27
32
|
end
|
data/spec/recoil/email_spec.rb
CHANGED
|
@@ -2,26 +2,33 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
module Recoil
|
|
4
4
|
RSpec.describe Email do
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
subject(:email) { Email.new('example@example.com') }
|
|
6
|
+
|
|
7
|
+
def create_bounce(created_at = nil)
|
|
8
|
+
Bounce.create!(email: email.to_s, created_at: created_at)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe '.blacklisted?' do
|
|
12
|
+
it 'defaults to a blacklist emails with more than 10 bounces in the last two weeks' do
|
|
13
|
+
10.times { create_bounce }
|
|
14
|
+
expect(email).not_to be_blacklisted
|
|
8
15
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
16
|
+
create_bounce(3.weeks.ago)
|
|
17
|
+
create_bounce(3.weeks.ago)
|
|
12
18
|
|
|
13
|
-
expect(
|
|
14
|
-
|
|
19
|
+
expect(email).not_to be_blacklisted
|
|
20
|
+
|
|
21
|
+
create_bounce
|
|
22
|
+
expect(email).to be_blacklisted
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'is configurable via the recoil config' do
|
|
26
|
+
original_threshold = Recoil.blacklist_threshold
|
|
15
27
|
|
|
16
|
-
Recoil.
|
|
17
|
-
|
|
18
|
-
end
|
|
19
|
-
expect(Email.new(2)).to be_blacklisted
|
|
20
|
-
expect(Email.new(4)).to be_blacklisted
|
|
28
|
+
Recoil.blacklist_threshold = ->(_scope) { true }
|
|
29
|
+
expect(email).to be_blacklisted
|
|
21
30
|
|
|
22
|
-
Recoil.
|
|
23
|
-
c.blacklist_threshold = original_threshold
|
|
24
|
-
end
|
|
31
|
+
Recoil.blacklist_threshold = original_threshold
|
|
25
32
|
end
|
|
26
33
|
end
|
|
27
34
|
end
|
|
@@ -4,15 +4,15 @@ require 'recoil/message/notification'
|
|
|
4
4
|
RSpec.describe Recoil::Message::Notification do
|
|
5
5
|
it 'performs a http get on the url' do
|
|
6
6
|
message = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
'Type' => 'Notification',
|
|
8
|
+
'MessageId' => 'id',
|
|
9
|
+
'TopicArn' => 'arn:aws:sns:',
|
|
10
|
+
'Message' => "{\"notificationType\":\"Bounce\",\"bounce\":{\"bounceSubType\":\"Undetermined\",\"bounceType\":\"Undetermined\",\"bouncedRecipients\":[{\"emailAddress\":\"example@example.com\"}],\"timestamp\":\"2015-03-05T13:36:37.000Z\",\"feedbackId\":\"ID\"},\"mail\":{\"timestamp\":\"2015-03-05T13:36:34.000Z\",\"destination\":[\"example@example.com\"],\"messageId\":\"ID\",\"source\":\"SES\"}}",
|
|
11
|
+
'Timestamp' => '2015-03-05T13:36:39.002Z',
|
|
12
|
+
'SignatureVersion' => '1',
|
|
13
|
+
'Signature' => 'Sig',
|
|
14
|
+
'SigningCertURL' => 'https',
|
|
15
|
+
'UnsubscribeURL' => 'https'
|
|
16
16
|
}
|
|
17
17
|
expect(Recoil::Bounce).to receive(:create!).with(
|
|
18
18
|
email: 'example@example.com',
|
|
@@ -2,20 +2,20 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
RSpec.describe 'Receive notification', type: :request do
|
|
4
4
|
it 'adds notifications to the database' do
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
body = {
|
|
6
|
+
'Type' => 'Notification',
|
|
7
|
+
'MessageId' => 'id',
|
|
8
|
+
'TopicArn' => 'arn:aws:sns:',
|
|
9
|
+
'Message' => "{\"notificationType\":\"Bounce\",\"bounce\":{\"bounceSubType\":\"Undetermined\",\"bounceType\":\"Undetermined\",\"bouncedRecipients\":[{\"emailAddress\":\"example@example.com\"}],\"timestamp\":\"2015-03-05T13:36:37.000Z\",\"feedbackId\":\"ID\"},\"mail\":{\"timestamp\":\"2015-03-05T13:36:34.000Z\",\"destination\":[\"example@example.com\"],\"messageId\":\"ID\",\"source\":\"SES\"}}",
|
|
10
|
+
'Timestamp' => '2015-03-05T13:36:39.002Z',
|
|
11
|
+
'SignatureVersion' => '1',
|
|
12
|
+
'Signature' => 'Sig',
|
|
13
|
+
'SigningCertURL' => 'https',
|
|
14
|
+
'UnsubscribeURL' => 'https'
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
expect {
|
|
18
|
-
|
|
18
|
+
post '/ses', body.to_json
|
|
19
19
|
}.to change(Recoil::Bounce, :count).by(1)
|
|
20
20
|
|
|
21
21
|
expect(Recoil::Bounce.last.email).to eq 'example@example.com'
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,17 +1,28 @@
|
|
|
1
|
-
ENV[
|
|
1
|
+
ENV['RAILS_ENV'] = 'test'
|
|
2
2
|
ENGINE_RAILS_ROOT = File.join(File.dirname(__FILE__), '../')
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
if ENV['COVERAGE']
|
|
5
|
+
require 'simplecov'
|
|
6
|
+
SimpleCov.start do
|
|
7
|
+
minimum_coverage 90
|
|
8
|
+
add_filter '/spec/'
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require File.expand_path('../dummy/config/environment.rb', __FILE__)
|
|
13
|
+
ActiveRecord::Migrator.migrations_paths = [File.expand_path('../../test/dummy/db/migrate', __FILE__)]
|
|
6
14
|
ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
|
|
7
15
|
require 'vcr'
|
|
8
16
|
require 'rspec/rails'
|
|
9
17
|
|
|
18
|
+
ActiveRecord::Migration.maintain_test_schema!
|
|
19
|
+
|
|
10
20
|
RSpec.configure do |c|
|
|
11
21
|
c.expect_with :rspec do |expectations|
|
|
12
22
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
|
13
23
|
end
|
|
14
24
|
|
|
25
|
+
c.use_transactional_fixtures = true
|
|
15
26
|
c.filter_run :focus
|
|
16
27
|
c.run_all_when_everything_filtered = true
|
|
17
28
|
|
|
@@ -19,9 +30,7 @@ RSpec.configure do |c|
|
|
|
19
30
|
|
|
20
31
|
c.warnings = true
|
|
21
32
|
|
|
22
|
-
if c.files_to_run.one?
|
|
23
|
-
c.default_formatter = 'doc'
|
|
24
|
-
end
|
|
33
|
+
c.default_formatter = 'doc' if c.files_to_run.one?
|
|
25
34
|
|
|
26
35
|
c.order = :random
|
|
27
36
|
|
|
@@ -29,7 +38,7 @@ RSpec.configure do |c|
|
|
|
29
38
|
end
|
|
30
39
|
|
|
31
40
|
VCR.configure do |c|
|
|
32
|
-
c.cassette_library_dir =
|
|
41
|
+
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
|
|
33
42
|
c.hook_into :webmock
|
|
34
43
|
c.configure_rspec_metadata!
|
|
35
44
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: recoil
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Brightin
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-07-
|
|
11
|
+
date: 2015-07-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -28,30 +28,44 @@ dependencies:
|
|
|
28
28
|
name: aws-sdk
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- - "
|
|
31
|
+
- - "<"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '2'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- - "
|
|
38
|
+
- - "<"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: brakeman
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
39
46
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
56
|
name: rspec
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
44
58
|
requirements:
|
|
45
|
-
- - "
|
|
59
|
+
- - ">="
|
|
46
60
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
61
|
+
version: '0'
|
|
48
62
|
type: :development
|
|
49
63
|
prerelease: false
|
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
65
|
requirements:
|
|
52
|
-
- - "
|
|
66
|
+
- - ">="
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
68
|
+
version: '0'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: rspec-rails
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -66,6 +80,48 @@ dependencies:
|
|
|
66
80
|
- - ">="
|
|
67
81
|
- !ruby/object:Gem::Version
|
|
68
82
|
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rubocop
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: rubocop-rspec
|
|
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: simplecov
|
|
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'
|
|
69
125
|
- !ruby/object:Gem::Dependency
|
|
70
126
|
name: sqlite3
|
|
71
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -117,14 +173,19 @@ extra_rdoc_files: []
|
|
|
117
173
|
files:
|
|
118
174
|
- ".gitignore"
|
|
119
175
|
- ".rspec"
|
|
176
|
+
- ".rubocop.yml"
|
|
177
|
+
- ".travis.yml"
|
|
120
178
|
- Gemfile
|
|
121
179
|
- LICENSE.txt
|
|
122
180
|
- README.md
|
|
123
181
|
- Rakefile
|
|
124
182
|
- app/controllers/recoil/notifications_controller.rb
|
|
125
183
|
- app/models/recoil/bounce.rb
|
|
184
|
+
- bin/brakeman
|
|
126
185
|
- bin/rails
|
|
127
186
|
- bin/rspec
|
|
187
|
+
- bin/rubocop
|
|
188
|
+
- bin/setup
|
|
128
189
|
- config/routes.rb
|
|
129
190
|
- db/migrate/20150305152728_add_emails_table.rb
|
|
130
191
|
- lib/recoil.rb
|
|
@@ -173,7 +234,6 @@ files:
|
|
|
173
234
|
- spec/dummy/config/locales/en.yml
|
|
174
235
|
- spec/dummy/config/routes.rb
|
|
175
236
|
- spec/dummy/config/secrets.yml
|
|
176
|
-
- spec/dummy/db/development.sqlite3
|
|
177
237
|
- spec/dummy/db/schema.rb
|
|
178
238
|
- spec/dummy/lib/assets/.keep
|
|
179
239
|
- spec/dummy/public/404.html
|
|
@@ -248,7 +308,6 @@ test_files:
|
|
|
248
308
|
- spec/dummy/config/locales/en.yml
|
|
249
309
|
- spec/dummy/config/routes.rb
|
|
250
310
|
- spec/dummy/config/secrets.yml
|
|
251
|
-
- spec/dummy/db/development.sqlite3
|
|
252
311
|
- spec/dummy/db/schema.rb
|
|
253
312
|
- spec/dummy/lib/assets/.keep
|
|
254
313
|
- spec/dummy/public/404.html
|