paper_trail 4.2.0 → 5.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 +4 -4
- data/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +28 -9
- data/.github/ISSUE_TEMPLATE.md +13 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +100 -0
- data/.rubocop_todo.yml +14 -0
- data/.travis.yml +8 -9
- data/Appraisals +41 -0
- data/CHANGELOG.md +49 -9
- data/Gemfile +1 -1
- data/README.md +130 -109
- data/Rakefile +19 -19
- data/doc/bug_report_template.rb +20 -14
- data/gemfiles/ar3.gemfile +10 -53
- data/gemfiles/ar4.gemfile +7 -0
- data/gemfiles/ar5.gemfile +13 -0
- data/lib/generators/paper_trail/install_generator.rb +26 -18
- data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +4 -2
- data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
- data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
- data/lib/generators/paper_trail/templates/create_versions.rb +39 -5
- data/lib/paper_trail.rb +169 -146
- data/lib/paper_trail/attributes_serialization.rb +89 -17
- data/lib/paper_trail/cleaner.rb +15 -9
- data/lib/paper_trail/config.rb +28 -11
- data/lib/paper_trail/frameworks/active_record.rb +4 -0
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
- data/lib/paper_trail/frameworks/cucumber.rb +1 -0
- data/lib/paper_trail/frameworks/rails.rb +2 -7
- data/lib/paper_trail/frameworks/rails/controller.rb +29 -9
- data/lib/paper_trail/frameworks/rails/engine.rb +7 -1
- data/lib/paper_trail/frameworks/rspec.rb +5 -5
- data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
- data/lib/paper_trail/frameworks/sinatra.rb +6 -4
- data/lib/paper_trail/has_paper_trail.rb +199 -106
- data/lib/paper_trail/record_history.rb +1 -3
- data/lib/paper_trail/reifier.rb +297 -118
- data/lib/paper_trail/serializers/json.rb +3 -3
- data/lib/paper_trail/serializers/yaml.rb +27 -8
- data/lib/paper_trail/version_association_concern.rb +3 -1
- data/lib/paper_trail/version_concern.rb +75 -35
- data/lib/paper_trail/version_number.rb +6 -9
- data/paper_trail.gemspec +44 -51
- data/spec/generators/install_generator_spec.rb +24 -25
- data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
- data/spec/models/animal_spec.rb +12 -12
- data/spec/models/boolit_spec.rb +8 -8
- data/spec/models/callback_modifier_spec.rb +47 -47
- data/spec/models/car_spec.rb +13 -0
- data/spec/models/fluxor_spec.rb +3 -3
- data/spec/models/gadget_spec.rb +19 -19
- data/spec/models/joined_version_spec.rb +3 -3
- data/spec/models/json_version_spec.rb +23 -24
- data/spec/models/kitchen/banana_spec.rb +3 -3
- data/spec/models/not_on_update_spec.rb +7 -4
- data/spec/models/post_with_status_spec.rb +13 -3
- data/spec/models/skipper_spec.rb +10 -10
- data/spec/models/thing_spec.rb +4 -4
- data/spec/models/truck_spec.rb +5 -0
- data/spec/models/vehicle_spec.rb +5 -0
- data/spec/models/version_spec.rb +103 -59
- data/spec/models/widget_spec.rb +82 -52
- data/spec/modules/paper_trail_spec.rb +2 -2
- data/spec/modules/version_concern_spec.rb +11 -12
- data/spec/modules/version_number_spec.rb +2 -4
- data/spec/paper_trail/config_spec.rb +10 -29
- data/spec/paper_trail_spec.rb +16 -14
- data/spec/rails_helper.rb +10 -9
- data/spec/requests/articles_spec.rb +11 -7
- data/spec/spec_helper.rb +41 -22
- data/spec/support/alt_db_init.rb +8 -13
- data/test/custom_json_serializer.rb +3 -3
- data/test/dummy/Rakefile +2 -2
- data/test/dummy/app/controllers/application_controller.rb +21 -8
- data/test/dummy/app/controllers/articles_controller.rb +11 -8
- data/test/dummy/app/controllers/widgets_controller.rb +13 -12
- data/test/dummy/app/models/animal.rb +1 -1
- data/test/dummy/app/models/article.rb +19 -11
- data/test/dummy/app/models/authorship.rb +1 -1
- data/test/dummy/app/models/bar_habtm.rb +4 -0
- data/test/dummy/app/models/book.rb +4 -4
- data/test/dummy/app/models/boolit.rb +1 -1
- data/test/dummy/app/models/callback_modifier.rb +6 -6
- data/test/dummy/app/models/car.rb +3 -0
- data/test/dummy/app/models/chapter.rb +4 -4
- data/test/dummy/app/models/customer.rb +1 -1
- data/test/dummy/app/models/document.rb +2 -2
- data/test/dummy/app/models/editor.rb +1 -1
- data/test/dummy/app/models/foo_habtm.rb +4 -0
- data/test/dummy/app/models/fruit.rb +2 -2
- data/test/dummy/app/models/gadget.rb +1 -1
- data/test/dummy/app/models/kitchen/banana.rb +1 -1
- data/test/dummy/app/models/legacy_widget.rb +2 -2
- data/test/dummy/app/models/line_item.rb +1 -1
- data/test/dummy/app/models/not_on_update.rb +1 -1
- data/test/dummy/app/models/person.rb +6 -6
- data/test/dummy/app/models/post.rb +1 -1
- data/test/dummy/app/models/post_with_status.rb +1 -1
- data/test/dummy/app/models/quotation.rb +1 -1
- data/test/dummy/app/models/section.rb +1 -1
- data/test/dummy/app/models/skipper.rb +2 -2
- data/test/dummy/app/models/song.rb +13 -4
- data/test/dummy/app/models/thing.rb +2 -2
- data/test/dummy/app/models/translation.rb +2 -2
- data/test/dummy/app/models/truck.rb +4 -0
- data/test/dummy/app/models/vehicle.rb +4 -0
- data/test/dummy/app/models/whatchamajigger.rb +1 -1
- data/test/dummy/app/models/widget.rb +7 -6
- data/test/dummy/app/versions/joined_version.rb +4 -3
- data/test/dummy/app/versions/json_version.rb +1 -1
- data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
- data/test/dummy/app/versions/post_version.rb +2 -2
- data/test/dummy/config.ru +1 -1
- data/test/dummy/config/application.rb +20 -9
- data/test/dummy/config/boot.rb +5 -5
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/development.rb +4 -3
- data/test/dummy/config/environments/production.rb +3 -2
- data/test/dummy/config/environments/test.rb +15 -5
- data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
- data/test/dummy/config/initializers/paper_trail.rb +1 -2
- data/test/dummy/config/initializers/secret_token.rb +3 -1
- data/test/dummy/config/initializers/session_store.rb +1 -1
- data/test/dummy/config/routes.rb +2 -2
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +120 -74
- data/test/dummy/db/schema.rb +29 -6
- data/test/dummy/script/rails +6 -4
- data/test/functional/controller_test.rb +34 -35
- data/test/functional/enabled_for_controller_test.rb +6 -7
- data/test/functional/modular_sinatra_test.rb +43 -38
- data/test/functional/sinatra_test.rb +49 -40
- data/test/functional/thread_safety_test.rb +4 -6
- data/test/paper_trail_test.rb +15 -14
- data/test/test_helper.rb +68 -44
- data/test/time_travel_helper.rb +1 -15
- data/test/unit/associations_test.rb +517 -251
- data/test/unit/cleaner_test.rb +66 -60
- data/test/unit/inheritance_column_test.rb +17 -17
- data/test/unit/model_test.rb +611 -504
- data/test/unit/protected_attrs_test.rb +16 -12
- data/test/unit/serializer_test.rb +44 -43
- data/test/unit/serializers/json_test.rb +17 -18
- data/test/unit/serializers/mixin_json_test.rb +15 -14
- data/test/unit/serializers/mixin_yaml_test.rb +20 -16
- data/test/unit/serializers/yaml_test.rb +12 -13
- data/test/unit/timestamp_test.rb +10 -12
- data/test/unit/version_test.rb +7 -7
- metadata +92 -40
@@ -1,7 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/json"
|
2
2
|
|
3
3
|
module PaperTrail
|
4
4
|
module Serializers
|
5
|
+
# An alternate serializer for, e.g. `versions.object`.
|
5
6
|
module JSON
|
6
7
|
extend self # makes all instance methods become module methods as well
|
7
8
|
|
@@ -25,8 +26,7 @@ module PaperTrail
|
|
25
26
|
# 123.
|
26
27
|
if value.is_a? Numeric
|
27
28
|
arel_field.matches("%\"#{field}\":#{json_value},%").
|
28
|
-
or(
|
29
|
-
arel_field.matches("%\"#{field}\":#{json_value}}%"))
|
29
|
+
or(arel_field.matches("%\"#{field}\":#{json_value}}%"))
|
30
30
|
else
|
31
31
|
arel_field.matches("%\"#{field}\":#{json_value}%")
|
32
32
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "yaml"
|
2
2
|
|
3
3
|
module PaperTrail
|
4
4
|
module Serializers
|
5
|
+
# The default serializer for, e.g. `versions.object`.
|
5
6
|
module YAML
|
6
7
|
extend self # makes all instance methods become module methods as well
|
7
8
|
|
@@ -23,13 +24,31 @@ module PaperTrail
|
|
23
24
|
# in the serialized object_changes
|
24
25
|
def where_object_changes_condition(arel_field, field, value)
|
25
26
|
# Need to check first (before) and secondary (after) fields
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
m1 = nil
|
28
|
+
m2 = nil
|
29
|
+
case yaml_engine_id
|
30
|
+
when :psych
|
31
|
+
m1 = "%\n#{field}:\n- #{value}\n%"
|
32
|
+
m2 = "%\n#{field}:\n-%\n- #{value}\n%"
|
33
|
+
when :syck
|
34
|
+
# Syck adds extra spaces into array dumps
|
35
|
+
m1 = "%\n#{field}: \n%- #{value}\n%"
|
36
|
+
m2 = "%\n#{field}: \n-%\n- #{value}\n%"
|
37
|
+
else
|
38
|
+
raise "Unknown yaml engine"
|
39
|
+
end
|
40
|
+
arel_field.matches(m1).or(arel_field.matches(m2))
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns a symbol identifying the YAML engine. Syck was removed from
|
44
|
+
# the ruby stdlib in ruby 2.0, but is still available as a gem.
|
45
|
+
# @api private
|
46
|
+
def yaml_engine_id
|
47
|
+
if (defined?(::YAML::ENGINE) && ::YAML::ENGINE.yamler == "psych") ||
|
48
|
+
(defined?(::Psych) && ::YAML == ::Psych)
|
49
|
+
:psych
|
50
|
+
else
|
51
|
+
:syck
|
33
52
|
end
|
34
53
|
end
|
35
54
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
3
|
module PaperTrail
|
4
|
+
# Functionality for `PaperTrail::VersionAssociation`. Exists in a module
|
5
|
+
# for the same reasons outlined in version_concern.rb.
|
4
6
|
module VersionAssociationConcern
|
5
7
|
extend ::ActiveSupport::Concern
|
6
8
|
|
@@ -1,18 +1,22 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
3
|
module PaperTrail
|
4
|
+
# Originally, PaperTrail did not provide this module, and all of this
|
5
|
+
# functionality was in `PaperTrail::Version`. That model still exists (and is
|
6
|
+
# used by most apps) but by moving the functionality to this module, people
|
7
|
+
# can include this concern instead of sub-classing the `Version` model.
|
4
8
|
module VersionConcern
|
5
9
|
extend ::ActiveSupport::Concern
|
6
10
|
|
7
11
|
included do
|
8
|
-
belongs_to :item, :
|
12
|
+
belongs_to :item, polymorphic: true
|
9
13
|
|
10
14
|
# Since the test suite has test coverage for this, we want to declare
|
11
15
|
# the association when the test suite is running. This makes it pass when
|
12
16
|
# DB is not initialized prior to test runs such as when we run on Travis
|
13
17
|
# CI (there won't be a db in `test/dummy/db/`).
|
14
18
|
if PaperTrail.config.track_associations?
|
15
|
-
has_many :version_associations, :
|
19
|
+
has_many :version_associations, dependent: :destroy
|
16
20
|
end
|
17
21
|
|
18
22
|
validates_presence_of :event
|
@@ -32,28 +36,29 @@ module PaperTrail
|
|
32
36
|
|
33
37
|
after_create :enforce_version_limit!
|
34
38
|
|
35
|
-
scope :within_transaction,
|
39
|
+
scope :within_transaction, ->(id) { where transaction_id: id }
|
36
40
|
end
|
37
41
|
|
42
|
+
# :nodoc:
|
38
43
|
module ClassMethods
|
39
44
|
def with_item_keys(item_type, item_id)
|
40
|
-
where :
|
45
|
+
where item_type: item_type, item_id: item_id
|
41
46
|
end
|
42
47
|
|
43
48
|
def creates
|
44
|
-
where :
|
49
|
+
where event: "create"
|
45
50
|
end
|
46
51
|
|
47
52
|
def updates
|
48
|
-
where :
|
53
|
+
where event: "update"
|
49
54
|
end
|
50
55
|
|
51
56
|
def destroys
|
52
|
-
where :
|
57
|
+
where event: "destroy"
|
53
58
|
end
|
54
59
|
|
55
60
|
def not_creates
|
56
|
-
where
|
61
|
+
where "event <> ?", "create"
|
57
62
|
end
|
58
63
|
|
59
64
|
# Returns versions after `obj`.
|
@@ -64,12 +69,12 @@ module PaperTrail
|
|
64
69
|
# @return `ActiveRecord::Relation`
|
65
70
|
# @api public
|
66
71
|
def subsequent(obj, timestamp_arg = false)
|
67
|
-
if timestamp_arg != true &&
|
72
|
+
if timestamp_arg != true && primary_key_is_int?
|
68
73
|
return where(arel_table[primary_key].gt(obj.id)).order(arel_table[primary_key].asc)
|
69
74
|
end
|
70
75
|
|
71
76
|
obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self)
|
72
|
-
where(arel_table[PaperTrail.timestamp_field].gt(obj)).order(
|
77
|
+
where(arel_table[PaperTrail.timestamp_field].gt(obj)).order(timestamp_sort_order)
|
73
78
|
end
|
74
79
|
|
75
80
|
# Returns versions before `obj`.
|
@@ -80,37 +85,38 @@ module PaperTrail
|
|
80
85
|
# @return `ActiveRecord::Relation`
|
81
86
|
# @api public
|
82
87
|
def preceding(obj, timestamp_arg = false)
|
83
|
-
if timestamp_arg != true &&
|
88
|
+
if timestamp_arg != true && primary_key_is_int?
|
84
89
|
return where(arel_table[primary_key].lt(obj.id)).order(arel_table[primary_key].desc)
|
85
90
|
end
|
86
91
|
|
87
92
|
obj = obj.send(PaperTrail.timestamp_field) if obj.is_a?(self)
|
88
|
-
where(arel_table[PaperTrail.timestamp_field].lt(obj)).
|
93
|
+
where(arel_table[PaperTrail.timestamp_field].lt(obj)).
|
94
|
+
order(timestamp_sort_order("desc"))
|
89
95
|
end
|
90
96
|
|
91
97
|
def between(start_time, end_time)
|
92
98
|
where(
|
93
99
|
arel_table[PaperTrail.timestamp_field].gt(start_time).
|
94
100
|
and(arel_table[PaperTrail.timestamp_field].lt(end_time))
|
95
|
-
).order(
|
101
|
+
).order(timestamp_sort_order)
|
96
102
|
end
|
97
103
|
|
98
104
|
# Defaults to using the primary key as the secondary sort order if
|
99
105
|
# possible.
|
100
|
-
def timestamp_sort_order(direction =
|
106
|
+
def timestamp_sort_order(direction = "asc")
|
101
107
|
[arel_table[PaperTrail.timestamp_field].send(direction.downcase)].tap do |array|
|
102
|
-
array << arel_table[primary_key].send(direction.downcase) if
|
108
|
+
array << arel_table[primary_key].send(direction.downcase) if primary_key_is_int?
|
103
109
|
end
|
104
110
|
end
|
105
111
|
|
106
112
|
# Performs an attribute search on the serialized object by invoking the
|
107
113
|
# identically-named method in the serializer being used.
|
108
114
|
def where_object(args = {})
|
109
|
-
raise ArgumentError,
|
115
|
+
raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
|
110
116
|
|
111
|
-
if columns_hash[
|
117
|
+
if columns_hash["object"].type == :jsonb
|
112
118
|
where("object @> ?", args.to_json)
|
113
|
-
elsif columns_hash[
|
119
|
+
elsif columns_hash["object"].type == :json
|
114
120
|
predicates = []
|
115
121
|
values = []
|
116
122
|
args.each do |field, value|
|
@@ -123,18 +129,19 @@ module PaperTrail
|
|
123
129
|
arel_field = arel_table[:object]
|
124
130
|
where_conditions = args.map { |field, value|
|
125
131
|
PaperTrail.serializer.where_object_condition(arel_field, field, value)
|
126
|
-
}
|
132
|
+
}
|
133
|
+
where_conditions = where_conditions.reduce { |a, e| a.and(e) }
|
127
134
|
where(where_conditions)
|
128
135
|
end
|
129
136
|
end
|
130
137
|
|
131
138
|
def where_object_changes(args = {})
|
132
|
-
raise ArgumentError,
|
139
|
+
raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
|
133
140
|
|
134
|
-
if columns_hash[
|
141
|
+
if columns_hash["object_changes"].type == :jsonb
|
135
142
|
args.each { |field, value| args[field] = [value] }
|
136
143
|
where("object_changes @> ?", args.to_json)
|
137
|
-
elsif columns_hash[
|
144
|
+
elsif columns_hash["object"].type == :json
|
138
145
|
predicates = []
|
139
146
|
values = []
|
140
147
|
args.each do |field, value|
|
@@ -149,7 +156,8 @@ module PaperTrail
|
|
149
156
|
arel_field = arel_table[:object_changes]
|
150
157
|
where_conditions = args.map { |field, value|
|
151
158
|
PaperTrail.serializer.where_object_changes_condition(arel_field, field, value)
|
152
|
-
}
|
159
|
+
}
|
160
|
+
where_conditions = where_conditions.reduce { |a, e| a.and(e) }
|
153
161
|
where(where_conditions)
|
154
162
|
end
|
155
163
|
end
|
@@ -163,13 +171,22 @@ module PaperTrail
|
|
163
171
|
# Returns whether the `object` column is using the `json` type supported
|
164
172
|
# by PostgreSQL.
|
165
173
|
def object_col_is_json?
|
166
|
-
[:json, :jsonb].include?(columns_hash[
|
174
|
+
[:json, :jsonb].include?(columns_hash["object"].type)
|
167
175
|
end
|
168
176
|
|
169
177
|
# Returns whether the `object_changes` column is using the `json` type
|
170
178
|
# supported by PostgreSQL.
|
171
179
|
def object_changes_col_is_json?
|
172
|
-
[:json, :jsonb].include?(columns_hash[
|
180
|
+
[:json, :jsonb].include?(columns_hash["object_changes"].try(:type))
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# @api private
|
185
|
+
def object_deserialized
|
186
|
+
if self.class.object_col_is_json?
|
187
|
+
object
|
188
|
+
else
|
189
|
+
PaperTrail.serializer.load(object)
|
173
190
|
end
|
174
191
|
end
|
175
192
|
|
@@ -211,18 +228,18 @@ module PaperTrail
|
|
211
228
|
# `ActiveModel::Dirty#changes`. returns `nil` if your `versions` table does
|
212
229
|
# not have an `object_changes` text column.
|
213
230
|
def changeset
|
214
|
-
return nil unless self.class.column_names.include?
|
231
|
+
return nil unless self.class.column_names.include? "object_changes"
|
215
232
|
@changeset ||= load_changeset
|
216
233
|
end
|
217
234
|
|
218
235
|
# Returns who put the item into the state stored in this version.
|
219
236
|
def paper_trail_originator
|
220
|
-
@paper_trail_originator ||= previous.whodunnit
|
237
|
+
@paper_trail_originator ||= previous.try(:whodunnit)
|
221
238
|
end
|
222
239
|
|
223
240
|
def originator
|
224
241
|
::ActiveSupport::Deprecation.warn "Use paper_trail_originator instead of originator."
|
225
|
-
|
242
|
+
paper_trail_originator
|
226
243
|
end
|
227
244
|
|
228
245
|
# Returns who changed the item from the state it had in this version. This
|
@@ -230,7 +247,7 @@ module PaperTrail
|
|
230
247
|
def terminator
|
231
248
|
@terminator ||= whodunnit
|
232
249
|
end
|
233
|
-
|
250
|
+
alias version_author terminator
|
234
251
|
|
235
252
|
def sibling_versions(reload = false)
|
236
253
|
if reload || @sibling_versions.nil?
|
@@ -259,19 +276,42 @@ module PaperTrail
|
|
259
276
|
|
260
277
|
# @api private
|
261
278
|
def load_changeset
|
279
|
+
# First, deserialize the `object_changes` column.
|
262
280
|
changes = HashWithIndifferentAccess.new(object_changes_deserialized)
|
263
|
-
|
281
|
+
|
282
|
+
# The next step is, perhaps unfortunately, called "un-serialization",
|
283
|
+
# and appears to be responsible for custom attribute serializers. For an
|
284
|
+
# example of a custom attribute serializer, see
|
285
|
+
# `Person::TimeZoneSerializer` in the test suite.
|
286
|
+
#
|
287
|
+
# Is `item.class` good enough? Does it handle `inheritance_column`
|
288
|
+
# as well as `Reifier#version_reification_class`? We were using
|
289
|
+
# `item_type.constantize`, but that is problematic when the STI parent
|
290
|
+
# is not versioned. (See `Vehicle` and `Car` in the test suite).
|
291
|
+
#
|
292
|
+
# Note: `item` returns nil if `event` is "destroy".
|
293
|
+
unless item.nil?
|
294
|
+
item.class.unserialize_attribute_changes_for_paper_trail!(changes)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Finally, return a Hash mapping each attribute name to
|
298
|
+
# a two-element array representing before and after.
|
264
299
|
changes
|
265
|
-
rescue # TODO: Rescue something specific
|
266
|
-
{}
|
267
300
|
end
|
268
301
|
|
302
|
+
# If the `object_changes` column is a Postgres JSON column, then
|
303
|
+
# ActiveRecord will deserialize it for us. Otherwise, it's a string column
|
304
|
+
# and we must deserialize it ourselves.
|
269
305
|
# @api private
|
270
306
|
def object_changes_deserialized
|
271
307
|
if self.class.object_changes_col_is_json?
|
272
308
|
object_changes
|
273
309
|
else
|
274
|
-
|
310
|
+
begin
|
311
|
+
PaperTrail.serializer.load(object_changes)
|
312
|
+
rescue # TODO: Rescue something specific
|
313
|
+
{}
|
314
|
+
end
|
275
315
|
end
|
276
316
|
end
|
277
317
|
|
@@ -282,7 +322,7 @@ module PaperTrail
|
|
282
322
|
if defined?(::ActiveRecord::IdentityMap) && ::ActiveRecord::IdentityMap.respond_to?(:without)
|
283
323
|
::ActiveRecord::IdentityMap.without(&block)
|
284
324
|
else
|
285
|
-
|
325
|
+
yield
|
286
326
|
end
|
287
327
|
end
|
288
328
|
|
@@ -1,18 +1,15 @@
|
|
1
1
|
module PaperTrail
|
2
|
+
# :nodoc:
|
2
3
|
module VERSION
|
3
|
-
MAJOR =
|
4
|
-
MINOR =
|
5
|
-
TINY
|
6
|
-
PRE
|
4
|
+
MAJOR = 5
|
5
|
+
MINOR = 0
|
6
|
+
TINY = 0
|
7
|
+
PRE = nil
|
7
8
|
|
8
|
-
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(
|
9
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".").freeze
|
9
10
|
|
10
11
|
def self.to_s
|
11
12
|
STRING
|
12
13
|
end
|
13
14
|
end
|
14
|
-
|
15
|
-
def self.version
|
16
|
-
VERSION::STRING
|
17
|
-
end
|
18
15
|
end
|
data/paper_trail.gemspec
CHANGED
@@ -1,59 +1,52 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path(
|
2
|
-
require
|
1
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
2
|
+
require "paper_trail/version_number"
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
s.name
|
6
|
-
s.version
|
7
|
-
s.platform
|
8
|
-
s.summary
|
9
|
-
s.description
|
10
|
-
s.homepage
|
11
|
-
s.authors
|
12
|
-
s.email
|
13
|
-
s.license
|
14
|
-
|
15
|
-
s.files
|
16
|
-
s.test_files
|
17
|
-
s.executables
|
18
|
-
s.require_paths = [
|
19
|
-
|
20
|
-
s.required_rubygems_version =
|
21
|
-
|
22
|
-
|
23
|
-
s.add_dependency
|
24
|
-
s.add_dependency
|
25
|
-
|
26
|
-
|
27
|
-
s.add_development_dependency
|
28
|
-
|
29
|
-
s.add_development_dependency
|
30
|
-
s.add_development_dependency
|
31
|
-
s.add_development_dependency
|
32
|
-
s.add_development_dependency
|
33
|
-
s.add_development_dependency
|
34
|
-
s.add_development_dependency
|
35
|
-
s.add_development_dependency
|
36
|
-
s.add_development_dependency
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
s.add_development_dependency 'delorean'
|
41
|
-
else
|
42
|
-
s.add_development_dependency 'timecop'
|
43
|
-
end
|
5
|
+
s.name = "paper_trail"
|
6
|
+
s.version = PaperTrail::VERSION::STRING
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.summary = "Track changes to your models' data. Good for auditing or versioning."
|
9
|
+
s.description = s.summary
|
10
|
+
s.homepage = "https://github.com/airblade/paper_trail"
|
11
|
+
s.authors = ["Andy Stewart", "Ben Atkins"]
|
12
|
+
s.email = "batkinz@gmail.com"
|
13
|
+
s.license = "MIT"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.required_rubygems_version = ">= 1.3.6"
|
21
|
+
s.required_ruby_version = ">= 1.9.3"
|
22
|
+
|
23
|
+
s.add_dependency "activerecord", [">= 3.0", "< 6.0"]
|
24
|
+
s.add_dependency "activesupport", [">= 3.0", "< 6.0"]
|
25
|
+
s.add_dependency "request_store", "~> 1.1"
|
26
|
+
|
27
|
+
s.add_development_dependency "appraisal", "~> 2.1"
|
28
|
+
s.add_development_dependency "rake", "~> 10.4.2"
|
29
|
+
s.add_development_dependency "shoulda", "~> 3.5.0"
|
30
|
+
s.add_development_dependency "ffaker", "~> 2.1.0"
|
31
|
+
s.add_development_dependency "railties", [">= 3.0", "< 6.0"]
|
32
|
+
s.add_development_dependency "sinatra", "~> 1.4.6"
|
33
|
+
s.add_development_dependency "rack-test", "~> 0.6.3"
|
34
|
+
s.add_development_dependency "rspec-rails", "~> 3.4.0"
|
35
|
+
s.add_development_dependency "generator_spec", "~> 0.9.3"
|
36
|
+
s.add_development_dependency "database_cleaner", "~> 1.2"
|
37
|
+
s.add_development_dependency "pry-nav", "~> 0.2.4"
|
38
|
+
s.add_development_dependency "rubocop", "~> 0.37.2"
|
39
|
+
s.add_development_dependency "timecop", "~> 0.8.0"
|
44
40
|
|
45
41
|
if defined?(JRUBY_VERSION)
|
46
|
-
s.add_development_dependency
|
47
|
-
s.add_development_dependency
|
48
|
-
s.add_development_dependency
|
42
|
+
s.add_development_dependency "activerecord-jdbcsqlite3-adapter", "~> 1.3.15"
|
43
|
+
s.add_development_dependency "activerecord-jdbcpostgresql-adapter", "~> 1.3.15"
|
44
|
+
s.add_development_dependency "activerecord-jdbcmysql-adapter", "~> 1.3.15"
|
49
45
|
else
|
50
|
-
s.add_development_dependency
|
51
|
-
|
52
|
-
# We would prefer to only constrain mysql2 to '~> 0.3',
|
53
|
-
# but a rails bug (https://github.com/rails/rails/issues/21544)
|
54
|
-
# requires us to constrain to '~> 0.3.20' for now.
|
55
|
-
s.add_development_dependency 'mysql2', '~> 0.3.20'
|
46
|
+
s.add_development_dependency "sqlite3", "~> 1.2"
|
47
|
+
s.add_development_dependency "pg", "~> 0.17"
|
56
48
|
|
57
|
-
|
49
|
+
# activerecord >= 4.2.5 may use mysql2 >= 0.4
|
50
|
+
s.add_development_dependency "mysql2", "~> 0.4.2"
|
58
51
|
end
|
59
52
|
end
|