paper_trail-association_tracking 1.0.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -3
- data/README.md +94 -157
- data/Rakefile +2 -29
- data/lib/generators/paper_trail_association_tracking/add_foreign_type_to_version_associations_generator.rb +52 -0
- data/lib/generators/paper_trail_association_tracking/install_generator.rb +2 -5
- data/lib/generators/paper_trail_association_tracking/templates/add_foreign_type_to_version_associations.rb.erb +21 -0
- data/lib/generators/paper_trail_association_tracking/templates/create_version_associations.rb.erb +2 -1
- data/lib/paper_trail-association_tracking.rb +1 -2
- data/lib/paper_trail_association_tracking/paper_trail.rb +0 -27
- data/lib/paper_trail_association_tracking/record_trail.rb +7 -4
- data/lib/paper_trail_association_tracking/reifier.rb +8 -6
- data/lib/paper_trail_association_tracking/reifiers/belongs_to.rb +9 -7
- data/lib/paper_trail_association_tracking/reifiers/has_many.rb +8 -8
- data/lib/paper_trail_association_tracking/reifiers/has_many_through.rb +14 -5
- data/lib/paper_trail_association_tracking/version.rb +1 -1
- metadata +48 -81
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c44254220614ad32a3f634a83c4c3a0d8e3c5aa5dd76521f09f702d03d0be1c
|
4
|
+
data.tar.gz: 9434f7aa8c162a2117d7c33890bdbd2df93729a343073e67ebc024537ee773ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5ee8734919969546148c2cb12add0ef77a6e0e0acec5137713974babdc05bb80be5d7321e41b636c74d3b3d4a3463d8e42ddc6b1d5d02f0affed0de0a024fc6
|
7
|
+
data.tar.gz: 3205666624b7f94acecca6dc56757e971ba1382b80bb9762c818f7f7935063adebb36e2ab8d3d3d0cb8216b6276042e7eda7f84658cb5e7d696242798503a3b7
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,41 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
-
|
4
|
-
the recommendations of [keepachangelog.com](http://keepachangelog.com/).
|
3
|
+
### Unreleased - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.1.1...master)
|
5
4
|
|
6
|
-
|
5
|
+
- Nothing yet
|
6
|
+
|
7
|
+
### 2.1.1 - 2020-10-21 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.1.0...v2.1.1)
|
8
|
+
|
9
|
+
- Bug fix for reify on `has_many :through` relationships when `:source` is specified
|
10
|
+
- Bug fix for reify on `has_many :through` relationships where the association is a has_one on the through model
|
11
|
+
- Bug fix to ensure install generator will set `PaperTrail.association_tracking = true`
|
12
|
+
|
13
|
+
### 2.1.0 - 2020-08-14 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.0.0...v2.1.0)
|
14
|
+
|
15
|
+
- [PR #18](https://github.com/westonganger/paper_trail-association_tracking/pull/18) - Improve performance for `Model.reify(has_many: true)` by separating the SQL subquery.
|
16
|
+
- [PR #15](https://github.com/westonganger/paper_trail-association_tracking/pull/15) - Recreate `version_associations.foreign_key` index to utilize the new `version_associations.foreign_type` column
|
17
|
+
- Update test matrix to support multiple versions of PT-core and ActiveRecord
|
18
|
+
- Remove deprecated methods `clear_transaction_id`, `transaction_id` and `transaction_id=`
|
19
|
+
|
20
|
+
### 2.0.0 - 2019-01-22 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v1.1.1...v2.0.0)
|
21
|
+
|
22
|
+
- [PR #11](https://github.com/westonganger/paper_trail-association_tracking/issues/11) - Remove null constraint on `version_associations.foreign_type` column which was added in `v1.1.0`. This fixes issues adding the column to existing projects who are upgrading.
|
23
|
+
- Add generator `rails g paper_trail_association_tracking:add_foreign_type_to_version_associations` for `versions_associations.foreign_type` column for upgrading applications from `v1.0.0` or earlier.
|
24
|
+
|
25
|
+
### How to Upgrade from v1.0.0 or earlier
|
26
|
+
|
27
|
+
- Run `rails g paper_trail_association_tracking:add_foreign_type_to_version_associations` and then migrate your database.
|
28
|
+
|
29
|
+
### 1.1.1 - 2018-01-14 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v1.1.0...v1.1.1)
|
30
|
+
|
31
|
+
- Same as v2 release, this is released simply to maintain a working `v1` branch since `v1.1.0` was broken
|
32
|
+
|
33
|
+
### 1.1.0 - 2018-12-28 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v1.0.0...v1.1.0)
|
34
|
+
|
35
|
+
- Note: This release is somewhat broken, please upgrade to `v2.0.0` or stay on `v1.0.0`
|
36
|
+
- [PR #10](https://github.com/westonganger/paper_trail-association_tracking/pull/10) - The `has_many: true` option now reifies polymorphic associations. Previously they were skipped.
|
37
|
+
- [PR #9](https://github.com/westonganger/paper_trail-association_tracking/pull/9) - The `belongs_to: true` option now reifies polymorphic associations. Previously they were skipped.
|
38
|
+
|
39
|
+
### 1.0.0 - 2018-06-04
|
7
40
|
|
8
41
|
- [PT #1070](https://github.com/paper-trail-gem/paper_trail/issues/1070), [#2](https://github.com/westonganger/paper_trail-association_tracking/issues/2) - Extracted from paper_trail gem in v9.2
|
data/README.md
CHANGED
@@ -1,172 +1,130 @@
|
|
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://travis-ci.com/westonganger/paper_trail-association_tracking' target='_blank'><img height='21' style='border:0px;height:21px;' src='https://api.travis-ci.com/westonganger/paper_trail-association_tracking.svg?branch=master' border='0' alt='Build Status' /></a>
|
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>
|
4
6
|
|
5
|
-
Plugin for the [PaperTrail](https://github.com/paper-trail-gem/paper_trail.git) gem to track and reify associations.
|
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.
|
6
8
|
|
7
9
|
**PR's will happily be accepted**
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
to association
|
11
|
+
PaperTrail-AssociationTracking can restore three types of associations: Has-One, Has-Many, and Has-Many-Through.
|
12
|
+
|
13
|
+
It will store in the `version_associations` table additional information to correlate versions of the association and versions of the model when the associated record is changed. When reifying the model, it will utilize this table, together with the `transaction_id` to find the correct version of the association and reify it. The `transaction_id` is a unique id for version records created in the same transaction. It is used to associate the version of the model and the version of the association that are created in the same transaction.
|
12
14
|
|
13
|
-
A little history lesson, discussed as early as 2009, and first implemented in late 2014, association
|
14
|
-
tracking was part of PT core until 2018 as an experimental feature and was use at your own risk. This gem now
|
15
|
-
maintains a list of known issues and we hope the community can help remove some of them via PR's.
|
16
15
|
|
17
|
-
## Table of Contents
|
18
16
|
|
19
|
-
|
17
|
+
|
18
|
+
## Table of Contents
|
20
19
|
|
21
20
|
- [Install](#install)
|
22
|
-
- [
|
21
|
+
- [Usage](#usage)
|
22
|
+
- [Limitations](#limitations)
|
23
23
|
- [Known Issues](#known-issues)
|
24
24
|
- [Contributing](#contributing)
|
25
25
|
- [Credits](#credits)
|
26
26
|
|
27
|
-
<!-- tocstop -->
|
28
27
|
|
29
28
|
# Install
|
30
29
|
|
31
30
|
```ruby
|
32
31
|
# Gemfile
|
33
32
|
|
34
|
-
gem 'paper_trail' #
|
33
|
+
gem 'paper_trail' # Minimum required version is v9.2.0
|
35
34
|
gem 'paper_trail-association_tracking'
|
36
35
|
```
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
This plugin currently can restore three types of associations: Has-One, Has-Many, and
|
41
|
-
Has-Many-Through. In order to do this, you will need to do two things:
|
37
|
+
Then run `rails generate paper_trail_association_tracking:install` which will do the following two things for you:
|
42
38
|
|
43
39
|
1. Create a `version_associations` table
|
44
|
-
2. Set `PaperTrail.config.track_associations = true`
|
45
|
-
|
46
|
-
Both will be done for you automatically if you install PaperTrail with the
|
47
|
-
`--with_associations` option
|
48
|
-
(e.g. `rails generate paper_trail:install --with-associations`)
|
49
|
-
|
50
|
-
If you want to add this functionality after the initial installation, you will
|
51
|
-
need to create the `version_associations` table manually, and you will need to
|
52
|
-
ensure that `PaperTrail.config.track_associations = true` is set.
|
40
|
+
2. Set `PaperTrail.config.track_associations = true` in an initializer
|
53
41
|
|
54
|
-
|
55
|
-
to correlate versions of the association and versions of the model when the
|
56
|
-
associated record is changed. When reifying the model, PaperTrail can use this
|
57
|
-
table, together with the `transaction_id` to find the correct version of the
|
58
|
-
association and reify it. The `transaction_id` is a unique id for version records
|
59
|
-
created in the same transaction. It is used to associate the version of the model
|
60
|
-
and the version of the association that are created in the same transaction.
|
42
|
+
# Usage
|
61
43
|
|
62
|
-
|
63
|
-
true` to `reify`. To restore Has-Many and Has-Many-Through associations, use
|
64
|
-
option `has_many: true`. To restore Belongs-To association, use
|
65
|
-
option `belongs_to: true`. For example:
|
44
|
+
First, ensure that you have added `has_paper_trail` to your main model and all associated models that are to be tracked.
|
66
45
|
|
67
|
-
|
68
|
-
class Location < ActiveRecord::Base
|
69
|
-
belongs_to :treasure
|
70
|
-
has_paper_trail
|
71
|
-
end
|
72
|
-
|
73
|
-
class Treasure < ActiveRecord::Base
|
74
|
-
has_one :location
|
75
|
-
has_paper_trail
|
76
|
-
end
|
46
|
+
To restore associations as they were at the time you must pass any of the following options to the `reify` method.
|
77
47
|
|
78
|
-
|
79
|
-
|
48
|
+
- To restore Has-Many and Has-Many-Through associations, use option `has_many: true`
|
49
|
+
- To restore Has-One associations , use option `has_one: true` to `reify`
|
50
|
+
- To restore Belongs-To associations, use option `belongs_to: true`
|
80
51
|
|
81
|
-
|
82
|
-
treasure.location.update_attributes latitude: 54.321
|
52
|
+
For example:
|
83
53
|
|
84
|
-
|
85
|
-
|
86
|
-
t.location.latitude # 12.345
|
54
|
+
```ruby
|
55
|
+
item.versions.last.reify(has_many: true, has_one: true, belongs_to: false)
|
87
56
|
```
|
88
57
|
|
89
|
-
If the parent
|
90
|
-
aforementioned `transaction_id` to reify the models as they were before the
|
91
|
-
transaction (instead of before the update to the model).
|
58
|
+
If you want the reified associations to be saved upon calling `save` on the parent model then you must set `autosave: true` on all required associations. A little tip, `accepts_nested_attributes` automatically sets `autosave` to true but you should probably still state it explicitly.
|
92
59
|
|
93
|
-
|
94
|
-
treasure.amount # 100
|
95
|
-
treasure.location.latitude # 12.345
|
60
|
+
For example:
|
96
61
|
|
97
|
-
|
98
|
-
|
99
|
-
|
62
|
+
```ruby
|
63
|
+
class Product
|
64
|
+
has_many :photos, autosave: true
|
100
65
|
end
|
101
66
|
|
102
|
-
|
103
|
-
|
104
|
-
t.location.latitude # 12.345, instead of 54.321
|
67
|
+
product = Product.first.versions.last.reify(has_many: true, has_one: true, belongs_to: false)
|
68
|
+
product.save! ### now this will also save all reified photos
|
105
69
|
```
|
106
70
|
|
107
|
-
|
108
|
-
model if the associated record exists in the live model but did not exist as at
|
109
|
-
the time the version was created. This is usually what you want if you just want
|
110
|
-
to look at the reified version. But if you want to persist it, it would be
|
111
|
-
better to pass in option `mark_for_destruction: true` so that the associated
|
112
|
-
record is included and marked for destruction. Note that `mark_for_destruction`
|
113
|
-
only has [an effect on associations marked with `autosave: true`](http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html#method-i-mark_for_destruction).
|
71
|
+
If you do not set `autosave: true` true on the association then you will have to save/delete them manually.
|
114
72
|
|
115
|
-
|
116
|
-
class Widget < ActiveRecord::Base
|
117
|
-
has_paper_trail
|
118
|
-
has_one :wotsit, autosave: true
|
119
|
-
end
|
73
|
+
For example:
|
120
74
|
|
121
|
-
|
75
|
+
```ruby
|
76
|
+
class Product < ActiveRecord::Base
|
122
77
|
has_paper_trail
|
123
|
-
|
78
|
+
has_many :photos, autosave: false ### or if autosave not set
|
124
79
|
end
|
125
80
|
|
126
|
-
|
127
|
-
|
128
|
-
|
81
|
+
product = Product.create(name: 'product_0')
|
82
|
+
product.photos.create(name: 'photo')
|
83
|
+
product.update(name: 'product_a')
|
84
|
+
product.photos.create(name: 'photo')
|
85
|
+
|
86
|
+
reified_product = product.versions.last.reify(has_many: true, mark_for_destruction: true)
|
87
|
+
reified_product.save!
|
88
|
+
reified_product.name # product_a
|
89
|
+
reified_product.photos.size # 2
|
90
|
+
reified_product.photos.reload
|
91
|
+
reified_product.photos.size # 1 ### bad, didnt save the associations
|
92
|
+
|
93
|
+
product = Product.create(name: 'product_1')
|
94
|
+
product.update(name: 'product_b')
|
95
|
+
product.photos.create(name: 'photo')
|
96
|
+
|
97
|
+
reified_product = product.versions.last.reify(has_many: true, mark_for_destruction: true)
|
98
|
+
reified_product.save!
|
99
|
+
reified_product.name # product_b
|
100
|
+
reified_product.photos.size # 1
|
101
|
+
reified_product.photos.each{|x| x.marked_for_destruction? ? x.destroy! : x.save! }
|
102
|
+
reified_product.photos.size # 0
|
103
|
+
```
|
129
104
|
|
130
|
-
|
131
|
-
widget_0.wotsit # nil
|
105
|
+
It will also respect AR transactions by utilizing the aforementioned `transaction_id` to reify the models as they were before the transaction (instead of before the update to the model).
|
132
106
|
|
133
|
-
|
134
|
-
widget_0.wotsit.marked_for_destruction? # true
|
135
|
-
widget_0.save!
|
136
|
-
widget.reload.wotsit # nil
|
137
|
-
```
|
107
|
+
For example:
|
138
108
|
|
139
|
-
|
109
|
+
```ruby
|
110
|
+
item.amount # 100
|
111
|
+
item.location.latitude # 12.345
|
140
112
|
|
141
|
-
|
113
|
+
Item.transaction do
|
114
|
+
item.location.update(latitude: 54.321)
|
115
|
+
item.update(amount: 153)
|
116
|
+
end
|
142
117
|
|
143
|
-
|
118
|
+
t = item.versions.last.reify(has_one: true)
|
119
|
+
t.amount # 100
|
120
|
+
t.location.latitude # 12.345, instead of 54.321
|
121
|
+
```
|
144
122
|
|
145
|
-
|
123
|
+
# Limitations
|
146
124
|
|
147
|
-
1.
|
148
|
-
1.
|
149
|
-
|
150
|
-
- When using STI, even if you enable `:warn` you will likely still end up recieving an `ActiveRecord::AssociationTypeMismatch` error.
|
151
|
-
1. Not compatible with [transactional tests](https://github.com/rails/rails/blob/591a0bb87fff7583e01156696fbbf929d48d3e54/activerecord/lib/active_record/fixtures.rb#L142), aka. transactional fixtures. - [PT Issue #542](https://github.com/airblade/paper_trail/issues/542)
|
152
|
-
1. Requires database timestamp columns with fractional second precision.
|
153
|
-
- Sqlite and postgres timestamps have fractional second precision by default.
|
154
|
-
[MySQL timestamps do not](https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html). Furthermore, MySQL 5.5 and earlier do not
|
155
|
-
support fractional second precision at all.
|
156
|
-
- Also, support for fractional seconds in MySQL was not added to
|
157
|
-
rails until ActiveRecord 4.2 (https://github.com/rails/rails/pull/14359).
|
158
|
-
1. PaperTrail-AssociationTracking can't restore an association properly if the association record
|
159
|
-
can be updated to replace its parent model (by replacing the foreign key)
|
160
|
-
1. Currently PaperTrail-AssociationTracking only supports a single `version_associations` table.
|
161
|
-
Therefore, you can only use a single table to store the versions for
|
162
|
-
all related models. Sorry for those who use multiple version tables.
|
163
|
-
1. PaperTrail-AssociationTracking relies on the callbacks on the association model (and the :through
|
164
|
-
association model for Has-Many-Through associations) to record the versions
|
165
|
-
and the relationship between the versions. If the association is changed
|
166
|
-
without invoking the callbacks, Reification won't work. Below are some
|
167
|
-
examples:
|
168
|
-
|
169
|
-
Given these models:
|
125
|
+
1. Only reifies the first level of associations. If you want to include nested associations simply add `:through` relationships to your model.
|
126
|
+
1. Currently we only supports a single `version_associations` table. Therefore, you can only use a single table to store the versions for all related models.
|
127
|
+
1. Relies on the callbacks on the association model (and the `:through` association model for Has-Many-Through associations) to record the versions and the relationship between the versions. If the association is changed without invoking the callbacks, then reification won't work. Example:
|
170
128
|
|
171
129
|
```ruby
|
172
130
|
class Book < ActiveRecord::Base
|
@@ -186,62 +144,41 @@ If you notice anything here that should be updated/removed/edited feel free to c
|
|
186
144
|
has_many :books, through: :authorships
|
187
145
|
has_paper_trail
|
188
146
|
end
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
```ruby
|
194
|
-
@book.authors << @dostoyevsky
|
195
|
-
@book.authors.create name: 'Tolstoy'
|
147
|
+
|
148
|
+
### Each of the following will store authorship versions:
|
149
|
+
@book.authors << @john
|
150
|
+
@book.authors.create(name: 'Jack')
|
196
151
|
@book.authorships.last.destroy
|
197
152
|
@book.authorships.clear
|
198
|
-
@book.author_ids = [@
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
```ruby
|
204
|
-
@book.authors.delete @tolstoy
|
153
|
+
@book.author_ids = [@john.id, @joe.id]
|
154
|
+
|
155
|
+
### But none of these will:
|
156
|
+
@book.authors.delete @john
|
205
157
|
@book.author_ids = []
|
206
158
|
@book.authors = []
|
207
159
|
```
|
208
160
|
|
209
|
-
Having said that, you can apparently get all these working (I haven't tested it
|
210
|
-
myself) with this patch:
|
211
|
-
|
212
|
-
```ruby
|
213
|
-
# config/initializers/active_record_patch.rb
|
214
|
-
|
215
|
-
class HasManyThroughAssociationPatch
|
216
|
-
def delete_records(records, method)
|
217
|
-
method ||= :destroy
|
218
|
-
super
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
ActiveRecord::Associations::HasManyThroughAssociation.prepend(HasManyThroughAssociationPatch)
|
223
|
-
```
|
224
161
|
|
225
|
-
|
162
|
+
# Known Issues
|
226
163
|
|
164
|
+
1. Sometimes the has_one association will find more than one possible candidate and will raise a `PaperTrailAssociationTracking::Reifiers::HasOne::FoundMoreThanOne` error. For example, see `spec/models/person_spec.rb`
|
165
|
+
- If you are not using STI, you may want to just assume the first result of multiple is the correct one and continue. PaperTrail <= v8 did this without error or warning. To do so add the following line to your initializer: `PaperTrail.config.association_reify_error_behaviour = :warn`. Valid options are: `[:error, :warn, :ignore]`
|
166
|
+
- When using STI, even if you enable `:warn` you will likely still end up recieving an `ActiveRecord::AssociationTypeMismatch` error. See [PT Issue #594](https://github.com/airblade/paper_trail/issues/594). I strongly recommend that you do not use STI, however if you do need to decide to use STI, please see https://github.com/paper-trail-gem/paper_trail#4b1-the-optional-item_subtype-column
|
167
|
+
1. Not compatible with transactional tests, see [PT Issue #542](https://github.com/airblade/paper_trail/issues/542). However, apparently there has been some success by using the [transactional_capybara](https://rubygems.org/gems/transactional_capybara) gem.
|
227
168
|
|
228
|
-
### Regarding ActiveRecord Single Table Inheritance (STI)
|
229
169
|
|
230
|
-
|
170
|
+
# Contributing
|
231
171
|
|
232
|
-
|
172
|
+
We use the `appraisal` gem for testing multiple versions of `paper_trail` and `activerecord`. Please use the following steps to test using `appraisal`.
|
233
173
|
|
234
|
-
|
174
|
+
1. `bundle exec appraisal install`
|
175
|
+
2. `bundle exec appraisal rake test`
|
235
176
|
|
236
|
-
See the paper_trail [contribution guidelines](https://github.com/paper-trail-gem/paper_trail/blob/master/.github/CONTRIBUTING.md)
|
237
177
|
|
238
178
|
# Credits
|
239
179
|
|
240
|
-
|
180
|
+
Maintained by [Weston Ganger](https://westonganger.com) - [@westonganger](https://github.com/westonganger)
|
241
181
|
|
242
|
-
|
182
|
+
Plugin authored by [Weston Ganger](https://westonganger.com) - [@westonganger](https://github.com/westonganger)
|
243
183
|
|
244
184
|
Associations code originally contributed by Ben Atkins, Jared Beck, Andy Stewart & more
|
245
|
-
|
246
|
-
[1]: https://api.travis-ci.org/westonganger/paper_trail-association_tracking.svg?branch=master
|
247
|
-
[2]: https://travis-ci.org/westonganger/paper_trail-association_tracking
|
data/Rakefile
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
require "bundler"
|
4
2
|
Bundler::GemHelper.install_tasks
|
5
3
|
|
@@ -20,9 +18,8 @@ Rake::TestTask.new(:test) do |t|
|
|
20
18
|
t.pattern = "test/**/*_test.rb"
|
21
19
|
t.verbose = false
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
# depend on.
|
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.
|
26
23
|
t.warning = false
|
27
24
|
end
|
28
25
|
|
@@ -33,29 +30,5 @@ RSpec::Core::RakeTask.new(:spec) do |t|
|
|
33
30
|
t.verbose = false # hide list of specs bit.ly/1nVq3Jn
|
34
31
|
end
|
35
32
|
|
36
|
-
task :autocorrect do
|
37
|
-
rules = [
|
38
|
-
'FrozenStringLiteralComment',
|
39
|
-
'Layout/EmptyLineAfterMagicComment',
|
40
|
-
'Layout/EmptyLinesAroundBlockBody',
|
41
|
-
'Layout/EmptyLinesAroundClassBody',
|
42
|
-
'Layout/EmptyLinesAroundMethodBody',
|
43
|
-
'Layout/EmptyLinesAroundModuleBody',
|
44
|
-
'Layout/TrailingWhitespace',
|
45
|
-
'Style/EmptyMethod',
|
46
|
-
'Style/TrailingCommaInArguments',
|
47
|
-
]
|
48
|
-
|
49
|
-
rules.each do |rule|
|
50
|
-
`bundle exec rubocop --auto-correct --only #{rule}`
|
51
|
-
end
|
52
|
-
|
53
|
-
Rake::Task['rubocop'].invoke
|
54
|
-
end
|
55
|
-
|
56
|
-
require "rubocop/rake_task"
|
57
|
-
RuboCop::RakeTask.new
|
58
|
-
|
59
|
-
### TODO: Allow rubocop to fail, but still continue
|
60
33
|
desc "Default: run all available test suites"
|
61
34
|
task default: %i[prepare test spec]
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators"
|
4
|
+
require "rails/generators/active_record"
|
5
|
+
|
6
|
+
module PaperTrailAssociationTracking
|
7
|
+
# Installs PaperTrail in a rails app.
|
8
|
+
class AddForeignTypeToVersionAssociationsGenerator < ::Rails::Generators::Base
|
9
|
+
include ::Rails::Generators::Migration
|
10
|
+
|
11
|
+
# Class names of MySQL adapters.
|
12
|
+
# - `MysqlAdapter` - Used by gems: `mysql`, `activerecord-jdbcmysql-adapter`.
|
13
|
+
# - `Mysql2Adapter` - Used by `mysql2` gem.
|
14
|
+
MYSQL_ADAPTERS = [
|
15
|
+
"ActiveRecord::ConnectionAdapters::MysqlAdapter",
|
16
|
+
"ActiveRecord::ConnectionAdapters::Mysql2Adapter"
|
17
|
+
].freeze
|
18
|
+
|
19
|
+
source_root File.expand_path("../templates", __FILE__)
|
20
|
+
|
21
|
+
desc "Generates (but does not run) a migration to add a the foreign_type column to the version_associations table after upgrading from v1.0 or earlier."
|
22
|
+
|
23
|
+
def create_migrations
|
24
|
+
add_paper_trail_migration("add_foreign_type_to_version_associations")
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.next_migration_number(dirname)
|
28
|
+
::ActiveRecord::Generators::Base.next_migration_number(dirname)
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def add_paper_trail_migration(template)
|
34
|
+
migration_dir = File.expand_path("db/migrate")
|
35
|
+
if self.class.migration_exists?(migration_dir, template)
|
36
|
+
::Kernel.warn "Migration already exists: #{template}"
|
37
|
+
else
|
38
|
+
migration_template(
|
39
|
+
"#{template}.rb.erb",
|
40
|
+
"db/migrate/#{template}.rb",
|
41
|
+
migration_version: migration_version
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def migration_version
|
49
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -28,7 +28,7 @@ module PaperTrailAssociationTracking
|
|
28
28
|
def create_initializer
|
29
29
|
create_file(
|
30
30
|
"config/initializers/paper_trail.rb",
|
31
|
-
"PaperTrail.config.track_associations =
|
31
|
+
"PaperTrail.config.track_associations = true\n",
|
32
32
|
"PaperTrail.config.association_reify_error_behaviour = :error"
|
33
33
|
)
|
34
34
|
end
|
@@ -55,10 +55,7 @@ module PaperTrailAssociationTracking
|
|
55
55
|
private
|
56
56
|
|
57
57
|
def migration_version
|
58
|
-
|
59
|
-
if major >= 5
|
60
|
-
"[#{major}.#{ActiveRecord::VERSION::MINOR}]"
|
61
|
-
end
|
58
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
62
59
|
end
|
63
60
|
end
|
64
61
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This migration and AddTransactionIdColumnToVersions provide the necessary
|
2
|
+
# schema for tracking associations.
|
3
|
+
class AddForeignTypeToVersionAssociations < ActiveRecord::Migration<%= migration_version %>
|
4
|
+
def self.up
|
5
|
+
add_column :version_associations, :foreign_type, :string, index: true
|
6
|
+
remove_index :version_associations,
|
7
|
+
name: "index_version_associations_on_foreign_key"
|
8
|
+
add_index :version_associations,
|
9
|
+
%i(foreign_key_name foreign_key_id foreign_type),
|
10
|
+
name: "index_version_associations_on_foreign_key"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
remove_index :version_associations,
|
15
|
+
name: "index_version_associations_on_foreign_key"
|
16
|
+
remove_column :version_associations, :foreign_type
|
17
|
+
add_index :version_associations,
|
18
|
+
%i(foreign_key_name foreign_key_id),
|
19
|
+
name: "index_version_associations_on_foreign_key"
|
20
|
+
end
|
21
|
+
end
|
data/lib/generators/paper_trail_association_tracking/templates/create_version_associations.rb.erb
CHANGED
@@ -6,10 +6,11 @@ class CreateVersionAssociations < ActiveRecord::Migration<%= migration_version %
|
|
6
6
|
t.integer :version_id
|
7
7
|
t.string :foreign_key_name, null: false
|
8
8
|
t.integer :foreign_key_id
|
9
|
+
t.string :foreign_type
|
9
10
|
end
|
10
11
|
add_index :version_associations, [:version_id]
|
11
12
|
add_index :version_associations,
|
12
|
-
%i(foreign_key_name foreign_key_id),
|
13
|
+
%i(foreign_key_name foreign_key_id foreign_type),
|
13
14
|
name: "index_version_associations_on_foreign_key"
|
14
15
|
end
|
15
16
|
|
@@ -55,8 +55,7 @@ end
|
|
55
55
|
|
56
56
|
# Require frameworks
|
57
57
|
if defined?(::Rails)
|
58
|
-
# Rails module is sometimes defined by gems like rails-html-sanitizer
|
59
|
-
# so we check for presence of Rails.application.
|
58
|
+
# Rails module is sometimes defined by gems like rails-html-sanitizer so we check for presence of Rails.application.
|
60
59
|
if defined?(::Rails.application)
|
61
60
|
require "paper_trail_association_tracking/frameworks/rails"
|
62
61
|
else
|
@@ -6,33 +6,6 @@ module PaperTrailAssociationTracking
|
|
6
6
|
def transaction?
|
7
7
|
::ActiveRecord::Base.connection.open_transactions.positive?
|
8
8
|
end
|
9
|
-
|
10
|
-
# @deprecated
|
11
|
-
def clear_transaction_id
|
12
|
-
::ActiveSupport::Deprecation.warn(
|
13
|
-
"PaperTrail.clear_transaction_id is deprecated, use PaperTrail.request.clear_transaction_id",
|
14
|
-
caller(1)
|
15
|
-
)
|
16
|
-
request.clear_transaction_id
|
17
|
-
end
|
18
|
-
|
19
|
-
# @deprecated
|
20
|
-
def transaction_id
|
21
|
-
::ActiveSupport::Deprecation.warn(
|
22
|
-
"PaperTrail.transaction_id is deprecated without replacement.",
|
23
|
-
caller(1)
|
24
|
-
)
|
25
|
-
request.transaction_id
|
26
|
-
end
|
27
|
-
|
28
|
-
# @deprecated
|
29
|
-
def transaction_id=(id)
|
30
|
-
::ActiveSupport::Deprecation.warn(
|
31
|
-
"PaperTrail.transaction_id= is deprecated without replacement.",
|
32
|
-
caller(1)
|
33
|
-
)
|
34
|
-
request.transaction_id = id
|
35
|
-
end
|
36
9
|
end
|
37
10
|
end
|
38
11
|
end
|
@@ -136,7 +136,8 @@ module PaperTrailAssociationTracking
|
|
136
136
|
::PaperTrail::VersionAssociation.create(
|
137
137
|
version_id: version.transaction_id,
|
138
138
|
foreign_key_name: a.name,
|
139
|
-
foreign_key_id: id
|
139
|
+
foreign_key_id: id,
|
140
|
+
foreign_type: a.klass
|
140
141
|
)
|
141
142
|
end
|
142
143
|
end
|
@@ -168,12 +169,14 @@ module PaperTrailAssociationTracking
|
|
168
169
|
}
|
169
170
|
|
170
171
|
if assoc.options[:polymorphic]
|
171
|
-
|
172
|
-
if
|
173
|
-
assoc_version_args[:foreign_key_id] =
|
172
|
+
foreign_type = @record.send(assoc.foreign_type)
|
173
|
+
if foreign_type && ::PaperTrail.request.enabled_for_model?(foreign_type.constantize)
|
174
|
+
assoc_version_args[:foreign_key_id] = @record.send(assoc.foreign_key)
|
175
|
+
assoc_version_args[:foreign_type] = foreign_type
|
174
176
|
end
|
175
177
|
elsif ::PaperTrail.request.enabled_for_model?(assoc.klass)
|
176
178
|
assoc_version_args[:foreign_key_id] = @record.send(assoc.foreign_key)
|
179
|
+
assoc_version_args[:foreign_type] = assoc.klass
|
177
180
|
end
|
178
181
|
|
179
182
|
if assoc_version_args.key?(:foreign_key_id)
|
@@ -50,9 +50,11 @@ module PaperTrailAssociationTracking
|
|
50
50
|
end
|
51
51
|
|
52
52
|
# @api private
|
53
|
-
def each_enabled_association(associations)
|
53
|
+
def each_enabled_association(associations, model)
|
54
54
|
associations.each do |assoc|
|
55
|
-
|
55
|
+
assoc_klass = assoc.polymorphic? ?
|
56
|
+
model.send(assoc.foreign_type).constantize : assoc.klass
|
57
|
+
next unless ::PaperTrail.request.enabled_for_model?(assoc_klass)
|
56
58
|
yield assoc
|
57
59
|
end
|
58
60
|
end
|
@@ -79,7 +81,7 @@ module PaperTrailAssociationTracking
|
|
79
81
|
# @api private
|
80
82
|
def reify_has_one_associations(transaction_id, model, options = {})
|
81
83
|
associations = model.class.reflect_on_all_associations(:has_one)
|
82
|
-
each_enabled_association(associations) do |assoc|
|
84
|
+
each_enabled_association(associations, model) do |assoc|
|
83
85
|
::PaperTrailAssociationTracking::Reifiers::HasOne.reify(assoc, model, options, transaction_id)
|
84
86
|
end
|
85
87
|
end
|
@@ -88,7 +90,7 @@ module PaperTrailAssociationTracking
|
|
88
90
|
# @api private
|
89
91
|
def reify_belongs_to_associations(transaction_id, model, options = {})
|
90
92
|
associations = model.class.reflect_on_all_associations(:belongs_to)
|
91
|
-
each_enabled_association(associations) do |assoc|
|
93
|
+
each_enabled_association(associations, model) do |assoc|
|
92
94
|
::PaperTrailAssociationTracking::Reifiers::BelongsTo.reify(assoc, model, options, transaction_id)
|
93
95
|
end
|
94
96
|
end
|
@@ -97,7 +99,7 @@ module PaperTrailAssociationTracking
|
|
97
99
|
# @api private
|
98
100
|
def reify_has_many_associations(transaction_id, associations, model, options = {})
|
99
101
|
version_table_name = model.class.paper_trail.version_class.table_name
|
100
|
-
each_enabled_association(associations) do |assoc|
|
102
|
+
each_enabled_association(associations, model) do |assoc|
|
101
103
|
::PaperTrailAssociationTracking::Reifiers::HasMany.reify(assoc, model, options, transaction_id, version_table_name)
|
102
104
|
end
|
103
105
|
end
|
@@ -106,7 +108,7 @@ module PaperTrailAssociationTracking
|
|
106
108
|
# direct (non-`through`) has_manys have been reified.
|
107
109
|
# @api private
|
108
110
|
def reify_has_many_through_associations(transaction_id, associations, model, options = {})
|
109
|
-
each_enabled_association(associations) do |assoc|
|
111
|
+
each_enabled_association(associations, model) do |assoc|
|
110
112
|
::PaperTrailAssociationTracking::Reifiers::HasManyThrough.reify(assoc, model, options, transaction_id)
|
111
113
|
end
|
112
114
|
end
|
@@ -9,8 +9,10 @@ module PaperTrailAssociationTracking
|
|
9
9
|
# @api private
|
10
10
|
def reify(assoc, model, options, transaction_id)
|
11
11
|
id = model.send(assoc.foreign_key)
|
12
|
-
|
13
|
-
|
12
|
+
klass = assoc.polymorphic? ?
|
13
|
+
model.send(assoc.foreign_type).constantize : assoc.klass
|
14
|
+
version = load_version(klass, id, transaction_id, options[:version_at])
|
15
|
+
record = load_record(klass, id, options, version)
|
14
16
|
model.send("#{assoc.name}=".to_sym, record)
|
15
17
|
end
|
16
18
|
|
@@ -19,9 +21,9 @@ module PaperTrailAssociationTracking
|
|
19
21
|
# Given a `belongs_to` association and a `version`, return a record that
|
20
22
|
# can be assigned in order to reify that association.
|
21
23
|
# @api private
|
22
|
-
def load_record(
|
24
|
+
def load_record(assoc_klass, id, options, version)
|
23
25
|
if version.nil?
|
24
|
-
|
26
|
+
assoc_klass.where(assoc_klass.primary_key => id).first
|
25
27
|
else
|
26
28
|
version.reify(
|
27
29
|
options.merge(
|
@@ -37,9 +39,9 @@ module PaperTrailAssociationTracking
|
|
37
39
|
# Given a `belongs_to` association and an `id`, return a version record
|
38
40
|
# from the point in time identified by `transaction_id` or `version_at`.
|
39
41
|
# @api private
|
40
|
-
def load_version(
|
41
|
-
|
42
|
-
where("item_type = ?",
|
42
|
+
def load_version(assoc_klass, id, transaction_id, version_at)
|
43
|
+
assoc_klass.paper_trail.version_class.
|
44
|
+
where("item_type = ?", assoc_klass.base_class.name).
|
43
45
|
where("item_id = ?", id).
|
44
46
|
where("created_at >= ? OR transaction_id = ?", version_at, transaction_id).
|
45
47
|
order("id").limit(1).first
|
@@ -78,14 +78,13 @@ module PaperTrailAssociationTracking
|
|
78
78
|
#
|
79
79
|
# @api private
|
80
80
|
# @param klass - An ActiveRecord class.
|
81
|
-
# @param
|
82
|
-
# the IDs of version records.
|
81
|
+
# @param version_ids - Array. The IDs of version records.
|
83
82
|
# @return A `Hash` mapping IDs to `Version`s
|
84
83
|
#
|
85
|
-
def versions_by_id(klass,
|
84
|
+
def versions_by_id(klass, version_ids)
|
86
85
|
klass.
|
87
86
|
paper_trail.version_class.
|
88
|
-
where(
|
87
|
+
where(id: version_ids).
|
89
88
|
inject({}) { |a, e| a.merge!(e.item_id => e) }
|
90
89
|
end
|
91
90
|
|
@@ -95,16 +94,17 @@ module PaperTrailAssociationTracking
|
|
95
94
|
# from the point in time identified by `tx_id` or `version_at`.
|
96
95
|
# @api private
|
97
96
|
def load_versions_for_hm_association(assoc, model, version_table, tx_id, version_at)
|
98
|
-
|
97
|
+
version_ids = ::PaperTrail::VersionAssociation.
|
99
98
|
joins(model.class.version_association_name).
|
100
|
-
select("MIN(version_id)").
|
99
|
+
select("MIN(version_id) as version_id").
|
101
100
|
where("foreign_key_name = ?", assoc.foreign_key).
|
102
101
|
where("foreign_key_id = ?", model.id).
|
102
|
+
where(foreign_type: [model.class.name, nil]).
|
103
103
|
where("#{version_table}.item_type = ?", assoc.klass.base_class.name).
|
104
104
|
where("created_at >= ? OR transaction_id = ?", version_at, tx_id).
|
105
105
|
group("item_id").
|
106
|
-
|
107
|
-
versions_by_id(model.class,
|
106
|
+
map{|e| e.version_id}
|
107
|
+
versions_by_id(model.class, version_ids)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
@@ -53,7 +53,16 @@ module PaperTrailAssociationTracking
|
|
53
53
|
# association, that is, `model.paragraphs`, has not been loaded. So,
|
54
54
|
# we do that now.
|
55
55
|
through_collection.flat_map { |through_model|
|
56
|
-
through_model.public_send(assoc.
|
56
|
+
records = through_model.public_send(assoc.source_reflection_name)
|
57
|
+
|
58
|
+
if records.respond_to?(:to_a)
|
59
|
+
# Has Many association
|
60
|
+
records = records.to_a
|
61
|
+
else
|
62
|
+
# Has One association - Nothing more to do
|
63
|
+
end
|
64
|
+
|
65
|
+
records
|
57
66
|
}
|
58
67
|
end
|
59
68
|
|
@@ -73,8 +82,8 @@ module PaperTrailAssociationTracking
|
|
73
82
|
# `version_at`.
|
74
83
|
# @api private
|
75
84
|
def load_versions_for_hmt_association(assoc, ids, tx_id, version_at)
|
76
|
-
|
77
|
-
select("MIN(id)").
|
85
|
+
version_ids = assoc.klass.paper_trail.version_class.
|
86
|
+
select("MIN(id) as id").
|
78
87
|
where("item_type = ?", assoc.klass.base_class.name).
|
79
88
|
where("item_id IN (?)", ids).
|
80
89
|
where(
|
@@ -83,8 +92,8 @@ module PaperTrailAssociationTracking
|
|
83
92
|
tx_id
|
84
93
|
).
|
85
94
|
group("item_id").
|
86
|
-
|
87
|
-
::PaperTrailAssociationTracking::Reifiers::HasMany.versions_by_id(assoc.klass,
|
95
|
+
map{|e| e.id}
|
96
|
+
::PaperTrailAssociationTracking::Reifiers::HasMany.versions_by_id(assoc.klass, version_ids)
|
88
97
|
end
|
89
98
|
end
|
90
99
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail-association_tracking
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Ganger
|
@@ -10,196 +10,162 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-10-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: appraisal
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
28
|
+
version: '0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: byebug
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '0'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: ffaker
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - "
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
49
|
+
version: '0'
|
50
50
|
type: :development
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - "
|
54
|
+
- - ">="
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
56
|
+
version: '0'
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: generator_spec
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
|
-
- - "
|
61
|
+
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 0
|
63
|
+
version: '0'
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- - "
|
68
|
+
- - ">="
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: 0
|
70
|
+
version: '0'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: mysql2
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- - "
|
75
|
+
- - ">="
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0
|
77
|
+
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- - "
|
82
|
+
- - ">="
|
83
83
|
- !ruby/object:Gem::Version
|
84
|
-
version: 0
|
84
|
+
version: '0'
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
86
|
name: pg
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
|
-
- - "
|
89
|
+
- - ">="
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version: 0
|
91
|
+
version: '0'
|
92
92
|
type: :development
|
93
93
|
prerelease: false
|
94
94
|
version_requirements: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
|
-
- - "
|
96
|
+
- - ">="
|
97
97
|
- !ruby/object:Gem::Version
|
98
|
-
version: 0
|
98
|
+
version: '0'
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
100
|
name: rack-test
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
103
|
- - ">="
|
104
104
|
- !ruby/object:Gem::Version
|
105
|
-
version: 0
|
106
|
-
- - "<"
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: '0.9'
|
105
|
+
version: '0'
|
109
106
|
type: :development
|
110
107
|
prerelease: false
|
111
108
|
version_requirements: !ruby/object:Gem::Requirement
|
112
109
|
requirements:
|
113
110
|
- - ">="
|
114
111
|
- !ruby/object:Gem::Version
|
115
|
-
version: 0
|
116
|
-
- - "<"
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '0.9'
|
112
|
+
version: '0'
|
119
113
|
- !ruby/object:Gem::Dependency
|
120
114
|
name: rake
|
121
115
|
requirement: !ruby/object:Gem::Requirement
|
122
116
|
requirements:
|
123
|
-
- - "
|
117
|
+
- - ">="
|
124
118
|
- !ruby/object:Gem::Version
|
125
|
-
version: '
|
119
|
+
version: '0'
|
126
120
|
type: :development
|
127
121
|
prerelease: false
|
128
122
|
version_requirements: !ruby/object:Gem::Requirement
|
129
123
|
requirements:
|
130
|
-
- - "
|
124
|
+
- - ">="
|
131
125
|
- !ruby/object:Gem::Version
|
132
|
-
version: '
|
126
|
+
version: '0'
|
133
127
|
- !ruby/object:Gem::Dependency
|
134
128
|
name: rspec-rails
|
135
129
|
requirement: !ruby/object:Gem::Requirement
|
136
130
|
requirements:
|
137
|
-
- - "
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
version: 3.7.2
|
140
|
-
type: :development
|
141
|
-
prerelease: false
|
142
|
-
version_requirements: !ruby/object:Gem::Requirement
|
143
|
-
requirements:
|
144
|
-
- - "~>"
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: 3.7.2
|
147
|
-
- !ruby/object:Gem::Dependency
|
148
|
-
name: rubocop
|
149
|
-
requirement: !ruby/object:Gem::Requirement
|
150
|
-
requirements:
|
151
|
-
- - "~>"
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
version: 0.51.0
|
154
|
-
type: :development
|
155
|
-
prerelease: false
|
156
|
-
version_requirements: !ruby/object:Gem::Requirement
|
157
|
-
requirements:
|
158
|
-
- - "~>"
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
version: 0.51.0
|
161
|
-
- !ruby/object:Gem::Dependency
|
162
|
-
name: rubocop-rspec
|
163
|
-
requirement: !ruby/object:Gem::Requirement
|
164
|
-
requirements:
|
165
|
-
- - "~>"
|
131
|
+
- - ">="
|
166
132
|
- !ruby/object:Gem::Version
|
167
|
-
version:
|
133
|
+
version: '0'
|
168
134
|
type: :development
|
169
135
|
prerelease: false
|
170
136
|
version_requirements: !ruby/object:Gem::Requirement
|
171
137
|
requirements:
|
172
|
-
- - "
|
138
|
+
- - ">="
|
173
139
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
140
|
+
version: '0'
|
175
141
|
- !ruby/object:Gem::Dependency
|
176
142
|
name: sqlite3
|
177
143
|
requirement: !ruby/object:Gem::Requirement
|
178
144
|
requirements:
|
179
|
-
- - "
|
145
|
+
- - ">="
|
180
146
|
- !ruby/object:Gem::Version
|
181
|
-
version: '
|
147
|
+
version: '0'
|
182
148
|
type: :development
|
183
149
|
prerelease: false
|
184
150
|
version_requirements: !ruby/object:Gem::Requirement
|
185
151
|
requirements:
|
186
|
-
- - "
|
152
|
+
- - ">="
|
187
153
|
- !ruby/object:Gem::Version
|
188
|
-
version: '
|
154
|
+
version: '0'
|
189
155
|
- !ruby/object:Gem::Dependency
|
190
156
|
name: timecop
|
191
157
|
requirement: !ruby/object:Gem::Requirement
|
192
158
|
requirements:
|
193
|
-
- - "
|
159
|
+
- - ">="
|
194
160
|
- !ruby/object:Gem::Version
|
195
|
-
version: 0
|
161
|
+
version: '0'
|
196
162
|
type: :development
|
197
163
|
prerelease: false
|
198
164
|
version_requirements: !ruby/object:Gem::Requirement
|
199
165
|
requirements:
|
200
|
-
- - "
|
166
|
+
- - ">="
|
201
167
|
- !ruby/object:Gem::Version
|
202
|
-
version: 0
|
168
|
+
version: '0'
|
203
169
|
description: Plugin for the PaperTrail gem to track and reify associations
|
204
170
|
email: weston@westonganger.com
|
205
171
|
executables: []
|
@@ -210,7 +176,9 @@ files:
|
|
210
176
|
- LICENSE
|
211
177
|
- README.md
|
212
178
|
- Rakefile
|
179
|
+
- lib/generators/paper_trail_association_tracking/add_foreign_type_to_version_associations_generator.rb
|
213
180
|
- lib/generators/paper_trail_association_tracking/install_generator.rb
|
181
|
+
- lib/generators/paper_trail_association_tracking/templates/add_foreign_type_to_version_associations.rb.erb
|
214
182
|
- lib/generators/paper_trail_association_tracking/templates/add_transaction_id_column_to_versions.rb.erb
|
215
183
|
- lib/generators/paper_trail_association_tracking/templates/create_version_associations.rb.erb
|
216
184
|
- lib/paper_trail-association_tracking.rb
|
@@ -250,10 +218,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
250
218
|
requirements:
|
251
219
|
- - ">="
|
252
220
|
- !ruby/object:Gem::Version
|
253
|
-
version:
|
221
|
+
version: '0'
|
254
222
|
requirements: []
|
255
|
-
|
256
|
-
rubygems_version: 2.7.6
|
223
|
+
rubygems_version: 3.1.2
|
257
224
|
signing_key:
|
258
225
|
specification_version: 4
|
259
226
|
summary: Plugin for the PaperTrail gem to track and reify associations
|