paper_trail_scrapbook 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile.lock +7 -5
- data/README.md +49 -3
- data/circle.yml +1 -1
- data/lib/paper_trail_scrapbook/chapter.rb +17 -3
- data/lib/paper_trail_scrapbook/life_history.rb +19 -2
- data/lib/paper_trail_scrapbook/secondary_chapter.rb +12 -0
- data/lib/paper_trail_scrapbook/version.rb +1 -1
- data/lib/paper_trail_scrapbook/version_helpers.rb +4 -0
- data/lib/paper_trail_scrapbook.rb +1 -0
- data/spec/paper_trail_scrapbook/chapter_spec.rb +7 -0
- data/spec/paper_trail_scrapbook/life_history_spec.rb +26 -1
- data/spec/paper_trail_scrapbook/secondary_chapter_spec.rb +64 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 67563a25cc478a45dfcc0a63311ecec0b38db5c5e8ce3d50977e5eaf3f30ac36
|
4
|
+
data.tar.gz: 78c1e866535132c11e9e98a606ef739e973f5ed4db0a878db6ae5bf150e67c68
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe2c6468ec05d4f1f4996a248667ac8ec7c7b3d15921df851dc9266c3ff45566e15569f9f64ebc868bef95a798fb049c33e7363a090ef05158409cc0eafa7cc1
|
7
|
+
data.tar.gz: 2eb5f79927a5e60ccaad7accd97c6eaca0afc0fa51fe4075c63a5b42d4f424a645ba531c6ebabdc558faeef126b5799269e1ef76a30d50265c67a0fbc9b64c87
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
paper_trail_scrapbook (0.1.
|
4
|
+
paper_trail_scrapbook (0.1.9)
|
5
5
|
activerecord (>= 4.0, < 5.2)
|
6
6
|
adamantium
|
7
7
|
concord
|
@@ -98,11 +98,13 @@ GEM
|
|
98
98
|
mutant-rspec (0.8.14)
|
99
99
|
mutant (~> 0.8.14)
|
100
100
|
rspec-core (>= 3.4.0, < 3.7.0)
|
101
|
-
nokogiri (1.8.
|
101
|
+
nokogiri (1.8.4)
|
102
102
|
mini_portile2 (~> 2.3.0)
|
103
|
-
paper_trail (9.
|
103
|
+
paper_trail (9.2.0)
|
104
104
|
activerecord (>= 4.2, < 5.3)
|
105
|
+
paper_trail-association_tracking (< 2)
|
105
106
|
request_store (~> 1.1)
|
107
|
+
paper_trail-association_tracking (1.0.0)
|
106
108
|
parallel (1.12.1)
|
107
109
|
parser (2.4.0.2)
|
108
110
|
ast (~> 2.3)
|
@@ -115,8 +117,8 @@ GEM
|
|
115
117
|
rails-dom-testing (2.0.3)
|
116
118
|
activesupport (>= 4.2.0)
|
117
119
|
nokogiri (>= 1.6)
|
118
|
-
rails-html-sanitizer (1.0.
|
119
|
-
loofah (~> 2.
|
120
|
+
rails-html-sanitizer (1.0.4)
|
121
|
+
loofah (~> 2.2, >= 2.2.2)
|
120
122
|
railties (5.1.4)
|
121
123
|
actionpack (= 5.1.4)
|
122
124
|
activesupport (= 5.1.4)
|
data/README.md
CHANGED
@@ -69,6 +69,52 @@ text = PaperTrailScrapbook::LifeHistory.new(widget).story
|
|
69
69
|
# • discounted_price: 29612.0
|
70
70
|
```
|
71
71
|
|
72
|
+
If desired, you can implement a `trailed_related_content` method in your model
|
73
|
+
that returns a collection of related objects to include in the history.
|
74
|
+
|
75
|
+
The following would, for example, cause version information for the `attachments` and `manufacturer` to be included when viewing the life story of a `Widget`:
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
class Widget < ApplicationRecord
|
79
|
+
has_paper_trail
|
80
|
+
|
81
|
+
def trailed_related_content
|
82
|
+
attachments | [manufacturer]
|
83
|
+
end
|
84
|
+
|
85
|
+
has_many :attachments
|
86
|
+
has_one :manufacturer
|
87
|
+
end
|
88
|
+
```
|
89
|
+
|
90
|
+
A history leveraging this feature might look like this:
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
widget = Widget.find 42
|
94
|
+
|
95
|
+
text = PaperTrailScrapbook::LifeHistory.new(widget).story
|
96
|
+
|
97
|
+
# On Monday, 05 Jun 2017 at 12:37 PM, Rob Owens created the following Manufacturer[411] information:
|
98
|
+
# • email: widgetsrus@example.com
|
99
|
+
# • name: WidgetsAreUs
|
100
|
+
# •: 411
|
101
|
+
#
|
102
|
+
# On Wednesday, 07 Jun 2017 at 2:37 PM, Rob Owens created the following Widget information:
|
103
|
+
# • email: Tim@example.com
|
104
|
+
# • name: Tim's Widget
|
105
|
+
# • manufacturer: WidgetsAreUs[411]
|
106
|
+
# •: 1234
|
107
|
+
#
|
108
|
+
# On Thursday, 23 Oct 2017 at 7:55 AM PDT, Rob Owens updated Manufacturer[411]:
|
109
|
+
# • name: WidgetsRUs
|
110
|
+
#
|
111
|
+
# On Friday, 24 Oct 2017 at 10:10 AM PDT, Rob Owens created the following Attachment[212] information:
|
112
|
+
# • name: Electromagnet
|
113
|
+
# • widget: Tim's Widget[1234]
|
114
|
+
# •: 212
|
115
|
+
#
|
116
|
+
```
|
117
|
+
|
72
118
|
### User Journal
|
73
119
|
|
74
120
|
The `UserJournal` module provides a list of changes made by a particular
|
@@ -79,7 +125,7 @@ who = WhoDidIt.find 42
|
|
79
125
|
text = PaperTrailScrapbook::UserJournal.new(who).story
|
80
126
|
# Between Wednesday, 31 Dec 1969 at 4:00 PM PST and Friday, 26 Jan 2018 at 10:35 AM PST, Rob Owens made the following changes:
|
81
127
|
#
|
82
|
-
# On Wednesday, 07 Jan 2018 at 2:37 PM,
|
128
|
+
# On Wednesday, 07 Jan 2018 at 2:37 PM, created the following Widget information:
|
83
129
|
# • email: Tim@example.com
|
84
130
|
# • name: Tim's Widget
|
85
131
|
# • built: true
|
@@ -107,7 +153,7 @@ You can also scope the change list to a specific class:
|
|
107
153
|
text = PaperTrailScrapbook::UserJournal.new(who, klass: Widget).story
|
108
154
|
# Between Wednesday, 31 Dec 1969 at 4:00 PM PST and Friday, 26 Jan 2018 at 10:35 AM PST, Rob Owens made the following Widget changes:
|
109
155
|
#
|
110
|
-
# On Wednesday, 07 Jan 2018 at 2:37 PM,
|
156
|
+
# On Wednesday, 07 Jan 2018 at 2:37 PM, created Widget[123]:
|
111
157
|
# • email: Tim@example.com
|
112
158
|
# • name: Tim's Widget
|
113
159
|
# • built: true
|
@@ -123,7 +169,7 @@ Or view changes in a time range:
|
|
123
169
|
text = PaperTrailScrapbook::UserJournal.new(who, start: 1.month.ago, end: Time.now).story
|
124
170
|
# Between Tuesday, 26 Dec 2017 at 4:00 PM PST and Friday, 26 Jan 2018 at 4:00 PM PST, Rob Owens made the following changes:
|
125
171
|
#
|
126
|
-
# On Wednesday, 07 Jan 2018 at 2:37 PM,
|
172
|
+
# On Wednesday, 07 Jan 2018 at 2:37 PM, created the following Widget information:
|
127
173
|
# • email: Tim@example.com
|
128
174
|
# • name: Tim's Widget
|
129
175
|
# • built: true
|
data/circle.yml
CHANGED
@@ -16,15 +16,29 @@ module PaperTrailScrapbook
|
|
16
16
|
#
|
17
17
|
def story
|
18
18
|
updates = changes
|
19
|
-
return unless
|
19
|
+
return unless tell_story?(updates)
|
20
20
|
|
21
|
-
"
|
21
|
+
[preface, (updates unless destroy?)].compact.join("\n")
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def preface
|
27
|
-
"On #{whenn}, #{who} #{kind}
|
27
|
+
"On #{whenn}, #{who} #{kind} #{what}".squeeze(' ')
|
28
|
+
end
|
29
|
+
|
30
|
+
def what
|
31
|
+
if destroy?
|
32
|
+
"#{model}#{item_id}"
|
33
|
+
else
|
34
|
+
"the following #{model}#{item_id} info:"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def item_id; end
|
39
|
+
|
40
|
+
def tell_story?(updates)
|
41
|
+
create? || destroy? || updates.present? || !config.filter_non_changes
|
28
42
|
end
|
29
43
|
end
|
30
44
|
end
|
@@ -5,7 +5,15 @@ module PaperTrailScrapbook
|
|
5
5
|
#
|
6
6
|
class LifeHistory
|
7
7
|
def initialize(object)
|
8
|
+
@object = object
|
8
9
|
@versions = object.versions
|
10
|
+
if object.respond_to?(:trailed_related_content)
|
11
|
+
object.trailed_related_content.compact.each do |trc|
|
12
|
+
@versions |= trc.versions
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
@versions = @versions.sort_by(&:created_at)
|
9
17
|
end
|
10
18
|
|
11
19
|
# Retries textual historical analysis of versions
|
@@ -14,12 +22,21 @@ module PaperTrailScrapbook
|
|
14
22
|
#
|
15
23
|
def story
|
16
24
|
versions.map do |v|
|
17
|
-
|
25
|
+
if primary?(v)
|
26
|
+
Chapter
|
27
|
+
else
|
28
|
+
SecondaryChapter
|
29
|
+
end.new(v).story
|
18
30
|
end.compact.join("\n\n")
|
19
31
|
end
|
20
32
|
|
21
33
|
private
|
22
34
|
|
23
|
-
|
35
|
+
def primary?(version)
|
36
|
+
version.item_type.eql?(object.class.name) &&
|
37
|
+
version.item_id.equal?(object.id)
|
38
|
+
end
|
39
|
+
|
40
|
+
attr_reader :object, :versions
|
24
41
|
end
|
25
42
|
end
|
@@ -8,6 +8,7 @@ require 'paper_trail_scrapbook/chapter'
|
|
8
8
|
require 'paper_trail_scrapbook/changes'
|
9
9
|
require 'paper_trail_scrapbook/journal_entry'
|
10
10
|
require 'paper_trail_scrapbook/life_history'
|
11
|
+
require 'paper_trail_scrapbook/secondary_chapter'
|
11
12
|
require 'paper_trail_scrapbook/user_journal'
|
12
13
|
require 'paper_trail_scrapbook/version'
|
13
14
|
require 'paper_trail_scrapbook/version_helpers'
|
@@ -50,7 +50,14 @@ module PaperTrailScrapbook
|
|
50
50
|
|
51
51
|
describe '#story' do
|
52
52
|
it 'provides a whole story' do
|
53
|
+
expect(subject).to match(/updated the following Widget info/)
|
54
|
+
expect(subject).to match(/email: tim@redbox.com added/)
|
55
|
+
expect(subject).to match(/name: Tim Chambers added/)
|
56
|
+
expect(subject).to match(/sent: false -> true/)
|
57
|
+
expect(subject).to match(/created by: \d+ added/)
|
58
|
+
expect(subject).to match(/amount: 29612.0 added/)
|
53
59
|
expect(subject).to match(/discounted amount: 29612.0 added/)
|
60
|
+
expect(subject).to match(/status: active -> issued/)
|
54
61
|
end
|
55
62
|
end
|
56
63
|
end
|
@@ -87,12 +87,37 @@ module PaperTrailScrapbook
|
|
87
87
|
end
|
88
88
|
|
89
89
|
context 'no papertrail' do
|
90
|
-
let(:target) {Elephant.create!}
|
90
|
+
let(:target) { Elephant.create! }
|
91
|
+
|
91
92
|
it 'has none' do
|
92
93
|
target
|
93
94
|
expect(subject).to eql ''
|
94
95
|
end
|
95
96
|
end
|
97
|
+
|
98
|
+
context 'with related data' do
|
99
|
+
before do
|
100
|
+
author
|
101
|
+
book
|
102
|
+
target
|
103
|
+
|
104
|
+
def target.trailed_related_content
|
105
|
+
[book, author]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'includes related content history' do
|
110
|
+
expect(subject).to match(/created the following Person\[\d+\] info/)
|
111
|
+
expect(subject).to match(/name: Dr\. Seuss/)
|
112
|
+
|
113
|
+
expect(subject).to match(/created the following Book\[\d+\] info/)
|
114
|
+
expect(subject).to match(/title: How the Grinch stole Xmas/)
|
115
|
+
|
116
|
+
expect(subject).to match(/created the following Authorship info/)
|
117
|
+
expect(subject).to match(/book: How the Grinch stole Xmas\[\d+\]/)
|
118
|
+
expect(subject).to match(/author: Dr\. Seuss\[\d+\]/)
|
119
|
+
end
|
120
|
+
end
|
96
121
|
end
|
97
122
|
end
|
98
123
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module PaperTrailScrapbook
|
4
|
+
::RSpec.describe SecondaryChapter do
|
5
|
+
let(:version) do
|
6
|
+
OpenStruct.new(id: 2_674_798,
|
7
|
+
item_type: 'Widget',
|
8
|
+
item_id: 4804,
|
9
|
+
event: 'update',
|
10
|
+
whodunnit: '1742',
|
11
|
+
object: ['---',
|
12
|
+
'id: ',
|
13
|
+
'discounted_amount: '].join("\n"),
|
14
|
+
created_at: Time.current,
|
15
|
+
object_changes: ['---',
|
16
|
+
'email:',
|
17
|
+
'- ',
|
18
|
+
'- tim@redbox.com',
|
19
|
+
'name:',
|
20
|
+
'- ',
|
21
|
+
'- Tim Chambers',
|
22
|
+
'sent:',
|
23
|
+
'- false',
|
24
|
+
'- true',
|
25
|
+
'created_by:',
|
26
|
+
'- ',
|
27
|
+
'- 1742',
|
28
|
+
'amount:',
|
29
|
+
'- ',
|
30
|
+
'- 29612.0',
|
31
|
+
'discounted_amount:',
|
32
|
+
'- ',
|
33
|
+
'- !ruby/object:BigDecimal 36:0.29612E5',
|
34
|
+
'created_at:',
|
35
|
+
'- ',
|
36
|
+
'- &1 2017-06-07 21:37:02.188657104 Z',
|
37
|
+
'updated_at:',
|
38
|
+
'- ',
|
39
|
+
'- *1',
|
40
|
+
'id:',
|
41
|
+
'- ',
|
42
|
+
'- 4806',
|
43
|
+
'status:',
|
44
|
+
'- active',
|
45
|
+
'- issued'].join("\n"))
|
46
|
+
end
|
47
|
+
|
48
|
+
let(:object) { described_class.new(version) }
|
49
|
+
let(:subject) { object.story }
|
50
|
+
|
51
|
+
describe '#story' do
|
52
|
+
it 'provides a whole story' do
|
53
|
+
expect(subject).to match(/updated the following Widget\[\d+\] info/)
|
54
|
+
expect(subject).to match(/email: tim@redbox.com added/)
|
55
|
+
expect(subject).to match(/name: Tim Chambers added/)
|
56
|
+
expect(subject).to match(/sent: false -> true/)
|
57
|
+
expect(subject).to match(/created by: \d+ added/)
|
58
|
+
expect(subject).to match(/amount: 29612.0 added/)
|
59
|
+
expect(subject).to match(/discounted amount: 29612.0 added/)
|
60
|
+
expect(subject).to match(/status: active -> issued/)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail_scrapbook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Timothy Chambers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -299,6 +299,7 @@ files:
|
|
299
299
|
- lib/paper_trail_scrapbook/config.rb
|
300
300
|
- lib/paper_trail_scrapbook/journal_entry.rb
|
301
301
|
- lib/paper_trail_scrapbook/life_history.rb
|
302
|
+
- lib/paper_trail_scrapbook/secondary_chapter.rb
|
302
303
|
- lib/paper_trail_scrapbook/user_journal.rb
|
303
304
|
- lib/paper_trail_scrapbook/version.rb
|
304
305
|
- lib/paper_trail_scrapbook/version_helpers.rb
|
@@ -382,6 +383,7 @@ files:
|
|
382
383
|
- spec/paper_trail_scrapbook/chapter_spec.rb
|
383
384
|
- spec/paper_trail_scrapbook/config_spec.rb
|
384
385
|
- spec/paper_trail_scrapbook/life_history_spec.rb
|
386
|
+
- spec/paper_trail_scrapbook/secondary_chapter_spec.rb
|
385
387
|
- spec/paper_trail_scrapbook/user_journal_spec.rb
|
386
388
|
- spec/paper_trail_scrapbook/version_helpers_spec.rb
|
387
389
|
- spec/paper_trail_scrapbook/version_spec.rb
|
@@ -407,7 +409,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
407
409
|
version: 1.3.6
|
408
410
|
requirements: []
|
409
411
|
rubyforge_project:
|
410
|
-
rubygems_version: 2.
|
412
|
+
rubygems_version: 2.7.6
|
411
413
|
signing_key:
|
412
414
|
specification_version: 4
|
413
415
|
summary: Paper Trail Scrapbook
|