kakurenbo 0.2.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/kakurenbo.gemspec +1 -1
- data/lib/kakurenbo.rb +4 -0
- data/lib/kakurenbo/core.rb +16 -38
- data/lib/kakurenbo/mixin_ar_associations.rb +23 -0
- data/lib/kakurenbo/mixin_ar_base.rb +0 -6
- data/lib/kakurenbo/mixin_ar_relation.rb +1 -1
- data/lib/kakurenbo/version.rb +1 -1
- data/spec/kakurenbo/cores/associations_spec.rb +24 -1
- data/spec/kakurenbo/mixin_ar_associations_spec.rb +122 -0
- data/spec/spec_helper.rb +1 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8fceaba359613cdffd663005dc7029090c9f381
|
4
|
+
data.tar.gz: 0d9f9a7cb444c4822c789701dc468df8fbee40b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d8d53fe4d2766e9e1785cf4d3a4b45b044de1ac47c16091c5efdab73f938c6665279bca49fa93af598b92f9505f3d398777ee7e58026b610e9df05bb57de6e3
|
7
|
+
data.tar.gz: 3f179d2bbc02c7c94bce01147bf2d928af1e4c3cfa6fbeb9559a923dbf997a226e3e92a361b53c857c3007b6ff354d1ff27488a5d63c946e12dd17bfebbe9059
|
data/.travis.yml
CHANGED
data/kakurenbo.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
|
12
12
|
spec.summary = <<-EOF
|
13
13
|
provides soft delete.
|
14
|
-
Kakurenbo is a re-implementation of paranoia and acts_as_paranoid for Rails4
|
14
|
+
Kakurenbo is a re-implementation of paranoia and acts_as_paranoid for Rails4.
|
15
15
|
implemented a function that other gems are not enough.
|
16
16
|
EOF
|
17
17
|
|
data/lib/kakurenbo.rb
CHANGED
@@ -5,6 +5,7 @@ require "active_record"
|
|
5
5
|
# require kakurenbo modules.
|
6
6
|
require "kakurenbo/version"
|
7
7
|
require "kakurenbo/mixin_ar_base"
|
8
|
+
require "kakurenbo/mixin_ar_associations"
|
8
9
|
require "kakurenbo/mixin_ar_relation"
|
9
10
|
require "kakurenbo/core"
|
10
11
|
|
@@ -16,3 +17,6 @@ ActiveRecord::Base.send :include, Kakurenbo::MixinARBase
|
|
16
17
|
|
17
18
|
# Kakurenbo Mixin to ActiveRecord::Relation.
|
18
19
|
ActiveRecord::Relation.send :include, Kakurenbo::MixinARRelation
|
20
|
+
|
21
|
+
# Kakurenbo Mixin to ActiveRecord::Associations
|
22
|
+
ActiveRecord::Associations::Association.send :include, Kakurenbo::MixinARAssociations::Association
|
data/lib/kakurenbo/core.rb
CHANGED
@@ -78,7 +78,7 @@ module Kakurenbo
|
|
78
78
|
else
|
79
79
|
return true if destroyed?
|
80
80
|
with_transaction_returning_status do
|
81
|
-
destroy_at =
|
81
|
+
destroy_at = Time.now
|
82
82
|
run_callbacks(:destroy){ update_column kakurenbo_column, destroy_at; self }
|
83
83
|
end
|
84
84
|
end
|
@@ -121,8 +121,7 @@ module Kakurenbo
|
|
121
121
|
|
122
122
|
with_transaction_returning_status do
|
123
123
|
run_callbacks(:restore) do
|
124
|
-
|
125
|
-
restore_associated_records(parent_deleted_at) if options[:recursive]
|
124
|
+
restore_associated_records if options[:recursive]
|
126
125
|
update_column kakurenbo_column, nil
|
127
126
|
self
|
128
127
|
end
|
@@ -140,50 +139,29 @@ module Kakurenbo
|
|
140
139
|
end
|
141
140
|
|
142
141
|
private
|
143
|
-
#
|
142
|
+
# All Scope of dependent association.
|
144
143
|
#
|
145
|
-
# @
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
resource.with_deleted
|
153
|
-
else
|
154
|
-
[resource]
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
# Calls the given block once for each dependent destroy records.
|
159
|
-
# @note Only call the class of paranoid.
|
160
|
-
#
|
161
|
-
# @param &block [Proc{|record|.. }] execute block.
|
162
|
-
def each_dependent_destroy_records(&block)
|
163
|
-
self.class.reflect_on_all_associations.each do |association|
|
164
|
-
next unless association.options[:dependent] == :destroy
|
165
|
-
next unless association.klass.paranoid?
|
166
|
-
|
167
|
-
associated_records(association).each &block
|
168
|
-
end
|
144
|
+
# @return [Array<ActiveRecord::Relation>] array of dependent association.
|
145
|
+
def dependent_association_scopes
|
146
|
+
self.class.reflect_on_all_associations.select { |reflection|
|
147
|
+
reflection.options[:dependent] == :destroy and reflection.klass.paranoid?
|
148
|
+
}.map { |reflection|
|
149
|
+
self.association(reflection.name).tap {|assoc| assoc.reset_scope }.scope
|
150
|
+
}
|
169
151
|
end
|
170
152
|
|
171
153
|
# Hard-Destroy associated records.
|
172
154
|
def hard_destroy_associated_records
|
173
|
-
|
174
|
-
|
155
|
+
dependent_association_scopes.each do |scope|
|
156
|
+
scope.with_deleted.destroy_all(nil, hard: true)
|
175
157
|
end
|
176
158
|
end
|
177
159
|
|
178
160
|
# Restore associated records.
|
179
|
-
# @note
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
each_dependent_destroy_records do |record|
|
184
|
-
next unless record.destroyed?
|
185
|
-
next unless parent_deleted_at <= record.send(kakurenbo_column)
|
186
|
-
record.restore!
|
161
|
+
# @note Record will be restored if record#deleted_at is newer than parent_deleted_at.
|
162
|
+
def restore_associated_records
|
163
|
+
dependent_association_scopes.each do |scope|
|
164
|
+
scope.restore_all
|
187
165
|
end
|
188
166
|
end
|
189
167
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Kakurenbo
|
2
|
+
module MixinARAssociations
|
3
|
+
module Association
|
4
|
+
# Extend ClassMethods after include.
|
5
|
+
def self.included(base_class)
|
6
|
+
base_class.class_eval { alias_method_chain :scope, :deleted }
|
7
|
+
end
|
8
|
+
|
9
|
+
# Load deleted model, if owner is deleted.
|
10
|
+
def scope_with_deleted
|
11
|
+
if @owner.paranoid? and @owner.destroyed? and klass.paranoid?
|
12
|
+
col = klass.arel_table[klass.kakurenbo_column]
|
13
|
+
owner_deleted_at = @owner.send(@owner.class.kakurenbo_column)
|
14
|
+
condition = col.eq(nil).or(col.gteq(owner_deleted_at))
|
15
|
+
|
16
|
+
scope_without_deleted.with_deleted.where(condition)
|
17
|
+
else
|
18
|
+
scope_without_deleted
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -34,9 +34,6 @@ module Kakurenbo
|
|
34
34
|
alias_method :destroy, :hard_destroy
|
35
35
|
alias_method :destroy!, :hard_destroy!
|
36
36
|
|
37
|
-
singleton_class.send(:alias_method, :delete, :hard_delete)
|
38
|
-
singleton_class.send(:alias_method, :delete_all, :hard_delete_all)
|
39
|
-
|
40
37
|
define_singleton_method(:paranoid?) { false }
|
41
38
|
end
|
42
39
|
end
|
@@ -55,9 +52,6 @@ module Kakurenbo
|
|
55
52
|
alias_method :hard_destroy, :destroy
|
56
53
|
alias_method :hard_destroy!, :destroy!
|
57
54
|
|
58
|
-
singleton_class.send(:alias_method, :hard_delete, :delete)
|
59
|
-
singleton_class.send(:alias_method, :hard_delete_all, :delete_all)
|
60
|
-
|
61
55
|
class_attribute :kakurenbo_column
|
62
56
|
include Kakurenbo::Core
|
63
57
|
end
|
data/lib/kakurenbo/version.rb
CHANGED
@@ -11,6 +11,11 @@ describe Kakurenbo::Core do
|
|
11
11
|
create_temp_table(:paranoid_child_models) { |t| t.integer :parent_model_id; t.datetime :deleted_at }
|
12
12
|
create_temp_table(:paranoid_single_child_models) { |t| t.integer :parent_model_id; t.datetime :deleted_at }
|
13
13
|
|
14
|
+
subject :subject_hard_delete do
|
15
|
+
create_unrelated_children
|
16
|
+
expect { parent.destroy!(hard: true) }.to change{ child_class.with_deleted.count }.by(children.length * -1)
|
17
|
+
end
|
18
|
+
|
14
19
|
subject :subject_soft_delete do
|
15
20
|
create_unrelated_children
|
16
21
|
expect { parent.destroy! }.to change(child_class, :count).by(children.length * -1)
|
@@ -91,6 +96,12 @@ describe Kakurenbo::Core do
|
|
91
96
|
end
|
92
97
|
end
|
93
98
|
|
99
|
+
context 'when parent is hard-destroyed' do
|
100
|
+
it 'related children will be hard-destroyed.' do
|
101
|
+
subject_hard_delete
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
94
105
|
context 'when parent is restored' do
|
95
106
|
it 'related children will be restored.' do
|
96
107
|
subject_restore
|
@@ -125,6 +136,12 @@ describe Kakurenbo::Core do
|
|
125
136
|
end
|
126
137
|
end
|
127
138
|
|
139
|
+
context 'when parent is hard-destroyed' do
|
140
|
+
it 'related children will be hard-destroyed.' do
|
141
|
+
subject_hard_delete
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
128
145
|
context 'when parent is restored' do
|
129
146
|
it 'related children will be restored.' do
|
130
147
|
subject_restore
|
@@ -142,7 +159,7 @@ describe Kakurenbo::Core do
|
|
142
159
|
end
|
143
160
|
end
|
144
161
|
|
145
|
-
describe 'ParanoidSingleChildModel(
|
162
|
+
describe 'ParanoidSingleChildModel(belongs_to)' do
|
146
163
|
let :child_class do
|
147
164
|
ParanoidSingleChildModel
|
148
165
|
end
|
@@ -159,6 +176,12 @@ describe Kakurenbo::Core do
|
|
159
176
|
end
|
160
177
|
end
|
161
178
|
|
179
|
+
context 'when parent is hard-destroyed' do
|
180
|
+
it 'related children will be hard-destroyed.' do
|
181
|
+
subject_hard_delete
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
162
185
|
context 'when parent is restored' do
|
163
186
|
it 'related children will be restored.' do
|
164
187
|
subject_restore
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
#
|
4
|
+
# NormalChildModel [has_many]
|
5
|
+
# ParentModel < ParanoidChildModel [has_many]
|
6
|
+
# ParanoidSingleChildModel [has_many][belongs_to]
|
7
|
+
# ParentChild - ParanoidChildModel [intermediate]
|
8
|
+
#
|
9
|
+
describe Kakurenbo::MixinARAssociations::Association do
|
10
|
+
create_temp_table(:parent_models) { |t| t.integer :child_belongs_to_id; t.datetime :deleted_at }
|
11
|
+
create_temp_table(:normal_child_models) { |t| t.integer :parent_model_id }
|
12
|
+
create_temp_table(:paranoid_child_models) { |t| t.integer :parent_model_id; t.datetime :deleted_at }
|
13
|
+
create_temp_table(:paranoid_single_child_models) { |t| t.integer :parent_model_id; t.datetime :deleted_at }
|
14
|
+
create_temp_table(:parents_children) { |t| t.integer :parent_model_id; t.integer :paranoid_child_model_id; t.datetime :deleted_at }
|
15
|
+
|
16
|
+
subject do
|
17
|
+
parent.destroy!
|
18
|
+
end
|
19
|
+
|
20
|
+
let :parent do
|
21
|
+
parent_class.create!
|
22
|
+
end
|
23
|
+
|
24
|
+
let! :parents_child_class do
|
25
|
+
ParentsChild.tap do |parents_child_class|
|
26
|
+
parents_child_class.belongs_to :parent_model
|
27
|
+
parents_child_class.belongs_to :paranoid_child_model
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
let :parent_class do
|
32
|
+
ParentModel.tap do |parent_class|
|
33
|
+
parent_class.has_many :normal_child_models, :dependent => :destroy
|
34
|
+
parent_class.has_many :paranoid_child_models, :dependent => :destroy
|
35
|
+
|
36
|
+
parent_class.has_one :child_has_one, :class_name => :ParanoidSingleChildModel, :dependent => :destroy
|
37
|
+
parent_class.belongs_to :child_belongs_to, :class_name => :ParanoidSingleChildModel, :dependent => :destroy
|
38
|
+
|
39
|
+
parent_class.has_many :parents_children, :dependent => :destroy
|
40
|
+
parent_class.has_many :children, :through => :parents_children, :source => :paranoid_child_model
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'NormalChildModel(has_many)' do
|
45
|
+
let! :children do
|
46
|
+
[
|
47
|
+
parent.normal_child_models.create!,
|
48
|
+
parent.normal_child_models.create!,
|
49
|
+
parent.normal_child_models.create!,
|
50
|
+
]
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when destroyed parent is loaded' do
|
54
|
+
it 'related children will be not loaded.' do
|
55
|
+
expect(subject.normal_child_models.size).to eq(0)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'ParanoidChildModel(has_many)' do
|
61
|
+
let! :children do
|
62
|
+
[
|
63
|
+
parent.paranoid_child_models.create!,
|
64
|
+
parent.paranoid_child_models.create!,
|
65
|
+
parent.paranoid_child_models.create!,
|
66
|
+
]
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when destroyed parent is loaded' do
|
70
|
+
it 'related children will be loaded.' do
|
71
|
+
expect(subject.paranoid_child_models(true)).to contain_exactly(*children)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'ParanoidSingleChildModel(has_one)' do
|
77
|
+
let! :children do
|
78
|
+
[
|
79
|
+
parent.create_child_has_one!
|
80
|
+
]
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'when destroyed parent is loaded' do
|
84
|
+
it 'related children will be loaded.' do
|
85
|
+
expect(subject.child_has_one(true)).to eq(*children)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe 'ParanoidSingleChildModel(belongs_to)' do
|
91
|
+
let! :children do
|
92
|
+
[
|
93
|
+
parent.create_child_belongs_to!
|
94
|
+
]
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when destroyed parent is loaded' do
|
98
|
+
it 'related children will be loaded.' do
|
99
|
+
expect(subject.child_belongs_to(true)).to eq(*children)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Not Support ActiveRecord < 4.1
|
105
|
+
unless ActiveRecord::VERSION::STRING < "4.1"
|
106
|
+
describe 'ParanoidChild(intermediate table)' do
|
107
|
+
let! :children do
|
108
|
+
[
|
109
|
+
parent.children.create!,
|
110
|
+
parent.children.create!,
|
111
|
+
parent.children.create!,
|
112
|
+
]
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'when destroyed parent is loaded' do
|
116
|
+
it 'related children will be loaded.' do
|
117
|
+
expect(subject.children(true)).to contain_exactly(*children)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kakurenbo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alfa-jpn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- kakurenbo.gemspec
|
117
117
|
- lib/kakurenbo.rb
|
118
118
|
- lib/kakurenbo/core.rb
|
119
|
+
- lib/kakurenbo/mixin_ar_associations.rb
|
119
120
|
- lib/kakurenbo/mixin_ar_base.rb
|
120
121
|
- lib/kakurenbo/mixin_ar_relation.rb
|
121
122
|
- lib/kakurenbo/version.rb
|
@@ -123,6 +124,7 @@ files:
|
|
123
124
|
- spec/kakurenbo/cores/callbacks_spec.rb
|
124
125
|
- spec/kakurenbo/cores/core_spec.rb
|
125
126
|
- spec/kakurenbo/cores/scopes_spec.rb
|
127
|
+
- spec/kakurenbo/mixin_ar_associations_spec.rb
|
126
128
|
- spec/kakurenbo/mixin_ar_base_spec.rb
|
127
129
|
- spec/kakurenbo/mixin_ar_relation_spec.rb
|
128
130
|
- spec/spec_helper.rb
|
@@ -150,12 +152,13 @@ rubygems_version: 2.2.2
|
|
150
152
|
signing_key:
|
151
153
|
specification_version: 4
|
152
154
|
summary: provides soft delete. Kakurenbo is a re-implementation of paranoia and acts_as_paranoid
|
153
|
-
for Rails4
|
155
|
+
for Rails4. implemented a function that other gems are not enough.
|
154
156
|
test_files:
|
155
157
|
- spec/kakurenbo/cores/associations_spec.rb
|
156
158
|
- spec/kakurenbo/cores/callbacks_spec.rb
|
157
159
|
- spec/kakurenbo/cores/core_spec.rb
|
158
160
|
- spec/kakurenbo/cores/scopes_spec.rb
|
161
|
+
- spec/kakurenbo/mixin_ar_associations_spec.rb
|
159
162
|
- spec/kakurenbo/mixin_ar_base_spec.rb
|
160
163
|
- spec/kakurenbo/mixin_ar_relation_spec.rb
|
161
164
|
- spec/spec_helper.rb
|