log-paper-trail-changes 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '096dcfbf125401ce4c6b32421c4b2e950c2276eb707c437f2c1319ea0c3d5cbe'
4
+ data.tar.gz: 026d83ec9a10c6c3f015255d54d3e800f1c66970f4948cc8eff40d0e515f18fb
5
+ SHA512:
6
+ metadata.gz: cf9c151ccbeec2d0f9d8d6649f36f38c925286360a752ba5b69e7e82ea040f290b952ab15cbb79272e45ba7868f92e7eb55759154e13bcec723a292e9617627f
7
+ data.tar.gz: 74b0f40e85ce8d25536bd80a6d6a24ec4c1fcb35ac87af96cfa95ed8776992e186e1ae116df8004e703e398ba0ab5533f8c48bc52bec600bc6b74086ffcb8222
@@ -0,0 +1,57 @@
1
+ class TrackChanges
2
+ def initialize(model_class, ids, start_date, end_date)
3
+ @model_class = model_class
4
+ @ids = ids
5
+ @start_date = start_date
6
+ @end_date = end_date
7
+ end
8
+
9
+ def call
10
+ @ids.each_with_object({}) do |id, result|
11
+ model_instance = @model_class.find(id)
12
+
13
+ unless model_instance.paper_trail.enabled?
14
+ raise "#{model_instance.class} does not have PaperTrail enabled"
15
+ end
16
+
17
+ result[id] = track_changes(model_instance)
18
+ output_changes(result)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def track_changes(model_instance)
25
+ versions = model_instance.versions.where(created_at: @start_date..@end_date)
26
+ timeline = {}
27
+
28
+ versions.each do |version|
29
+ changes = version.object_changes ? YAML.load(version.object_changes) : {}
30
+ next if changes.empty?
31
+
32
+ timestamp = version.created_at.strftime("%Y-%m-%d %H:%M:%S")
33
+ timeline[timestamp] = {}
34
+
35
+ changes.each do |attribute, (old_value, new_value)|
36
+ timeline[timestamp][attribute] = { from: old_value, to: new_value }
37
+ end
38
+ end
39
+
40
+ timeline
41
+ end
42
+
43
+ def output_changes(result)
44
+ result.each do |id, timeline|
45
+ puts "Changes for #{@model_class.name} #{id}:"
46
+ timeline.each do |timestamp, changes|
47
+ puts "\e[1mChanges on #{timestamp}:\e[0m" # \e[1m starts bold text, \e[0m ends it
48
+ changes.each do |attribute, change|
49
+ from_value = change[:from].nil? || change[:from].to_s.empty? ? "\e[31mnil\e[0m" : change[:from]
50
+ to_value = change[:to].nil? || change[:to].to_s.empty? ? "\e[31mnil\e[0m" : change[:to]
51
+ puts " #{attribute}: #{from_value} -> #{to_value}"
52
+ end
53
+ end
54
+ puts
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ # track_changes_spec.rb
2
+ require 'rspec'
3
+ require 'date'
4
+ require 'YAML'
5
+ require_relative 'track_changes'
6
+
7
+ RSpec.describe TrackChanges do
8
+ let(:model_class) { double('ModelClass', name: 'ModelClass') }
9
+ let(:ids) { [1, 2, 3] }
10
+ let(:start_date) { Date.new(2024, 1, 1) }
11
+ let(:end_date) { Date.new(2024, 12, 31) }
12
+ let(:track_changes) { TrackChanges.new(model_class, ids, start_date, end_date) }
13
+
14
+ describe '#call' do
15
+ let(:model_instance) { double('ModelInstance', paper_trail: double(enabled?: true)) }
16
+ let(:versions) { [double('Version', created_at: start_date, object_changes: "---\nname:\n- Alice\n- Bob\n")] }
17
+
18
+ before do
19
+ allow(model_class).to receive(:find).and_return(model_instance)
20
+ allow(model_instance).to receive_message_chain(:versions, :where).and_return(versions)
21
+ end
22
+
23
+ it 'tracks changes for each id' do
24
+ expect(track_changes.call).to eq({
25
+ 1 => { "2024-01-01 00:00:00" => { "name" => { from: "Alice", to: "Bob" } } },
26
+ 2 => { "2024-01-01 00:00:00" => { "name" => { from: "Alice", to: "Bob" } } },
27
+ 3 => { "2024-01-01 00:00:00" => { "name" => { from: "Alice", to: "Bob" } } }
28
+ })
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,4 @@
1
+ # lib/track_changes/version.rb
2
+ module TrackChanges
3
+ VERSION = "0.1.0"
4
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: log-paper-trail-changes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Brandyn Britton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-06-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: paper_trail
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A gem that logs the changes made by PaperTrail in ActiveRecord models
28
+ email: brandynbb96@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/track_changes/track_changes.rb
34
+ - lib/track_changes/track_changes_spec.rb
35
+ - lib/track_changes/version.rb
36
+ homepage: http://example.com/track_changes
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubygems_version: 3.2.33
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: Log changes in Papertrail models
59
+ test_files: []