culturecode-track_changes 0.2.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bfa353667777cba682df7ab603e3b4b21054439c6f6d91e4c0a0a719a244de33
4
- data.tar.gz: 1155b70851fddaa85d6c10e7c0e9541649117ed8a9cf6dd38550788559269093
3
+ metadata.gz: 740a90693ee8263535857c6037b35d1f005a3ad3e9f6e1d200b8db1fefa82a89
4
+ data.tar.gz: df7bbc71ddfd165f0cc2cb347284b6fcb4aa334b58699e24e7294a35d8a540e2
5
5
  SHA512:
6
- metadata.gz: 0e9f8c86da3f47175fd32bdefc8b070f2526dea41fcc279f5a4e4392dd464eec3d4ca68b2f2b9fd9d785c87c47e110d50463f382875cfd360e9ee3a222c603e7
7
- data.tar.gz: 2cb9c5348ac4a7d6f24c1c3bbd0f1eed42098d5d361009d8ec2d5a820863dba06ea2f2333db2cb61a015f7c90d593cf821dae14cd477ac03eaf6ffcbc926153f
6
+ metadata.gz: c06836667b94b7a4a873662a4ac105d4d4ad190b325c91f978147231d4cf107187c3d446f2e9d8250cb4e1a243166e712fed9a3c713c3bfe0db374620092db6d
7
+ data.tar.gz: 138ed42c7a8549ead7070afdc61fea6a0b00ea56745d2b3e906515eec785d81b73647a99eb0d5d80e608e3d0ebf9be404023caf4220d59b785609fcf1ae54587
data/README.md CHANGED
@@ -40,6 +40,8 @@ By default all model attributes are tracked, except the primary_key, usually ```
40
40
  - ```:methods``` accepts a field name or array of field names to track in addition to the default fields
41
41
  - ```:track_timestamps``` accepts a boolean, enabling or disabling tracking of ```created_at``` and ```updated_at```
42
42
  - ```:track_primary_key``` accepts a boolean, enabling or disabling tracking of the model's primary key
43
+ - ```:track_locking_column``` accepts a boolean, enabling or disabling tracking of the model's locking column
44
+
43
45
 
44
46
  ### Attribution
45
47
  Changes can be attributed to a particular source. The source is saved as a string
@@ -33,8 +33,9 @@ module TrackChanges
33
33
  end
34
34
 
35
35
  if reflection
36
- from = reflection.klass.find_by_id(from) || content_tag(:span, 'DELETED', :class => 'deleted', :title => "This #{field_name} has been deleted") if from.present?
37
- to = reflection.klass.find_by_id(to) || content_tag(:span, 'DELETED', :class => 'deleted', :title => "This #{field_name} has been deleted") if to.present?
36
+ primary_key = reflection.options.fetch(:primary_key, :id)
37
+ from = reflection.klass.find_by(primary_key => from) || content_tag(:span, 'DELETED', :class => 'deleted', :title => "This #{field_name} has been deleted") if from.present?
38
+ to = reflection.klass.find_by(primary_key => to) || content_tag(:span, 'DELETED', :class => 'deleted', :title => "This #{field_name} has been deleted") if to.present?
38
39
  end
39
40
 
40
41
  if from.blank?
@@ -0,0 +1,6 @@
1
+ module TrackChanges
2
+ module Configuration
3
+ mattr_accessor :cascade_destroy # Destroy tracked changes when record is destroyed?
4
+ self.cascade_destroy = true
5
+ end
6
+ end
@@ -1,3 +1,4 @@
1
+ require 'track_changes/configuration'
1
2
  require 'track_changes/model'
2
3
  require 'track_changes/controller'
3
4
  require 'track_changes/attribution'
@@ -11,8 +11,10 @@ module TrackChanges
11
11
  attr_accessor :track_changes # Faux attribute to allow disabling of change tracking on this record
12
12
  attr_writer :track_changes_by # Faux attribute to store who made the changes so we can save it in the diff
13
13
 
14
- has_one :snapshot, :as => :record, :class_name => 'TrackChanges::Snapshot' # A representation of this record as it was last saved
15
- has_many :diffs, lambda { reorder('id DESC') }, :as => :record, :class_name => 'TrackChanges::Diff' # A representation of changes made between saves through this record's lifetime
14
+ # A representation of this record as it was last saved
15
+ has_one :snapshot, :as => :record, :class_name => 'TrackChanges::Snapshot', :dependent => Configuration.cascade_destroy ? :destroy : nil
16
+ # A representation of changes made between saves through this record's lifetime
17
+ has_many :diffs, lambda { reorder('id DESC') }, :as => :record, :class_name => 'TrackChanges::Diff', :dependent => Configuration.cascade_destroy ? :delete_all : nil
16
18
 
17
19
  after_save :persist_tracked_changes
18
20
  end
@@ -21,11 +23,18 @@ module TrackChanges
21
23
  module ClassMethods
22
24
  # Returns the method names to call to fetch the fields tracked for changes
23
25
  def track_changes_fields
24
- fields = Array(track_changes_options[:only]).collect(&:to_s).presence || self.attribute_names
26
+ fields = Array(track_changes_options[:only]).collect(&:to_s).presence || default_track_changes_fields
25
27
  fields -= Array(track_changes_options[:except]).collect(&:to_s)
26
28
  fields += Array(track_changes_options[:methods]).collect(&:to_s)
27
29
  fields -= ['created_at', 'updated_at'] unless track_changes_options[:track_timestamps]
28
30
  fields -= [primary_key] unless track_changes_options[:track_primary_key]
31
+ fields -= [locking_column] unless track_changes_options[:track_locking_column]
32
+
33
+ return fields.uniq
34
+ end
35
+
36
+ def default_track_changes_fields
37
+ attribute_names - stored_attributes.keys.map(&:to_s) + stored_attributes.values.flatten.map(&:to_s)
29
38
  end
30
39
 
31
40
  # Create snapshots for all records so that the next changes made are captured
@@ -36,11 +45,18 @@ module TrackChanges
36
45
  # Create new snapshots
37
46
  where.not(:id => joins(:snapshot)).find_each(&:create_snapshot)
38
47
  end
48
+
49
+ # Record a diff and update the snapshot for all records in the scope
50
+ # This can be used to record a diff after an `update_all`.
51
+ def persist_tracked_changes(track_changes_by: nil)
52
+ find_each do |record|
53
+ record.track_changes_by = track_changes_by
54
+ record.persist_tracked_changes
55
+ end
56
+ end
39
57
  end
40
58
 
41
59
  module InstanceMethods
42
- private
43
-
44
60
  def track_changes_by
45
61
  @track_changes_by || TrackChanges.default_attribution
46
62
  end
@@ -49,7 +65,7 @@ module TrackChanges
49
65
  def persist_tracked_changes
50
66
  return if track_changes == false
51
67
 
52
- new_record = id_was.blank?
68
+ new_record = was_new_record_before_save?
53
69
  action = new_record ? 'create' : 'update'
54
70
  changes_by = track_changes_by.is_a?(ActiveRecord::Base) ? track_changes_by.id : track_changes_by
55
71
 
@@ -64,6 +80,16 @@ module TrackChanges
64
80
  snapshot.create_diff(:action => action, :changes_by => changes_by, :from => {})
65
81
  end
66
82
  end
83
+
84
+ def was_new_record_before_save?
85
+ if !respond_to?(:attribute_before_last_save) # Rails < 6
86
+ id_was.blank?
87
+ elsif saved_change_to_attribute?(:id) # Rails <=5
88
+ attribute_before_last_save(:id).blank?
89
+ else # Allow this method to be used outside of a transaction, e.g. after a bulk update
90
+ new_record?
91
+ end
92
+ end
67
93
  end
68
94
  end
69
95
  end
@@ -1,3 +1,3 @@
1
1
  module TrackChanges
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: culturecode-track_changes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Jakobsen, Ryan Wallace
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-20 00:00:00.000000000 Z
11
+ date: 2023-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -56,6 +56,7 @@ files:
56
56
  - lib/tasks/track_changes_tasks.rake
57
57
  - lib/track_changes.rb
58
58
  - lib/track_changes/attribution.rb
59
+ - lib/track_changes/configuration.rb
59
60
  - lib/track_changes/controller.rb
60
61
  - lib/track_changes/engine.rb
61
62
  - lib/track_changes/model.rb
@@ -79,8 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
80
  - !ruby/object:Gem::Version
80
81
  version: '0'
81
82
  requirements: []
82
- rubyforge_project:
83
- rubygems_version: 2.7.9
83
+ rubygems_version: 3.3.23
84
84
  signing_key:
85
85
  specification_version: 4
86
86
  summary: Easily track changes to various ActiveRecord models