paper_trail 4.0.0 → 4.0.1

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.
data/lib/paper_trail.rb CHANGED
@@ -25,7 +25,7 @@ module PaperTrail
25
25
  end
26
26
 
27
27
  # ActiveRecord 5 drops support for serialized attributes; for previous
28
- # versions of ActiveRecord it is supported, we have a config option
28
+ # versions of ActiveRecord it is supported, we have a config option
29
29
  # to enable it within PaperTrail.
30
30
  def self.serialized_attributes?
31
31
  !!PaperTrail.config.serialized_attributes && ::ActiveRecord::VERSION::MAJOR < 5
@@ -43,12 +43,14 @@ module PaperTrail
43
43
  !!paper_trail_store[:request_enabled_for_controller]
44
44
  end
45
45
 
46
- # Sets whether PaperTrail is enabled or disabled for this model in the current request.
46
+ # Sets whether PaperTrail is enabled or disabled for this model in the
47
+ # current request.
47
48
  def self.enabled_for_model(model, value)
48
49
  paper_trail_store[:"enabled_for_#{model}"] = value
49
50
  end
50
51
 
51
- # Returns `true` if PaperTrail is enabled for this model in the current request, `false` otherwise.
52
+ # Returns `true` if PaperTrail is enabled for this model in the current
53
+ # request, `false` otherwise.
52
54
  def self.enabled_for_model?(model)
53
55
  !!paper_trail_store.fetch(:"enabled_for_#{model}", true)
54
56
  end
@@ -63,10 +65,9 @@ module PaperTrail
63
65
  PaperTrail.config.timestamp_field
64
66
  end
65
67
 
66
- # Sets who is responsible for any changes that occur.
67
- # You would normally use this in a migration or on the console,
68
- # when working with models directly. In a controller it is set
69
- # automatically to the `current_user`.
68
+ # Sets who is responsible for any changes that occur. You would normally use
69
+ # this in a migration or on the console, when working with models directly.
70
+ # In a controller it is set automatically to the `current_user`.
70
71
  def self.whodunnit=(value)
71
72
  paper_trail_store[:whodunnit] = value
72
73
  end
@@ -76,8 +77,8 @@ module PaperTrail
76
77
  paper_trail_store[:whodunnit]
77
78
  end
78
79
 
79
- # Sets any information from the controller that you want PaperTrail
80
- # to store. By default this is set automatically by a before filter.
80
+ # Sets any information from the controller that you want PaperTrail to
81
+ # store. By default this is set automatically by a before filter.
81
82
  def self.controller_info=(value)
82
83
  paper_trail_store[:controller_info] = value
83
84
  end
@@ -117,8 +118,8 @@ module PaperTrail
117
118
 
118
119
  private
119
120
 
120
- # Thread-safe hash to hold PaperTrail's data.
121
- # Initializing with needed default values.
121
+ # Thread-safe hash to hold PaperTrail's data. Initializing with needed
122
+ # default values.
122
123
  def self.paper_trail_store
123
124
  RequestStore.store[:paper_trail] ||= { :request_enabled_for_controller => true }
124
125
  end
@@ -135,12 +136,15 @@ module PaperTrail
135
136
  end
136
137
  end
137
138
 
138
- # Ensure `ProtectedAttributes` gem gets required if it is available before the `Version` class gets loaded in
139
+ # Ensure `ProtectedAttributes` gem gets required if it is available before the
140
+ # `Version` class gets loaded in.
139
141
  unless PaperTrail.active_record_protected_attributes?
140
142
  PaperTrail.send(:remove_instance_variable, :@active_record_protected_attributes)
141
143
  begin
142
144
  require 'protected_attributes'
143
- rescue LoadError; end # will rescue if `ProtectedAttributes` gem is not available
145
+ rescue LoadError
146
+ # In case `ProtectedAttributes` gem is not available.
147
+ end
144
148
  end
145
149
 
146
150
  ActiveSupport.on_load(:active_record) do
@@ -1,19 +1,24 @@
1
1
  module PaperTrail
2
2
  module Cleaner
3
- # Destroys all but the most recent version(s) for items on a given date (or on all dates). Useful for deleting drafts.
3
+ # Destroys all but the most recent version(s) for items on a given date
4
+ # (or on all dates). Useful for deleting drafts.
4
5
  #
5
6
  # Options:
6
- # :keeping An `integer` indicating the number of versions to be kept for each item per date.
7
- # Defaults to `1`.
8
- # :date Should either be a `Date` object specifying which date to destroy versions for or `:all`,
9
- # which will specify that all dates should be cleaned. Defaults to `:all`.
10
- # :item_id The `id` for the item to be cleaned on, or `nil`, which causes all items to be cleaned.
11
- # Defaults to `nil`.
7
+ #
8
+ # - :keeping - An `integer` indicating the number of versions to be kept for
9
+ # each item per date. Defaults to `1`.
10
+ # - :date - Should either be a `Date` object specifying which date to
11
+ # destroy versions for or `:all`, which will specify that all dates
12
+ # should be cleaned. Defaults to `:all`.
13
+ # - :item_id - The `id` for the item to be cleaned on, or `nil`, which
14
+ # causes all items to be cleaned. Defaults to `nil`.
15
+ #
12
16
  def clean_versions!(options = {})
13
17
  options = {:keeping => 1, :date => :all}.merge(options)
14
18
  gather_versions(options[:item_id], options[:date]).each do |item_id, versions|
15
19
  versions.group_by { |v| v.send(PaperTrail.timestamp_field).to_date }.each do |date, _versions|
16
- # remove the number of versions we wish to keep from the collection of versions prior to destruction
20
+ # Remove the number of versions we wish to keep from the collection
21
+ # of versions prior to destruction.
17
22
  _versions.pop(options[:keeping])
18
23
  _versions.map(&:destroy)
19
24
  end
@@ -22,13 +27,18 @@ module PaperTrail
22
27
 
23
28
  private
24
29
 
25
- # Returns a hash of versions grouped by the `item_id` attribute formatted like this: {:item_id => PaperTrail::Version}.
26
- # If `item_id` or `date` is set, versions will be narrowed to those pointing at items with those ids that were created on specified date.
30
+ # Returns a hash of versions grouped by the `item_id` attribute formatted
31
+ # like this: {:item_id => PaperTrail::Version}. If `item_id` or `date` is
32
+ # set, versions will be narrowed to those pointing at items with those ids
33
+ # that were created on specified date.
27
34
  def gather_versions(item_id = nil, date = :all)
28
35
  raise ArgumentError.new("`date` argument must receive a Timestamp or `:all`") unless date == :all || date.respond_to?(:to_date)
29
36
  versions = item_id ? PaperTrail::Version.where(:item_id => item_id) : PaperTrail::Version
30
37
  versions = versions.between(date.to_date, date.to_date + 1.day) unless date == :all
31
- versions = PaperTrail::Version.all if versions == PaperTrail::Version # if versions has not been converted to an ActiveRecord::Relation yet, do so now
38
+
39
+ # If `versions` has not been converted to an ActiveRecord::Relation yet,
40
+ # do so now.
41
+ versions = PaperTrail::Version.all if versions == PaperTrail::Version
32
42
  versions.group_by(&:item_id)
33
43
  end
34
44
  end
@@ -32,7 +32,9 @@ module PaperTrail
32
32
  end
33
33
 
34
34
  def track_associations
35
- @track_associations ||= PaperTrail::VersionAssociation.table_exists?
35
+ @track_associations.nil? ?
36
+ PaperTrail::VersionAssociation.table_exists? :
37
+ @track_associations
36
38
  end
37
39
  alias_method :track_associations?, :track_associations
38
40
 
@@ -1,4 +1,4 @@
1
- # This file only needs to be loaded if the gem is being used outside of Rails, since otherwise
2
- # the model(s) will get loaded in via the `Rails::Engine`
1
+ # This file only needs to be loaded if the gem is being used outside of Rails,
2
+ # since otherwise the model(s) will get loaded in via the `Rails::Engine`.
3
3
  require "paper_trail/frameworks/active_record/models/paper_trail/version_association"
4
4
  require "paper_trail/frameworks/active_record/models/paper_trail/version"
@@ -36,24 +36,26 @@ module PaperTrail
36
36
  #
37
37
  # The columns `ip` and `user_agent` must exist in your `versions` # table.
38
38
  #
39
- # Use the `:meta` option to `PaperTrail::Model::ClassMethods.has_paper_trail`
40
- # to store any extra model-level data you need.
39
+ # Use the `:meta` option to
40
+ # `PaperTrail::Model::ClassMethods.has_paper_trail` to store any extra
41
+ # model-level data you need.
41
42
  def info_for_paper_trail
42
43
  {}
43
44
  end
44
45
 
45
- # Returns `true` (default) or `false` depending on whether PaperTrail should
46
- # be active for the current request.
46
+ # Returns `true` (default) or `false` depending on whether PaperTrail
47
+ # should be active for the current request.
47
48
  #
48
- # Override this method in your controller to specify when PaperTrail should
49
- # be off.
49
+ # Override this method in your controller to specify when PaperTrail
50
+ # should be off.
50
51
  def paper_trail_enabled_for_controller
51
52
  ::PaperTrail.enabled?
52
53
  end
53
54
 
54
55
  private
55
56
 
56
- # Tells PaperTrail whether versions should be saved in the current request.
57
+ # Tells PaperTrail whether versions should be saved in the current
58
+ # request.
57
59
  def set_paper_trail_enabled_for_controller
58
60
  ::PaperTrail.enabled_for_controller = paper_trail_enabled_for_controller
59
61
  end
@@ -63,8 +65,8 @@ module PaperTrail
63
65
  ::PaperTrail.whodunnit = user_for_paper_trail if ::PaperTrail.enabled_for_controller?
64
66
  end
65
67
 
66
- # Tells PaperTrail any information from the controller you want
67
- # to store alongside any changes that occur.
68
+ # Tells PaperTrail any information from the controller you want to store
69
+ # alongside any changes that occur.
68
70
  def set_paper_trail_controller_info
69
71
  ::PaperTrail.controller_info = info_for_paper_trail if ::PaperTrail.enabled_for_controller?
70
72
  end
@@ -3,7 +3,8 @@ require 'active_support/core_ext/object' # provides the `try` method
3
3
  module PaperTrail
4
4
  module Sinatra
5
5
 
6
- # Register this module inside your Sinatra application to gain access to controller-level methods used by PaperTrail
6
+ # Register this module inside your Sinatra application to gain access to
7
+ # controller-level methods used by PaperTrail.
7
8
  def self.registered(app)
8
9
  app.use RequestStore::Middleware
9
10
  app.helpers self
@@ -8,31 +8,42 @@ module PaperTrail
8
8
  end
9
9
 
10
10
  module ClassMethods
11
- # Declare this in your model to track every create, update, and destroy. Each version of
12
- # the model is available in the `versions` association.
11
+ # Declare this in your model to track every create, update, and destroy.
12
+ # Each version of the model is available in the `versions` association.
13
13
  #
14
14
  # Options:
15
- # :on the events to track (optional; defaults to all of them). Set to an array of
16
- # `:create`, `:update`, `:destroy` as desired.
17
- # :class_name the name of a custom Version class. This class should inherit from `PaperTrail::Version`.
18
- # :ignore an array of attributes for which a new `Version` will not be created if only they change.
19
- # it can also aceept a Hash as an argument where the key is the attribute to ignore (a `String` or `Symbol`),
20
- # which will only be ignored if the value is a `Proc` which returns truthily.
21
- # :if, :unless Procs that allow to specify conditions when to save versions for an object
22
- # :only inverse of `ignore` - a new `Version` will be created only for these attributes if supplied
23
- # it can also aceept a Hash as an argument where the key is the attribute to track (a `String` or `Symbol`),
24
- # which will only be counted if the value is a `Proc` which returns truthily.
25
- # :skip fields to ignore completely. As with `ignore`, updates to these fields will not create
26
- # a new `Version`. In addition, these fields will not be included in the serialized versions
27
- # of the object whenever a new `Version` is created.
28
- # :meta a hash of extra data to store. You must add a column to the `versions` table for each key.
29
- # Values are objects or procs (which are called with `self`, i.e. the model with the paper
30
- # trail). See `PaperTrail::Controller.info_for_paper_trail` for how to store data from
31
- # the controller.
32
- # :versions the name to use for the versions association. Default is `:versions`.
33
- # :version the name to use for the method which returns the version the instance was reified from.
34
- # Default is `:version`.
35
- # :save_changes whether or not to save changes to the object_changes column if it exists. Default is true
15
+ #
16
+ # - :on - The events to track (optional; defaults to all of them). Set
17
+ # to an array of `:create`, `:update`, `:destroy` as desired.
18
+ # - :class_name - The name of a custom Version class. This class should
19
+ # inherit from `PaperTrail::Version`.
20
+ # - :ignore - An array of attributes for which a new `Version` will not be
21
+ # created if only they change. It can also aceept a Hash as an
22
+ # argument where the key is the attribute to ignore (a `String` or
23
+ # `Symbol`), which will only be ignored if the value is a `Proc` which
24
+ # returns truthily.
25
+ # - :if, :unless - Procs that allow to specify conditions when to save
26
+ # versions for an object.
27
+ # - :only - Inverse of `ignore`. A new `Version` will be created only
28
+ # for these attributes if supplied it can also aceept a Hash as an
29
+ # argument where the key is the attribute to track (a `String` or
30
+ # `Symbol`), which will only be counted if the value is a `Proc` which
31
+ # returns truthily.
32
+ # - :skip - Fields to ignore completely. As with `ignore`, updates to
33
+ # these fields will not create a new `Version`. In addition, these
34
+ # fields will not be included in the serialized versions of the object
35
+ # whenever a new `Version` is created.
36
+ # - :meta - A hash of extra data to store. You must add a column to the
37
+ # `versions` table for each key. Values are objects or procs (which
38
+ # are called with `self`, i.e. the model with the paper trail). See
39
+ # `PaperTrail::Controller.info_for_paper_trail` for how to store data
40
+ # from the controller.
41
+ # - :versions - The name to use for the versions association. Default
42
+ # is `:versions`.
43
+ # - :version - The name to use for the method which returns the version
44
+ # the instance was reified from. Default is `:version`.
45
+ # - :save_changes - Whether or not to save changes to the object_changes
46
+ # column if it exists. Default is true
36
47
  #
37
48
  def has_paper_trail(options = {})
38
49
  # Lazily include the instance methods so we don't clutter up
@@ -64,7 +75,8 @@ module PaperTrail
64
75
 
65
76
  attr_accessor :paper_trail_event
66
77
 
67
- if ::ActiveRecord::VERSION::MAJOR >= 4 # `has_many` syntax for specifying order uses a lambda in Rails 4
78
+ # `has_many` syntax for specifying order uses a lambda in Rails 4
79
+ if ::ActiveRecord::VERSION::MAJOR >= 4
68
80
  has_many self.versions_association_name,
69
81
  lambda { order(model.timestamp_sort_order) },
70
82
  :class_name => self.version_class_name, :as => :item
@@ -76,7 +88,11 @@ module PaperTrail
76
88
  end
77
89
 
78
90
  options[:on] ||= [:create, :update, :destroy]
79
- options_on = Array(options[:on]) # so that a single symbol can be passed in without wrapping it in an `Array`
91
+
92
+ # Wrap the :on option in an array if necessary. This allows a single
93
+ # symbol to be passed in.
94
+ options_on = Array(options[:on])
95
+
80
96
  after_create :record_create, :if => :save_version? if options_on.include?(:create)
81
97
  if options_on.include?(:update)
82
98
  before_save :reset_timestamp_attrs_for_update_if_needed!, :on => :update
@@ -85,7 +101,7 @@ module PaperTrail
85
101
  end
86
102
  after_destroy :record_destroy, :if => :save_version? if options_on.include?(:destroy)
87
103
 
88
- # Reset the transaction id when the transaction is closed
104
+ # Reset the transaction id when the transaction is closed.
89
105
  after_commit :reset_transaction_id
90
106
  after_rollback :reset_transaction_id
91
107
  after_rollback :clear_rolled_back_versions
@@ -110,40 +126,47 @@ module PaperTrail
110
126
  @paper_trail_version_class ||= version_class_name.constantize
111
127
  end
112
128
 
113
- # Used for Version#object attribute
129
+ # Used for `Version#object` attribute.
114
130
  def serialize_attributes_for_paper_trail!(attributes)
115
- # don't serialize before values before inserting into columns of type `JSON` on `PostgreSQL` databases
131
+ # Don't serialize before values before inserting into columns of type
132
+ # `JSON` on `PostgreSQL` databases.
116
133
  return attributes if self.paper_trail_version_class.object_col_is_json?
117
134
 
118
135
  serialized_attributes.each do |key, coder|
119
136
  if attributes.key?(key)
120
- # Fall back to current serializer if `coder` has no `dump` method
137
+ # Fall back to current serializer if `coder` has no `dump` method.
121
138
  coder = PaperTrail.serializer unless coder.respond_to?(:dump)
122
139
  attributes[key] = coder.dump(attributes[key])
123
140
  end
124
141
  end
125
142
  end
126
143
 
144
+ # TODO: There is a lot of duplication between this and
145
+ # `serialize_attributes_for_paper_trail!`.
127
146
  def unserialize_attributes_for_paper_trail!(attributes)
128
- # don't serialize before values before inserting into columns of type `JSON` on `PostgreSQL` databases
147
+ # Don't serialize before values before inserting into columns of type
148
+ # `JSON` on `PostgreSQL` databases.
129
149
  return attributes if self.paper_trail_version_class.object_col_is_json?
130
150
 
131
151
  serialized_attributes.each do |key, coder|
132
152
  if attributes.key?(key)
153
+ # Fall back to current serializer if `coder` has no `dump` method.
154
+ # TODO: Shouldn't this be `:load`?
133
155
  coder = PaperTrail.serializer unless coder.respond_to?(:dump)
134
156
  attributes[key] = coder.load(attributes[key])
135
157
  end
136
158
  end
137
159
  end
138
160
 
139
- # Used for Version#object_changes attribute
161
+ # Used for Version#object_changes attribute.
140
162
  def serialize_attribute_changes_for_paper_trail!(changes)
141
- # don't serialize before values before inserting into columns of type `JSON` on `PostgreSQL` databases
163
+ # Don't serialize before values before inserting into columns of type `JSON`
164
+ # on `PostgreSQL` databases.
142
165
  return changes if self.paper_trail_version_class.object_changes_col_is_json?
143
166
 
144
167
  serialized_attributes.each do |key, coder|
145
168
  if changes.key?(key)
146
- # Fall back to current serializer if `coder` has no `dump` method
169
+ # Fall back to current serializer if `coder` has no `dump` method.
147
170
  coder = PaperTrail.serializer unless coder.respond_to?(:dump)
148
171
  old_value, new_value = changes[key]
149
172
  changes[key] = [coder.dump(old_value),
@@ -152,12 +175,17 @@ module PaperTrail
152
175
  end
153
176
  end
154
177
 
178
+ # TODO: There is a lot of duplication between this and
179
+ # `serialize_attribute_changes_for_paper_trail!`.
155
180
  def unserialize_attribute_changes_for_paper_trail!(changes)
156
- # don't serialize before values before inserting into columns of type `JSON` on `PostgreSQL` databases
181
+ # Don't serialize before values before inserting into columns of type
182
+ # `JSON` on `PostgreSQL` databases.
157
183
  return changes if self.paper_trail_version_class.object_changes_col_is_json?
158
184
 
159
185
  serialized_attributes.each do |key, coder|
160
186
  if changes.key?(key)
187
+ # Fall back to current serializer if `coder` has no `dump` method.
188
+ # TODO: Shouldn't this be `:load`?
161
189
  coder = PaperTrail.serializer unless coder.respond_to?(:dump)
162
190
  old_value, new_value = changes[key]
163
191
  changes[key] = [coder.load(old_value),
@@ -236,7 +264,8 @@ module PaperTrail
236
264
  self.class.paper_trail_on! if paper_trail_was_enabled
237
265
  end
238
266
 
239
- # Utility method for reifying. Anything executed inside the block will appear like a new record
267
+ # Utility method for reifying. Anything executed inside the block will
268
+ # appear like a new record.
240
269
  def appear_as_new_record
241
270
  instance_eval {
242
271
  alias :old_new_record? :new_record?
@@ -246,7 +275,8 @@ module PaperTrail
246
275
  instance_eval { alias :new_record? :old_new_record? }
247
276
  end
248
277
 
249
- # Temporarily overwrites the value of whodunnit and then executes the provided block.
278
+ # Temporarily overwrites the value of whodunnit and then executes the
279
+ # provided block.
250
280
  def whodunnit(value)
251
281
  raise ArgumentError, 'expected to receive a block' unless block_given?
252
282
  current_whodunnit = PaperTrail.whodunnit
@@ -296,8 +326,8 @@ module PaperTrail
296
326
  :event => paper_trail_event || 'create',
297
327
  :whodunnit => PaperTrail.whodunnit
298
328
  }
299
- if respond_to?(:created_at)
300
- data[PaperTrail.timestamp_field] = created_at
329
+ if respond_to?(:updated_at)
330
+ data[PaperTrail.timestamp_field] = updated_at
301
331
  end
302
332
  if paper_trail_options[:save_changes] && changed_notably? && self.class.paper_trail_version_class.column_names.include?('object_changes')
303
333
  data[:object_changes] = self.class.paper_trail_version_class.object_changes_col_is_json? ? changes_for_paper_trail :
@@ -344,15 +374,19 @@ module PaperTrail
344
374
  _changes.to_hash
345
375
  end
346
376
 
347
- # Invoked via`after_update` callback for when a previous version is reified and then saved
377
+ # Invoked via`after_update` callback for when a previous version is
378
+ # reified and then saved.
348
379
  def clear_version_instance!
349
380
  send("#{self.class.version_association_name}=", nil)
350
381
  end
351
382
 
383
+ # Invoked via callback when a user attempts to persist a reified
384
+ # `Version`.
352
385
  def reset_timestamp_attrs_for_update_if_needed!
353
- return if self.live? # invoked via callback when a user attempts to persist a reified `Version`
386
+ return if self.live?
354
387
  timestamp_attributes_for_update_in_model.each do |column|
355
- # ActiveRecord 4.2 deprecated `reset_column!` in favor of `restore_column!`
388
+ # ActiveRecord 4.2 deprecated `reset_column!` in favor of
389
+ # `restore_column!`.
356
390
  if respond_to?("restore_#{column}!")
357
391
  send("restore_#{column}!")
358
392
  else
@@ -382,7 +416,7 @@ module PaperTrail
382
416
  end
383
417
  end
384
418
 
385
- # saves associations if the join table for `VersionAssociation` exists
419
+ # Saves associations if the join table for `VersionAssociation` exists.
386
420
  def save_associations(version)
387
421
  return unless PaperTrail.config.track_associations?
388
422
  self.class.reflect_on_all_associations(:belongs_to).each do |assoc|
@@ -424,8 +458,8 @@ module PaperTrail
424
458
  if v.respond_to?(:call)
425
459
  v.call(self)
426
460
  elsif v.is_a?(Symbol) && respond_to?(v)
427
- # if it is an attribute that is changing in an existing object,
428
- # be sure to grab the current version
461
+ # If it is an attribute that is changing in an existing object,
462
+ # be sure to grab the current version.
429
463
  if has_attribute?(v) && send("#{v}_changed?".to_sym) && data[:event] != 'create'
430
464
  send("#{v}_was".to_sym)
431
465
  else
@@ -435,6 +469,7 @@ module PaperTrail
435
469
  v
436
470
  end
437
471
  end
472
+
438
473
  # Second we merge any extra data from the controller (if available).
439
474
  data.merge(PaperTrail.controller_info || {})
440
475
  end
@@ -449,8 +484,8 @@ module PaperTrail
449
484
  end
450
485
  end
451
486
 
452
- # returns hash of attributes (with appropriate attributes serialized),
453
- # ommitting attributes to be skipped
487
+ # Returns hash of attributes (with appropriate attributes serialized),
488
+ # ommitting attributes to be skipped.
454
489
  def object_attrs_for_paper_trail(attributes_hash)
455
490
  attrs = attributes_hash.except(*self.paper_trail_options[:skip])
456
491
  if PaperTrail.serialized_attributes?
@@ -459,10 +494,9 @@ module PaperTrail
459
494
  attrs
460
495
  end
461
496
 
462
- # This method determines whether it is appropriate to generate a new
463
- # version instance. A timestamp-only update (e.g. only `updated_at`
464
- # changed) is considered notable unless an ignored attribute was also
465
- # changed.
497
+ # Determines whether it is appropriate to generate a new version
498
+ # instance. A timestamp-only update (e.g. only `updated_at` changed) is
499
+ # considered notable unless an ignored attribute was also changed.
466
500
  def changed_notably?
467
501
  if ignored_attr_has_changed?
468
502
  timestamps = timestamp_attributes_for_update_in_model.map(&:to_s)
@@ -473,8 +507,8 @@ module PaperTrail
473
507
  end
474
508
 
475
509
  # An attributed is "ignored" if it is listed in the `:ignore` option
476
- # and/or the `:skip` option. Returns true if an ignored attribute
477
- # has changed.
510
+ # and/or the `:skip` option. Returns true if an ignored attribute has
511
+ # changed.
478
512
  def ignored_attr_has_changed?
479
513
  ignored = self.paper_trail_options[:ignore] + self.paper_trail_options[:skip]
480
514
  ignored.any? && (changed & ignored).any?
@@ -482,7 +516,8 @@ module PaperTrail
482
516
 
483
517
  def notably_changed
484
518
  only = self.paper_trail_options[:only].dup
485
- # remove Hash arguments and then evaluate whether the attributes (the keys of the hash) should also get pushed into the collection
519
+ # Remove Hash arguments and then evaluate whether the attributes (the
520
+ # keys of the hash) should also get pushed into the collection.
486
521
  only.delete_if do |obj|
487
522
  obj.is_a?(Hash) && obj.each { |attr, condition| only << attr if condition.respond_to?(:call) && condition.call(self) }
488
523
  end
@@ -491,7 +526,8 @@ module PaperTrail
491
526
 
492
527
  def changed_and_not_ignored
493
528
  ignore = self.paper_trail_options[:ignore].dup
494
- # remove Hash arguments and then evaluate whether the attributes (the keys of the hash) should also get pushed into the collection
529
+ # Remove Hash arguments and then evaluate whether the attributes (the
530
+ # keys of the hash) should also get pushed into the collection.
495
531
  ignore.delete_if do |obj|
496
532
  obj.is_a?(Hash) && obj.each { |attr, condition| ignore << attr if condition.respond_to?(:call) && condition.call(self) }
497
533
  end