paper_trail 12.0.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -194,15 +194,17 @@ module PaperTrail
194
194
  # Save, and create a version record regardless of options such as `:on`,
195
195
  # `:if`, or `:unless`.
196
196
  #
197
- # Arguments are passed to `save`.
197
+ # `in_after_callback`: Indicates if this method is being called within an
198
+ # `after` callback. Defaults to `false`.
199
+ # `options`: Optional arguments passed to `save`.
198
200
  #
199
201
  # This is an "update" event. That is, we record the same data we would in
200
202
  # the case of a normal AR `update`.
201
- def save_with_version(**options)
203
+ def save_with_version(in_after_callback: false, **options)
202
204
  ::PaperTrail.request(enabled: false) do
203
205
  @record.save(**options)
204
206
  end
205
- record_update(force: true, in_after_callback: false, is_touch: false)
207
+ record_update(force: true, in_after_callback: in_after_callback, is_touch: false)
206
208
  end
207
209
 
208
210
  # Like the `update_column` method from `ActiveRecord::Persistence`, but also
@@ -283,7 +285,7 @@ module PaperTrail
283
285
  def log_version_errors(version, action)
284
286
  version.logger&.warn(
285
287
  "Unable to create version for #{action} of #{@record.class.name}" \
286
- "##{@record.id}: " + version.errors.full_messages.join(", ")
288
+ "##{@record.id}: " + version.errors.full_messages.join(", ")
287
289
  )
288
290
  end
289
291
 
@@ -60,9 +60,7 @@ module PaperTrail
60
60
  model = if options[:dup] == true || version.event == "destroy"
61
61
  klass.new
62
62
  else
63
- find_cond = { klass.primary_key => version.item_id }
64
-
65
- version.item || klass.unscoped.where(find_cond).first || klass.new
63
+ version.item || init_model_by_finding_item_id(klass, version) || klass.new
66
64
  end
67
65
 
68
66
  if options[:unversioned_attributes] == :nil && !model.new_record?
@@ -72,6 +70,11 @@ module PaperTrail
72
70
  model
73
71
  end
74
72
 
73
+ # @api private
74
+ def init_model_by_finding_item_id(klass, version)
75
+ klass.unscoped.where(klass.primary_key => version.item_id).first
76
+ end
77
+
75
78
  # Look for attributes that exist in `model` and not in this version.
76
79
  # These attributes should be set to nil. Modifies `attrs`.
77
80
  # @api private
@@ -109,21 +112,35 @@ module PaperTrail
109
112
  end
110
113
 
111
114
  # Given a `version`, return the class to reify. This method supports
112
- # Single Table Inheritance (STI) with custom inheritance columns.
115
+ # Single Table Inheritance (STI) with custom inheritance columns and
116
+ # custom inheritance column values.
113
117
  #
114
118
  # For example, imagine a `version` whose `item_type` is "Animal". The
115
119
  # `animals` table is an STI table (it has cats and dogs) and it has a
116
120
  # custom inheritance column, `species`. If `attrs["species"]` is "Dog",
117
121
  # this method returns the constant `Dog`. If `attrs["species"]` is blank,
118
- # this method returns the constant `Animal`. You can see this particular
119
- # example in action in `spec/models/animal_spec.rb`.
122
+ # this method returns the constant `Animal`.
120
123
  #
121
- # TODO: Duplication: similar `constantize` in VersionConcern#version_limit
124
+ # The values contained in the inheritance columns may be non-camelized
125
+ # strings (e.g. 'dog' instead of 'Dog'). To reify classes in this case
126
+ # we need to call the parents class `sti_class_for` method to retrieve
127
+ # the correct record class.
128
+ #
129
+ # You can see these particular examples in action in
130
+ # `spec/models/animal_spec.rb` and `spec/models/plant_spec.rb`
122
131
  def version_reification_class(version, attrs)
123
- inheritance_column_name = version.item_type.constantize.inheritance_column
132
+ clazz = version.item_type.constantize
133
+ inheritance_column_name = clazz.inheritance_column
124
134
  inher_col_value = attrs[inheritance_column_name]
125
- class_name = inher_col_value.blank? ? version.item_type : inher_col_value
126
- class_name.constantize
135
+ return clazz if inher_col_value.blank?
136
+
137
+ # Rails 6.1 adds a public method for clients to use to customize STI classes. If that
138
+ # method is not available, fall back to using the private one
139
+ if clazz.public_methods.include?(:sti_class_for)
140
+ return clazz.sti_class_for(inher_col_value)
141
+ end
142
+
143
+ clazz.send(:find_sti_class, inher_col_value)
127
144
  end
128
145
  end
129
146
  end
@@ -12,9 +12,6 @@ module PaperTrail
12
12
  #
13
13
  # @api private
14
14
  module Request
15
- class InvalidOption < RuntimeError
16
- end
17
-
18
15
  class << self
19
16
  # Sets any data from the controller that you want PaperTrail to store.
20
17
  # See also `PaperTrail::Rails::Controller#info_for_paper_trail`.
@@ -31,24 +31,6 @@ module PaperTrail
31
31
  arel_field.matches("%\"#{field}\":#{json_value}%")
32
32
  end
33
33
  end
34
-
35
- def where_object_changes_condition(*)
36
- raise <<-STR.squish.freeze
37
- where_object_changes no longer supports reading JSON from a text
38
- column. The old implementation was inaccurate, returning more records
39
- than you wanted. This feature was deprecated in 7.1.0 and removed in
40
- 8.0.0. The json and jsonb datatypes are still supported. See the
41
- discussion at https://github.com/paper-trail-gem/paper_trail/issues/803
42
- STR
43
- end
44
-
45
- # Raises an exception as this operation is not allowed from text columns.
46
- def where_object_changes_from_condition(*)
47
- raise <<-STR.squish.freeze
48
- where_object_changes_from does not support reading JSON from a text
49
- column. The json and jsonb datatypes are supported.
50
- STR
51
- end
52
34
  end
53
35
  end
54
36
  end
@@ -9,13 +9,23 @@ module PaperTrail
9
9
  extend self # makes all instance methods become module methods as well
10
10
 
11
11
  def load(string)
12
- ::YAML.load string
12
+ if use_safe_load?
13
+ ::YAML.safe_load(
14
+ string,
15
+ permitted_classes: ::ActiveRecord.yaml_column_permitted_classes,
16
+ aliases: true
17
+ )
18
+ elsif ::YAML.respond_to?(:unsafe_load)
19
+ ::YAML.unsafe_load(string)
20
+ else
21
+ ::YAML.load(string)
22
+ end
13
23
  end
14
24
 
15
25
  # @param object (Hash | HashWithIndifferentAccess) - Coming from
16
26
  # `recordable_object` `object` will be a plain `Hash`. However, due to
17
- # recent [memory optimizations](https://git.io/fjeYv), when coming from
18
- # `recordable_object_changes`, it will be a `HashWithIndifferentAccess`.
27
+ # recent [memory optimizations](https://github.com/paper-trail-gem/paper_trail/pull/1189),
28
+ # when coming from `recordable_object_changes`, it will be a `HashWithIndifferentAccess`.
19
29
  def dump(object)
20
30
  object = object.to_hash if object.is_a?(HashWithIndifferentAccess)
21
31
  ::YAML.dump object
@@ -27,24 +37,12 @@ module PaperTrail
27
37
  arel_field.matches("%\n#{field}: #{value}\n%")
28
38
  end
29
39
 
30
- # Returns a SQL LIKE condition to be used to match the given field and
31
- # value in the serialized `object_changes`.
32
- def where_object_changes_condition(*)
33
- raise <<-STR.squish.freeze
34
- where_object_changes no longer supports reading YAML from a text
35
- column. The old implementation was inaccurate, returning more records
36
- than you wanted. This feature was deprecated in 8.1.0 and removed in
37
- 9.0.0. The json and jsonb datatypes are still supported. See
38
- discussion at https://github.com/paper-trail-gem/paper_trail/pull/997
39
- STR
40
- end
40
+ private
41
41
 
42
- # Raises an exception as this operation is not allowed with YAML.
43
- def where_object_changes_from_condition(*)
44
- raise <<-STR.squish.freeze
45
- where_object_changes_from does not support reading YAML from a text
46
- column. The json and jsonb datatypes are supported.
47
- STR
42
+ # `use_yaml_unsafe_load` was added in 7.0.3.1, will be removed in 7.1.0?
43
+ def use_safe_load?
44
+ defined?(ActiveRecord.use_yaml_unsafe_load) &&
45
+ !ActiveRecord.use_yaml_unsafe_load
48
46
  end
49
47
  end
50
48
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "paper_trail/attribute_serializers/object_changes_attribute"
4
+ require "paper_trail/queries/versions/where_attribute_changes"
4
5
  require "paper_trail/queries/versions/where_object"
5
6
  require "paper_trail/queries/versions/where_object_changes"
6
7
  require "paper_trail/queries/versions/where_object_changes_from"
8
+ require "paper_trail/queries/versions/where_object_changes_to"
7
9
 
8
10
  module PaperTrail
9
11
  # Originally, PaperTrail did not provide this module, and all of this
@@ -13,18 +15,20 @@ module PaperTrail
13
15
  module VersionConcern
14
16
  extend ::ActiveSupport::Concern
15
17
 
18
+ E_YAML_PERMITTED_CLASSES = <<-EOS.squish.freeze
19
+ PaperTrail encountered a Psych::DisallowedClass error during
20
+ deserialization of YAML column, indicating that
21
+ yaml_column_permitted_classes has not been configured correctly. %s
22
+ EOS
23
+
16
24
  included do
17
- belongs_to :item, polymorphic: true, optional: true
25
+ belongs_to :item, polymorphic: true, optional: true, inverse_of: false
18
26
  validates_presence_of :event
19
27
  after_create :enforce_version_limit!
20
28
  end
21
29
 
22
30
  # :nodoc:
23
31
  module ClassMethods
24
- def item_subtype_column_present?
25
- column_names.include?("item_subtype")
26
- end
27
-
28
32
  def with_item_keys(item_type, item_id)
29
33
  where item_type: item_type, item_id: item_id
30
34
  end
@@ -42,7 +46,7 @@ module PaperTrail
42
46
  end
43
47
 
44
48
  def not_creates
45
- where "event <> ?", "create"
49
+ where.not(event: "create")
46
50
  end
47
51
 
48
52
  def between(start_time, end_time)
@@ -60,6 +64,18 @@ module PaperTrail
60
64
  end
61
65
  end
62
66
 
67
+ # Given an attribute like `"name"`, query the `versions.object_changes`
68
+ # column for any changes that modified the provided attribute.
69
+ #
70
+ # @api public
71
+ def where_attribute_changes(attribute)
72
+ unless attribute.is_a?(String) || attribute.is_a?(Symbol)
73
+ raise ArgumentError, "expected to receive a String or Symbol"
74
+ end
75
+
76
+ Queries::Versions::WhereAttributeChanges.new(self, attribute).execute
77
+ end
78
+
63
79
  # Given a hash of attributes like `name: 'Joan'`, query the
64
80
  # `versions.objects` column.
65
81
  #
@@ -131,6 +147,21 @@ module PaperTrail
131
147
  Queries::Versions::WhereObjectChangesFrom.new(self, args).execute
132
148
  end
133
149
 
150
+ # Given a hash of attributes like `name: 'Joan'`, query the
151
+ # `versions.objects_changes` column for changes where the version changed
152
+ # to the hash of attributes from other values.
153
+ #
154
+ # This is useful for finding versions where the attribute started with an
155
+ # unknown value and changed to a known value. This is in comparison to
156
+ # `where_object_changes` which will find both the changes before and
157
+ # after.
158
+ #
159
+ # @api public
160
+ def where_object_changes_to(args = {})
161
+ raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
162
+ Queries::Versions::WhereObjectChangesTo.new(self, args).execute
163
+ end
164
+
134
165
  def primary_key_is_int?
135
166
  @primary_key_is_int ||= columns_hash[primary_key].type == :integer
136
167
  rescue StandardError # TODO: Rescue something more specific
@@ -237,7 +268,7 @@ module PaperTrail
237
268
  #
238
269
  def reify(options = {})
239
270
  unless self.class.column_names.include? "object"
240
- raise "reify can't be called without an object column"
271
+ raise Error, "reify requires an object column"
241
272
  end
242
273
  return nil if object.nil?
243
274
  ::PaperTrail::Reifier.reify(self, options)
@@ -323,7 +354,10 @@ module PaperTrail
323
354
  else
324
355
  begin
325
356
  PaperTrail.serializer.load(object_changes)
326
- rescue StandardError # TODO: Rescue something more specific
357
+ rescue StandardError => e
358
+ if defined?(::Psych::Exception) && e.instance_of?(::Psych::Exception)
359
+ ::Kernel.warn format(E_YAML_PERMITTED_CLASSES, e)
360
+ end
327
361
  {}
328
362
  end
329
363
  end
@@ -350,16 +384,23 @@ module PaperTrail
350
384
  # The version limit can be global or per-model.
351
385
  #
352
386
  # @api private
353
- #
354
- # TODO: Duplication: similar `constantize` in Reifier#version_reification_class
355
387
  def version_limit
356
- if self.class.item_subtype_column_present?
357
- klass = (item_subtype || item_type).constantize
358
- if klass&.paper_trail_options&.key?(:limit)
359
- return klass.paper_trail_options[:limit]
360
- end
388
+ klass = item.class
389
+ if limit_option?(klass)
390
+ klass.paper_trail_options[:limit]
391
+ elsif base_class_limit_option?(klass)
392
+ klass.base_class.paper_trail_options[:limit]
393
+ else
394
+ PaperTrail.config.version_limit
361
395
  end
362
- PaperTrail.config.version_limit
396
+ end
397
+
398
+ def limit_option?(klass)
399
+ klass.respond_to?(:paper_trail_options) && klass.paper_trail_options.key?(:limit)
400
+ end
401
+
402
+ def base_class_limit_option?(klass)
403
+ klass.respond_to?(:base_class) && limit_option?(klass.base_class)
363
404
  end
364
405
  end
365
406
  end
@@ -7,7 +7,7 @@ module PaperTrail
7
7
  # because of this confusion, but it's not worth the breaking change.
8
8
  # People are encouraged to use `PaperTrail.gem_version` instead.
9
9
  module VERSION
10
- MAJOR = 12
10
+ MAJOR = 13
11
11
  MINOR = 0
12
12
  TINY = 0
13
13
 
data/lib/paper_trail.rb CHANGED
@@ -8,6 +8,7 @@
8
8
  # can revisit this decision.
9
9
  require "active_support/all"
10
10
 
11
+ require "paper_trail/errors"
11
12
  require "paper_trail/cleaner"
12
13
  require "paper_trail/compatibility"
13
14
  require "paper_trail/config"
@@ -25,6 +26,8 @@ module PaperTrail
25
26
  named created_at.
26
27
  EOS
27
28
 
29
+ RAILS_GTE_7_0 = ::ActiveRecord.gem_version >= ::Gem::Version.new("7.0.0")
30
+
28
31
  extend PaperTrail::Cleaner
29
32
 
30
33
  class << self
@@ -68,7 +71,7 @@ module PaperTrail
68
71
  #
69
72
  # @api public
70
73
  def request(options = nil, &block)
71
- if options.nil? && !block_given?
74
+ if options.nil? && !block
72
75
  Request
73
76
  else
74
77
  Request.with(options, &block)
@@ -78,7 +81,7 @@ module PaperTrail
78
81
  # Set the field which records when a version was created.
79
82
  # @api public
80
83
  def timestamp_field=(_field_name)
81
- raise(E_TIMESTAMP_FIELD_CONFIG)
84
+ raise Error, E_TIMESTAMP_FIELD_CONFIG
82
85
  end
83
86
 
84
87
  # Set the PaperTrail serializer. This setting affects all threads.
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paper_trail
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.0.0
4
+ version: 13.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Stewart
8
8
  - Ben Atkins
9
9
  - Jared Beck
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-03-29 00:00:00.000000000 Z
13
+ date: 2022-08-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -46,42 +46,42 @@ dependencies:
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: '2.2'
49
+ version: 2.4.1
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.2'
56
+ version: 2.4.1
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: byebug
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
- version: '11.0'
63
+ version: '11.1'
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: '11.0'
70
+ version: '11.1'
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: ffaker
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - "~>"
76
76
  - !ruby/object:Gem::Version
77
- version: '2.11'
77
+ version: '2.20'
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: '2.11'
84
+ version: '2.20'
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: generator_spec
87
87
  requirement: !ruby/object:Gem::Requirement
@@ -102,14 +102,14 @@ dependencies:
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: 0.9.14
105
+ version: 1.0.0
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: 0.9.14
112
+ version: 1.0.0
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rails
115
115
  requirement: !ruby/object:Gem::Requirement
@@ -144,118 +144,140 @@ dependencies:
144
144
  requirements:
145
145
  - - "~>"
146
146
  - !ruby/object:Gem::Version
147
- version: '4.0'
147
+ version: 5.0.2
148
148
  type: :development
149
149
  prerelease: false
150
150
  version_requirements: !ruby/object:Gem::Requirement
151
151
  requirements:
152
152
  - - "~>"
153
153
  - !ruby/object:Gem::Version
154
- version: '4.0'
154
+ version: 5.0.2
155
155
  - !ruby/object:Gem::Dependency
156
156
  name: rubocop
157
157
  requirement: !ruby/object:Gem::Requirement
158
158
  requirements:
159
159
  - - "~>"
160
160
  - !ruby/object:Gem::Version
161
- version: 1.11.0
161
+ version: 1.22.2
162
162
  type: :development
163
163
  prerelease: false
164
164
  version_requirements: !ruby/object:Gem::Requirement
165
165
  requirements:
166
166
  - - "~>"
167
167
  - !ruby/object:Gem::Version
168
- version: 1.11.0
168
+ version: 1.22.2
169
169
  - !ruby/object:Gem::Dependency
170
- name: rubocop-rails
170
+ name: rubocop-packaging
171
171
  requirement: !ruby/object:Gem::Requirement
172
172
  requirements:
173
173
  - - "~>"
174
174
  - !ruby/object:Gem::Version
175
- version: 2.9.1
175
+ version: 0.5.1
176
176
  type: :development
177
177
  prerelease: false
178
178
  version_requirements: !ruby/object:Gem::Requirement
179
179
  requirements:
180
180
  - - "~>"
181
181
  - !ruby/object:Gem::Version
182
- version: 2.9.1
182
+ version: 0.5.1
183
183
  - !ruby/object:Gem::Dependency
184
- name: rubocop-packaging
184
+ name: rubocop-performance
185
185
  requirement: !ruby/object:Gem::Requirement
186
186
  requirements:
187
187
  - - "~>"
188
188
  - !ruby/object:Gem::Version
189
- version: 0.5.1
189
+ version: 1.11.5
190
190
  type: :development
191
191
  prerelease: false
192
192
  version_requirements: !ruby/object:Gem::Requirement
193
193
  requirements:
194
194
  - - "~>"
195
195
  - !ruby/object:Gem::Version
196
- version: 0.5.1
196
+ version: 1.11.5
197
197
  - !ruby/object:Gem::Dependency
198
- name: rubocop-performance
198
+ name: rubocop-rails
199
+ requirement: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - "~>"
202
+ - !ruby/object:Gem::Version
203
+ version: 2.12.4
204
+ type: :development
205
+ prerelease: false
206
+ version_requirements: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - "~>"
209
+ - !ruby/object:Gem::Version
210
+ version: 2.12.4
211
+ - !ruby/object:Gem::Dependency
212
+ name: rubocop-rake
199
213
  requirement: !ruby/object:Gem::Requirement
200
214
  requirements:
201
215
  - - "~>"
202
216
  - !ruby/object:Gem::Version
203
- version: 1.10.1
217
+ version: 0.6.0
204
218
  type: :development
205
219
  prerelease: false
206
220
  version_requirements: !ruby/object:Gem::Requirement
207
221
  requirements:
208
222
  - - "~>"
209
223
  - !ruby/object:Gem::Version
210
- version: 1.10.1
224
+ version: 0.6.0
211
225
  - !ruby/object:Gem::Dependency
212
226
  name: rubocop-rspec
213
227
  requirement: !ruby/object:Gem::Requirement
214
228
  requirements:
215
229
  - - "~>"
216
230
  - !ruby/object:Gem::Version
217
- version: 2.2.0
231
+ version: 2.5.0
218
232
  type: :development
219
233
  prerelease: false
220
234
  version_requirements: !ruby/object:Gem::Requirement
221
235
  requirements:
222
236
  - - "~>"
223
237
  - !ruby/object:Gem::Version
224
- version: 2.2.0
238
+ version: 2.5.0
239
+ - !ruby/object:Gem::Dependency
240
+ name: simplecov
241
+ requirement: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - "~>"
244
+ - !ruby/object:Gem::Version
245
+ version: 0.21.2
246
+ type: :development
247
+ prerelease: false
248
+ version_requirements: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - "~>"
251
+ - !ruby/object:Gem::Version
252
+ version: 0.21.2
225
253
  - !ruby/object:Gem::Dependency
226
254
  name: mysql2
227
255
  requirement: !ruby/object:Gem::Requirement
228
256
  requirements:
229
257
  - - "~>"
230
258
  - !ruby/object:Gem::Version
231
- version: '0.5'
259
+ version: 0.5.3
232
260
  type: :development
233
261
  prerelease: false
234
262
  version_requirements: !ruby/object:Gem::Requirement
235
263
  requirements:
236
264
  - - "~>"
237
265
  - !ruby/object:Gem::Version
238
- version: '0.5'
266
+ version: 0.5.3
239
267
  - !ruby/object:Gem::Dependency
240
268
  name: pg
241
269
  requirement: !ruby/object:Gem::Requirement
242
270
  requirements:
243
- - - ">="
244
- - !ruby/object:Gem::Version
245
- version: '0.18'
246
- - - "<"
271
+ - - "~>"
247
272
  - !ruby/object:Gem::Version
248
- version: '2.0'
273
+ version: '1.2'
249
274
  type: :development
250
275
  prerelease: false
251
276
  version_requirements: !ruby/object:Gem::Requirement
252
277
  requirements:
253
- - - ">="
254
- - !ruby/object:Gem::Version
255
- version: '0.18'
256
- - - "<"
278
+ - - "~>"
257
279
  - !ruby/object:Gem::Version
258
- version: '2.0'
280
+ version: '1.2'
259
281
  - !ruby/object:Gem::Dependency
260
282
  name: sqlite3
261
283
  requirement: !ruby/object:Gem::Requirement
@@ -297,6 +319,7 @@ files:
297
319
  - lib/paper_trail/cleaner.rb
298
320
  - lib/paper_trail/compatibility.rb
299
321
  - lib/paper_trail/config.rb
322
+ - lib/paper_trail/errors.rb
300
323
  - lib/paper_trail/events/base.rb
301
324
  - lib/paper_trail/events/create.rb
302
325
  - lib/paper_trail/events/destroy.rb
@@ -311,9 +334,11 @@ files:
311
334
  - lib/paper_trail/frameworks/rspec/helpers.rb
312
335
  - lib/paper_trail/has_paper_trail.rb
313
336
  - lib/paper_trail/model_config.rb
337
+ - lib/paper_trail/queries/versions/where_attribute_changes.rb
314
338
  - lib/paper_trail/queries/versions/where_object.rb
315
339
  - lib/paper_trail/queries/versions/where_object_changes.rb
316
340
  - lib/paper_trail/queries/versions/where_object_changes_from.rb
341
+ - lib/paper_trail/queries/versions/where_object_changes_to.rb
317
342
  - lib/paper_trail/record_history.rb
318
343
  - lib/paper_trail/record_trail.rb
319
344
  - lib/paper_trail/reifier.rb
@@ -327,7 +352,7 @@ homepage: https://github.com/paper-trail-gem/paper_trail
327
352
  licenses:
328
353
  - MIT
329
354
  metadata: {}
330
- post_install_message:
355
+ post_install_message:
331
356
  rdoc_options: []
332
357
  require_paths:
333
358
  - lib
@@ -335,16 +360,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
335
360
  requirements:
336
361
  - - ">="
337
362
  - !ruby/object:Gem::Version
338
- version: 2.5.0
363
+ version: 2.6.0
339
364
  required_rubygems_version: !ruby/object:Gem::Requirement
340
365
  requirements:
341
366
  - - ">="
342
367
  - !ruby/object:Gem::Version
343
368
  version: 1.3.6
344
369
  requirements: []
345
- rubyforge_project:
346
- rubygems_version: 2.7.6.2
347
- signing_key:
370
+ rubygems_version: 3.3.7
371
+ signing_key:
348
372
  specification_version: 4
349
373
  summary: Track changes to your models.
350
374
  test_files: []