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 +7 -0
- data/lib/track_changes/track_changes.rb +57 -0
- data/lib/track_changes/track_changes_spec.rb +31 -0
- data/lib/track_changes/version.rb +4 -0
- metadata +59 -0
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
|
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: []
|