paper_trail 2.3.2 → 2.3.3
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/README.md +3 -1
- data/lib/paper_trail/has_paper_trail.rb +15 -6
- data/lib/paper_trail/version.rb +1 -1
- data/lib/paper_trail/version_number.rb +1 -1
- data/test/dummy/app/models/legacy_widget.rb +3 -0
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +7 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/unit/model_test.rb +36 -0
- metadata +6 -4
data/README.md
CHANGED
@@ -42,10 +42,11 @@ When you declare `has_paper_trail` in your model, you get these methods:
|
|
42
42
|
has_paper_trail # you can pass various options here
|
43
43
|
end
|
44
44
|
|
45
|
-
# Returns this widget's versions.
|
45
|
+
# Returns this widget's versions. You can customise the name of the association.
|
46
46
|
widget.versions
|
47
47
|
|
48
48
|
# Return the version this widget was reified from, or nil if it is live.
|
49
|
+
# You can customise the name of the method.
|
49
50
|
widget.version
|
50
51
|
|
51
52
|
# Returns true if this widget is the current, live one; or false if it is from a previous version.
|
@@ -649,6 +650,7 @@ Many thanks to:
|
|
649
650
|
* [nir0](https://github.com/nir0)
|
650
651
|
* [Eduard Tsech](https://github.com/edtsech)
|
651
652
|
* [Mathieu Arnold](https://github.com/mat813)
|
653
|
+
* [Nicholas Thrower](https://github.com/throwern)
|
652
654
|
|
653
655
|
|
654
656
|
## Inspirations
|
@@ -21,13 +21,18 @@ module PaperTrail
|
|
21
21
|
# trail). See `PaperTrail::Controller.info_for_paper_trail` for how to store data from
|
22
22
|
# the controller.
|
23
23
|
# :versions the name to use for the versions association. Default is `:versions`.
|
24
|
+
# :version_name the name to use for the method which returns the version the instance was reified from.
|
25
|
+
# Default is `:version`.
|
24
26
|
def has_paper_trail(options = {})
|
25
27
|
# Lazily include the instance methods so we don't clutter up
|
26
28
|
# any more ActiveRecord models than we have to.
|
27
29
|
send :include, InstanceMethods
|
28
30
|
|
31
|
+
class_attribute :version_name
|
32
|
+
self.version_name = options[:version_name] || 'version'
|
33
|
+
|
29
34
|
# The version this instance was reified from.
|
30
|
-
attr_accessor
|
35
|
+
attr_accessor self.version_name
|
31
36
|
|
32
37
|
class_attribute :version_class_name
|
33
38
|
self.version_class_name = options[:class_name] || 'Version'
|
@@ -74,7 +79,7 @@ module PaperTrail
|
|
74
79
|
# Returns true if this instance is the current, live one;
|
75
80
|
# returns false if this instance came from a previous version.
|
76
81
|
def live?
|
77
|
-
|
82
|
+
source_version.nil?
|
78
83
|
end
|
79
84
|
|
80
85
|
# Returns who put the object into its current state.
|
@@ -86,13 +91,13 @@ module PaperTrail
|
|
86
91
|
def version_at(timestamp, reify_options={})
|
87
92
|
# Because a version stores how its object looked *before* the change,
|
88
93
|
# we need to look for the first version created *after* the timestamp.
|
89
|
-
|
90
|
-
|
94
|
+
v = send(self.class.versions_association_name).after(timestamp).first
|
95
|
+
v ? v.reify(reify_options) : self
|
91
96
|
end
|
92
97
|
|
93
98
|
# Returns the object (not a Version) as it was most recently.
|
94
99
|
def previous_version
|
95
|
-
preceding_version =
|
100
|
+
preceding_version = source_version ? source_version.previous : send(self.class.versions_association_name).last
|
96
101
|
preceding_version.try :reify
|
97
102
|
end
|
98
103
|
|
@@ -100,7 +105,7 @@ module PaperTrail
|
|
100
105
|
def next_version
|
101
106
|
# NOTE: if self (the item) was not reified from a version, i.e. it is the
|
102
107
|
# "live" item, we return nil. Perhaps we should return self instead?
|
103
|
-
subsequent_version =
|
108
|
+
subsequent_version = source_version ? source_version.next : nil
|
104
109
|
subsequent_version.reify if subsequent_version
|
105
110
|
end
|
106
111
|
|
@@ -119,6 +124,10 @@ module PaperTrail
|
|
119
124
|
version_class_name.constantize
|
120
125
|
end
|
121
126
|
|
127
|
+
def source_version
|
128
|
+
send self.class.version_name
|
129
|
+
end
|
130
|
+
|
122
131
|
def record_create
|
123
132
|
if switched_on?
|
124
133
|
send(self.class.versions_association_name).create merge_metadata(:event => 'create', :whodunnit => PaperTrail.whodunnit)
|
data/lib/paper_trail/version.rb
CHANGED
@@ -97,6 +97,12 @@ class SetUpTestTables < ActiveRecord::Migration
|
|
97
97
|
create_table :documents, :force => true do |t|
|
98
98
|
t.string :name
|
99
99
|
end
|
100
|
+
|
101
|
+
create_table :legacy_widgets, :force => true do |t|
|
102
|
+
t.string :name
|
103
|
+
t.integer :version
|
104
|
+
end
|
105
|
+
|
100
106
|
end
|
101
107
|
|
102
108
|
def self.down
|
@@ -115,5 +121,6 @@ class SetUpTestTables < ActiveRecord::Migration
|
|
115
121
|
drop_table :versions
|
116
122
|
drop_table :widgets
|
117
123
|
drop_table :documents
|
124
|
+
drop_table :legacy_widgets
|
118
125
|
end
|
119
126
|
end
|
data/test/dummy/db/test.sqlite3
CHANGED
Binary file
|
data/test/unit/model_test.rb
CHANGED
@@ -912,6 +912,42 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
912
912
|
end
|
913
913
|
end
|
914
914
|
|
915
|
+
context 'A model with column version and custom version_method' do
|
916
|
+
setup do
|
917
|
+
@legacy_widget = LegacyWidget.create(:name => "foo", :version => 2)
|
918
|
+
end
|
919
|
+
|
920
|
+
should 'set version on create' do
|
921
|
+
assert_equal 2, @legacy_widget.version
|
922
|
+
end
|
923
|
+
|
924
|
+
should 'allow version updates' do
|
925
|
+
@legacy_widget.update_attributes :version => 3
|
926
|
+
assert_equal 3, @legacy_widget.version
|
927
|
+
end
|
928
|
+
|
929
|
+
should 'create a new version record' do
|
930
|
+
assert_equal 1, @legacy_widget.versions.size
|
931
|
+
end
|
932
|
+
end
|
933
|
+
|
934
|
+
context 'A reified item with a column -version- and custom version_method' do
|
935
|
+
setup do
|
936
|
+
widget = LegacyWidget.create(:name => "foo", :version => 2)
|
937
|
+
%w( bar baz ).each { |name| widget.update_attributes :name => name }
|
938
|
+
@version = widget.versions.last
|
939
|
+
@widget = @version.reify
|
940
|
+
end
|
941
|
+
|
942
|
+
should 'know which version it came from' do
|
943
|
+
assert_equal @version, @widget.custom_version
|
944
|
+
end
|
945
|
+
|
946
|
+
should 'return its previous self' do
|
947
|
+
assert_equal @widget.versions[-2].reify, @widget.previous_version
|
948
|
+
end
|
949
|
+
end
|
950
|
+
|
915
951
|
private
|
916
952
|
|
917
953
|
# Updates `model`'s last version so it looks like the version was
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 2.3.
|
9
|
+
- 3
|
10
|
+
version: 2.3.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andy Stewart
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-09-14 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- test/dummy/app/models/elephant.rb
|
135
135
|
- test/dummy/app/models/fluxor.rb
|
136
136
|
- test/dummy/app/models/foo_widget.rb
|
137
|
+
- test/dummy/app/models/legacy_widget.rb
|
137
138
|
- test/dummy/app/models/person.rb
|
138
139
|
- test/dummy/app/models/post.rb
|
139
140
|
- test/dummy/app/models/song.rb
|
@@ -230,6 +231,7 @@ test_files:
|
|
230
231
|
- test/dummy/app/models/elephant.rb
|
231
232
|
- test/dummy/app/models/fluxor.rb
|
232
233
|
- test/dummy/app/models/foo_widget.rb
|
234
|
+
- test/dummy/app/models/legacy_widget.rb
|
233
235
|
- test/dummy/app/models/person.rb
|
234
236
|
- test/dummy/app/models/post.rb
|
235
237
|
- test/dummy/app/models/song.rb
|