paper_trail-association_tracking 2.1.1 → 2.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/CHANGELOG.md +18 -2
- data/README.md +9 -4
- data/Rakefile +1 -4
- data/lib/paper_trail-association_tracking.rb +8 -16
- data/lib/paper_trail_association_tracking/frameworks/active_record.rb +0 -2
- data/lib/paper_trail_association_tracking/frameworks/rails/railtie.rb +17 -0
- data/lib/paper_trail_association_tracking/frameworks/rails.rb +1 -1
- data/lib/paper_trail_association_tracking/model_config.rb +28 -9
- data/lib/paper_trail_association_tracking/reifiers/has_many.rb +7 -1
- data/lib/paper_trail_association_tracking/reifiers/has_one.rb +1 -3
- data/lib/paper_trail_association_tracking/version.rb +1 -1
- data/lib/paper_trail_association_tracking/version_concern.rb +1 -20
- metadata +16 -31
- data/lib/paper_trail_association_tracking/frameworks/rails/engine.rb +0 -10
- data/lib/paper_trail_association_tracking/frameworks/rspec.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b49b412d6cd431cd4310dadde716d334231225fed80e84c5d4d8696f42fcb0f
|
4
|
+
data.tar.gz: a77500b35d0f66a1840272b8efd9891ce876da341756fe47077cd1257e4f26b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dff6c0eacc9cf46bb6ed00edbed900426ac3b842b7e5046bb9511422b44d78bb88782d7ffc4c4322c40e28426ee0cc2c3c4fdcd7630f0c0ca4b294dabaa9f815
|
7
|
+
data.tar.gz: 41c42f324a608af7c22d7b442827eedf15f4d6c79e0c023eb93adc99f177076a95b84c7dc18acdf8f8a3f0d3a9726378d542d18f02b8bc92a3a18092d9e792d2
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
-
### Unreleased - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.
|
3
|
+
### Unreleased - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.2.1...master)
|
4
|
+
- Nothing yet
|
4
5
|
|
5
|
-
-
|
6
|
+
### v2.2.1 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.2.0...v2.2.1)
|
7
|
+
- [PR #38](https://github.com/westonganger/paper_trail-association_tracking/pull/38) - Fix the issue where reifying has_one association with `dependent: :destroy` could destroy a live record
|
8
|
+
|
9
|
+
### v2.2.0 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.1.3...v2.2.0)
|
10
|
+
|
11
|
+
- [PR #36](https://github.com/westonganger/paper_trail-association_tracking/pull/36) - Fix load order for paper_trail v12+
|
12
|
+
- Drop support for Ruby 2.5
|
13
|
+
- Add Github Actions CI supporting multiple version of Ruby, Rails and multiple databases types
|
14
|
+
|
15
|
+
### 2.1.3 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.1.1...v2.1.3)
|
16
|
+
|
17
|
+
- [PR #24](https://github.com/westonganger/paper_trail-association_tracking/pull/24) - Fix reification on STI models that have parent child relationships
|
18
|
+
|
19
|
+
### 2.1.2
|
20
|
+
|
21
|
+
- A late night oopsies, Release yanked immediately, had bug preventing installation.
|
6
22
|
|
7
23
|
### 2.1.1 - 2020-10-21 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.1.0...v2.1.1)
|
8
24
|
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# PaperTrail-AssociationTracking
|
2
2
|
|
3
3
|
<a href="https://badge.fury.io/rb/paper_trail-association_tracking" target="_blank"><img height="21" style='border:0px;height:21px;' border='0' src="https://badge.fury.io/rb/paper_trail-association_tracking.svg" alt="Gem Version"></a>
|
4
|
-
<a href='https://
|
4
|
+
<a href='https://github.com/westonganger/paper_trail-association_tracking/actions' target='_blank'><img src="https://github.com/westonganger/paper_trail-association_tracking/workflows/Tests/badge.svg" style="max-width:100%;" height='21' style='border:0px;height:21px;' border='0' alt="CI Status"></a>
|
5
5
|
<a href='https://rubygems.org/gems/paper_trail-association_tracking' target='_blank'><img height='21' style='border:0px;height:21px;' src='https://ruby-gem-downloads-badge.herokuapp.com/paper_trail-association_tracking?label=rubygems&type=total&total_label=downloads&color=brightgreen' border='0' alt='RubyGems Downloads' /></a>
|
6
6
|
|
7
7
|
Plugin for the [PaperTrail](https://github.com/paper-trail-gem/paper_trail.git) gem to track and reify associations. This gem was extracted from PaperTrail for v9.2.0 to simplify things in PaperTrail and association tracking separately.
|
@@ -23,14 +23,13 @@ It will store in the `version_associations` table additional information to corr
|
|
23
23
|
- [Known Issues](#known-issues)
|
24
24
|
- [Contributing](#contributing)
|
25
25
|
- [Credits](#credits)
|
26
|
+
- [Alternative Solution](#alternative-solution)
|
26
27
|
|
27
28
|
|
28
29
|
# Install
|
29
30
|
|
30
31
|
```ruby
|
31
|
-
|
32
|
-
|
33
|
-
gem 'paper_trail' # Minimum required version is v9.2.0
|
32
|
+
gem 'paper_trail'
|
34
33
|
gem 'paper_trail-association_tracking'
|
35
34
|
```
|
36
35
|
|
@@ -182,3 +181,9 @@ Maintained by [Weston Ganger](https://westonganger.com) - [@westonganger](https:
|
|
182
181
|
Plugin authored by [Weston Ganger](https://westonganger.com) - [@westonganger](https://github.com/westonganger)
|
183
182
|
|
184
183
|
Associations code originally contributed by Ben Atkins, Jared Beck, Andy Stewart & more
|
184
|
+
|
185
|
+
# Alternative Solution
|
186
|
+
|
187
|
+
Model Versioning and Restoration require concious thought, design, and understanding. You should understand your versioning and restoration process completely. Because PT-AT it is mostly a blackbox solution which encourages you to set it up and then assume its "Just Working". This can make for major data problems later.
|
188
|
+
|
189
|
+
Instead I recommend a newer gem that I have created for handling snapshots of records and associations called [active_snapshot](https://github.com/westonganger/active_snapshot). This gem does not utilize `paper_trail` at all. The focus of this gem is to have a simple and fully understandable design is easy to customize and know inside and out for your projects needs.
|
data/Rakefile
CHANGED
@@ -17,9 +17,6 @@ Rake::TestTask.new(:test) do |t|
|
|
17
17
|
t.libs << "test"
|
18
18
|
t.pattern = "test/**/*_test.rb"
|
19
19
|
t.verbose = false
|
20
|
-
|
21
|
-
### Enabling ruby interpreter warnings (-w) is, sadly, impractical.
|
22
|
-
### There are too many noisy warnings that we have no control over, e.g. caused by libs we depend on.
|
23
20
|
t.warning = false
|
24
21
|
end
|
25
22
|
|
@@ -27,7 +24,7 @@ require "rspec/core/rake_task"
|
|
27
24
|
desc "Run tests on PaperTrail with RSpec"
|
28
25
|
task(:spec).clear
|
29
26
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
30
|
-
t.verbose = false # hide list of specs
|
27
|
+
t.verbose = false # hide list of specs
|
31
28
|
end
|
32
29
|
|
33
30
|
desc "Default: run all available test suites"
|
@@ -9,6 +9,14 @@ require "paper_trail_association_tracking/request"
|
|
9
9
|
require "paper_trail_association_tracking/paper_trail"
|
10
10
|
require "paper_trail_association_tracking/version_concern"
|
11
11
|
|
12
|
+
if defined?(Rails)
|
13
|
+
require "paper_trail/frameworks/active_record"
|
14
|
+
require "paper_trail_association_tracking/frameworks/rails"
|
15
|
+
elsif defined?(ActiveRecord)
|
16
|
+
require "paper_trail/frameworks/active_record"
|
17
|
+
require "paper_trail_association_tracking/frameworks/active_record"
|
18
|
+
end
|
19
|
+
|
12
20
|
module PaperTrailAssociationTracking
|
13
21
|
def self.version
|
14
22
|
VERSION
|
@@ -47,20 +55,4 @@ module PaperTrail
|
|
47
55
|
prepend ::PaperTrailAssociationTracking::Request::ClassMethods
|
48
56
|
end
|
49
57
|
end
|
50
|
-
|
51
|
-
module VersionConcern
|
52
|
-
include ::PaperTrailAssociationTracking::VersionConcern
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Require frameworks
|
57
|
-
if defined?(::Rails)
|
58
|
-
# Rails module is sometimes defined by gems like rails-html-sanitizer so we check for presence of Rails.application.
|
59
|
-
if defined?(::Rails.application)
|
60
|
-
require "paper_trail_association_tracking/frameworks/rails"
|
61
|
-
else
|
62
|
-
::Kernel.warn('PaperTrail has been loaded too early, before rails is loaded. This can happen when another gem defines the ::Rails namespace, then PT is loaded, all before rails is loaded. You may want to reorder your Gemfile, or defer the loading of PT by using `require: false` and a manual require elsewhere.')
|
63
|
-
end
|
64
|
-
else
|
65
|
-
require "paper_trail_association_tracking/frameworks/active_record"
|
66
58
|
end
|
@@ -1,5 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# This file only needs to be loaded if the gem is being used outside of Rails,
|
4
|
-
# since otherwise the model(s) will get loaded in via the `Rails::Engine`.
|
5
3
|
require "paper_trail_association_tracking/frameworks/active_record/models/paper_trail/version_association"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PaperTrailAssociationTracking
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
|
6
|
+
initializer "paper_trail_association_tracking", after: "paper_trail" do
|
7
|
+
ActiveSupport.on_load(:active_record) do
|
8
|
+
require "paper_trail_association_tracking/frameworks/active_record"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
config.to_prepare do
|
13
|
+
::PaperTrail::Version.include(::PaperTrailAssociationTracking::VersionConcern)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -38,15 +38,34 @@ module PaperTrailAssociationTracking
|
|
38
38
|
habtm_assocs_not_skipped.each(&method(:setup_habtm_change_callbacks))
|
39
39
|
end
|
40
40
|
|
41
|
-
def setup_habtm_change_callbacks(
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
41
|
+
def setup_habtm_change_callbacks(association)
|
42
|
+
association_name = association.name
|
43
|
+
|
44
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
45
|
+
### https://github.com/westonganger/paper_trail-association_tracking/pull/37#issuecomment-1067146121
|
46
|
+
|
47
|
+
before_add_callback = lambda do |*args|
|
48
|
+
update_habtm_state(association_name, :before_add, args[-2], args.last)
|
49
|
+
end
|
50
|
+
|
51
|
+
before_remove_callback = lambda do |*args|
|
52
|
+
update_habtm_state(association_name, :before_remove, args[-2], args.last)
|
53
|
+
end
|
54
|
+
|
55
|
+
assoc_opts = association.options.merge(before_add: before_add_callback, before_remove: before_remove_callback)
|
56
|
+
|
57
|
+
association.instance_variable_set(:@options, **assoc_opts)
|
58
|
+
|
59
|
+
::ActiveRecord::Associations::Builder::CollectionAssociation.send(:define_callbacks, @model_class, association)
|
60
|
+
else
|
61
|
+
%w[add remove].each do |verb|
|
62
|
+
@model_class.send("before_#{verb}_for_#{association_name}").send(
|
63
|
+
:<<,
|
64
|
+
lambda do |*args|
|
65
|
+
update_habtm_state(association_name, :"before_#{verb}", args[-2], args.last)
|
66
|
+
end
|
67
|
+
)
|
68
|
+
end
|
50
69
|
end
|
51
70
|
end
|
52
71
|
|
@@ -94,12 +94,18 @@ module PaperTrailAssociationTracking
|
|
94
94
|
# from the point in time identified by `tx_id` or `version_at`.
|
95
95
|
# @api private
|
96
96
|
def load_versions_for_hm_association(assoc, model, version_table, tx_id, version_at)
|
97
|
+
# For STI models, associations may be defined to reference superclasses, so looking up
|
98
|
+
# based on only the child-most class is not appropriate.
|
99
|
+
sti_model_names = model.class.ancestors
|
100
|
+
.select { |x| x <= model.class.base_class && x.method_defined?(assoc.name) }
|
101
|
+
.map(&:name)
|
102
|
+
|
97
103
|
version_ids = ::PaperTrail::VersionAssociation.
|
98
104
|
joins(model.class.version_association_name).
|
99
105
|
select("MIN(version_id) as version_id").
|
100
106
|
where("foreign_key_name = ?", assoc.foreign_key).
|
101
107
|
where("foreign_key_id = ?", model.id).
|
102
|
-
where(foreign_type: [
|
108
|
+
where(foreign_type: sti_model_names + [nil]).
|
103
109
|
where("#{version_table}.item_type = ?", assoc.klass.base_class.name).
|
104
110
|
where("created_at >= ? OR transaction_id = ?", version_at, tx_id).
|
105
111
|
group("item_id").
|
@@ -56,9 +56,7 @@ module PaperTrailAssociationTracking
|
|
56
56
|
if options[:mark_for_destruction]
|
57
57
|
model.send(assoc.name).mark_for_destruction if model.send(assoc.name, true)
|
58
58
|
else
|
59
|
-
model.
|
60
|
-
model.send "#{assoc.name}=", nil
|
61
|
-
end
|
59
|
+
model.association(assoc.name).target = nil
|
62
60
|
end
|
63
61
|
end
|
64
62
|
|
@@ -1,10 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module PaperTrailAssociationTracking
|
4
|
-
# Originally, PaperTrail did not provide this module, and all of this
|
5
|
-
# functionality was in `PaperTrail::Version`. That model still exists (and is
|
6
|
-
# used by most apps) but by moving the functionality to this module, people
|
7
|
-
# can include this concern instead of sub-classing the `Version` model.
|
8
4
|
module VersionConcern
|
9
5
|
extend ::ActiveSupport::Concern
|
10
6
|
|
@@ -16,22 +12,7 @@ module PaperTrailAssociationTracking
|
|
16
12
|
has_many :version_associations, dependent: :destroy
|
17
13
|
end
|
18
14
|
|
19
|
-
scope
|
15
|
+
scope :within_transaction, ->(id) { where(transaction_id: id) }
|
20
16
|
end
|
21
|
-
|
22
|
-
# Restore the item from this version.
|
23
|
-
#
|
24
|
-
# In addition to the options provided by PaperTrail core. This Plugin provides the following Options:
|
25
|
-
#
|
26
|
-
# - :has_one
|
27
|
-
# - `true` - Also reify has_one associations.
|
28
|
-
# - `false - Default.
|
29
|
-
# - :has_many
|
30
|
-
# - `true` - Also reify has_many and has_many :through associations.
|
31
|
-
# - `false` - Default.
|
32
|
-
#
|
33
|
-
#def reify(options = {})
|
34
|
-
# super
|
35
|
-
#end
|
36
17
|
end
|
37
18
|
end
|
metadata
CHANGED
@@ -1,47 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail-association_tracking
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Ganger
|
8
8
|
- Jared Beck
|
9
9
|
- Ben Atkins
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2022-03-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
requirements:
|
19
|
-
- - ">="
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
requirements:
|
26
|
-
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
version: '0'
|
29
|
-
- !ruby/object:Gem::Dependency
|
30
|
-
name: byebug
|
16
|
+
name: paper_trail
|
31
17
|
requirement: !ruby/object:Gem::Requirement
|
32
18
|
requirements:
|
33
19
|
- - ">="
|
34
20
|
- !ruby/object:Gem::Version
|
35
|
-
version: '0'
|
36
|
-
type: :
|
21
|
+
version: '12.0'
|
22
|
+
type: :runtime
|
37
23
|
prerelease: false
|
38
24
|
version_requirements: !ruby/object:Gem::Requirement
|
39
25
|
requirements:
|
40
26
|
- - ">="
|
41
27
|
- !ruby/object:Gem::Version
|
42
|
-
version: '0'
|
28
|
+
version: '12.0'
|
43
29
|
- !ruby/object:Gem::Dependency
|
44
|
-
name:
|
30
|
+
name: appraisal
|
45
31
|
requirement: !ruby/object:Gem::Requirement
|
46
32
|
requirements:
|
47
33
|
- - ">="
|
@@ -55,7 +41,7 @@ dependencies:
|
|
55
41
|
- !ruby/object:Gem::Version
|
56
42
|
version: '0'
|
57
43
|
- !ruby/object:Gem::Dependency
|
58
|
-
name:
|
44
|
+
name: byebug
|
59
45
|
requirement: !ruby/object:Gem::Requirement
|
60
46
|
requirements:
|
61
47
|
- - ">="
|
@@ -69,7 +55,7 @@ dependencies:
|
|
69
55
|
- !ruby/object:Gem::Version
|
70
56
|
version: '0'
|
71
57
|
- !ruby/object:Gem::Dependency
|
72
|
-
name:
|
58
|
+
name: ffaker
|
73
59
|
requirement: !ruby/object:Gem::Requirement
|
74
60
|
requirements:
|
75
61
|
- - ">="
|
@@ -83,7 +69,7 @@ dependencies:
|
|
83
69
|
- !ruby/object:Gem::Version
|
84
70
|
version: '0'
|
85
71
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
72
|
+
name: generator_spec
|
87
73
|
requirement: !ruby/object:Gem::Requirement
|
88
74
|
requirements:
|
89
75
|
- - ">="
|
@@ -186,8 +172,7 @@ files:
|
|
186
172
|
- lib/paper_trail_association_tracking/frameworks/active_record.rb
|
187
173
|
- lib/paper_trail_association_tracking/frameworks/active_record/models/paper_trail/version_association.rb
|
188
174
|
- lib/paper_trail_association_tracking/frameworks/rails.rb
|
189
|
-
- lib/paper_trail_association_tracking/frameworks/rails/
|
190
|
-
- lib/paper_trail_association_tracking/frameworks/rspec.rb
|
175
|
+
- lib/paper_trail_association_tracking/frameworks/rails/railtie.rb
|
191
176
|
- lib/paper_trail_association_tracking/model_config.rb
|
192
177
|
- lib/paper_trail_association_tracking/paper_trail.rb
|
193
178
|
- lib/paper_trail_association_tracking/record_trail.rb
|
@@ -205,7 +190,7 @@ homepage: https://github.com/westonganger/paper_trail-association_tracking
|
|
205
190
|
licenses:
|
206
191
|
- MIT
|
207
192
|
metadata: {}
|
208
|
-
post_install_message:
|
193
|
+
post_install_message:
|
209
194
|
rdoc_options: []
|
210
195
|
require_paths:
|
211
196
|
- lib
|
@@ -213,15 +198,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
213
198
|
requirements:
|
214
199
|
- - ">="
|
215
200
|
- !ruby/object:Gem::Version
|
216
|
-
version: 2.
|
201
|
+
version: 2.6.0
|
217
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
218
203
|
requirements:
|
219
204
|
- - ">="
|
220
205
|
- !ruby/object:Gem::Version
|
221
206
|
version: '0'
|
222
207
|
requirements: []
|
223
|
-
rubygems_version: 3.
|
224
|
-
signing_key:
|
208
|
+
rubygems_version: 3.2.32
|
209
|
+
signing_key:
|
225
210
|
specification_version: 4
|
226
211
|
summary: Plugin for the PaperTrail gem to track and reify associations
|
227
212
|
test_files: []
|
@@ -1,10 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module PaperTrailAssociationTracking
|
4
|
-
module Rails
|
5
|
-
# See http://guides.rubyonrails.org/engines.html
|
6
|
-
class Engine < ::Rails::Engine
|
7
|
-
paths["app/models"] << "lib/paper_trail_association_tracking/frameworks/active_record/models"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "rspec/core"
|
4
|
-
require "rspec/matchers"
|
5
|
-
|
6
|
-
RSpec::Matchers.define :have_a_version_with do |attributes|
|
7
|
-
# check if the model has a version with the specified attributes
|
8
|
-
match do |actual|
|
9
|
-
versions_association = actual.class.versions_association_name
|
10
|
-
actual.send(versions_association).where_object(attributes).any?
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
RSpec::Matchers.define :have_a_version_with_changes do |attributes|
|
15
|
-
# check if the model has a version changes with the specified attributes
|
16
|
-
match do |actual|
|
17
|
-
versions_association = actual.class.versions_association_name
|
18
|
-
actual.send(versions_association).where_object_changes(attributes).any?
|
19
|
-
end
|
20
|
-
end
|