acts_as_archival 1.3.0 → 1.4.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 +5 -5
- data/.travis.yml +3 -0
- data/Appraisals +8 -4
- data/CHANGELOG.md +8 -0
- data/README.md +23 -2
- data/acts_as_archival.gemspec +7 -2
- data/gemfiles/rails_4.2.gemfile +2 -1
- data/gemfiles/rails_5.0.gemfile +2 -1
- data/gemfiles/rails_5.1.gemfile +2 -1
- data/gemfiles/{rails_4.1.gemfile → rails_5.2.gemfile} +3 -2
- data/lib/acts_as_archival.rb +2 -0
- data/lib/acts_as_archival/version.rb +1 -1
- data/lib/expected_behavior/acts_as_archival_active_record_methods.rb +19 -0
- data/lib/expected_behavior/association_operation/base.rb +5 -1
- data/test/fixtures/another_polys_holder.rb +11 -0
- data/test/polymorphic_test.rb +23 -0
- data/test/relations_test.rb +63 -0
- data/test/schema.rb +7 -0
- data/test/scope_test.rb +9 -8
- data/test/test_helper.rb +3 -2
- metadata +23 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0453a0ad7518b6953ccc8fd43220c553177f41af9adf664c17ffc79b863ea08b
|
4
|
+
data.tar.gz: 71ae456902253a456381a61b6db990c3406e55c388c0d4cf61997015820b00ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 913f3ba460d1bf0d214f9a1971fae666ab381d28f2177b07f93d6be7dc5d96ea3e9b2446de382292cbe1f861b13c0e7e1ace5dbe2b1787232eef2dde52848431
|
7
|
+
data.tar.gz: 928fb526a60d9c8c244c61a062095ba456be6124a20f6cc34240ec15dee6423229ac6ee179380d33ff946e84a97f98e9fc962b89bc90b84c0007f41e4cb9797e
|
data/.travis.yml
CHANGED
@@ -9,6 +9,7 @@ rvm:
|
|
9
9
|
- 2.2.6
|
10
10
|
- 2.3.3
|
11
11
|
- 2.4.0
|
12
|
+
- 2.5.1
|
12
13
|
|
13
14
|
gemfile:
|
14
15
|
- gemfiles/rails_4.1.gemfile
|
@@ -30,3 +31,5 @@ matrix:
|
|
30
31
|
gemfile: gemfiles/rails_5.1.gemfile
|
31
32
|
- rvm: 2.4.0
|
32
33
|
gemfile: gemfiles/rails_4.1.gemfile
|
34
|
+
- rvm: 2.5.1
|
35
|
+
gemfile: gemfiles/rails_4.1.gemfile
|
data/Appraisals
CHANGED
@@ -1,15 +1,19 @@
|
|
1
|
-
appraise "rails-4.1" do
|
2
|
-
gem "rails", "~> 4.1.0"
|
3
|
-
end
|
4
|
-
|
5
1
|
appraise "rails-4.2" do
|
6
2
|
gem "rails", "~> 4.2.0"
|
3
|
+
gem "sqlite3", "~> 1.3.13"
|
7
4
|
end
|
8
5
|
|
9
6
|
appraise "rails-5.0" do
|
10
7
|
gem "rails", "~> 5.0.0"
|
8
|
+
gem "sqlite3", "~> 1.3.13"
|
11
9
|
end
|
12
10
|
|
13
11
|
appraise "rails-5.1" do
|
14
12
|
gem "rails", "~> 5.1.0"
|
13
|
+
gem "sqlite3", "~> 1.4.1"
|
14
|
+
end
|
15
|
+
|
16
|
+
appraise "rails-5.2" do
|
17
|
+
gem "rails", "~> 5.2.0"
|
18
|
+
gem "sqlite3", "~> 1.4.1"
|
15
19
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.4.0 - July 10, 2019
|
4
|
+
* **BREAKING CHANGE** drop support for rails 4.1
|
5
|
+
* **BUGFIX** polymorphic associations that are archived/unarchived can be acted on safely if they share the same ID.
|
6
|
+
* add support officially for rails 5.2
|
7
|
+
* sqlite upgrades for various rails
|
8
|
+
* new methods `#archive_all!` and `#unarchive_all` that can be called off scopes
|
9
|
+
|
10
|
+
|
3
11
|
## 1.3.0 - October 21, 2017
|
4
12
|
* deprecate `#archive` and `#unarchive` in favor of `#archive!` and `#unarchive!` [#36](https://github.com/expectedbehavior/acts_as_archival/pull/36)
|
5
13
|
|
data/README.md
CHANGED
@@ -79,6 +79,25 @@ r.archived_at # => nil
|
|
79
79
|
r.archived? # => false
|
80
80
|
```
|
81
81
|
|
82
|
+
### Relations
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
Hole.create!
|
86
|
+
Hole.create!
|
87
|
+
Hole.create!
|
88
|
+
|
89
|
+
holes = Hole.all
|
90
|
+
|
91
|
+
# All records in the relation will be archived with the same archive_number.
|
92
|
+
# Dependent/Destroy relationships will be archived, and callbacks will still be honored.
|
93
|
+
holes.archive_all! # => [array of Hole records in the relation]
|
94
|
+
|
95
|
+
holes.first.archive_number # => "b56876de48a5dcfe71b2c13eec15e4a2"
|
96
|
+
holes.last.archive_number # => "b56876de48a5dcfe71b2c13eec15e4a2"
|
97
|
+
|
98
|
+
holes.unarchive_all! # => [array of Hole records in the relation]
|
99
|
+
```
|
100
|
+
|
82
101
|
### Scopes
|
83
102
|
|
84
103
|
``` ruby
|
@@ -144,8 +163,8 @@ end
|
|
144
163
|
|
145
164
|
#### Halting the callback chain
|
146
165
|
|
147
|
-
* Rails 4.
|
148
|
-
* Rails
|
166
|
+
* Rails 4.2 - the callback method should return a `false`/`nil` value.
|
167
|
+
* Rails 5.x - the callback should `throw(:abort)`/`raise(:abort)`.
|
149
168
|
|
150
169
|
## Caveats
|
151
170
|
|
@@ -190,6 +209,8 @@ ActsAsParanoid and PermanentRecords were both inspirations for this:
|
|
190
209
|
* Anthony Panozzo
|
191
210
|
* Aaron Milam
|
192
211
|
* Anton Rieder
|
212
|
+
* Josh Menden
|
213
|
+
* Sergey Gnuskov
|
193
214
|
|
194
215
|
Thanks!
|
195
216
|
|
data/acts_as_archival.gemspec
CHANGED
@@ -14,7 +14,12 @@ Gem::Specification.new do |gem|
|
|
14
14
|
"Dave Woodward",
|
15
15
|
"Miles Sterrett",
|
16
16
|
"James Hill",
|
17
|
-
"Maarten Claes"
|
17
|
+
"Maarten Claes",
|
18
|
+
"Anthony Panozzo",
|
19
|
+
"Aaron Milam",
|
20
|
+
"Anton Rieder",
|
21
|
+
"Josh Menden",
|
22
|
+
"Sergey Gnuskov"]
|
18
23
|
gem.email = ["joel@expectedbehavior.com",
|
19
24
|
"matt@expectedbehavior.com",
|
20
25
|
"jason@expectedbehavior.com",
|
@@ -32,8 +37,8 @@ Gem::Specification.new do |gem|
|
|
32
37
|
gem.add_development_dependency "database_cleaner"
|
33
38
|
gem.add_development_dependency "rake"
|
34
39
|
gem.add_development_dependency "rr"
|
35
|
-
gem.add_development_dependency "sqlite3"
|
36
40
|
gem.add_development_dependency "rubocop", "~> 0.47.1"
|
41
|
+
gem.add_development_dependency "sqlite3"
|
37
42
|
|
38
43
|
gem.description = <<-END
|
39
44
|
*Atomic archiving/unarchiving for ActiveRecord-based apps*
|
data/gemfiles/rails_4.2.gemfile
CHANGED
data/gemfiles/rails_5.0.gemfile
CHANGED
data/gemfiles/rails_5.1.gemfile
CHANGED
data/lib/acts_as_archival.rb
CHANGED
@@ -15,3 +15,5 @@ else
|
|
15
15
|
ActiveRecord::Base.send :include, ExpectedBehavior::ActsAsArchival
|
16
16
|
ActiveRecord::Base.send :include, ExpectedBehavior::ActsAsArchivalActiveRecordMethods
|
17
17
|
end
|
18
|
+
|
19
|
+
ActiveRecord::Relation.send :include, ExpectedBehavior::ActsAsArchivalActiveRecordMethods::ARRelationMethods
|
@@ -36,5 +36,24 @@ module ExpectedBehavior
|
|
36
36
|
|
37
37
|
end
|
38
38
|
|
39
|
+
module ARRelationMethods
|
40
|
+
|
41
|
+
def archive_all!
|
42
|
+
error_message = "The #{klass} must implement 'act_on_archivals' in order to call `archive_all!`"
|
43
|
+
raise NotImplementedError.new(error_message) unless archival?
|
44
|
+
|
45
|
+
head_archive_number = Digest::MD5.hexdigest("#{klass}#{Time.now.utc.to_i}")
|
46
|
+
each { |record| record.archive!(head_archive_number) }.tap { reset }
|
47
|
+
end
|
48
|
+
|
49
|
+
def unarchive_all!
|
50
|
+
error_message = "The #{klass} must implement 'act_on_archivals' in order to call `unarchive_all!`"
|
51
|
+
raise NotImplementedError.new(error_message) unless archival?
|
52
|
+
|
53
|
+
each(&:unarchive!).tap { reset }
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
39
58
|
end
|
40
59
|
end
|
@@ -36,7 +36,11 @@ module ExpectedBehavior
|
|
36
36
|
|
37
37
|
def act_on_association(association)
|
38
38
|
key = association.respond_to?(:foreign_key) ? association.foreign_key : association.primary_key_name
|
39
|
-
|
39
|
+
scope_conditions = { key => model.id }
|
40
|
+
# polymorphic associations need a type so we don't accidentally act on multiple associated objects
|
41
|
+
# that have the same ID
|
42
|
+
scope_conditions[association.type] = model.class.base_class.name if association.type
|
43
|
+
scope = association.klass.where(scope_conditions)
|
40
44
|
act_on_archivals(scope)
|
41
45
|
end
|
42
46
|
|
data/test/polymorphic_test.rb
CHANGED
@@ -11,6 +11,15 @@ class PolymorphicTest < ActiveSupport::TestCase
|
|
11
11
|
assert poly.reload.archived?
|
12
12
|
end
|
13
13
|
|
14
|
+
test "does not archive polymorphic association of different item with same id" do
|
15
|
+
archival = Archival.create!
|
16
|
+
another_polys_holder = AnotherPolysHolder.create!(id: archival.id)
|
17
|
+
poly = another_polys_holder.polys.create!
|
18
|
+
archival.archive!
|
19
|
+
|
20
|
+
assert_not poly.reload.archived?
|
21
|
+
end
|
22
|
+
|
14
23
|
test "unarchive item with polymorphic association" do
|
15
24
|
archive_attributes = {
|
16
25
|
archive_number: "test",
|
@@ -24,4 +33,18 @@ class PolymorphicTest < ActiveSupport::TestCase
|
|
24
33
|
assert_not poly.reload.archived?
|
25
34
|
end
|
26
35
|
|
36
|
+
test "does not unarchive polymorphic association of different item with same id" do
|
37
|
+
archive_attributes = {
|
38
|
+
archive_number: "test",
|
39
|
+
archived_at: Time.now
|
40
|
+
}
|
41
|
+
|
42
|
+
archival = Archival.create!(archive_attributes)
|
43
|
+
another_polys_holder = AnotherPolysHolder.create!(archive_attributes.merge(id: archival.id))
|
44
|
+
poly = another_polys_holder.polys.create!(archive_attributes)
|
45
|
+
archival.unarchive!
|
46
|
+
|
47
|
+
assert poly.reload.archived?
|
48
|
+
end
|
49
|
+
|
27
50
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class RelationsTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
test "archive_all! archives all records in an AR Association" do
|
6
|
+
3.times { Archival.create! }
|
7
|
+
|
8
|
+
archivals = Archival.all
|
9
|
+
archivals.archive_all!
|
10
|
+
assert archivals.first.archived?
|
11
|
+
assert archivals.last.archived?
|
12
|
+
end
|
13
|
+
|
14
|
+
test "archive_all! archives all records with the same archival number" do
|
15
|
+
3.times { Archival.create! }
|
16
|
+
|
17
|
+
archivals = Archival.all
|
18
|
+
archivals.archive_all!
|
19
|
+
assert_equal archivals.first.archive_number, archivals.last.archive_number
|
20
|
+
end
|
21
|
+
|
22
|
+
test "archive_all! archives children records" do
|
23
|
+
3.times do
|
24
|
+
parent = Archival.create!
|
25
|
+
2.times do
|
26
|
+
parent.archivals.create!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
parents = Archival.all
|
31
|
+
parents.archive_all!
|
32
|
+
|
33
|
+
assert parents.first.archivals.first.archived?
|
34
|
+
assert parents.first.archivals.last.archived?
|
35
|
+
end
|
36
|
+
|
37
|
+
test "unarchive_all! unarchives all records in an AR Assocation" do
|
38
|
+
3.times { Archival.create! }
|
39
|
+
|
40
|
+
archivals = Archival.all
|
41
|
+
archivals.archive_all!
|
42
|
+
archivals.unarchive_all!
|
43
|
+
assert_not archivals.first.archived?
|
44
|
+
assert_not archivals.last.archived?
|
45
|
+
end
|
46
|
+
|
47
|
+
test "unarchive_all! unarchives children records" do
|
48
|
+
3.times do
|
49
|
+
parent = Archival.create!
|
50
|
+
2.times do
|
51
|
+
parent.archivals.create!
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
parents = Archival.all
|
56
|
+
parents.archive_all!
|
57
|
+
parents.unarchive_all!
|
58
|
+
|
59
|
+
assert_not parents.first.archivals.first.archived?
|
60
|
+
assert_not parents.first.archivals.last.archived?
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/test/schema.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
ActiveRecord::Schema.define(version: 1) do
|
2
|
+
create_table :another_polys_holders, force: true do |t|
|
3
|
+
t.column :name, :string
|
4
|
+
t.column :archival_id, :integer
|
5
|
+
t.column :archive_number, :string
|
6
|
+
t.column :archived_at, :datetime
|
7
|
+
end
|
8
|
+
|
2
9
|
create_table :archivals, force: true do |t|
|
3
10
|
t.column :name, :string
|
4
11
|
t.column :archival_id, :integer
|
data/test/scope_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require_relative "test_helper"
|
2
3
|
|
3
4
|
class ScopeTest < ActiveSupport::TestCase
|
@@ -50,15 +51,15 @@ class ScopeTest < ActiveSupport::TestCase
|
|
50
51
|
end
|
51
52
|
|
52
53
|
test "table_name is set to 'legacy'" do
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
archived_sql = "SELECT \"legacy\".* FROM \"legacy\"#{spaces}" \
|
54
|
+
archived_sql =
|
55
|
+
if ActiveRecord.version >= Gem::Version.new("5.2.0")
|
56
|
+
"SELECT \"legacy\".* FROM \"legacy\" " \
|
57
|
+
'WHERE "legacy"."archived_at" IS NOT NULL AND "legacy"."archive_number" IS NOT NULL'
|
58
|
+
else
|
59
|
+
"SELECT \"legacy\".* FROM \"legacy\" " \
|
60
60
|
'WHERE ("legacy"."archived_at" IS NOT NULL) AND ("legacy"."archive_number" IS NOT NULL)'
|
61
|
-
|
61
|
+
end
|
62
|
+
unarchived_sql = "SELECT \"legacy\".* FROM \"legacy\" " \
|
62
63
|
'WHERE "legacy"."archived_at" IS NULL AND "legacy"."archive_number" IS NULL'
|
63
64
|
assert_equal archived_sql, ArchivalTableName.archived.to_sql
|
64
65
|
assert_equal unarchived_sql, ArchivalTableName.unarchived.to_sql
|
data/test/test_helper.rb
CHANGED
@@ -50,6 +50,7 @@ def create_test_tables
|
|
50
50
|
end
|
51
51
|
|
52
52
|
BASE_FIXTURE_CLASSES = [
|
53
|
+
:another_polys_holder,
|
53
54
|
:archival,
|
54
55
|
:archival_kid,
|
55
56
|
:archival_grandkid,
|
@@ -79,9 +80,9 @@ def require_test_classes
|
|
79
80
|
end
|
80
81
|
|
81
82
|
fixtures = if ActiveRecord::VERSION::MAJOR >= 4
|
82
|
-
RAILS_5_FIXTURE_CLASSES
|
83
|
+
RAILS_5_FIXTURE_CLASSES
|
83
84
|
else
|
84
|
-
RAILS_4_FIXTURE_CLASSES
|
85
|
+
RAILS_4_FIXTURE_CLASSES
|
85
86
|
end
|
86
87
|
|
87
88
|
fixtures += BASE_FIXTURE_CLASSES
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_archival
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Meador
|
@@ -13,10 +13,15 @@ authors:
|
|
13
13
|
- Miles Sterrett
|
14
14
|
- James Hill
|
15
15
|
- Maarten Claes
|
16
|
+
- Anthony Panozzo
|
17
|
+
- Aaron Milam
|
18
|
+
- Anton Rieder
|
19
|
+
- Josh Menden
|
20
|
+
- Sergey Gnuskov
|
16
21
|
autorequire:
|
17
22
|
bindir: bin
|
18
23
|
cert_chain: []
|
19
|
-
date:
|
24
|
+
date: 2019-07-09 00:00:00.000000000 Z
|
20
25
|
dependencies:
|
21
26
|
- !ruby/object:Gem::Dependency
|
22
27
|
name: activerecord
|
@@ -103,33 +108,33 @@ dependencies:
|
|
103
108
|
- !ruby/object:Gem::Version
|
104
109
|
version: '0'
|
105
110
|
- !ruby/object:Gem::Dependency
|
106
|
-
name:
|
111
|
+
name: rubocop
|
107
112
|
requirement: !ruby/object:Gem::Requirement
|
108
113
|
requirements:
|
109
|
-
- - "
|
114
|
+
- - "~>"
|
110
115
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
116
|
+
version: 0.47.1
|
112
117
|
type: :development
|
113
118
|
prerelease: false
|
114
119
|
version_requirements: !ruby/object:Gem::Requirement
|
115
120
|
requirements:
|
116
|
-
- - "
|
121
|
+
- - "~>"
|
117
122
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
123
|
+
version: 0.47.1
|
119
124
|
- !ruby/object:Gem::Dependency
|
120
|
-
name:
|
125
|
+
name: sqlite3
|
121
126
|
requirement: !ruby/object:Gem::Requirement
|
122
127
|
requirements:
|
123
|
-
- - "
|
128
|
+
- - ">="
|
124
129
|
- !ruby/object:Gem::Version
|
125
|
-
version: 0
|
130
|
+
version: '0'
|
126
131
|
type: :development
|
127
132
|
prerelease: false
|
128
133
|
version_requirements: !ruby/object:Gem::Requirement
|
129
134
|
requirements:
|
130
|
-
- - "
|
135
|
+
- - ">="
|
131
136
|
- !ruby/object:Gem::Version
|
132
|
-
version: 0
|
137
|
+
version: '0'
|
133
138
|
description: |
|
134
139
|
*Atomic archiving/unarchiving for ActiveRecord-based apps*
|
135
140
|
|
@@ -164,10 +169,10 @@ files:
|
|
164
169
|
- README.md
|
165
170
|
- Rakefile
|
166
171
|
- acts_as_archival.gemspec
|
167
|
-
- gemfiles/rails_4.1.gemfile
|
168
172
|
- gemfiles/rails_4.2.gemfile
|
169
173
|
- gemfiles/rails_5.0.gemfile
|
170
174
|
- gemfiles/rails_5.1.gemfile
|
175
|
+
- gemfiles/rails_5.2.gemfile
|
171
176
|
- init.rb
|
172
177
|
- lib/acts_as_archival.rb
|
173
178
|
- lib/acts_as_archival/version.rb
|
@@ -184,6 +189,7 @@ files:
|
|
184
189
|
- test/callbacks_test.rb
|
185
190
|
- test/column_test.rb
|
186
191
|
- test/deep_nesting_test.rb
|
192
|
+
- test/fixtures/another_polys_holder.rb
|
187
193
|
- test/fixtures/application_record.rb
|
188
194
|
- test/fixtures/application_record_row.rb
|
189
195
|
- test/fixtures/archival.rb
|
@@ -201,6 +207,7 @@ files:
|
|
201
207
|
- test/fixtures/readonly_when_archived.rb
|
202
208
|
- test/polymorphic_test.rb
|
203
209
|
- test/readonly_when_archived_test.rb
|
210
|
+
- test/relations_test.rb
|
204
211
|
- test/responds_test.rb
|
205
212
|
- test/schema.rb
|
206
213
|
- test/scope_test.rb
|
@@ -225,8 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
232
|
- !ruby/object:Gem::Version
|
226
233
|
version: '0'
|
227
234
|
requirements: []
|
228
|
-
|
229
|
-
rubygems_version: 2.5.1
|
235
|
+
rubygems_version: 3.0.3
|
230
236
|
signing_key:
|
231
237
|
specification_version: 4
|
232
238
|
summary: Atomic archiving/unarchiving for ActiveRecord-based apps
|
@@ -238,6 +244,7 @@ test_files:
|
|
238
244
|
- test/callbacks_test.rb
|
239
245
|
- test/column_test.rb
|
240
246
|
- test/deep_nesting_test.rb
|
247
|
+
- test/fixtures/another_polys_holder.rb
|
241
248
|
- test/fixtures/application_record.rb
|
242
249
|
- test/fixtures/application_record_row.rb
|
243
250
|
- test/fixtures/archival.rb
|
@@ -255,6 +262,7 @@ test_files:
|
|
255
262
|
- test/fixtures/readonly_when_archived.rb
|
256
263
|
- test/polymorphic_test.rb
|
257
264
|
- test/readonly_when_archived_test.rb
|
265
|
+
- test/relations_test.rb
|
258
266
|
- test/responds_test.rb
|
259
267
|
- test/schema.rb
|
260
268
|
- test/scope_test.rb
|