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.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +28 -9
  3. data/.github/ISSUE_TEMPLATE.md +13 -0
  4. data/.gitignore +2 -1
  5. data/.rubocop.yml +100 -0
  6. data/.rubocop_todo.yml +14 -0
  7. data/.travis.yml +8 -9
  8. data/Appraisals +41 -0
  9. data/CHANGELOG.md +49 -9
  10. data/Gemfile +1 -1
  11. data/README.md +130 -109
  12. data/Rakefile +19 -19
  13. data/doc/bug_report_template.rb +20 -14
  14. data/gemfiles/ar3.gemfile +10 -53
  15. data/gemfiles/ar4.gemfile +7 -0
  16. data/gemfiles/ar5.gemfile +13 -0
  17. data/lib/generators/paper_trail/install_generator.rb +26 -18
  18. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +4 -2
  19. data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
  20. data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
  21. data/lib/generators/paper_trail/templates/create_versions.rb +39 -5
  22. data/lib/paper_trail.rb +169 -146
  23. data/lib/paper_trail/attributes_serialization.rb +89 -17
  24. data/lib/paper_trail/cleaner.rb +15 -9
  25. data/lib/paper_trail/config.rb +28 -11
  26. data/lib/paper_trail/frameworks/active_record.rb +4 -0
  27. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
  28. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
  29. data/lib/paper_trail/frameworks/cucumber.rb +1 -0
  30. data/lib/paper_trail/frameworks/rails.rb +2 -7
  31. data/lib/paper_trail/frameworks/rails/controller.rb +29 -9
  32. data/lib/paper_trail/frameworks/rails/engine.rb +7 -1
  33. data/lib/paper_trail/frameworks/rspec.rb +5 -5
  34. data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
  35. data/lib/paper_trail/frameworks/sinatra.rb +6 -4
  36. data/lib/paper_trail/has_paper_trail.rb +199 -106
  37. data/lib/paper_trail/record_history.rb +1 -3
  38. data/lib/paper_trail/reifier.rb +297 -118
  39. data/lib/paper_trail/serializers/json.rb +3 -3
  40. data/lib/paper_trail/serializers/yaml.rb +27 -8
  41. data/lib/paper_trail/version_association_concern.rb +3 -1
  42. data/lib/paper_trail/version_concern.rb +75 -35
  43. data/lib/paper_trail/version_number.rb +6 -9
  44. data/paper_trail.gemspec +44 -51
  45. data/spec/generators/install_generator_spec.rb +24 -25
  46. data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
  47. data/spec/models/animal_spec.rb +12 -12
  48. data/spec/models/boolit_spec.rb +8 -8
  49. data/spec/models/callback_modifier_spec.rb +47 -47
  50. data/spec/models/car_spec.rb +13 -0
  51. data/spec/models/fluxor_spec.rb +3 -3
  52. data/spec/models/gadget_spec.rb +19 -19
  53. data/spec/models/joined_version_spec.rb +3 -3
  54. data/spec/models/json_version_spec.rb +23 -24
  55. data/spec/models/kitchen/banana_spec.rb +3 -3
  56. data/spec/models/not_on_update_spec.rb +7 -4
  57. data/spec/models/post_with_status_spec.rb +13 -3
  58. data/spec/models/skipper_spec.rb +10 -10
  59. data/spec/models/thing_spec.rb +4 -4
  60. data/spec/models/truck_spec.rb +5 -0
  61. data/spec/models/vehicle_spec.rb +5 -0
  62. data/spec/models/version_spec.rb +103 -59
  63. data/spec/models/widget_spec.rb +82 -52
  64. data/spec/modules/paper_trail_spec.rb +2 -2
  65. data/spec/modules/version_concern_spec.rb +11 -12
  66. data/spec/modules/version_number_spec.rb +2 -4
  67. data/spec/paper_trail/config_spec.rb +10 -29
  68. data/spec/paper_trail_spec.rb +16 -14
  69. data/spec/rails_helper.rb +10 -9
  70. data/spec/requests/articles_spec.rb +11 -7
  71. data/spec/spec_helper.rb +41 -22
  72. data/spec/support/alt_db_init.rb +8 -13
  73. data/test/custom_json_serializer.rb +3 -3
  74. data/test/dummy/Rakefile +2 -2
  75. data/test/dummy/app/controllers/application_controller.rb +21 -8
  76. data/test/dummy/app/controllers/articles_controller.rb +11 -8
  77. data/test/dummy/app/controllers/widgets_controller.rb +13 -12
  78. data/test/dummy/app/models/animal.rb +1 -1
  79. data/test/dummy/app/models/article.rb +19 -11
  80. data/test/dummy/app/models/authorship.rb +1 -1
  81. data/test/dummy/app/models/bar_habtm.rb +4 -0
  82. data/test/dummy/app/models/book.rb +4 -4
  83. data/test/dummy/app/models/boolit.rb +1 -1
  84. data/test/dummy/app/models/callback_modifier.rb +6 -6
  85. data/test/dummy/app/models/car.rb +3 -0
  86. data/test/dummy/app/models/chapter.rb +4 -4
  87. data/test/dummy/app/models/customer.rb +1 -1
  88. data/test/dummy/app/models/document.rb +2 -2
  89. data/test/dummy/app/models/editor.rb +1 -1
  90. data/test/dummy/app/models/foo_habtm.rb +4 -0
  91. data/test/dummy/app/models/fruit.rb +2 -2
  92. data/test/dummy/app/models/gadget.rb +1 -1
  93. data/test/dummy/app/models/kitchen/banana.rb +1 -1
  94. data/test/dummy/app/models/legacy_widget.rb +2 -2
  95. data/test/dummy/app/models/line_item.rb +1 -1
  96. data/test/dummy/app/models/not_on_update.rb +1 -1
  97. data/test/dummy/app/models/person.rb +6 -6
  98. data/test/dummy/app/models/post.rb +1 -1
  99. data/test/dummy/app/models/post_with_status.rb +1 -1
  100. data/test/dummy/app/models/quotation.rb +1 -1
  101. data/test/dummy/app/models/section.rb +1 -1
  102. data/test/dummy/app/models/skipper.rb +2 -2
  103. data/test/dummy/app/models/song.rb +13 -4
  104. data/test/dummy/app/models/thing.rb +2 -2
  105. data/test/dummy/app/models/translation.rb +2 -2
  106. data/test/dummy/app/models/truck.rb +4 -0
  107. data/test/dummy/app/models/vehicle.rb +4 -0
  108. data/test/dummy/app/models/whatchamajigger.rb +1 -1
  109. data/test/dummy/app/models/widget.rb +7 -6
  110. data/test/dummy/app/versions/joined_version.rb +4 -3
  111. data/test/dummy/app/versions/json_version.rb +1 -1
  112. data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
  113. data/test/dummy/app/versions/post_version.rb +2 -2
  114. data/test/dummy/config.ru +1 -1
  115. data/test/dummy/config/application.rb +20 -9
  116. data/test/dummy/config/boot.rb +5 -5
  117. data/test/dummy/config/environment.rb +1 -1
  118. data/test/dummy/config/environments/development.rb +4 -3
  119. data/test/dummy/config/environments/production.rb +3 -2
  120. data/test/dummy/config/environments/test.rb +15 -5
  121. data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
  122. data/test/dummy/config/initializers/paper_trail.rb +1 -2
  123. data/test/dummy/config/initializers/secret_token.rb +3 -1
  124. data/test/dummy/config/initializers/session_store.rb +1 -1
  125. data/test/dummy/config/routes.rb +2 -2
  126. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +120 -74
  127. data/test/dummy/db/schema.rb +29 -6
  128. data/test/dummy/script/rails +6 -4
  129. data/test/functional/controller_test.rb +34 -35
  130. data/test/functional/enabled_for_controller_test.rb +6 -7
  131. data/test/functional/modular_sinatra_test.rb +43 -38
  132. data/test/functional/sinatra_test.rb +49 -40
  133. data/test/functional/thread_safety_test.rb +4 -6
  134. data/test/paper_trail_test.rb +15 -14
  135. data/test/test_helper.rb +68 -44
  136. data/test/time_travel_helper.rb +1 -15
  137. data/test/unit/associations_test.rb +517 -251
  138. data/test/unit/cleaner_test.rb +66 -60
  139. data/test/unit/inheritance_column_test.rb +17 -17
  140. data/test/unit/model_test.rb +611 -504
  141. data/test/unit/protected_attrs_test.rb +16 -12
  142. data/test/unit/serializer_test.rb +44 -43
  143. data/test/unit/serializers/json_test.rb +17 -18
  144. data/test/unit/serializers/mixin_json_test.rb +15 -14
  145. data/test/unit/serializers/mixin_yaml_test.rb +20 -16
  146. data/test/unit/serializers/yaml_test.rb +12 -13
  147. data/test/unit/timestamp_test.rb +10 -12
  148. data/test/unit/version_test.rb +7 -7
  149. metadata +92 -40
@@ -1,7 +1,8 @@
1
- require 'active_support/json'
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 'yaml'
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
- if (defined?(::YAML::ENGINE) && ::YAML::ENGINE.yamler == 'psych') ||
27
- (defined?(::Psych) && ::YAML == ::Psych)
28
- arel_field.matches("%\n#{field}:\n- #{value}\n%").
29
- or(arel_field.matches("%\n#{field}:\n-%\n- #{value}\n%"))
30
- else # Syck adds extra spaces into array dumps
31
- arel_field.matches("%\n#{field}: \n%- #{value}\n%").
32
- or(arel_field.matches("%\n#{field}: \n-%\n- #{value}\n%"))
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 'active_support/concern'
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 'active_support/concern'
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, :polymorphic => true
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, :dependent => :destroy
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, lambda { |id| where :transaction_id => id }
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 :item_type => item_type, :item_id => item_id
45
+ where item_type: item_type, item_id: item_id
41
46
  end
42
47
 
43
48
  def creates
44
- where :event => 'create'
49
+ where event: "create"
45
50
  end
46
51
 
47
52
  def updates
48
- where :event => 'update'
53
+ where event: "update"
49
54
  end
50
55
 
51
56
  def destroys
52
- where :event => 'destroy'
57
+ where event: "destroy"
53
58
  end
54
59
 
55
60
  def not_creates
56
- where 'event <> ?', 'create'
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 && self.primary_key_is_int?
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(self.timestamp_sort_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 && self.primary_key_is_int?
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)).order(self.timestamp_sort_order('desc'))
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(self.timestamp_sort_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 = 'asc')
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 self.primary_key_is_int?
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, 'expected to receive a Hash' unless args.is_a?(Hash)
115
+ raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
110
116
 
111
- if columns_hash['object'].type == :jsonb
117
+ if columns_hash["object"].type == :jsonb
112
118
  where("object @> ?", args.to_json)
113
- elsif columns_hash['object'].type == :json
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
- }.reduce { |a, e| a.and(e) }
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, 'expected to receive a Hash' unless args.is_a?(Hash)
139
+ raise ArgumentError, "expected to receive a Hash" unless args.is_a?(Hash)
133
140
 
134
- if columns_hash['object_changes'].type == :jsonb
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['object'].type == :json
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
- }.reduce { |a, e| a.and(e) }
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['object'].type)
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['object_changes'].try(:type))
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? 'object_changes'
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 rescue nil
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
- self.paper_trail_originator
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
- alias_method :version_author, :terminator
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
- item_type.constantize.unserialize_attribute_changes_for_paper_trail!(changes)
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
- PaperTrail.serializer.load(object_changes)
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
- block.call
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
4
- MINOR = 2
5
- TINY = 0
6
- PRE = nil
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
@@ -1,59 +1,52 @@
1
- $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
- require 'paper_trail/version_number'
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 = 'paper_trail'
6
- s.version = PaperTrail.version
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
-
22
- s.add_dependency 'activerecord', ['>= 3.0', '< 6.0']
23
- s.add_dependency 'activesupport', ['>= 3.0', '< 6.0']
24
- s.add_dependency 'request_store', '~> 1.1'
25
-
26
- s.add_development_dependency 'rake', '~> 10.1.1'
27
- s.add_development_dependency 'shoulda', '~> 3.5'
28
- # s.add_development_dependency 'shoulda-matchers', '~> 1.5' # needed for ActiveRecord < 4
29
- s.add_development_dependency 'ffaker', '<= 1.31.0'
30
- s.add_development_dependency 'railties', ['>= 3.0', '< 5.0']
31
- s.add_development_dependency 'sinatra', '~> 1.0'
32
- s.add_development_dependency 'rack-test', '>= 0.6'
33
- s.add_development_dependency 'rspec-rails', '~> 3.1.0'
34
- s.add_development_dependency 'generator_spec'
35
- s.add_development_dependency 'database_cleaner', '~> 1.2'
36
- s.add_development_dependency 'pry-nav'
37
-
38
- # Allow time travel in testing. timecop is only supported after 1.9.2 but does a better cleanup at 'return'
39
- if RUBY_VERSION < "1.9.2"
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 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
47
- s.add_development_dependency 'activerecord-jdbcpostgresql-adapter', '~> 1.3'
48
- s.add_development_dependency 'activerecord-jdbcmysql-adapter', '~> 1.3'
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 'sqlite3', '~> 1.2'
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
- s.add_development_dependency 'pg', '~> 0.17'
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