paper_trail 12.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e29e666977c2b4072eab98684b884cb43dba15e85367eb8221b9294ebad945c
4
- data.tar.gz: 750c5670a52675ab4dcc17bfd5389eaf87ebe4d4a3a68ccbb7ed2da1bd43e52f
3
+ metadata.gz: 776e912c4a06b036014b0301b30a1438974c00b8e63b6e0b78fbffe4dfca7824
4
+ data.tar.gz: 691060404fbb2b4a3f66cf40c0b6187df7a9e8439854097ffbad433a7bdd6e75
5
5
  SHA512:
6
- metadata.gz: b44b40b4683d987d67faf3fabb87d603cd6d99dad2c0c3b6b2859c5d30fd862fe3058e2fa1a1cea982a15ec45a4b8b194a55590b8d523aa8630d3b0644374b8e
7
- data.tar.gz: '0882176106dfa57ce49b0cf0c1267e2465e134a07719fc3436beec7cad5e10a23c6ff7d409b3332123cf8a5b7ce99e854351e4d60072894026027772f1cc14e8'
6
+ metadata.gz: 7110ad57841a431cb50318a79db55ba65f279b839d72009dc2aef961a57c9b044d4d8d706062bbff4cea7fe9b7b2db0a3d83c966518eeffddd66cca6f9e63ae3
7
+ data.tar.gz: d5ebe8b0a5f8dd4df889b1e6a71e81ab5fb1e752a034dd400decd5ef1bdb91441bce9b6061980db7d443796309995c745063175bf7cdb85819028f45fc20dc88
@@ -20,6 +20,12 @@ module PaperTrail
20
20
  default: false,
21
21
  desc: "Store changeset (diff) with each version"
22
22
  )
23
+ class_option(
24
+ :uuid,
25
+ type: :boolean,
26
+ default: false,
27
+ desc: "Use uuid instead of bigint for item_id type (use only if tables use UUIDs)"
28
+ )
23
29
 
24
30
  desc "Generates (but does not run) a migration to add a versions table." \
25
31
  " See section 5.c. Generators in README.md for more information."
@@ -28,7 +34,8 @@ module PaperTrail
28
34
  add_paper_trail_migration(
29
35
  "create_versions",
30
36
  item_type_options: item_type_options,
31
- versions_table_options: versions_table_options
37
+ versions_table_options: versions_table_options,
38
+ item_id_type_options: item_id_type_options
32
39
  )
33
40
  if options.with_changes?
34
41
  add_paper_trail_migration("add_object_changes_to_versions")
@@ -37,13 +44,18 @@ module PaperTrail
37
44
 
38
45
  private
39
46
 
47
+ # To use uuid instead of integer for primary key
48
+ def item_id_type_options
49
+ options.uuid? ? "string" : "bigint"
50
+ end
51
+
40
52
  # MySQL 5.6 utf8mb4 limit is 191 chars for keys used in indexes.
41
53
  # See https://github.com/paper-trail-gem/paper_trail/issues/651
42
54
  def item_type_options
43
55
  if mysql?
44
- ", { null: false, limit: 191 }"
56
+ ", null: false, limit: 191"
45
57
  else
46
- ", { null: false }"
58
+ ", null: false"
47
59
  end
48
60
  end
49
61
 
@@ -11,7 +11,7 @@ class CreateVersions < ActiveRecord::Migration<%= migration_version %>
11
11
  def change
12
12
  create_table :versions<%= versions_table_options %> do |t|
13
13
  t.string :item_type<%= item_type_options %>
14
- t.bigint :item_id, null: false
14
+ t.<%= item_id_type_options %> :item_id, null: false
15
15
  t.string :event, null: false
16
16
  t.string :whodunnit
17
17
  t.text :object, limit: TEXT_BYTES
@@ -29,8 +29,10 @@ class CreateVersions < ActiveRecord::Migration<%= migration_version %>
29
29
  # version of ActiveRecord with support for fractional seconds in MySQL.
30
30
  # (https://github.com/rails/rails/pull/14359)
31
31
  #
32
+ # MySQL users should use the following line for `created_at`
33
+ # t.datetime :created_at, limit: 6
32
34
  t.datetime :created_at
33
35
  end
34
- add_index :versions, %i(item_type item_id)
36
+ add_index :versions, %i[item_type item_id]
35
37
  end
36
38
  end
@@ -32,6 +32,12 @@ module PaperTrail
32
32
  if defined_enums[attr] && val.is_a?(::String)
33
33
  # Because PT 4 used to save the string version of enums to `object_changes`
34
34
  val
35
+ elsif PaperTrail::RAILS_GTE_7_0 && val.is_a?(ActiveRecord::Type::Time::Value)
36
+ # Because Rails 7 time attribute throws a delegation error when you deserialize
37
+ # it with the factory.
38
+ # See ActiveRecord::Type::Time::Value crashes when loaded from YAML on rails 7.0
39
+ # https://github.com/rails/rails/issues/43966
40
+ val.instance_variable_get(:@time)
35
41
  else
36
42
  AttributeSerializerFactory.for(@klass, attr).deserialize(val)
37
43
  end
@@ -8,7 +8,7 @@ module PaperTrail
8
8
  #
9
9
  # It is not safe to assume that a new version of rails will be compatible with
10
10
  # PaperTrail. PT is only compatible with the versions of rails that it is
11
- # tested against. See `.travis.yml`.
11
+ # tested against. See `.github/workflows/test.yml`.
12
12
  #
13
13
  # However, as of
14
14
  # [#1213](https://github.com/paper-trail-gem/paper_trail/pull/1213) our
@@ -18,7 +18,7 @@ module PaperTrail
18
18
  # versions.
19
19
  module Compatibility
20
20
  ACTIVERECORD_GTE = ">= 5.2" # enforced in gemspec
21
- ACTIVERECORD_LT = "< 7.0" # not enforced in gemspec
21
+ ACTIVERECORD_LT = "< 7.1" # not enforced in gemspec
22
22
 
23
23
  E_INCOMPATIBLE_AR = <<-EOS
24
24
  PaperTrail %s is not compatible with ActiveRecord %s. We allow PT
@@ -116,6 +116,20 @@ module PaperTrail
116
116
  @changes_in_latest_version ||= load_changes_in_latest_version
117
117
  end
118
118
 
119
+ # @api private
120
+ def evaluate_only
121
+ only = @record.paper_trail_options[:only].dup
122
+ # Remove Hash arguments and then evaluate whether the attributes (the
123
+ # keys of the hash) should also get pushed into the collection.
124
+ only.delete_if do |obj|
125
+ obj.is_a?(Hash) &&
126
+ obj.each { |attr, condition|
127
+ only << attr if condition.respond_to?(:call) && condition.call(@record)
128
+ }
129
+ end
130
+ only
131
+ end
132
+
119
133
  # An attributed is "ignored" if it is listed in the `:ignore` option
120
134
  # and/or the `:skip` option. Returns true if an ignored attribute has
121
135
  # changed.
@@ -182,20 +196,28 @@ module PaperTrail
182
196
  if value.respond_to?(:call)
183
197
  value.call(@record)
184
198
  elsif value.is_a?(Symbol) && @record.respond_to?(value, true)
185
- # If it is an attribute that is changing in an existing object,
186
- # be sure to grab the current version.
187
- if event != "create" &&
188
- @record.has_attribute?(value) &&
189
- attribute_changed_in_latest_version?(value)
190
- attribute_in_previous_version(value, false)
191
- else
192
- @record.send(value)
193
- end
199
+ metadatum_from_model_method(event, value)
194
200
  else
195
201
  value
196
202
  end
197
203
  end
198
204
 
205
+ # The model method can either be an attribute or a non-attribute method.
206
+ #
207
+ # If it is an attribute that is changing in an existing object,
208
+ # be sure to grab the correct version.
209
+ #
210
+ # @api private
211
+ def metadatum_from_model_method(event, method)
212
+ if event != "create" &&
213
+ @record.has_attribute?(method) &&
214
+ attribute_changed_in_latest_version?(method)
215
+ attribute_in_previous_version(method, false)
216
+ else
217
+ @record.send(method)
218
+ end
219
+ end
220
+
199
221
  # @api private
200
222
  def notable_changes
201
223
  changes_in_latest_version.delete_if { |k, _v|
@@ -207,16 +229,9 @@ module PaperTrail
207
229
  def notably_changed
208
230
  # Memoized to reduce memory usage
209
231
  @notably_changed ||= begin
210
- only = @record.paper_trail_options[:only].dup
211
- # Remove Hash arguments and then evaluate whether the attributes (the
212
- # keys of the hash) should also get pushed into the collection.
213
- only.delete_if do |obj|
214
- obj.is_a?(Hash) &&
215
- obj.each { |attr, condition|
216
- only << attr if condition.respond_to?(:call) && condition.call(@record)
217
- }
218
- end
219
- only.empty? ? changed_and_not_ignored : (changed_and_not_ignored & only)
232
+ only = evaluate_only
233
+ cani = changed_and_not_ignored
234
+ only.empty? ? cani : (cani & only)
220
235
  end
221
236
  end
222
237
 
@@ -35,16 +35,35 @@ module PaperTrail
35
35
  if record_object?
36
36
  data[:object] = recordable_object(@is_touch)
37
37
  end
38
- if record_object_changes?
39
- changes = @force_changes.nil? ? notable_changes : @force_changes
40
- data[:object_changes] = prepare_object_changes(changes)
41
- end
38
+ merge_object_changes_into(data)
42
39
  merge_item_subtype_into(data)
43
40
  merge_metadata_into(data)
44
41
  end
45
42
 
43
+ # If it is a touch event, and changed are empty, it is assumed to be
44
+ # implicit `touch` mutation, and will a version is created.
45
+ #
46
+ # See https://github.com/rails/rails/commit/dcb825902d79d0f6baba956f7c6ec5767611353e
47
+ #
48
+ # @api private
49
+ def changed_notably?
50
+ if @is_touch && changes_in_latest_version.empty?
51
+ true
52
+ else
53
+ super
54
+ end
55
+ end
56
+
46
57
  private
47
58
 
59
+ # @api private
60
+ def merge_object_changes_into(data)
61
+ if record_object_changes?
62
+ changes = @force_changes.nil? ? notable_changes : @force_changes
63
+ data[:object_changes] = prepare_object_changes(changes)
64
+ end
65
+ end
66
+
48
67
  # `touch` cannot record `object_changes` because rails' `touch` does not
49
68
  # perform dirty-tracking. Specifically, methods from `Dirty`, like
50
69
  # `saved_changes`, return the same values before and after `touch`.
@@ -40,8 +40,7 @@ module PaperTrail
40
40
  @model_class.after_create { |r|
41
41
  r.paper_trail.record_create if r.paper_trail.save_version?
42
42
  }
43
- return if @model_class.paper_trail_options[:on].include?(:create)
44
- @model_class.paper_trail_options[:on] << :create
43
+ append_option_uniquely(:on, :create)
45
44
  end
46
45
 
47
46
  # Adds a callback that records a version before or after a "destroy" event.
@@ -49,7 +48,6 @@ module PaperTrail
49
48
  # @api public
50
49
  def on_destroy(recording_order = "before")
51
50
  assert_valid_recording_order_for_on_destroy(recording_order)
52
-
53
51
  @model_class.send(
54
52
  "#{recording_order}_destroy",
55
53
  lambda do |r|
@@ -57,9 +55,7 @@ module PaperTrail
57
55
  r.paper_trail.record_destroy(recording_order)
58
56
  end
59
57
  )
60
-
61
- return if @model_class.paper_trail_options[:on].include?(:destroy)
62
- @model_class.paper_trail_options[:on] << :destroy
58
+ append_option_uniquely(:on, :destroy)
63
59
  end
64
60
 
65
61
  # Adds a callback that records a version after an "update" event.
@@ -81,8 +77,7 @@ module PaperTrail
81
77
  @model_class.after_update { |r|
82
78
  r.paper_trail.clear_version_instance
83
79
  }
84
- return if @model_class.paper_trail_options[:on].include?(:update)
85
- @model_class.paper_trail_options[:on] << :update
80
+ append_option_uniquely(:on, :update)
86
81
  end
87
82
 
88
83
  # Adds a callback that records a version after a "touch" event.
@@ -96,11 +91,13 @@ module PaperTrail
96
91
  # @api public
97
92
  def on_touch
98
93
  @model_class.after_touch { |r|
99
- r.paper_trail.record_update(
100
- force: RAILS_LT_6_0,
101
- in_after_callback: true,
102
- is_touch: true
103
- )
94
+ if r.paper_trail.save_version?
95
+ r.paper_trail.record_update(
96
+ force: RAILS_LT_6_0,
97
+ in_after_callback: true,
98
+ is_touch: true
99
+ )
100
+ end
104
101
  }
105
102
  end
106
103
 
@@ -127,6 +124,13 @@ module PaperTrail
127
124
  RAILS_LT_6_0 = ::ActiveRecord.gem_version < ::Gem::Version.new("6.0.0")
128
125
  private_constant :RAILS_LT_6_0
129
126
 
127
+ # @api private
128
+ def append_option_uniquely(option, value)
129
+ collection = @model_class.paper_trail_options.fetch(option)
130
+ return if collection.include?(value)
131
+ collection << value
132
+ end
133
+
130
134
  # Raises an error if the provided class is an `abstract_class`.
131
135
  # @api private
132
136
  def assert_concrete_activerecord_class(class_name)
@@ -205,6 +209,14 @@ module PaperTrail
205
209
  options
206
210
  end
207
211
 
212
+ # Process an `ignore`, `skip`, or `only` option.
213
+ def event_attribute_option(option_name)
214
+ [@model_class.paper_trail_options[option_name]].
215
+ flatten.
216
+ compact.
217
+ map { |attr| attr.is_a?(Hash) ? attr.stringify_keys : attr.to_s }
218
+ end
219
+
208
220
  def get_versions_scope(options)
209
221
  options[:versions][:scope] || -> { order(model.timestamp_sort_order) }
210
222
  end
@@ -239,12 +251,8 @@ module PaperTrail
239
251
  @model_class.paper_trail_options = options.dup
240
252
 
241
253
  %i[ignore skip only].each do |k|
242
- @model_class.paper_trail_options[k] = [@model_class.paper_trail_options[k]].
243
- flatten.
244
- compact.
245
- map { |attr| attr.is_a?(Hash) ? attr.stringify_keys : attr.to_s }
254
+ @model_class.paper_trail_options[k] = event_attribute_option(k)
246
255
  end
247
-
248
256
  @model_class.paper_trail_options[:meta] ||= {}
249
257
  end
250
258
  end
@@ -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
@@ -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
@@ -26,6 +36,14 @@ module PaperTrail
26
36
  def where_object_condition(arel_field, field, value)
27
37
  arel_field.matches("%\n#{field}: #{value}\n%")
28
38
  end
39
+
40
+ private
41
+
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
46
+ end
29
47
  end
30
48
  end
31
49
  end
@@ -15,8 +15,14 @@ module PaperTrail
15
15
  module VersionConcern
16
16
  extend ::ActiveSupport::Concern
17
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
+
18
24
  included do
19
- belongs_to :item, polymorphic: true, optional: true
25
+ belongs_to :item, polymorphic: true, optional: true, inverse_of: false
20
26
  validates_presence_of :event
21
27
  after_create :enforce_version_limit!
22
28
  end
@@ -348,7 +354,10 @@ module PaperTrail
348
354
  else
349
355
  begin
350
356
  PaperTrail.serializer.load(object_changes)
351
- 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
352
361
  {}
353
362
  end
354
363
  end
@@ -376,10 +385,11 @@ module PaperTrail
376
385
  #
377
386
  # @api private
378
387
  def version_limit
379
- if limit_option?(item.class)
380
- item.class.paper_trail_options[:limit]
381
- elsif base_class_limit_option?(item.class)
382
- item.class.base_class.paper_trail_options[:limit]
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]
383
393
  else
384
394
  PaperTrail.config.version_limit
385
395
  end
@@ -7,8 +7,8 @@ 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
11
- MINOR = 1
10
+ MAJOR = 13
11
+ MINOR = 0
12
12
  TINY = 0
13
13
 
14
14
  # Set PRE to nil unless it's a pre-release (beta, rc, etc.)
data/lib/paper_trail.rb CHANGED
@@ -26,6 +26,8 @@ module PaperTrail
26
26
  named created_at.
27
27
  EOS
28
28
 
29
+ RAILS_GTE_7_0 = ::ActiveRecord.gem_version >= ::Gem::Version.new("7.0.0")
30
+
29
31
  extend PaperTrail::Cleaner
30
32
 
31
33
  class << self
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.1.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-08-30 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
@@ -60,28 +60,28 @@ dependencies:
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.19.0
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.19.0
84
+ version: '2.20'
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: generator_spec
87
87
  requirement: !ruby/object:Gem::Requirement
@@ -158,14 +158,14 @@ dependencies:
158
158
  requirements:
159
159
  - - "~>"
160
160
  - !ruby/object:Gem::Version
161
- version: 1.20.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.20.0
168
+ version: 1.22.2
169
169
  - !ruby/object:Gem::Dependency
170
170
  name: rubocop-packaging
171
171
  requirement: !ruby/object:Gem::Requirement
@@ -200,14 +200,14 @@ dependencies:
200
200
  requirements:
201
201
  - - "~>"
202
202
  - !ruby/object:Gem::Version
203
- version: 2.11.3
203
+ version: 2.12.4
204
204
  type: :development
205
205
  prerelease: false
206
206
  version_requirements: !ruby/object:Gem::Requirement
207
207
  requirements:
208
208
  - - "~>"
209
209
  - !ruby/object:Gem::Version
210
- version: 2.11.3
210
+ version: 2.12.4
211
211
  - !ruby/object:Gem::Dependency
212
212
  name: rubocop-rake
213
213
  requirement: !ruby/object:Gem::Requirement
@@ -228,68 +228,56 @@ dependencies:
228
228
  requirements:
229
229
  - - "~>"
230
230
  - !ruby/object:Gem::Version
231
- version: 2.4.0
231
+ version: 2.5.0
232
232
  type: :development
233
233
  prerelease: false
234
234
  version_requirements: !ruby/object:Gem::Requirement
235
235
  requirements:
236
236
  - - "~>"
237
237
  - !ruby/object:Gem::Version
238
- version: 2.4.0
238
+ version: 2.5.0
239
239
  - !ruby/object:Gem::Dependency
240
240
  name: simplecov
241
241
  requirement: !ruby/object:Gem::Requirement
242
242
  requirements:
243
- - - ">="
244
- - !ruby/object:Gem::Version
245
- version: '0.21'
246
- - - "<"
243
+ - - "~>"
247
244
  - !ruby/object:Gem::Version
248
- version: '0.22'
245
+ version: 0.21.2
249
246
  type: :development
250
247
  prerelease: false
251
248
  version_requirements: !ruby/object:Gem::Requirement
252
249
  requirements:
253
- - - ">="
254
- - !ruby/object:Gem::Version
255
- version: '0.21'
256
- - - "<"
250
+ - - "~>"
257
251
  - !ruby/object:Gem::Version
258
- version: '0.22'
252
+ version: 0.21.2
259
253
  - !ruby/object:Gem::Dependency
260
254
  name: mysql2
261
255
  requirement: !ruby/object:Gem::Requirement
262
256
  requirements:
263
257
  - - "~>"
264
258
  - !ruby/object:Gem::Version
265
- version: '0.5'
259
+ version: 0.5.3
266
260
  type: :development
267
261
  prerelease: false
268
262
  version_requirements: !ruby/object:Gem::Requirement
269
263
  requirements:
270
264
  - - "~>"
271
265
  - !ruby/object:Gem::Version
272
- version: '0.5'
266
+ version: 0.5.3
273
267
  - !ruby/object:Gem::Dependency
274
268
  name: pg
275
269
  requirement: !ruby/object:Gem::Requirement
276
270
  requirements:
277
- - - ">="
278
- - !ruby/object:Gem::Version
279
- version: '0.18'
280
- - - "<"
271
+ - - "~>"
281
272
  - !ruby/object:Gem::Version
282
- version: '2.0'
273
+ version: '1.2'
283
274
  type: :development
284
275
  prerelease: false
285
276
  version_requirements: !ruby/object:Gem::Requirement
286
277
  requirements:
287
- - - ">="
288
- - !ruby/object:Gem::Version
289
- version: '0.18'
290
- - - "<"
278
+ - - "~>"
291
279
  - !ruby/object:Gem::Version
292
- version: '2.0'
280
+ version: '1.2'
293
281
  - !ruby/object:Gem::Dependency
294
282
  name: sqlite3
295
283
  requirement: !ruby/object:Gem::Requirement
@@ -364,7 +352,7 @@ homepage: https://github.com/paper-trail-gem/paper_trail
364
352
  licenses:
365
353
  - MIT
366
354
  metadata: {}
367
- post_install_message:
355
+ post_install_message:
368
356
  rdoc_options: []
369
357
  require_paths:
370
358
  - lib
@@ -372,15 +360,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
372
360
  requirements:
373
361
  - - ">="
374
362
  - !ruby/object:Gem::Version
375
- version: 2.5.0
363
+ version: 2.6.0
376
364
  required_rubygems_version: !ruby/object:Gem::Requirement
377
365
  requirements:
378
366
  - - ">="
379
367
  - !ruby/object:Gem::Version
380
368
  version: 1.3.6
381
369
  requirements: []
382
- rubygems_version: 3.2.22
383
- signing_key:
370
+ rubygems_version: 3.3.7
371
+ signing_key:
384
372
  specification_version: 4
385
373
  summary: Track changes to your models.
386
374
  test_files: []