paper_trail 2.3.2 → 2.3.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|