paper_trail-association_tracking 2.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: be0618cd37dd77186e11f03c7e1006fdd02fccbfb6b83e22b6ae54d4af2bd945
4
- data.tar.gz: 4a7340acd04011de27fa56b947b884cff477873efa1d8dfffa4c06065d9d1509
3
+ metadata.gz: 1c44254220614ad32a3f634a83c4c3a0d8e3c5aa5dd76521f09f702d03d0be1c
4
+ data.tar.gz: 9434f7aa8c162a2117d7c33890bdbd2df93729a343073e67ebc024537ee773ca
5
5
  SHA512:
6
- metadata.gz: a683ddf3b0dea3daa756217049e6dc2ff08b8e3d05c3b72b925c207fd5a8f3e675286917054f42b7d6ca98b10409190ee258ba0474db4b3a341cadf34f09ad7f
7
- data.tar.gz: 64fc6b739f4672f1552b27c34a41941a24e7459a1ba089f3fcff706cf1816b3169ede7232de7fd9744c4b842a4426925e6a15a128a03a4fc52312b58c8d4c1ad
6
+ metadata.gz: f5ee8734919969546148c2cb12add0ef77a6e0e0acec5137713974babdc05bb80be5d7321e41b636c74d3b3d4a3463d8e42ddc6b1d5d02f0affed0de0a024fc6
7
+ data.tar.gz: 3205666624b7f94acecca6dc56757e971ba1382b80bb9762c818f7f7935063adebb36e2ab8d3d3d0cb8216b6276042e7eda7f84658cb5e7d696242798503a3b7
@@ -1,24 +1,41 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 2.0.0 - 2018-01-22
3
+ ### Unreleased - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v2.1.1...master)
4
4
 
5
- - [#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.
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.
6
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.
7
24
 
8
25
  ### How to Upgrade from v1.0.0 or earlier
9
26
 
10
27
  - Run `rails g paper_trail_association_tracking:add_foreign_type_to_version_associations` and then migrate your database.
11
28
 
12
- ## 1.1.1 - 2018-01-14
29
+ ### 1.1.1 - 2018-01-14 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v1.1.0...v1.1.1)
13
30
 
14
31
  - Same as v2 release, this is released simply to maintain a working `v1` branch since `v1.1.0` was broken
15
32
 
16
- ## 1.1.0 - 2018-12-28
33
+ ### 1.1.0 - 2018-12-28 - [View Diff](https://github.com/westonganger/paper_trail-association_tracking/compare/v1.0.0...v1.1.0)
17
34
 
18
35
  - Note: This release is somewhat broken, please upgrade to `v2.0.0` or stay on `v1.0.0`
19
- - [#10](https://github.com/westonganger/paper_trail-association_tracking/pull/9) - The `has_many: true` option now reifies polymorphic associations. Previously they were skipped.
20
- - [#9](https://github.com/westonganger/paper_trail-association_tracking/pull/9) - The `belongs_to: true` option now reifies polymorphic associations. Previously they were skipped.
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.
21
38
 
22
- ## 1.0.0 - 2018-06-04
39
+ ### 1.0.0 - 2018-06-04
23
40
 
24
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.org/westonganger/paper_trail-association_tracking' target='_blank'><img height='21' style='border:0px;height:21px;' src='https://api.travis-ci.org/westonganger/paper_trail-association_tracking.svg?branch=master' border='0' alt='Build Status' /></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
5
  <a href='https://rubygems.org/gems/paper_trail-association_tracking' target='_blank'><img height='21' style='border:0px;height:21px;' src='https://ruby-gem-downloads-badge.herokuapp.com/paper_trail-association_tracking?label=rubygems&type=total&total_label=downloads&color=brightgreen' border='0' alt='RubyGems Downloads' /></a>
6
6
 
7
- 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.
8
8
 
9
9
  **PR's will happily be accepted**
10
10
 
11
- This gem was extracted from PaperTrail in v9.2 to simplify things in PaperTrail and association tracking seperately.
12
- At this time, `paper_trail` only has a development dependency in order to run the tests. If you want use this gem in your project you must add it to your own Gemfile.
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.
13
14
 
14
- A little history lesson, discussed as early as 2009, and first implemented in late 2014, association
15
- tracking was part of PT core until 2018 as an experimental feature and was use at your own risk. This gem now
16
- maintains a list of known issues and we hope the community can help remove some of them via PR's.
17
15
 
18
- ## Table of Contents
19
16
 
20
- <!-- toc -->
17
+
18
+ ## Table of Contents
21
19
 
22
20
  - [Install](#install)
23
- - [Associations](#associations)
21
+ - [Usage](#usage)
22
+ - [Limitations](#limitations)
24
23
  - [Known Issues](#known-issues)
25
24
  - [Contributing](#contributing)
26
25
  - [Credits](#credits)
27
26
 
28
- <!-- tocstop -->
29
27
 
30
28
  # Install
31
29
 
32
30
  ```ruby
33
31
  # Gemfile
34
32
 
35
- gem 'paper_trail' # Requires v9.2+
33
+ gem 'paper_trail' # Minimum required version is v9.2.0
36
34
  gem 'paper_trail-association_tracking'
37
35
  ```
38
36
 
39
- # Association Tracking
40
-
41
- This plugin currently can restore three types of associations: Has-One, Has-Many, and
42
- 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:
43
38
 
44
39
  1. Create a `version_associations` table
45
- 2. Set `PaperTrail.config.track_associations = true` (e.g. in an initializer)
40
+ 2. Set `PaperTrail.config.track_associations = true` in an initializer
46
41
 
42
+ # Usage
47
43
 
48
- Both will be done for you automatically if you run the PaperTrail-AssociationTracking generator (e.g. `rails generate paper_trail_association_tracking:install`)
44
+ First, ensure that you have added `has_paper_trail` to your main model and all associated models that are to be tracked.
49
45
 
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.
46
+ To restore associations as they were at the time you must pass any of the following options to the `reify` method.
53
47
 
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.
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`
61
51
 
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:
52
+ For example:
66
53
 
67
54
  ```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
77
-
78
- treasure.amount # 100
79
- treasure.location.latitude # 12.345
80
-
81
- treasure.update_attributes amount: 153
82
- treasure.location.update_attributes latitude: 54.321
83
-
84
- t = treasure.versions.last.reify(has_one: true)
85
- t.amount # 100
86
- t.location.latitude # 12.345
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,59 +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
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]
@@ -46,10 +46,7 @@ module PaperTrailAssociationTracking
46
46
  private
47
47
 
48
48
  def migration_version
49
- major = ActiveRecord::VERSION::MAJOR
50
- if major >= 5
51
- "[#{major}.#{ActiveRecord::VERSION::MINOR}]"
52
- end
49
+ "[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
53
50
  end
54
51
  end
55
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
@@ -3,9 +3,19 @@
3
3
  class AddForeignTypeToVersionAssociations < ActiveRecord::Migration<%= migration_version %>
4
4
  def self.up
5
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"
6
11
  end
7
12
 
8
13
  def self.down
14
+ remove_index :version_associations,
15
+ name: "index_version_associations_on_foreign_key"
9
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"
10
20
  end
11
21
  end
@@ -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
@@ -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,17 +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).
103
102
  where(foreign_type: [model.class.name, nil]).
104
103
  where("#{version_table}.item_type = ?", assoc.klass.base_class.name).
105
104
  where("created_at >= ? OR transaction_id = ?", version_at, tx_id).
106
105
  group("item_id").
107
- to_sql
108
- versions_by_id(model.class, version_id_subquery)
106
+ map{|e| e.version_id}
107
+ versions_by_id(model.class, version_ids)
109
108
  end
110
109
  end
111
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 = "2.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: 2.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: 2019-01-22 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: []
@@ -252,10 +218,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
252
218
  requirements:
253
219
  - - ">="
254
220
  - !ruby/object:Gem::Version
255
- version: 1.3.6
221
+ version: '0'
256
222
  requirements: []
257
- rubyforge_project:
258
- rubygems_version: 2.7.6
223
+ rubygems_version: 3.1.2
259
224
  signing_key:
260
225
  specification_version: 4
261
226
  summary: Plugin for the PaperTrail gem to track and reify associations