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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e55c15952e70d133273bb7e64458a3064124070c64228667ec1e160f6b0213a2
4
- data.tar.gz: 755381e69ab58abb9d7167040ad237f384e2cd7c940c15b72c4d7da9454432a6
3
+ metadata.gz: 1c44254220614ad32a3f634a83c4c3a0d8e3c5aa5dd76521f09f702d03d0be1c
4
+ data.tar.gz: 9434f7aa8c162a2117d7c33890bdbd2df93729a343073e67ebc024537ee773ca
5
5
  SHA512:
6
- metadata.gz: 80e0609842fb80eed4e07e57e568d79a4721fcd09d510d6b5033338570963b8989026e96c97e5647599b613a1f0639db6d2211612d41898d349ccd4a3de548e3
7
- data.tar.gz: 991d02c97096a303e445f166a49d0110dda689781ef9bd3f3fcb85083b6d79503e6988e6499e1d873e67345a06265ce5695b92ef30b983bc2627d7aaf72fccbb
6
+ metadata.gz: f5ee8734919969546148c2cb12add0ef77a6e0e0acec5137713974babdc05bb80be5d7321e41b636c74d3b3d4a3463d8e42ddc6b1d5d02f0affed0de0a024fc6
7
+ data.tar.gz: 3205666624b7f94acecca6dc56757e971ba1382b80bb9762c818f7f7935063adebb36e2ab8d3d3d0cb8216b6276042e7eda7f84658cb5e7d696242798503a3b7
@@ -1,8 +1,41 @@
1
1
  # CHANGELOG
2
2
 
3
- This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and
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
- ## 1.0.0
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
- [![Build Status][1]][2]
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
- This gem was extracted from PaperTrail in v9.2 to simplify things in PaperTrail and association tracking seperately.
10
- At this time, `paper_trail` has a runtime dependency on this gem and will keep running the existing tests related
11
- to association tracking. This arrangement will be maintained for a few years, if practical.
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
- <!-- toc -->
17
+
18
+ ## Table of Contents
20
19
 
21
20
  - [Install](#install)
22
- - [Associations](#associations)
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' # Requires v9.2+
33
+ gem 'paper_trail' # Minimum required version is v9.2.0
35
34
  gem 'paper_trail-association_tracking'
36
35
  ```
37
36
 
38
- # Association Tracking
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` (e.g. in an initializer)
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
- PaperTrail will store in the `version_associations` table additional information
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
- To restore Has-One associations as they were at the time, pass option `has_one:
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
- ```ruby
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
- treasure.amount # 100
79
- treasure.location.latitude # 12.345
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
- treasure.update_attributes amount: 153
82
- treasure.location.update_attributes latitude: 54.321
52
+ For example:
83
53
 
84
- t = treasure.versions.last.reify(has_one: true)
85
- t.amount # 100
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 and child are updated in one go, PaperTrail-AssociationTracking can use the
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
- ```ruby
94
- treasure.amount # 100
95
- treasure.location.latitude # 12.345
60
+ For example:
96
61
 
97
- Treasure.transaction do
98
- treasure.location.update_attributes latitude: 54.321
99
- treasure.update_attributes amount: 153
62
+ ```ruby
63
+ class Product
64
+ has_many :photos, autosave: true
100
65
  end
101
66
 
102
- t = treasure.versions.last.reify(has_one: true)
103
- t.amount # 100
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
- By default, PaperTrail-AssociationTracking excludes an associated record from the reified parent
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
- ```ruby
116
- class Widget < ActiveRecord::Base
117
- has_paper_trail
118
- has_one :wotsit, autosave: true
119
- end
73
+ For example:
120
74
 
121
- class Wotsit < ActiveRecord::Base
75
+ ```ruby
76
+ class Product < ActiveRecord::Base
122
77
  has_paper_trail
123
- belongs_to :widget
78
+ has_many :photos, autosave: false ### or if autosave not set
124
79
  end
125
80
 
126
- widget = Widget.create(name: 'widget_0')
127
- widget.update_attributes(name: 'widget_1')
128
- widget.create_wotsit(name: 'wotsit')
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
- widget_0 = widget.versions.last.reify(has_one: true)
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
- widget_0 = widget.versions.last.reify(has_one: true, mark_for_destruction: true)
134
- widget_0.wotsit.marked_for_destruction? # true
135
- widget_0.save!
136
- widget.reload.wotsit # nil
137
- ```
107
+ For example:
138
108
 
139
- # Known Issues
109
+ ```ruby
110
+ item.amount # 100
111
+ item.location.latitude # 12.345
140
112
 
141
- Associations have the following known issues, in order of descending importance. Use in Production at your own risk.
113
+ Item.transaction do
114
+ item.location.update(latitude: 54.321)
115
+ item.update(amount: 153)
116
+ end
142
117
 
143
- **PR's for these issues will happily be accepted**
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
- If you notice anything here that should be updated/removed/edited feel free to create an issue.
123
+ # Limitations
146
124
 
147
- 1. PaperTrail-AssociationTracking only reifies the first level of associations.
148
- 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`
149
- - 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]`
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
- Then each of the following will store authorship versions:
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 = [@solzhenistyn.id, @dostoyevsky.id]
199
- ```
200
-
201
- But none of these will:
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
- See [PT Issue #113](https://github.com/paper-trail-gem/paper_trail/issues/113) for a discussion about this.
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
- At this time during `reify` any STI `has_one` associations will raise a `PaperTrailAssociationTracking::Reifiers::HasOne::FoundMoreThanOne` error. See [PT Issue #594](https://github.com/airblade/paper_trail/issues/594)
170
+ # Contributing
231
171
 
232
- Something to note though, is while the PaperTrail gem supports [Single Table Inheritance](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance), I do NOT recommend STI ever. Your better off rolling your own solution rather than using STI.
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
- # Contributing
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
- Plugin authored by [Weston Ganger](https://github.com/westonganger) & Jared Beck
180
+ Maintained by [Weston Ganger](https://westonganger.com) - [@westonganger](https://github.com/westonganger)
241
181
 
242
- Maintained by [Weston Ganger](https://github.com/westonganger) & [Jared Beck](https://github.com/jaredbeck)
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
- # Enabling ruby interpreter warnings (-w) is, sadly, impractical. There are
24
- # too many noisy warnings that we have no control over, e.g. caused by libs we
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 = #{!!options.with_associations?}\n",
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
- major = ActiveRecord::VERSION::MAJOR
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
@@ -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
- associated_record = @record.send(assoc.name) if @record.send(assoc.foreign_type)
172
- if associated_record && ::PaperTrail.request.enabled_for_model?(associated_record.class)
173
- assoc_version_args[:foreign_key_id] = associated_record.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
- next unless ::PaperTrail.request.enabled_for_model?(assoc.klass)
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
- version = load_version(assoc, id, transaction_id, options[:version_at])
13
- record = load_record(assoc, id, options, version)
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(assoc, id, options, version)
24
+ def load_record(assoc_klass, id, options, version)
23
25
  if version.nil?
24
- assoc.klass.where(assoc.klass.primary_key => id).first
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(assoc, id, transaction_id, version_at)
41
- assoc.klass.paper_trail.version_class.
42
- where("item_type = ?", assoc.klass.base_class.name).
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 version_id_subquery - String. A SQL subquery that selects
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, version_id_subquery)
84
+ def versions_by_id(klass, version_ids)
86
85
  klass.
87
86
  paper_trail.version_class.
88
- where("id IN (#{version_id_subquery})").
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
- version_id_subquery = ::PaperTrail::VersionAssociation.
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
- to_sql
107
- versions_by_id(model.class, version_id_subquery)
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.name.to_sym).to_a
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
- version_id_subquery = assoc.klass.paper_trail.version_class.
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
- to_sql
87
- ::PaperTrailAssociationTracking::Reifiers::HasMany.versions_by_id(assoc.klass, version_id_subquery)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PaperTrailAssociationTracking
4
- VERSION = "1.0.0"
4
+ VERSION = "2.1.1".freeze
5
5
  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.0.0
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: 2018-06-05 00:00:00.000000000 Z
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: '2.2'
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: '2.2'
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: '9.1'
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: '9.1'
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: '2.7'
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: '2.7'
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.9.4
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.9.4
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.4.10
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.4.10
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.21.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.21.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.6.3
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.6.3
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: '12.3'
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: '12.3'
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: 1.19.0
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: 1.19.0
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: '1.3'
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: '1.3'
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.9.1
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.9.1
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: 1.3.6
221
+ version: '0'
254
222
  requirements: []
255
- rubyforge_project:
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