acts_as_archival 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -1
- data/.rubocop.yml +71 -0
- data/.rubocop_todo.yml +98 -0
- data/.travis.yml +23 -0
- data/Appraisals +7 -7
- data/CHANGELOG.md +29 -0
- data/Gemfile.lock +70 -0
- data/README.md +49 -19
- data/Rakefile +6 -3
- data/acts_as_archival.gemspec +23 -17
- data/gemfiles/rails_5.2.gemfile +8 -0
- data/gemfiles/{rails_4.2.gemfile → rails_6.0.gemfile} +2 -2
- data/gemfiles/{rails_5.0.gemfile → rails_6.1.gemfile} +2 -2
- data/lib/acts_as_archival/version.rb +3 -1
- data/lib/acts_as_archival.rb +2 -0
- data/lib/expected_behavior/acts_as_archival.rb +111 -77
- data/lib/expected_behavior/acts_as_archival_active_record_methods.rb +29 -4
- data/lib/expected_behavior/association_operation/archive.rb +1 -1
- data/lib/expected_behavior/association_operation/base.rb +12 -9
- data/lib/expected_behavior/association_operation/unarchive.rb +2 -2
- data/script/setup +0 -3
- data/test/ambiguous_table_test.rb +3 -1
- data/test/application_record_test.rb +5 -3
- data/test/associations_test.rb +19 -17
- data/test/basic_test.rb +16 -14
- data/test/callbacks_test.rb +8 -6
- data/test/column_test.rb +8 -6
- data/test/deep_nesting_test.rb +6 -4
- data/test/fixtures/another_polys_holder.rb +11 -0
- data/test/fixtures/application_record.rb +2 -0
- data/test/fixtures/application_record_row.rb +2 -0
- data/test/fixtures/archival.rb +9 -7
- data/test/fixtures/archival_grandkid.rb +2 -0
- data/test/fixtures/archival_kid.rb +3 -1
- data/test/fixtures/archival_table_name.rb +2 -0
- data/test/fixtures/callback_archival_4.rb +2 -0
- data/test/fixtures/callback_archival_5.rb +4 -1
- data/test/fixtures/exploder.rb +2 -0
- data/test/fixtures/independent_archival.rb +2 -0
- data/test/fixtures/missing_archive_number.rb +2 -0
- data/test/fixtures/missing_archived_at.rb +2 -0
- data/test/fixtures/plain.rb +2 -0
- data/test/fixtures/poly.rb +3 -1
- data/test/fixtures/readonly_when_archived.rb +3 -1
- data/test/polymorphic_test.rb +29 -4
- data/test/readonly_when_archived_test.rb +6 -4
- data/test/relations_test.rb +63 -0
- data/test/responds_test.rb +8 -6
- data/test/schema.rb +64 -77
- data/test/scope_test.rb +28 -23
- data/test/test_helper.rb +47 -40
- data/test/through_association_test.rb +4 -2
- data/test/transaction_test.rb +7 -58
- metadata +33 -50
- data/gemfiles/rails_4.1.gemfile +0 -8
- data/script/db_setup +0 -51
- data/test/database.yml +0 -26
- data/test/fixtures/mass_attribute_protected.rb +0 -7
- data/test/fixtures/mysql_archival.rb +0 -10
- data/test/fixtures/mysql_exploder.rb +0 -9
- data/test/fixtures/pg_archival.rb +0 -10
- data/test/fixtures/pg_exploder.rb +0 -9
- data/test/mass_attribute_test.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1f9de47af7c26b8d78744f6f150523da886cc3e72f3adfdf2c43489f92dd29d7
|
4
|
+
data.tar.gz: eb8710dc7dd90dfb876b83e61f9d08ac01003d734950f9554abd24d91e428875
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e16b3e95c07251f5f5c1dcd2b960e76ffc3f41241c7601b9cb7923e1f89bbc3c4aa21be46ad2b55ebce502933a3d6171ed1a57874857001a653db984822d8176
|
7
|
+
data.tar.gz: 9b818f82e6072dde8e0f7e1a621dd7593b918cb696738a0b1750b2357ab732250e18ae5d008813f3b8dc8204447df0f37e98561532343105c89682cd46a9a3c8
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
Exclude:
|
5
|
+
- vendor/**/*
|
6
|
+
- gemfiles/**/*
|
7
|
+
TargetRubyVersion: 2.4
|
8
|
+
NewCops: enable
|
9
|
+
|
10
|
+
|
11
|
+
################
|
12
|
+
# Layout Rules #
|
13
|
+
################
|
14
|
+
Layout/EmptyLinesAroundClassBody:
|
15
|
+
EnforcedStyle: empty_lines_except_namespace
|
16
|
+
|
17
|
+
Layout/EmptyLinesAroundModuleBody:
|
18
|
+
EnforcedStyle: empty_lines_except_namespace
|
19
|
+
|
20
|
+
Layout/LineLength:
|
21
|
+
Max: 140
|
22
|
+
|
23
|
+
Layout/SpaceInsideHashLiteralBraces:
|
24
|
+
EnforcedStyle: space
|
25
|
+
|
26
|
+
|
27
|
+
################
|
28
|
+
# Code Metrics #
|
29
|
+
################
|
30
|
+
Metrics/BlockLength:
|
31
|
+
Exclude:
|
32
|
+
- 'test/schema.rb'
|
33
|
+
- '*.gemspec'
|
34
|
+
|
35
|
+
Metrics/AbcSize:
|
36
|
+
Max: 25
|
37
|
+
|
38
|
+
Metrics/MethodLength:
|
39
|
+
Max: 10
|
40
|
+
CountComments: false
|
41
|
+
|
42
|
+
|
43
|
+
###############
|
44
|
+
# Style Rules #
|
45
|
+
###############
|
46
|
+
Style/Alias:
|
47
|
+
EnforcedStyle: prefer_alias_method
|
48
|
+
|
49
|
+
# ¯\_(ツ)_/¯
|
50
|
+
# ʕノ•ᴥ•ʔノ ︵ ┻━┻
|
51
|
+
# ( ͡° ͜ʖ ͡°)
|
52
|
+
Style/AsciiComments:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
Style/Documentation:
|
56
|
+
Enabled: false
|
57
|
+
|
58
|
+
Style/DoubleNegation:
|
59
|
+
Enabled: false
|
60
|
+
|
61
|
+
Style/FrozenStringLiteralComment:
|
62
|
+
EnforcedStyle: never
|
63
|
+
|
64
|
+
Style/HashSyntax:
|
65
|
+
EnforcedStyle: ruby19
|
66
|
+
|
67
|
+
Style/RaiseArgs:
|
68
|
+
EnforcedStyle: compact
|
69
|
+
|
70
|
+
Style/StringLiterals:
|
71
|
+
EnforcedStyle: double_quotes
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2020-04-28 17:17:25 +0200 using RuboCop version 0.82.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 2
|
10
|
+
# Cop supports --auto-correct.
|
11
|
+
Layout/EmptyLineAfterMagicComment:
|
12
|
+
Exclude:
|
13
|
+
- 'acts_as_archival.gemspec'
|
14
|
+
- 'test/scope_test.rb'
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
# Cop supports --auto-correct.
|
18
|
+
# Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator.
|
19
|
+
# SupportedStylesForExponentOperator: space, no_space
|
20
|
+
Layout/SpaceAroundOperators:
|
21
|
+
Exclude:
|
22
|
+
- 'test/deep_nesting_test.rb'
|
23
|
+
|
24
|
+
# Offense count: 1
|
25
|
+
# Cop supports --auto-correct.
|
26
|
+
Lint/ScriptPermission:
|
27
|
+
Exclude:
|
28
|
+
- 'Rakefile'
|
29
|
+
|
30
|
+
# Offense count: 7
|
31
|
+
# Cop supports --auto-correct.
|
32
|
+
Lint/SendWithMixinArgument:
|
33
|
+
Exclude:
|
34
|
+
- 'init.rb'
|
35
|
+
- 'lib/acts_as_archival.rb'
|
36
|
+
|
37
|
+
# Offense count: 1
|
38
|
+
# Configuration parameters: EnforcedStyle.
|
39
|
+
# SupportedStyles: lowercase, uppercase
|
40
|
+
Naming/HeredocDelimiterCase:
|
41
|
+
Exclude:
|
42
|
+
- 'lib/expected_behavior/acts_as_archival.rb'
|
43
|
+
|
44
|
+
# Offense count: 3
|
45
|
+
# Configuration parameters: ForbiddenDelimiters.
|
46
|
+
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
|
47
|
+
Naming/HeredocDelimiterNaming:
|
48
|
+
Exclude:
|
49
|
+
- 'acts_as_archival.gemspec'
|
50
|
+
- 'lib/expected_behavior/acts_as_archival.rb'
|
51
|
+
|
52
|
+
# Offense count: 12
|
53
|
+
# Configuration parameters: EnforcedStyle, AllowModifiersOnSymbols.
|
54
|
+
# SupportedStyles: inline, group
|
55
|
+
Style/AccessModifierDeclarations:
|
56
|
+
Exclude:
|
57
|
+
- 'lib/expected_behavior/acts_as_archival.rb'
|
58
|
+
- 'test/fixtures/callback_archival_4.rb'
|
59
|
+
- 'test/fixtures/callback_archival_5.rb'
|
60
|
+
|
61
|
+
# Offense count: 2
|
62
|
+
# Cop supports --auto-correct.
|
63
|
+
Style/Encoding:
|
64
|
+
Exclude:
|
65
|
+
- 'acts_as_archival.gemspec'
|
66
|
+
- 'test/scope_test.rb'
|
67
|
+
|
68
|
+
# Offense count: 1
|
69
|
+
Style/EvalWithLocation:
|
70
|
+
Exclude:
|
71
|
+
- 'lib/expected_behavior/acts_as_archival.rb'
|
72
|
+
|
73
|
+
# Offense count: 1
|
74
|
+
# Cop supports --auto-correct.
|
75
|
+
Style/ExpandPathArguments:
|
76
|
+
Exclude:
|
77
|
+
- 'acts_as_archival.gemspec'
|
78
|
+
|
79
|
+
# Offense count: 1
|
80
|
+
# Cop supports --auto-correct.
|
81
|
+
Style/IfUnlessModifier:
|
82
|
+
Exclude:
|
83
|
+
- 'test/test_helper.rb'
|
84
|
+
|
85
|
+
# Offense count: 1
|
86
|
+
# Cop supports --auto-correct.
|
87
|
+
# Configuration parameters: EnforcedStyle.
|
88
|
+
# SupportedStyles: implicit, explicit
|
89
|
+
Style/RescueStandardError:
|
90
|
+
Exclude:
|
91
|
+
- 'lib/expected_behavior/acts_as_archival.rb'
|
92
|
+
|
93
|
+
# Offense count: 3
|
94
|
+
# Cop supports --auto-correct.
|
95
|
+
# Configuration parameters: MinSize.
|
96
|
+
# SupportedStyles: percent, brackets
|
97
|
+
Style/SymbolArray:
|
98
|
+
EnforcedStyle: brackets
|
data/.travis.yml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
|
4
|
+
rvm:
|
5
|
+
- 2.4
|
6
|
+
- 2.5
|
7
|
+
- 2.6
|
8
|
+
- 2.7
|
9
|
+
|
10
|
+
gemfile:
|
11
|
+
- gemfiles/rails_5.0.gemfile
|
12
|
+
- gemfiles/rails_5.1.gemfile
|
13
|
+
- gemfiles/rails_5.2.gemfile
|
14
|
+
- gemfiles/rails_6.0.gemfile
|
15
|
+
|
16
|
+
before_install:
|
17
|
+
- gem update --system
|
18
|
+
|
19
|
+
matrix:
|
20
|
+
fast_finish: true
|
21
|
+
exclude:
|
22
|
+
- gemfile: gemfiles/rails_6.0.gemfile
|
23
|
+
rvm: 2.4
|
data/Appraisals
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
appraise "rails-
|
2
|
-
gem "rails", "~>
|
3
|
-
gem "
|
1
|
+
appraise "rails-5.2" do
|
2
|
+
gem "rails", "~> 5.2.0"
|
3
|
+
gem "sqlite3", "~> 1.4.1"
|
4
4
|
end
|
5
5
|
|
6
|
-
appraise "rails-
|
7
|
-
gem "rails", "~>
|
6
|
+
appraise "rails-6.0" do
|
7
|
+
gem "rails", "~> 6.0.0"
|
8
8
|
end
|
9
9
|
|
10
|
-
appraise "rails-
|
11
|
-
gem "rails", "~>
|
10
|
+
appraise "rails-6.1" do
|
11
|
+
gem "rails", "~> 6.1"
|
12
12
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 2.0.0 – (UNRELEASED)
|
4
|
+
|
5
|
+
* **BREAKING CHANGE** Drop support for Rails 4.2
|
6
|
+
* **BREAKING CHANGE** Drop support for Rails 5.0
|
7
|
+
* **BREAKING CHANGE** Drop support for Rails 5.1
|
8
|
+
* **BREAKING CHANGE** Removed deprecated methods
|
9
|
+
* Fix Rails 6 deprecation warnings
|
10
|
+
* Add offical support for Rails 6.1
|
11
|
+
|
12
|
+
## 1.4.0 - July 10, 2019
|
13
|
+
* **BREAKING CHANGE** drop support for rails 4.1
|
14
|
+
* **BREAKING CHANGE** drop support for Ruby <2.4
|
15
|
+
* **BUGFIX** polymorphic associations that are archived/unarchived can be acted on safely if they share the same ID.
|
16
|
+
* add support officially for rails 5.2
|
17
|
+
* sqlite upgrades for various rails
|
18
|
+
* new methods `#archive_all!` and `#unarchive_all` that can be called off scopes
|
19
|
+
|
20
|
+
|
21
|
+
## 1.3.0 - October 21, 2017
|
22
|
+
* deprecate `#archive` and `#unarchive` in favor of `#archive!` and `#unarchive!` [#36](https://github.com/expectedbehavior/acts_as_archival/pull/36)
|
23
|
+
|
24
|
+
## 1.2.0 - March 19, 2017
|
25
|
+
* **BREAKING CHANGE** the utility instance and class method `is_archival?` is now `archival?`. `is_archival?` is deprecated and will be removed
|
26
|
+
* hard dependency on rails 4.1+ – this shouldn't break anything since it was de facto before, but worth mentioning
|
27
|
+
* minor refactoring through most code
|
28
|
+
* much work done to make automatic checks worthwhile (travis/rubocop)
|
29
|
+
* general test cleanup
|
30
|
+
* drop hard dependency on mysql and postresql in tests
|
31
|
+
|
3
32
|
## 1.1.1 - April 10, 2016
|
4
33
|
* Update the way the `::unarchived` scope is generated using `::not` instead of manually building SQL, which should be better for complex queries
|
5
34
|
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
acts_as_archival (2.0.0)
|
5
|
+
activerecord (>= 5.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (6.1.4.1)
|
11
|
+
activesupport (= 6.1.4.1)
|
12
|
+
activerecord (6.1.4.1)
|
13
|
+
activemodel (= 6.1.4.1)
|
14
|
+
activesupport (= 6.1.4.1)
|
15
|
+
activesupport (6.1.4.1)
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
|
+
i18n (>= 1.6, < 2)
|
18
|
+
minitest (>= 5.1)
|
19
|
+
tzinfo (~> 2.0)
|
20
|
+
zeitwerk (~> 2.3)
|
21
|
+
appraisal (2.2.0)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
thor (>= 0.14.0)
|
25
|
+
assertions-eb (1.7.3)
|
26
|
+
ast (2.4.0)
|
27
|
+
concurrent-ruby (1.1.9)
|
28
|
+
database_cleaner (1.8.4)
|
29
|
+
i18n (1.8.10)
|
30
|
+
concurrent-ruby (~> 1.0)
|
31
|
+
jaro_winkler (1.5.4)
|
32
|
+
minitest (5.14.4)
|
33
|
+
parallel (1.19.1)
|
34
|
+
parser (2.7.1.1)
|
35
|
+
ast (~> 2.4.0)
|
36
|
+
rainbow (3.0.0)
|
37
|
+
rake (13.0.1)
|
38
|
+
rexml (3.2.4)
|
39
|
+
rr (1.2.1)
|
40
|
+
rubocop (0.82.0)
|
41
|
+
jaro_winkler (~> 1.5.1)
|
42
|
+
parallel (~> 1.10)
|
43
|
+
parser (>= 2.7.0.1)
|
44
|
+
rainbow (>= 2.2.2, < 4.0)
|
45
|
+
rexml
|
46
|
+
ruby-progressbar (~> 1.7)
|
47
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
48
|
+
ruby-progressbar (1.10.1)
|
49
|
+
sqlite3 (1.4.2)
|
50
|
+
thor (1.0.1)
|
51
|
+
tzinfo (2.0.4)
|
52
|
+
concurrent-ruby (~> 1.0)
|
53
|
+
unicode-display_width (1.7.0)
|
54
|
+
zeitwerk (2.4.2)
|
55
|
+
|
56
|
+
PLATFORMS
|
57
|
+
ruby
|
58
|
+
|
59
|
+
DEPENDENCIES
|
60
|
+
acts_as_archival!
|
61
|
+
appraisal
|
62
|
+
assertions-eb
|
63
|
+
database_cleaner
|
64
|
+
rake
|
65
|
+
rr
|
66
|
+
rubocop (~> 0.82.0)
|
67
|
+
sqlite3
|
68
|
+
|
69
|
+
BUNDLED WITH
|
70
|
+
2.1.4
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# ActsAsArchival
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/expectedbehavior/acts_as_archival.svg?branch=master)](https://travis-ci.org/expectedbehavior/acts_as_archival)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/acts_as_archival.svg)](https://badge.fury.io/rb/acts_as_archival)
|
5
|
+
|
3
6
|
Atomically archive object trees in your activerecord models.
|
4
7
|
|
5
8
|
We had the problem that acts_as_paranoid and similar plugins/gems
|
@@ -38,7 +41,7 @@ _If you're stuck on Rails 4.0x/3x/2x, check out the older tags/branches, which a
|
|
38
41
|
``` ruby
|
39
42
|
class Hole < ActiveRecord::Base
|
40
43
|
acts_as_archival
|
41
|
-
has_many :rats, :
|
44
|
+
has_many :rats, dependent: :destroy
|
42
45
|
end
|
43
46
|
|
44
47
|
class Rat < ActiveRecord::Base
|
@@ -51,11 +54,11 @@ end
|
|
51
54
|
``` ruby
|
52
55
|
h = Hole.create #
|
53
56
|
h.archived? # => false
|
54
|
-
h.archive
|
57
|
+
h.archive! # => true
|
55
58
|
h.archived? # => true
|
56
59
|
h.archive_number # => "b56876de48a5dcfe71b2c13eec15e4a2"
|
57
60
|
h.archived_at # => Thu, 01 Jan 2012 01:49:21 -0400
|
58
|
-
h.unarchive
|
61
|
+
h.unarchive! # => true
|
59
62
|
h.archived? # => false
|
60
63
|
h.archive_number # => nil
|
61
64
|
h.archived_at # => nil
|
@@ -66,23 +69,42 @@ h.archived_at # => nil
|
|
66
69
|
``` ruby
|
67
70
|
h = Hole.create #
|
68
71
|
r = h.rats.create #
|
69
|
-
h.archive
|
72
|
+
h.archive! # => true
|
70
73
|
h.archive_number # => "b56876de48a5dcfe71b2c13eec15e4a2"
|
71
|
-
r.
|
74
|
+
r.archived_at # => Thu, 01 Jan 2012 01:52:12 -0400
|
72
75
|
r.archived? # => true
|
73
|
-
h.unarchive
|
76
|
+
h.unarchive! # => true
|
74
77
|
h.archive_number # => nil
|
75
|
-
r.
|
78
|
+
r.archived_at # => nil
|
76
79
|
r.archived? # => false
|
77
80
|
```
|
78
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
|
+
|
79
101
|
### Scopes
|
80
102
|
|
81
103
|
``` ruby
|
82
104
|
h = Hole.create
|
83
105
|
Hole.archived.size # => 0
|
84
106
|
Hole.unarchived.size # => 1
|
85
|
-
h.archive
|
107
|
+
h.archive!
|
86
108
|
Hole.archived.size # => 1
|
87
109
|
Hole.unarchived.size # => 0
|
88
110
|
```
|
@@ -91,23 +113,23 @@ Hole.unarchived.size # => 0
|
|
91
113
|
|
92
114
|
``` ruby
|
93
115
|
h = Hole.create #
|
94
|
-
h.
|
95
|
-
Hole.
|
116
|
+
h.archival? # => true
|
117
|
+
Hole.archival? # => true
|
96
118
|
```
|
97
119
|
|
98
120
|
### Options
|
99
121
|
|
100
122
|
When defining an AAA model, it is is possible to make it unmodifiable
|
101
|
-
when it is archived by passing
|
123
|
+
when it is archived by passing `readonly_when_archived: true` to the
|
102
124
|
`acts_as_archival` call in your model.
|
103
125
|
|
104
126
|
``` ruby
|
105
127
|
class CantTouchThis < ActiveRecord::Base
|
106
|
-
acts_as_archival :
|
128
|
+
acts_as_archival readonly_when_archived: true
|
107
129
|
end
|
108
130
|
|
109
|
-
record = CantTouchThis.create(:
|
110
|
-
record.archive
|
131
|
+
record = CantTouchThis.create(foo: "bar")
|
132
|
+
record.archive! # => true
|
111
133
|
record.foo = "I want this to work"
|
112
134
|
record.save # => false
|
113
135
|
record.errors.full_messages.first # => "Cannot modify an archived record."
|
@@ -121,13 +143,17 @@ AAA models have four additional callbacks to do any necessary cleanup or other p
|
|
121
143
|
class Hole < ActiveRecord::Base
|
122
144
|
acts_as_archival
|
123
145
|
|
146
|
+
# runs before #archive!
|
124
147
|
before_archive :some_method_before_archiving
|
125
148
|
|
149
|
+
# runs after #archive!
|
126
150
|
after_archive :some_method_after_archiving
|
127
151
|
|
152
|
+
# runs before #unarchive!
|
128
153
|
before_unarchive :some_method_before_unarchiving
|
129
154
|
|
130
|
-
|
155
|
+
# runs after #unarchive!
|
156
|
+
after_unarchive :some_method_after_unarchiving
|
131
157
|
|
132
158
|
# ... implement those methods
|
133
159
|
end
|
@@ -135,14 +161,14 @@ end
|
|
135
161
|
|
136
162
|
#### Halting the callback chain
|
137
163
|
|
138
|
-
* Rails 4.
|
139
|
-
* Rails
|
164
|
+
* Rails 4.2 - the callback method should return a `false`/`nil` value.
|
165
|
+
* Rails 5.x - the callback should `throw(:abort)`/`raise(:abort)`.
|
140
166
|
|
141
167
|
## Caveats
|
142
168
|
|
143
169
|
1. This will only work on associations that are dependent destroy. It
|
144
170
|
should be trival to change that or make it optional.
|
145
|
-
1. If you would like to work on this, you will need to setup sqlite
|
171
|
+
1. If you would like to work on this, you will need to setup sqlite on your development machine. Alternately, you can disable specific dev dependencies in the gemspec and test_helper and ask for help.
|
146
172
|
|
147
173
|
## Testing
|
148
174
|
|
@@ -178,8 +204,12 @@ ActsAsParanoid and PermanentRecords were both inspirations for this:
|
|
178
204
|
* Miles Sterrett
|
179
205
|
* James Hill
|
180
206
|
* Maarten Claes
|
207
|
+
* Anthony Panozzo
|
181
208
|
* Aaron Milam
|
209
|
+
* Anton Rieder
|
210
|
+
* Josh Menden
|
211
|
+
* Sergey Gnuskov
|
182
212
|
|
183
213
|
Thanks!
|
184
214
|
|
185
|
-
*Copyright (c) 2009-
|
215
|
+
*Copyright (c) 2009-2017 Expected Behavior, LLC, released under the MIT license*
|
data/Rakefile
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
require "bundler/gem_tasks"
|
3
3
|
require "rake/testtask"
|
4
|
+
require "rubocop/rake_task"
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
RuboCop::RakeTask.new
|
7
|
+
|
8
|
+
desc "Default: run all available test suites."
|
9
|
+
task default: [:rubocop, :test]
|
7
10
|
|
8
11
|
desc "Test the acts_as_archival plugin."
|
9
12
|
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs
|
13
|
+
t.libs << "test"
|
11
14
|
t.pattern = "test/**/*_test.rb"
|
12
15
|
t.verbose = true
|
13
16
|
end
|
data/acts_as_archival.gemspec
CHANGED
@@ -4,7 +4,7 @@ require "acts_as_archival/version"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "acts_as_archival"
|
7
|
-
gem.summary =
|
7
|
+
gem.summary = "Atomic archiving/unarchiving for ActiveRecord-based apps"
|
8
8
|
gem.version = ActsAsArchival::VERSION
|
9
9
|
gem.authors = ["Joel Meador",
|
10
10
|
"Michael Kuehl",
|
@@ -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",
|
@@ -24,31 +29,32 @@ Gem::Specification.new do |gem|
|
|
24
29
|
gem.files = `git ls-files`.split("\n")
|
25
30
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
26
31
|
gem.require_paths = ["lib"]
|
32
|
+
gem.required_ruby_version = ">= 2.4"
|
27
33
|
|
28
|
-
gem.add_dependency "activerecord"
|
34
|
+
gem.add_dependency "activerecord", ">= 5.0"
|
29
35
|
|
30
36
|
gem.add_development_dependency "appraisal"
|
31
37
|
gem.add_development_dependency "assertions-eb"
|
32
38
|
gem.add_development_dependency "database_cleaner"
|
33
|
-
gem.add_development_dependency "mysql2"
|
34
|
-
gem.add_development_dependency "pg"
|
35
39
|
gem.add_development_dependency "rake"
|
36
40
|
gem.add_development_dependency "rr"
|
41
|
+
gem.add_development_dependency "rubocop", "~> 0.82.0"
|
37
42
|
gem.add_development_dependency "sqlite3"
|
38
43
|
|
39
|
-
gem.description =
|
40
|
-
|
44
|
+
gem.description =
|
45
|
+
<<~END
|
46
|
+
*Atomic archiving/unarchiving for ActiveRecord-based apps*
|
41
47
|
|
42
|
-
We had the problem that acts_as_paranoid and similar plugins/gems always work on
|
43
|
-
a record by record basis and made it very difficult to restore records
|
44
|
-
atomically (or archive them, for that matter).
|
48
|
+
We had the problem that acts_as_paranoid and similar plugins/gems always work on
|
49
|
+
a record by record basis and made it very difficult to restore records
|
50
|
+
atomically (or archive them, for that matter).
|
45
51
|
|
46
|
-
Because the archive and unarchive methods are in transactions, and every
|
47
|
-
archival record involved gets the same archive number upon archiving, you can
|
48
|
-
easily restore or remove an entire set of records without having to worry about
|
49
|
-
partial deletion or restoration.
|
52
|
+
Because the archive and unarchive methods are in transactions, and every
|
53
|
+
archival record involved gets the same archive number upon archiving, you can
|
54
|
+
easily restore or remove an entire set of records without having to worry about
|
55
|
+
partial deletion or restoration.
|
50
56
|
|
51
|
-
Additionally, other plugins generally screw with how destroy/delete work.
|
52
|
-
don't because we actually want to be able to destroy records.
|
53
|
-
END
|
57
|
+
Additionally, other plugins generally screw with how destroy/delete work. We
|
58
|
+
don't because we actually want to be able to destroy records.
|
59
|
+
END
|
54
60
|
end
|
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
|