paper_trail 12.0.0 → 13.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/paper_trail/install/install_generator.rb +15 -3
- data/lib/generators/paper_trail/install/templates/create_versions.rb.erb +4 -2
- data/lib/generators/paper_trail/update_item_subtype/update_item_subtype_generator.rb +4 -2
- data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +6 -0
- data/lib/paper_trail/compatibility.rb +2 -2
- data/lib/paper_trail/errors.rb +33 -0
- data/lib/paper_trail/events/base.rb +47 -28
- data/lib/paper_trail/events/update.rb +23 -4
- data/lib/paper_trail/model_config.rb +49 -42
- data/lib/paper_trail/queries/versions/where_attribute_changes.rb +50 -0
- data/lib/paper_trail/queries/versions/where_object.rb +1 -1
- data/lib/paper_trail/queries/versions/where_object_changes.rb +7 -12
- data/lib/paper_trail/queries/versions/where_object_changes_from.rb +7 -15
- data/lib/paper_trail/queries/versions/where_object_changes_to.rb +57 -0
- data/lib/paper_trail/record_trail.rb +6 -4
- data/lib/paper_trail/reifier.rb +27 -10
- data/lib/paper_trail/request.rb +0 -3
- data/lib/paper_trail/serializers/json.rb +0 -18
- data/lib/paper_trail/serializers/yaml.rb +18 -20
- data/lib/paper_trail/version_concern.rb +57 -16
- data/lib/paper_trail/version_number.rb +1 -1
- data/lib/paper_trail.rb +5 -2
- metadata +67 -43
@@ -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
|
-
#
|
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:
|
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
|
-
|
288
|
+
"##{@record.id}: " + version.errors.full_messages.join(", ")
|
287
289
|
)
|
288
290
|
end
|
289
291
|
|
data/lib/paper_trail/reifier.rb
CHANGED
@@ -60,9 +60,7 @@ module PaperTrail
|
|
60
60
|
model = if options[:dup] == true || version.event == "destroy"
|
61
61
|
klass.new
|
62
62
|
else
|
63
|
-
|
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`.
|
119
|
-
# example in action in `spec/models/animal_spec.rb`.
|
122
|
+
# this method returns the constant `Animal`.
|
120
123
|
#
|
121
|
-
#
|
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
|
-
|
132
|
+
clazz = version.item_type.constantize
|
133
|
+
inheritance_column_name = clazz.inheritance_column
|
124
134
|
inher_col_value = attrs[inheritance_column_name]
|
125
|
-
|
126
|
-
|
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
|
data/lib/paper_trail/request.rb
CHANGED
@@ -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
|
-
|
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://
|
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
|
-
|
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
|
-
#
|
43
|
-
def
|
44
|
-
|
45
|
-
|
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
|
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
|
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
|
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
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
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
|
-
|
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
|
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? && !
|
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
|
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:
|
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:
|
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:
|
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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:
|
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:
|
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.
|
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.
|
168
|
+
version: 1.22.2
|
169
169
|
- !ruby/object:Gem::Dependency
|
170
|
-
name: rubocop-
|
170
|
+
name: rubocop-packaging
|
171
171
|
requirement: !ruby/object:Gem::Requirement
|
172
172
|
requirements:
|
173
173
|
- - "~>"
|
174
174
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
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:
|
182
|
+
version: 0.5.1
|
183
183
|
- !ruby/object:Gem::Dependency
|
184
|
-
name: rubocop-
|
184
|
+
name: rubocop-performance
|
185
185
|
requirement: !ruby/object:Gem::Requirement
|
186
186
|
requirements:
|
187
187
|
- - "~>"
|
188
188
|
- !ruby/object:Gem::Version
|
189
|
-
version:
|
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:
|
196
|
+
version: 1.11.5
|
197
197
|
- !ruby/object:Gem::Dependency
|
198
|
-
name: rubocop-
|
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:
|
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:
|
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.
|
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.
|
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:
|
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:
|
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
|
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
|
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.
|
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
|
-
|
346
|
-
|
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: []
|