paper_trail 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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