paper_trail 2.6.0 → 2.6.1
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 +12 -0
- data/lib/paper_trail.rb +10 -0
- data/lib/paper_trail/config.rb +3 -2
- data/lib/paper_trail/has_paper_trail.rb +1 -1
- data/lib/paper_trail/version.rb +6 -5
- data/lib/paper_trail/version_number.rb +1 -1
- data/paper_trail.gemspec +1 -1
- data/test/dummy/app/models/animal.rb +1 -1
- data/test/dummy/app/versions/post_version.rb +1 -1
- data/test/support/integration_case.rb +1 -1
- data/test/test_helper.rb +1 -0
- data/test/unit/timestamp_test.rb +39 -0
- metadata +20 -18
data/README.md
CHANGED
@@ -358,6 +358,16 @@ This allows you to store each model's versions in a separate table, which is use
|
|
358
358
|
|
359
359
|
Alternatively you could store certain metadata for one type of version, and other metadata for other versions.
|
360
360
|
|
361
|
+
If you only use custom version classes and don't use PaperTrail's built-in one, on Rails 3.2 you must:
|
362
|
+
|
363
|
+
- either declare PaperTrail's version class abstract like this (in `config/initializers/paper_trail_patch.rb`):
|
364
|
+
|
365
|
+
Version.module_eval do
|
366
|
+
self.abstract_class = true
|
367
|
+
end
|
368
|
+
|
369
|
+
- or define a `versions` table in the database so Rails can instantiate the version superclass.
|
370
|
+
|
361
371
|
You can also specify custom names for the versions and version associations. This is useful if you already have `versions` or/and `version` methods on your model. For example:
|
362
372
|
|
363
373
|
class Post < ActiveRecord::Base
|
@@ -705,6 +715,8 @@ Many thanks to:
|
|
705
715
|
* [Peter Harkins](https://github.com/pushcx)
|
706
716
|
* [Mohd Amree](https://github.com/amree)
|
707
717
|
* [Nikita Cernovs](https://github.com/nikitachernov)
|
718
|
+
* [Jason Noble](https://github.com/jasonnoble)
|
719
|
+
* [Jared Mehle](https://github.com/jrmehle)
|
708
720
|
|
709
721
|
|
710
722
|
## Inspirations
|
data/lib/paper_trail.rb
CHANGED
@@ -32,6 +32,16 @@ module PaperTrail
|
|
32
32
|
paper_trail_store[:request_enabled_for_controller] = value
|
33
33
|
end
|
34
34
|
|
35
|
+
# Set the field which records when a version was created.
|
36
|
+
def self.timestamp_field=(field_name)
|
37
|
+
PaperTrail.config.timestamp_field = field_name
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns the field which records when a version was created.
|
41
|
+
def self.timestamp_field
|
42
|
+
PaperTrail.config.timestamp_field
|
43
|
+
end
|
44
|
+
|
35
45
|
# Returns who is reponsible for any changes that occur.
|
36
46
|
def self.whodunnit
|
37
47
|
paper_trail_store[:whodunnit]
|
data/lib/paper_trail/config.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module PaperTrail
|
2
2
|
class Config
|
3
3
|
include Singleton
|
4
|
-
attr_accessor :enabled
|
4
|
+
attr_accessor :enabled, :timestamp_field
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
# Indicates whether PaperTrail is on or off.
|
8
|
-
@enabled
|
8
|
+
@enabled = true
|
9
|
+
@timestamp_field = :created_at
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
@@ -68,7 +68,7 @@ module PaperTrail
|
|
68
68
|
has_many self.versions_association_name,
|
69
69
|
:class_name => version_class_name,
|
70
70
|
:as => :item,
|
71
|
-
:order => "
|
71
|
+
:order => "#{PaperTrail.timestamp_field} ASC, #{self.version_class_name.constantize.primary_key} ASC"
|
72
72
|
|
73
73
|
after_create :record_create, :if => :save_version? if !options[:on] || options[:on].include?(:create)
|
74
74
|
before_update :record_update, :if => :save_version? if !options[:on] || options[:on].include?(:update)
|
data/lib/paper_trail/version.rb
CHANGED
@@ -8,16 +8,16 @@ class Version < ActiveRecord::Base
|
|
8
8
|
end
|
9
9
|
|
10
10
|
scope :subsequent, lambda { |version|
|
11
|
-
where(["#{self.primary_key} > ?", version.is_a?(self) ? version.
|
11
|
+
where(["#{self.primary_key} > ?", version.is_a?(self) ? version.send(self.primary_key) : version]).order("#{self.primary_key} ASC")
|
12
12
|
}
|
13
13
|
|
14
14
|
scope :preceding, lambda { |version|
|
15
|
-
where(["#{self.primary_key} < ?", version.is_a?(self) ? version.
|
15
|
+
where(["#{self.primary_key} < ?", version.is_a?(self) ? version.send(self.primary_key) : version]).order("#{self.primary_key} DESC")
|
16
16
|
}
|
17
17
|
|
18
18
|
scope :following, lambda { |timestamp|
|
19
19
|
# TODO: is this :order necessary, considering its presence on the has_many :versions association?
|
20
|
-
where([
|
20
|
+
where(["#{PaperTrail.timestamp_field} > ?", timestamp]).order("#{PaperTrail.timestamp_field} ASC, #{self.primary_key} ASC")
|
21
21
|
}
|
22
22
|
|
23
23
|
# Restore the item from this version.
|
@@ -116,7 +116,8 @@ class Version < ActiveRecord::Base
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def index
|
119
|
-
|
119
|
+
id_column = self.class.primary_key.to_sym
|
120
|
+
sibling_versions.select(id_column).order("#{id_column} ASC").map(&id_column).index(self.send(id_column))
|
120
121
|
end
|
121
122
|
|
122
123
|
private
|
@@ -145,7 +146,7 @@ class Version < ActiveRecord::Base
|
|
145
146
|
# but until PaperTrail knows which updates are "together" (e.g. parent and child being
|
146
147
|
# updated on the same form), it's impossible to tell when the overall update started;
|
147
148
|
# and therefore impossible to know when "just before" was.
|
148
|
-
if (child_as_it_was = child.version_at(
|
149
|
+
if (child_as_it_was = child.version_at(send(PaperTrail.timestamp_field) - lookback.seconds))
|
149
150
|
child_as_it_was.attributes.each do |k,v|
|
150
151
|
model.send(assoc.name).send :write_attribute, k.to_sym, v rescue nil
|
151
152
|
end
|
data/paper_trail.gemspec
CHANGED
@@ -20,5 +20,5 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_development_dependency 'rake'
|
21
21
|
s.add_development_dependency 'shoulda', '2.10.3'
|
22
22
|
s.add_development_dependency 'sqlite3-ruby', '~> 1.2'
|
23
|
-
s.add_development_dependency 'capybara', '
|
23
|
+
s.add_development_dependency 'capybara', '~> 1.0.0'
|
24
24
|
end
|
data/test/test_helper.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TimestampTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
setup do
|
6
|
+
PaperTrail.config.timestamp_field = :custom_created_at
|
7
|
+
change_schema
|
8
|
+
Version.reset_column_information
|
9
|
+
|
10
|
+
Fluxor.instance_eval <<-END
|
11
|
+
has_paper_trail
|
12
|
+
END
|
13
|
+
|
14
|
+
@fluxor = Fluxor.create :name => 'Some text.'
|
15
|
+
@fluxor.update_attributes :name => 'Some more text.'
|
16
|
+
@fluxor.update_attributes :name => 'Even more text.'
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'versions works with custom timestamp field' do
|
20
|
+
# Normal behaviour
|
21
|
+
assert_equal 3, @fluxor.versions.length
|
22
|
+
assert_nil @fluxor.versions[0].reify
|
23
|
+
assert_equal 'Some text.', @fluxor.versions[1].reify.name
|
24
|
+
assert_equal 'Some more text.', @fluxor.versions[2].reify.name
|
25
|
+
|
26
|
+
# Tinker with custom timestamps.
|
27
|
+
now = Time.now.utc
|
28
|
+
@fluxor.versions.reverse.each_with_index do |version, index|
|
29
|
+
version.update_attribute :custom_created_at, (now + index.seconds)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Test we are ordering by custom timestamps.
|
33
|
+
@fluxor.versions true # reload association
|
34
|
+
assert_nil @fluxor.versions[2].reify
|
35
|
+
assert_equal 'Some text.', @fluxor.versions[1].reify.name
|
36
|
+
assert_equal 'Some more text.', @fluxor.versions[0].reify.name
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
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: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 2.6.
|
9
|
+
- 1
|
10
|
+
version: 2.6.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andy Stewart
|
@@ -15,13 +15,13 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-03-12 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: rails
|
23
23
|
prerelease: false
|
24
|
-
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
@@ -31,11 +31,11 @@ dependencies:
|
|
31
31
|
- 3
|
32
32
|
version: "3"
|
33
33
|
type: :runtime
|
34
|
-
|
34
|
+
requirement: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rake
|
37
37
|
prerelease: false
|
38
|
-
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
@@ -45,11 +45,11 @@ dependencies:
|
|
45
45
|
- 0
|
46
46
|
version: "0"
|
47
47
|
type: :development
|
48
|
-
|
48
|
+
requirement: *id002
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: shoulda
|
51
51
|
prerelease: false
|
52
|
-
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
53
53
|
none: false
|
54
54
|
requirements:
|
55
55
|
- - "="
|
@@ -61,11 +61,11 @@ dependencies:
|
|
61
61
|
- 3
|
62
62
|
version: 2.10.3
|
63
63
|
type: :development
|
64
|
-
|
64
|
+
requirement: *id003
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
66
|
name: sqlite3-ruby
|
67
67
|
prerelease: false
|
68
|
-
|
68
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
69
69
|
none: false
|
70
70
|
requirements:
|
71
71
|
- - ~>
|
@@ -76,23 +76,23 @@ dependencies:
|
|
76
76
|
- 2
|
77
77
|
version: "1.2"
|
78
78
|
type: :development
|
79
|
-
|
79
|
+
requirement: *id004
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: capybara
|
82
82
|
prerelease: false
|
83
|
-
|
83
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
|
-
- -
|
86
|
+
- - ~>
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
hash:
|
88
|
+
hash: 23
|
89
89
|
segments:
|
90
|
+
- 1
|
90
91
|
- 0
|
91
|
-
- 4
|
92
92
|
- 0
|
93
|
-
version: 0.
|
93
|
+
version: 1.0.0
|
94
94
|
type: :development
|
95
|
-
|
95
|
+
requirement: *id005
|
96
96
|
description: Track changes to your models' data. Good for auditing or versioning.
|
97
97
|
email: boss@airbladesoftware.com
|
98
98
|
executables: []
|
@@ -180,6 +180,7 @@ files:
|
|
180
180
|
- test/test_helper.rb
|
181
181
|
- test/unit/inheritance_column_test.rb
|
182
182
|
- test/unit/model_test.rb
|
183
|
+
- test/unit/timestamp_test.rb
|
183
184
|
has_rdoc: true
|
184
185
|
homepage: http://github.com/airblade/paper_trail
|
185
186
|
licenses: []
|
@@ -276,3 +277,4 @@ test_files:
|
|
276
277
|
- test/test_helper.rb
|
277
278
|
- test/unit/inheritance_column_test.rb
|
278
279
|
- test/unit/model_test.rb
|
280
|
+
- test/unit/timestamp_test.rb
|