batch_dependent_associations 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +117 -0
- data/.standalone_migrations +7 -0
- data/.travis.yml +6 -0
- data/Gemfile +6 -0
- data/Guardfile +26 -0
- data/README.md +89 -0
- data/Rakefile +63 -0
- data/batch_dependent_associations.gemspec +36 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/batch_dependent_associations/version.rb +3 -0
- data/lib/batch_dependent_associations.rb +21 -0
- metadata +253 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 84ea82085a532496f98b03cbf2094f19f900e880
|
4
|
+
data.tar.gz: c7839250e2b082423feb83aaaa3306bf93350a36
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 351491b7ee686f32aace431102c249188ee7dc14e04e7b589f8ea3dfa179d911d21a88da2a646c887fd5b8ba1c1b3ac316085af0aed7a73ec0dc600850d81f2a
|
7
|
+
data.tar.gz: 33dcc47696517143d348164b2385ced50ec22c7ecca3c6b248c21379f0bf83506dae3a4998a5c3defe3b916e7c201a90240485c24c2c11c3190342a88dfe6dc8
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
AllCops:
|
2
|
+
DisabledByDefault: true
|
3
|
+
DisplayCopNames: true
|
4
|
+
Exclude:
|
5
|
+
- doc/**/*
|
6
|
+
- vendor/**/*
|
7
|
+
- spec/fixtures/**/*
|
8
|
+
TargetRubyVersion: 2.3
|
9
|
+
Layout/CaseIndentation:
|
10
|
+
Enabled: true
|
11
|
+
IndentOneStep: false
|
12
|
+
Layout/EmptyLineBetweenDefs:
|
13
|
+
Enabled: true
|
14
|
+
AllowAdjacentOneLineDefs: true
|
15
|
+
Layout/EmptyLines:
|
16
|
+
Enabled: true
|
17
|
+
Layout/EmptyLinesAroundBeginBody:
|
18
|
+
Enabled: true
|
19
|
+
Layout/EmptyLinesAroundBlockBody:
|
20
|
+
Enabled: true
|
21
|
+
EnforcedStyle: no_empty_lines
|
22
|
+
Layout/EmptyLinesAroundClassBody:
|
23
|
+
Enabled: true
|
24
|
+
Layout/EmptyLinesAroundMethodBody:
|
25
|
+
Enabled: true
|
26
|
+
Layout/EmptyLinesAroundModuleBody:
|
27
|
+
Enabled: true
|
28
|
+
Layout/ExtraSpacing:
|
29
|
+
Exclude:
|
30
|
+
- Gemfile
|
31
|
+
Layout/FirstParameterIndentation:
|
32
|
+
Enabled: true
|
33
|
+
Layout/IndentationConsistency:
|
34
|
+
Enabled: true
|
35
|
+
Layout/IndentationWidth:
|
36
|
+
Enabled: true
|
37
|
+
Exclude:
|
38
|
+
- spec/**/*
|
39
|
+
Layout/MultilineMethodCallIndentation:
|
40
|
+
EnforcedStyle: indented_relative_to_receiver
|
41
|
+
IndentationWidth: 2
|
42
|
+
Layout/MultilineOperationIndentation:
|
43
|
+
EnforcedStyle: indented
|
44
|
+
Layout/SpaceAfterColon:
|
45
|
+
Enabled: true
|
46
|
+
Layout/SpaceAfterComma:
|
47
|
+
Enabled: true
|
48
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
49
|
+
Enabled: true
|
50
|
+
Layout/SpaceAroundKeyword:
|
51
|
+
Enabled: true
|
52
|
+
Layout/SpaceAroundOperators:
|
53
|
+
Enabled: true
|
54
|
+
Layout/SpaceBeforeBlockBraces:
|
55
|
+
Enabled: true
|
56
|
+
Layout/SpaceBeforeFirstArg:
|
57
|
+
Enabled: true
|
58
|
+
Layout/SpaceInsideBlockBraces:
|
59
|
+
Enabled: true
|
60
|
+
Layout/SpaceInsideHashLiteralBraces:
|
61
|
+
Enabled: true
|
62
|
+
Layout/SpaceInsideParens:
|
63
|
+
Enabled: true
|
64
|
+
Layout/Tab:
|
65
|
+
Enabled: true
|
66
|
+
Layout/TrailingBlankLines:
|
67
|
+
Enabled: true
|
68
|
+
Layout/TrailingWhitespace:
|
69
|
+
Enabled: true
|
70
|
+
Lint/EndAlignment:
|
71
|
+
Enabled: true
|
72
|
+
EnforcedStyleAlignWith: variable
|
73
|
+
Lint/RequireParentheses:
|
74
|
+
Enabled: true
|
75
|
+
Metrics/AbcSize:
|
76
|
+
Max: 62
|
77
|
+
Metrics/ClassLength:
|
78
|
+
CountComments: false
|
79
|
+
Max: 1000
|
80
|
+
Metrics/LineLength:
|
81
|
+
Exclude:
|
82
|
+
- spec/**/*
|
83
|
+
Max: 318
|
84
|
+
Metrics/MethodLength:
|
85
|
+
Max: 70
|
86
|
+
Metrics/ModuleLength:
|
87
|
+
CountComments: false
|
88
|
+
Max: 1000
|
89
|
+
Rails:
|
90
|
+
Enabled: true
|
91
|
+
Style/AndOr:
|
92
|
+
EnforcedStyle: conditionals
|
93
|
+
Style/BlockDelimiters:
|
94
|
+
EnforcedStyle: braces_for_chaining
|
95
|
+
Style/BracesAroundHashParameters:
|
96
|
+
Enabled: true
|
97
|
+
EnforcedStyle: context_dependent
|
98
|
+
Style/ConditionalAssignment:
|
99
|
+
EnforcedStyle: assign_to_condition
|
100
|
+
Style/HashSyntax:
|
101
|
+
Enabled: true
|
102
|
+
Style/MethodDefParentheses:
|
103
|
+
Enabled: true
|
104
|
+
Style/RedundantReturn:
|
105
|
+
AllowMultipleReturnValues: true
|
106
|
+
Enabled: true
|
107
|
+
Style/RegexpLiteral:
|
108
|
+
EnforcedStyle: percent_r
|
109
|
+
Style/Semicolon:
|
110
|
+
AllowAsExpressionSeparator: true
|
111
|
+
Enabled: true
|
112
|
+
Style/StringLiterals:
|
113
|
+
Enabled: true
|
114
|
+
EnforcedStyle: double_quotes
|
115
|
+
Style/TrivialAccessors:
|
116
|
+
Enabled: true
|
117
|
+
ExactNameMatch: true
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
guard "bundler" do
|
2
|
+
watch("Gemfile")
|
3
|
+
end
|
4
|
+
|
5
|
+
guard :rubocop, cli: "--auto-correct" do
|
6
|
+
watch(%r{.+\.rb$})
|
7
|
+
watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
|
8
|
+
end
|
9
|
+
|
10
|
+
rspec_prefix = File.file?("bin/spring") ? "bundle exec spring" : "bundle exec"
|
11
|
+
guard "rspec", cmd: "#{rspec_prefix} rspec #{ENV['FOCUS']}", all_after_pass: ENV["FOCUS"].nil? do
|
12
|
+
watch(%r{^spec/(.+)_spec\.rb$})
|
13
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
14
|
+
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
15
|
+
watch(%r{^app/models/(.+)\.rb$}) { |m| "spec/builders/#{m[1]}_builder_spec.rb" }
|
16
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
17
|
+
watch("config/routes.rb") { "spec/routing" }
|
18
|
+
watch("app/controllers/application_controller.rb") { "spec/controllers" }
|
19
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
20
|
+
end
|
21
|
+
|
22
|
+
guard "rspec", cmd: "#{rspec_prefix} rspec #{ENV['FOCUS']}" do
|
23
|
+
watch(%r{^spec/(.+)_helper.rb}) { "spec" }
|
24
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
25
|
+
watch(%r{^spec/factories/(.+)\.rb$}) { "spec" }
|
26
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# BatchDependentAssociations
|
2
|
+
|
3
|
+
#### Use dependent associations with Rails safely, with automatic batching.
|
4
|
+
|
5
|
+
| Branch | Status |
|
6
|
+
| ------ | ------ |
|
7
|
+
| Release | [![Build Status](https://travis-ci.org/thisismydesign/batch_dependent_associations.svg?branch=release)](https://travis-ci.org/thisismydesign/batch_dependent_associations) [![Coverage Status](https://coveralls.io/repos/github/thisismydesign/batch_dependent_associations/badge.svg?branch=release)](https://coveralls.io/github/thisismydesign/batch_dependent_associations?branch=release) [![Gem Version](https://badge.fury.io/rb/batch_dependent_associations.svg)](https://badge.fury.io/rb/batch_dependent_associations) [![Total Downloads](http://ruby-gem-downloads-badge.herokuapp.com/batch_dependent_associations?type=total)](https://rubygems.org/gems/batch_dependent_associations) |
|
8
|
+
| Development | [![Build Status](https://travis-ci.org/thisismydesign/batch_dependent_associations.svg?branch=master)](https://travis-ci.org/thisismydesign/batch_dependent_associations) [![Coverage Status](https://coveralls.io/repos/github/thisismydesign/batch_dependent_associations/badge.svg?branch=master)](https://coveralls.io/github/thisismydesign/batch_dependent_associations?branch=master) |
|
9
|
+
|
10
|
+
As the [discussion](https://github.com/rails/rails/issues/22510#issuecomment-162448557) in [this](https://github.com/rails/rails/issues/22510) open Rails issue from 2015 points out `dependent: :(destroy|delete_all)` loads the entire relation and does not batch. This makes the usage of this otherwise great feature very dangerous and disencouraged at the very least because of possible OOM issues.
|
11
|
+
|
12
|
+
This gem is the sweet spot between the memory safety of custom batching and the convenience of letting Rails take care of associations. When included, it [prepends](https://medium.com/appaloosa-store-engineering/caution-when-using-before-destroy-with-model-association-71600b8bfed2) a `before_destroy` hook that removes all `has_many` associations with appropriate `dependent` options. It will call `destroy` or `delete` if `dependent` is set to `:destroy` or `:delete_all` respectively. `nullify` and `restrict_with_(error|exception)` options don't remove associations. For the documentation of `dependent` options refer to [Active Record Associations 4.2.2.4](http://guides.rubyonrails.org/association_basics.html) (currently it incorrectly lists `delete` instead of `delete_all`).
|
13
|
+
|
14
|
+
## Installation
|
15
|
+
|
16
|
+
Add this line to your application's Gemfile:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
gem 'batch_dependent_associations'
|
20
|
+
```
|
21
|
+
|
22
|
+
And then execute:
|
23
|
+
|
24
|
+
$ bundle
|
25
|
+
|
26
|
+
Or install it yourself as:
|
27
|
+
|
28
|
+
$ gem install batch_dependent_associations
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
require "batch_dependent_associations"
|
34
|
+
|
35
|
+
class SafePerson < ActiveRecord::Base
|
36
|
+
include BatchDependentAssociations
|
37
|
+
|
38
|
+
has_many :bank_accounts, dependent: :destroy
|
39
|
+
has_many :friends, dependent: :delete_all
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
Is equivalent to:
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
class SafePerson < ActiveRecord::Base
|
47
|
+
has_many :bank_accounts, dependent: :destroy
|
48
|
+
has_many :friends, dependent: :delete_all
|
49
|
+
|
50
|
+
before_destroy :batch_dependent_associations, prepend: true
|
51
|
+
|
52
|
+
def batch_dependent_associations
|
53
|
+
bank_accounts.find_each(batch_size: 5, &:destroy)
|
54
|
+
friends.find_each(batch_size: 5, &:delete)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
```
|
58
|
+
|
59
|
+
## Development
|
60
|
+
|
61
|
+
```bash
|
62
|
+
git clone git@github.com:thisismydesign/batch_dependent_associations.git
|
63
|
+
bundle
|
64
|
+
RAILS_ENV=test bundle exec rake db:drop db:create db:migrate # Ignore schema.rb error: https://source.xing.com/growth/inquiry/pull/92
|
65
|
+
bundle exec rake
|
66
|
+
```
|
67
|
+
|
68
|
+
## Feedback
|
69
|
+
|
70
|
+
Any feedback is much appreciated.
|
71
|
+
|
72
|
+
I can only tailor this project to fit use-cases I know about - which are usually my own ones. If you find that this might be the right direction to solve your problem too but you find that it's suboptimal or lacks features don't hesitate to contact me.
|
73
|
+
|
74
|
+
Please let me know if you make use of this project so that I can prioritize further efforts.
|
75
|
+
|
76
|
+
## Conventions
|
77
|
+
|
78
|
+
This gem is developed using the following conventions:
|
79
|
+
- [Bundler's guide for developing a gem](http://bundler.io/v1.14/guides/creating_gem.html)
|
80
|
+
- [Better Specs](http://www.betterspecs.org/)
|
81
|
+
- [Semantic versioning](http://semver.org/)
|
82
|
+
- [RubyGems' guide on gem naming](http://guides.rubygems.org/name-your-gem/)
|
83
|
+
- [RFC memo about key words used to Indicate Requirement Levels](https://tools.ietf.org/html/rfc2119)
|
84
|
+
- [Bundler improvements](https://github.com/thisismydesign/bundler-improvements)
|
85
|
+
- [Minimal dependencies](http://www.mikeperham.com/2016/02/09/kill-your-dependencies/)
|
86
|
+
|
87
|
+
## Contributing
|
88
|
+
|
89
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/thisismydesign/batch_dependent_associations.
|
data/Rakefile
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
|
4
|
+
require "standalone_migrations"
|
5
|
+
StandaloneMigrations::Tasks.load_tasks
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
|
+
|
9
|
+
require "logger"
|
10
|
+
@logger = Logger.new(STDOUT)
|
11
|
+
|
12
|
+
desc "Check if source can be required and is correctly required"
|
13
|
+
task :require do
|
14
|
+
dir = File.dirname(__FILE__)
|
15
|
+
gemspec = load_gemspec(dir)
|
16
|
+
|
17
|
+
# Order is important, assert_can_be_required should be run first
|
18
|
+
assert_can_be_required(dir, gemspec)
|
19
|
+
check_source_files_required(dir, gemspec)
|
20
|
+
check_source_files_included(dir, gemspec)
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_gemspec(_dir)
|
24
|
+
require "bundler/setup"
|
25
|
+
Gem::Specification.find do |spec|
|
26
|
+
spec.full_gem_path.include?(File.dirname(__FILE__))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_source_files_required(dir, gemspec)
|
31
|
+
require_gem(gemspec)
|
32
|
+
ruby_files = Dir.glob("#{dir}/**/*.rb").reject { |f| f.include?("/spec/") }
|
33
|
+
required_ruby_files = $LOADED_FEATURES.select { |f| f.include?(dir) }
|
34
|
+
(ruby_files - required_ruby_files).each do |file|
|
35
|
+
@logger.warn("Source file not required when loading gem: #{file.sub("#{dir}/", '')}")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_source_files_included(dir, gemspec)
|
40
|
+
ruby_files_relative = Dir.glob("#{dir}/**/*.rb").reject { |f| f.include?("/spec/") }.map { |f| f.sub("#{dir}/", "") }
|
41
|
+
(ruby_files_relative - gemspec.files.select { |f| f.end_with?(".rb") }).each do |file|
|
42
|
+
@logger.warn("File ignored when building gem because it's not added to git: #{file}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def assert_can_be_required(dir, gemspec)
|
47
|
+
local_load_paths = $LOAD_PATH.select { |path| path.include?(dir) }
|
48
|
+
$LOAD_PATH.reject! { |path| local_load_paths.include?(path) }
|
49
|
+
begin
|
50
|
+
require_gem(gemspec)
|
51
|
+
rescue LoadError => e
|
52
|
+
@logger.error("Gem source cannot be required relatively: #{e}")
|
53
|
+
raise
|
54
|
+
ensure
|
55
|
+
$LOAD_PATH.push(*local_load_paths)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def require_gem(gemspec)
|
60
|
+
require_relative "lib/#{gemspec.name.tr('-', '/')}"
|
61
|
+
end
|
62
|
+
|
63
|
+
task default: %i[require spec]
|
@@ -0,0 +1,36 @@
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "batch_dependent_associations/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "batch_dependent_associations"
|
7
|
+
spec.version = BatchDependentAssociations::VERSION
|
8
|
+
spec.authors = ["thisismydesign"]
|
9
|
+
spec.email = ["thisismydesign@users.noreply.github.com"]
|
10
|
+
|
11
|
+
spec.summary = ""
|
12
|
+
spec.homepage = ""
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
15
|
+
f.match(%r{^(test|spec|features)/})
|
16
|
+
end
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "activesupport"
|
22
|
+
|
23
|
+
spec.add_development_dependency "standalone_migrations"
|
24
|
+
spec.add_development_dependency "sqlite3"
|
25
|
+
spec.add_development_dependency "db-query-matchers"
|
26
|
+
spec.add_development_dependency "autowow"
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
28
|
+
spec.add_development_dependency "coveralls"
|
29
|
+
spec.add_development_dependency "guard-bundler"
|
30
|
+
spec.add_development_dependency "guard-rspec"
|
31
|
+
spec.add_development_dependency "guard-rubocop"
|
32
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
33
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
+
spec.add_development_dependency "rubocop"
|
35
|
+
spec.add_development_dependency "rubocop-rspec"
|
36
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "batch_dependent_associations"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "active_support"
|
2
|
+
|
3
|
+
require_relative "batch_dependent_associations/version"
|
4
|
+
|
5
|
+
module BatchDependentAssociations
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
# Why prepend: https://medium.com/appaloosa-store-engineering/caution-when-using-before-destroy-with-model-association-71600b8bfed2
|
10
|
+
before_destroy :batch_dependent_associations, prepend: true
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def batch_dependent_associations
|
16
|
+
self.class.reflect_on_all_associations(:has_many).select { |v| v.options.has_key?(:dependent) && [:destroy, :delete_all].include?(v.options[:dependent]) }.each do |association|
|
17
|
+
send(association.name).find_each(batch_size: 5, &:destroy) if association.options[:dependent].eql?(:destroy)
|
18
|
+
send(association.name).find_each(batch_size: 5, &:delete) if association.options[:dependent].eql?(:delete_all)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,253 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: batch_dependent_associations
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- thisismydesign
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-04-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: standalone_migrations
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sqlite3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::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'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: db-query-matchers
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: autowow
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.16'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.16'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: coveralls
|
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-bundler
|
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
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: guard-rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: guard-rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rake
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '10.0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '10.0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rspec
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '3.0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '3.0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: rubocop
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: rubocop-rspec
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
description:
|
210
|
+
email:
|
211
|
+
- thisismydesign@users.noreply.github.com
|
212
|
+
executables: []
|
213
|
+
extensions: []
|
214
|
+
extra_rdoc_files: []
|
215
|
+
files:
|
216
|
+
- ".gitignore"
|
217
|
+
- ".rspec"
|
218
|
+
- ".rubocop.yml"
|
219
|
+
- ".standalone_migrations"
|
220
|
+
- ".travis.yml"
|
221
|
+
- Gemfile
|
222
|
+
- Guardfile
|
223
|
+
- README.md
|
224
|
+
- Rakefile
|
225
|
+
- batch_dependent_associations.gemspec
|
226
|
+
- bin/console
|
227
|
+
- bin/setup
|
228
|
+
- lib/batch_dependent_associations.rb
|
229
|
+
- lib/batch_dependent_associations/version.rb
|
230
|
+
homepage: ''
|
231
|
+
licenses: []
|
232
|
+
metadata: {}
|
233
|
+
post_install_message:
|
234
|
+
rdoc_options: []
|
235
|
+
require_paths:
|
236
|
+
- lib
|
237
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
238
|
+
requirements:
|
239
|
+
- - ">="
|
240
|
+
- !ruby/object:Gem::Version
|
241
|
+
version: '0'
|
242
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
243
|
+
requirements:
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: '0'
|
247
|
+
requirements: []
|
248
|
+
rubyforge_project:
|
249
|
+
rubygems_version: 2.5.1
|
250
|
+
signing_key:
|
251
|
+
specification_version: 4
|
252
|
+
summary: ''
|
253
|
+
test_files: []
|