deferring 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.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Appraisals +15 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +236 -0
- data/Rakefile +11 -0
- data/deferring.gemspec +31 -0
- data/gemfiles/rails_30.gemfile +7 -0
- data/gemfiles/rails_30.gemfile.lock +51 -0
- data/gemfiles/rails_32.gemfile +7 -0
- data/gemfiles/rails_32.gemfile.lock +53 -0
- data/gemfiles/rails_4.gemfile +7 -0
- data/gemfiles/rails_4.gemfile.lock +58 -0
- data/gemfiles/rails_40.gemfile +7 -0
- data/gemfiles/rails_40.gemfile.lock +59 -0
- data/gemfiles/rails_41.gemfile +7 -0
- data/gemfiles/rails_41.gemfile.lock +58 -0
- data/lib/deferring.rb +150 -0
- data/lib/deferring/deferred_association.rb +187 -0
- data/lib/deferring/version.rb +5 -0
- data/spec/lib/deferring_spec.rb +536 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/active_record.rb +28 -0
- data/spec/support/models.rb +67 -0
- data/spec/support/rails_versions.rb +13 -0
- metadata +175 -0
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'support/active_record'
|
2
|
+
require 'deferring'
|
3
|
+
require 'support/models'
|
4
|
+
require 'support/rails_versions'
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
8
|
+
config.run_all_when_everything_filtered = true
|
9
|
+
config.filter_run :focus
|
10
|
+
|
11
|
+
# Run specs in random order to surface order dependencies. If you find an
|
12
|
+
# order dependency and want to debug it, you can fix the order by providing
|
13
|
+
# the seed, which is printed after each run.
|
14
|
+
# --seed 1234
|
15
|
+
config.order = 'random'
|
16
|
+
|
17
|
+
# Rollback all the database changes after each spec, poor man's
|
18
|
+
# DatabaseCleaner :-)
|
19
|
+
config.around do |example|
|
20
|
+
ActiveRecord::Base.transaction do
|
21
|
+
example.run
|
22
|
+
raise ActiveRecord::Rollback
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
|
5
|
+
|
6
|
+
ActiveRecord::Schema.define version: 0 do
|
7
|
+
create_table :people do |t|
|
8
|
+
t.string :name
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
|
12
|
+
create_table :people_teams, id: false do |t|
|
13
|
+
t.integer :person_id
|
14
|
+
t.integer :team_id
|
15
|
+
end
|
16
|
+
|
17
|
+
create_table :teams do |t|
|
18
|
+
t.string :name
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table :issues do |t|
|
23
|
+
t.string :subject
|
24
|
+
t.integer :person_id
|
25
|
+
t.timestamps
|
26
|
+
end
|
27
|
+
end
|
28
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
class Person < ActiveRecord::Base
|
4
|
+
|
5
|
+
deferred_has_and_belongs_to_many :teams, before_add: :add_team,
|
6
|
+
after_add: :added_team
|
7
|
+
set_callback :deferred_team_remove, :before, :before_removing_team
|
8
|
+
set_callback :deferred_team_remove, :after, :after_removing_team
|
9
|
+
|
10
|
+
deferred_accepts_nested_attributes_for :teams, allow_destroy: true
|
11
|
+
|
12
|
+
deferred_has_many :issues
|
13
|
+
set_callback :deferred_issue_remove, :before, :before_removing_issue
|
14
|
+
set_callback :deferred_issue_remove, :after, :after_removing_issue
|
15
|
+
|
16
|
+
validates_presence_of :name
|
17
|
+
|
18
|
+
def audit_log
|
19
|
+
@audit_log ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
def log(audit_line)
|
23
|
+
audit_log << audit_line
|
24
|
+
audit_log
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_team(team)
|
28
|
+
log("Before adding team #{team.id}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def added_team(team)
|
32
|
+
log("After adding team #{team.id}")
|
33
|
+
end
|
34
|
+
|
35
|
+
def before_removing_team
|
36
|
+
log("Before removing team #{@deferred_team_remove.id}")
|
37
|
+
end
|
38
|
+
|
39
|
+
def after_removing_team
|
40
|
+
log("After removing team #{@deferred_team_remove.id}")
|
41
|
+
end
|
42
|
+
|
43
|
+
def before_adding_issue
|
44
|
+
log("Before removing issue #{@deferred_issue_add.id}")
|
45
|
+
end
|
46
|
+
|
47
|
+
def after_adding_issue
|
48
|
+
log("After removing issue #{@deferred_issue_add.id}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Team < ActiveRecord::Base
|
53
|
+
has_and_belongs_to_many :people
|
54
|
+
|
55
|
+
validates :name, presence: true
|
56
|
+
validate :no_more_than_two_people_per_team
|
57
|
+
|
58
|
+
def no_more_than_two_people_per_team
|
59
|
+
if people.length > 2
|
60
|
+
errors.add(:people, "A maximum of two persons per team is allowed")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Issue < ActiveRecord::Base
|
66
|
+
belongs_to :person
|
67
|
+
end
|
metadata
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: deferring
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Robin Roestenburg
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-05-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>'
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>'
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: sqlite3
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: appraisal
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: ! "\n The Deferring gem makes it possible to defer saving ActiveRecord\n
|
111
|
+
\ associations until the parent object is saved.\n "
|
112
|
+
email:
|
113
|
+
- robin@roestenburg.io
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- .rspec
|
120
|
+
- Appraisals
|
121
|
+
- Gemfile
|
122
|
+
- LICENSE.txt
|
123
|
+
- README.md
|
124
|
+
- Rakefile
|
125
|
+
- deferring.gemspec
|
126
|
+
- gemfiles/rails_30.gemfile
|
127
|
+
- gemfiles/rails_30.gemfile.lock
|
128
|
+
- gemfiles/rails_32.gemfile
|
129
|
+
- gemfiles/rails_32.gemfile.lock
|
130
|
+
- gemfiles/rails_4.gemfile
|
131
|
+
- gemfiles/rails_4.gemfile.lock
|
132
|
+
- gemfiles/rails_40.gemfile
|
133
|
+
- gemfiles/rails_40.gemfile.lock
|
134
|
+
- gemfiles/rails_41.gemfile
|
135
|
+
- gemfiles/rails_41.gemfile.lock
|
136
|
+
- lib/deferring.rb
|
137
|
+
- lib/deferring/deferred_association.rb
|
138
|
+
- lib/deferring/version.rb
|
139
|
+
- spec/lib/deferring_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
141
|
+
- spec/support/active_record.rb
|
142
|
+
- spec/support/models.rb
|
143
|
+
- spec/support/rails_versions.rb
|
144
|
+
homepage: http://github.com/robinroestenburg/delay_many
|
145
|
+
licenses:
|
146
|
+
- MIT
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ! '>='
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
+
none: false
|
159
|
+
requirements:
|
160
|
+
- - ! '>='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
requirements: []
|
164
|
+
rubyforge_project:
|
165
|
+
rubygems_version: 1.8.23
|
166
|
+
signing_key:
|
167
|
+
specification_version: 3
|
168
|
+
summary: Defer saving ActiveRecord associations until parent is saved
|
169
|
+
test_files:
|
170
|
+
- spec/lib/deferring_spec.rb
|
171
|
+
- spec/spec_helper.rb
|
172
|
+
- spec/support/active_record.rb
|
173
|
+
- spec/support/models.rb
|
174
|
+
- spec/support/rails_versions.rb
|
175
|
+
has_rdoc:
|