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 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
@@ -0,0 +1,14 @@
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
12
+
13
+ /Gemfile.lock
14
+ /spec/example_project/db/*.sqlite3
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
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
@@ -0,0 +1,7 @@
1
+ # Used for testing with ActiveRecord
2
+ db:
3
+ seeds: spec/example_project/db/seeds.rb
4
+ migrate: spec/example_project/db/migrate
5
+ schema: spec/example_project/db/schema.rb
6
+ config:
7
+ database: spec/example_project/db/config.yml
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.0
5
+ before_install: gem install bundler -v 1.16.1
6
+ before_script: RAILS_ENV=test bundle exec rake db:drop db:create db:migrate || echo 'Ignore schema.rb error https://source.xing.com/growth/inquiry/pull/92'
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 batch_dependent_associations.gemspec
6
+ gemspec
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,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,3 @@
1
+ module BatchDependentAssociations
2
+ VERSION = "0.1.0".freeze
3
+ end
@@ -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: []