paper_trail 3.0.7 → 3.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -6
- data/README.md +9 -9
- data/gemfiles/3.0.gemfile +4 -2
- data/lib/paper_trail/has_paper_trail.rb +10 -3
- data/lib/paper_trail/version_concern.rb +9 -2
- data/lib/paper_trail/version_number.rb +1 -1
- data/paper_trail.gemspec +1 -1
- data/spec/models/version_spec.rb +49 -2
- data/spec/models/widget_spec.rb +29 -8
- data/test/dummy/app/models/person.rb +13 -3
- data/test/dummy/app/models/song.rb +20 -0
- data/test/dummy/config/application.rb +3 -0
- data/test/unit/model_test.rb +47 -23
- data/test/unit/serializers/json_test.rb +17 -4
- data/test/unit/serializers/yaml_test.rb +5 -1
- metadata +44 -64
- data/test/dummy/public/404.html +0 -26
- data/test/dummy/public/422.html +0 -26
- data/test/dummy/public/500.html +0 -26
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/javascripts/application.js +0 -2
- data/test/dummy/public/javascripts/controls.js +0 -965
- data/test/dummy/public/javascripts/dragdrop.js +0 -974
- data/test/dummy/public/javascripts/effects.js +0 -1123
- data/test/dummy/public/javascripts/rails.js +0 -175
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de205e84196241d1165f38050f43114114b47cca
|
4
|
+
data.tar.gz: 2401292c3098d9050260528490556294f8034a6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89b14153e1f66e8e043532c78a6cda7033e2aa902c9d191fddc29ece1a4036c9808c26e345ca3360d4c70f6d1193eac14eb5884025a45750361419e290217d2f
|
7
|
+
data.tar.gz: 531199dd212d76562c9baed8033fd3ca765b5458b19c3b8029e89c8cd3f7a44202cdcb5efd3ad979022c5e4386e47e042fab2617470134a52d3ee6b328779f65
|
data/CHANGELOG.md
CHANGED
@@ -1,18 +1,32 @@
|
|
1
|
+
## 3.0.9
|
2
|
+
|
3
|
+
- [#479](https://github.com/airblade/paper_trail/issues/479) - Deprecated `originator` method in favor of
|
4
|
+
`paper_trail_originator` Deprecation warning informs users that the `originator` of the methods will be
|
5
|
+
removed in version `4.0`. (Backported from v4)
|
6
|
+
- Updated deprecation warnings for `Model.paper_trail_on` and `Model.paper_trail_off` to have display correct
|
7
|
+
version number the methods will be removed (`4.0`)
|
8
|
+
|
9
|
+
## 3.0.8
|
10
|
+
|
11
|
+
- [#525](https://github.com/airblade/paper_trail/issues/525) / [#512](https://github.com/airblade/paper_trail/pull/512) -
|
12
|
+
Support for virtual accessors and redefined setter and getter methods. (Backported from v4)
|
13
|
+
|
1
14
|
## 3.0.7
|
2
15
|
|
3
16
|
- [#404](https://github.com/airblade/paper_trail/issues/404) / [#428](https://github.com/airblade/paper_trail/issues/428) -
|
4
|
-
Fix errors occuring when a user attempts to update the inheritance column on an STI model instance in `ActiveRecord` 4.1.x
|
17
|
+
Fix errors occuring when a user attempts to update the inheritance column on an STI model instance in `ActiveRecord` 4.1.x.
|
18
|
+
(Backported from v4)
|
5
19
|
|
6
20
|
## 3.0.6
|
7
21
|
|
8
22
|
- [#414](https://github.com/airblade/paper_trail/issues/414) - Fix functionality `ignore` argument to `has_paper_trail`
|
9
|
-
in `ActiveRecord` 4
|
23
|
+
in `ActiveRecord` 4. (Backported from v4)
|
10
24
|
|
11
25
|
## 3.0.5
|
12
26
|
|
13
27
|
- [#401](https://github.com/airblade/paper_trail/issues/401) / [#406](https://github.com/airblade/paper_trail/issues/406) -
|
14
28
|
`PaperTrail::Version` class is not loaded via a `Rails::Engine`, even when the gem is used with in Rails. This feature has
|
15
|
-
will be re-introduced in version `
|
29
|
+
will be re-introduced in version `4.0`.
|
16
30
|
- [#398](https://github.com/airblade/paper_trail/pull/398) - Only require the `RSpec` helper if `RSpec::Core` is required.
|
17
31
|
|
18
32
|
## 3.0.3
|
@@ -57,7 +71,7 @@ in the `PaperTrail::Version` class through a `Rails::Engine` when the gem is use
|
|
57
71
|
with Rails `4.1.0.rc1`.
|
58
72
|
- [#334](https://github.com/airblade/paper_trail/pull/334) - Add small-scope `whodunnit` method to `PaperTrail::Model::InstanceMethods`.
|
59
73
|
- [#329](https://github.com/airblade/paper_trail/issues/329) - Add `touch_with_version` method to `PaperTrail::Model::InstanceMethods`,
|
60
|
-
to allow for generating a version `touch`ing a model.
|
74
|
+
to allow for generating a version while `touch`ing a model.
|
61
75
|
- [#328](https://github.com/airblade/paper_trail/pull/328) / [#326](https://github.com/airblade/paper_trail/issues/326) /
|
62
76
|
[#307](https://github.com/airblade/paper_trail/issues/307) - `Model.paper_trail_enabled_for_model?` and
|
63
77
|
`model_instance.without_versioning` is now thread-safe.
|
@@ -68,8 +82,8 @@ in the `PaperTrail::Version` class through a `Rails::Engine` when the gem is use
|
|
68
82
|
- [#312](https://github.com/airblade/paper_trail/issues/312) - Fix RSpec `with_versioning` class level helper method.
|
69
83
|
- `model_instance.without_versioning` now yields the `model_instance`, enabling syntax like this:
|
70
84
|
`model_instance.without_versioning { |obj| obj.update_attributes(:name => 'value') }`.
|
71
|
-
- Deprecated `Model.paper_trail_on` and `Model.paper_trail_off` in favor of bang versions of the methods.
|
72
|
-
informs users that the non-bang versions of the methods will be removed in version `
|
85
|
+
- Deprecated `Model.paper_trail_on` and `Model.paper_trail_off` in favor of bang versions of the methods.
|
86
|
+
Deprecation warning informs users that the non-bang versions of the methods will be removed in version `4.0`
|
73
87
|
|
74
88
|
## 3.0.0
|
75
89
|
|
data/README.md
CHANGED
@@ -42,7 +42,7 @@ The Rails 2.3 code is on the [`rails2`](https://github.com/airblade/paper_trail/
|
|
42
42
|
|
43
43
|
1. Add PaperTrail to your `Gemfile`.
|
44
44
|
|
45
|
-
`gem 'paper_trail', '~> 3.0.
|
45
|
+
`gem 'paper_trail', '~> 3.0.9'`
|
46
46
|
|
47
47
|
2. Generate a migration which will add a `versions` table to your database.
|
48
48
|
|
@@ -64,7 +64,7 @@ your applications `ActiveRecord` connection in a manner similar to the way `Rail
|
|
64
64
|
|
65
65
|
1. Add PaperTrail to your `Gemfile`.
|
66
66
|
|
67
|
-
`gem 'paper_trail', '~> 3.0.
|
67
|
+
`gem 'paper_trail', '~> 3.0.9'`
|
68
68
|
|
69
69
|
2. Generate a migration to add a `versions` table to your database.
|
70
70
|
|
@@ -115,7 +115,7 @@ widget.version
|
|
115
115
|
widget.live?
|
116
116
|
|
117
117
|
# Returns who put the widget into its current state.
|
118
|
-
widget.
|
118
|
+
widget.paper_trail_originator
|
119
119
|
|
120
120
|
# Returns the widget (not a version) as it looked at the given timestamp.
|
121
121
|
widget.version_at(timestamp)
|
@@ -147,7 +147,7 @@ And a `PaperTrail::Version` instance has these methods:
|
|
147
147
|
version.reify(options = {})
|
148
148
|
|
149
149
|
# Returns who put the item into the state stored in this version.
|
150
|
-
version.
|
150
|
+
version.paper_trail_originator
|
151
151
|
|
152
152
|
# Returns who changed the item from the state it had in this version.
|
153
153
|
version.terminator
|
@@ -504,22 +504,22 @@ Sometimes you want to define who is responsible for a change in a small scope wi
|
|
504
504
|
|
505
505
|
A version's `whodunnit` records who changed the object causing the `version` to be stored. Because a version stores the object as it looked before the change (see the table above), `whodunnit` returns who stopped the object looking like this -- not who made it look like this. Hence `whodunnit` is aliased as `terminator`.
|
506
506
|
|
507
|
-
To find out who made a version's object look that way, use `version.
|
507
|
+
To find out who made a version's object look that way, use `version.paper_trail_originator`. And to find out who made a "live" object look like it does, call `paper_trail_originator` on the object.
|
508
508
|
|
509
509
|
```ruby
|
510
510
|
>> widget = Widget.find 153 # assume widget has 0 versions
|
511
511
|
>> PaperTrail.whodunnit = 'Alice'
|
512
512
|
>> widget.update_attributes :name => 'Yankee'
|
513
|
-
>> widget
|
513
|
+
>> widget..paper_trail_originator # 'Alice'
|
514
514
|
>> PaperTrail.whodunnit = 'Bob'
|
515
515
|
>> widget.update_attributes :name => 'Zulu'
|
516
|
-
>> widget.
|
516
|
+
>> widget.paper_trail_originator # 'Bob'
|
517
517
|
>> first_version, last_version = widget.versions.first, widget.versions.last
|
518
518
|
>> first_version.whodunnit # 'Alice'
|
519
|
-
>> first_version.
|
519
|
+
>> first_version.paper_trail_originator # nil
|
520
520
|
>> first_version.terminator # 'Alice'
|
521
521
|
>> last_version.whodunnit # 'Bob'
|
522
|
-
>> last_version.
|
522
|
+
>> last_version.paper_trail_originator # 'Alice'
|
523
523
|
>> last_version.terminator # 'Bob'
|
524
524
|
```
|
525
525
|
|
data/gemfiles/3.0.gemfile
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gem 'activerecord', '~> 3.0'
|
4
|
+
gem 'i18n', '~> 0.6.11'
|
4
5
|
|
5
6
|
group :development, :test do
|
6
7
|
gem 'rake', '~> 10.1.1'
|
7
8
|
gem 'shoulda', '~> 3.5'
|
8
|
-
gem 'ffaker', '
|
9
|
+
gem 'ffaker', '<= 1.31.0'
|
9
10
|
|
10
11
|
# Testing of Rails
|
11
12
|
gem 'railties', '~> 3.0'
|
@@ -24,7 +25,7 @@ group :development, :test do
|
|
24
25
|
platforms :ruby do
|
25
26
|
gem 'sqlite3', '~> 1.2'
|
26
27
|
gem 'mysql2', '~> 0.3'
|
27
|
-
gem 'pg', '~> 0.17'
|
28
|
+
gem 'pg', '~> 0.17.1'
|
28
29
|
end
|
29
30
|
|
30
31
|
platforms :jruby, :ruby_18 do
|
@@ -38,5 +39,6 @@ group :development, :test do
|
|
38
39
|
gem 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
|
39
40
|
gem 'activerecord-jdbcpostgresql-adapter', '~> 1.3'
|
40
41
|
gem 'activerecord-jdbcmysql-adapter', '~> 1.3'
|
42
|
+
gem 'activerecord-jdbc-adapter', '1.3.15'
|
41
43
|
end
|
42
44
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/object' # provides the `try` method
|
2
|
+
|
1
3
|
module PaperTrail
|
2
4
|
module Model
|
3
5
|
|
@@ -86,7 +88,7 @@ module PaperTrail
|
|
86
88
|
end
|
87
89
|
|
88
90
|
def paper_trail_off
|
89
|
-
warn "DEPRECATED: use `paper_trail_off!` instead of `paper_trail_off`. Support for `paper_trail_off` will be removed in PaperTrail
|
91
|
+
warn "DEPRECATED: use `paper_trail_off!` instead of `paper_trail_off`. Support for `paper_trail_off` will be removed in PaperTrail 4.0"
|
90
92
|
self.paper_trail_off!
|
91
93
|
end
|
92
94
|
|
@@ -96,7 +98,7 @@ module PaperTrail
|
|
96
98
|
end
|
97
99
|
|
98
100
|
def paper_trail_on
|
99
|
-
warn "DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail
|
101
|
+
warn "DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail 4.0"
|
100
102
|
self.paper_trail_on!
|
101
103
|
end
|
102
104
|
|
@@ -173,10 +175,15 @@ module PaperTrail
|
|
173
175
|
end
|
174
176
|
|
175
177
|
# Returns who put the object into its current state.
|
176
|
-
def
|
178
|
+
def paper_trail_originator
|
177
179
|
(source_version || send(self.class.versions_association_name).last).try(:whodunnit)
|
178
180
|
end
|
179
181
|
|
182
|
+
def originator
|
183
|
+
warn "DEPRECATED: use `paper_trail_originator` instead of `originator`. Support for `originator` will be removed in PaperTrail 4.0"
|
184
|
+
self.paper_trail_originator
|
185
|
+
end
|
186
|
+
|
180
187
|
# Returns the object (not a Version) as it was at the given timestamp.
|
181
188
|
def version_at(timestamp, reify_options={})
|
182
189
|
# Because a version stores how its object looked *before* the change,
|
@@ -148,8 +148,10 @@ module PaperTrail
|
|
148
148
|
|
149
149
|
# Set all the attributes in this version on the model
|
150
150
|
attrs.each do |k, v|
|
151
|
-
if model.
|
151
|
+
if model.has_attribute?(k)
|
152
152
|
model[k.to_sym] = v
|
153
|
+
elsif model.respond_to?("#{k}=")
|
154
|
+
model.send("#{k}=", v)
|
153
155
|
else
|
154
156
|
logger.warn "Attribute #{k} does not exist on #{item_type} (Version id: #{id})."
|
155
157
|
end
|
@@ -179,8 +181,13 @@ module PaperTrail
|
|
179
181
|
end
|
180
182
|
|
181
183
|
# Returns who put the item into the state stored in this version.
|
184
|
+
def paper_trail_originator
|
185
|
+
@paper_trail_originator ||= previous.whodunnit rescue nil
|
186
|
+
end
|
187
|
+
|
182
188
|
def originator
|
183
|
-
|
189
|
+
warn "DEPRECATED: use `paper_trail_originator` instead of `originator`. Support for `originator` will be removed in PaperTrail 4.0"
|
190
|
+
self.paper_trail_originator
|
184
191
|
end
|
185
192
|
|
186
193
|
# Returns who changed the item from the state it had in this version.
|
data/paper_trail.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency 'rake', '~> 10.1.1'
|
26
26
|
s.add_development_dependency 'shoulda', '~> 3.5'
|
27
27
|
# s.add_development_dependency 'shoulda-matchers', '~> 1.5' # needed for ActiveRecord < 4
|
28
|
-
s.add_development_dependency 'ffaker',
|
28
|
+
s.add_development_dependency 'ffaker', '<= 1.31.0'
|
29
29
|
s.add_development_dependency 'railties', ['>= 3.0', '< 5.0']
|
30
30
|
s.add_development_dependency 'sinatra', '~> 1.0'
|
31
31
|
s.add_development_dependency 'rack-test', '>= 0.6'
|
data/spec/models/version_spec.rb
CHANGED
@@ -22,13 +22,60 @@ describe PaperTrail::Version do
|
|
22
22
|
describe "Instance" do
|
23
23
|
subject { PaperTrail::Version.new(attributes) rescue PaperTrail::Version.new }
|
24
24
|
|
25
|
-
describe
|
25
|
+
describe '#paper_trail_originator' do
|
26
|
+
it { is_expected.to respond_to(:paper_trail_originator) }
|
27
|
+
|
28
|
+
context "No previous versions" do
|
29
|
+
specify { expect(subject.previous).to be_nil }
|
30
|
+
|
31
|
+
it "should return nil" do
|
32
|
+
expect(subject.paper_trail_originator).to be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "Has previous version", :versioning => true do
|
37
|
+
let(:name) { Faker::Name.name }
|
38
|
+
let(:widget) { Widget.create!(:name => Faker::Name.name) }
|
39
|
+
before do
|
40
|
+
widget.versions.first.update_attributes!(:whodunnit => name)
|
41
|
+
widget.update_attributes!(:name => Faker::Name.first_name)
|
42
|
+
end
|
43
|
+
subject { widget.versions.last }
|
44
|
+
|
45
|
+
specify { expect(subject.previous).to be_instance_of(PaperTrail::Version) }
|
46
|
+
|
47
|
+
it "should return nil" do
|
48
|
+
expect(subject.paper_trail_originator).to eq(name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#originator" do
|
54
|
+
it { is_expected.to respond_to(:originator) }
|
55
|
+
let(:warning_msg) do
|
56
|
+
"DEPRECATED: use `paper_trail_originator` instead of `originator`." +
|
57
|
+
" Support for `originator` will be removed in PaperTrail 4.0"
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should set the invoke `paper_trail_originator`' do
|
61
|
+
is_expected.to receive(:warn)
|
62
|
+
is_expected.to receive(:paper_trail_originator)
|
63
|
+
subject.originator
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should display a deprecation warning' do
|
67
|
+
is_expected.to receive(:warn).with(warning_msg)
|
68
|
+
subject.originator
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#terminator' do
|
26
73
|
it { should respond_to(:terminator) }
|
27
74
|
|
28
75
|
let(:attributes) { {:whodunnit => Faker::Name.first_name} }
|
29
76
|
|
30
77
|
it "is an alias for the `whodunnit` attribute" do
|
31
|
-
subject.
|
78
|
+
subject.terminator.should == attributes[:whodunnit]
|
32
79
|
end
|
33
80
|
end
|
34
81
|
|
data/spec/models/widget_spec.rb
CHANGED
@@ -72,8 +72,8 @@ describe Widget do
|
|
72
72
|
|
73
73
|
describe "Methods" do
|
74
74
|
describe "Instance", :versioning => true do
|
75
|
-
describe
|
76
|
-
it { should respond_to(:
|
75
|
+
describe '#paper_trail_originator' do
|
76
|
+
it { should respond_to(:paper_trail_originator) }
|
77
77
|
|
78
78
|
describe "return value" do
|
79
79
|
let(:orig_name) { Faker::Name.name }
|
@@ -84,9 +84,9 @@ describe Widget do
|
|
84
84
|
specify { widget.should be_live }
|
85
85
|
|
86
86
|
it "should return the originator for the model at a given state" do
|
87
|
-
widget.
|
87
|
+
widget.paper_trail_originator.should == orig_name
|
88
88
|
widget.whodunnit(new_name) { |w| w.update_attributes(:name => 'Elizabeth') }
|
89
|
-
widget.
|
89
|
+
widget.paper_trail_originator.should == new_name
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
@@ -99,13 +99,34 @@ describe Widget do
|
|
99
99
|
let(:reified_widget) { widget.versions[1].reify }
|
100
100
|
|
101
101
|
it "should return the appropriate originator" do
|
102
|
-
reified_widget.
|
102
|
+
reified_widget.paper_trail_originator.should == orig_name
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
describe
|
108
|
+
describe "#originator" do
|
109
|
+
subject { widget }
|
110
|
+
|
111
|
+
it { is_expected.to respond_to(:originator) }
|
112
|
+
let(:warning_msg) do
|
113
|
+
"DEPRECATED: use `paper_trail_originator` instead of `originator`." +
|
114
|
+
" Support for `originator` will be removed in PaperTrail 4.0"
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should set the invoke `paper_trail_originator`' do
|
118
|
+
is_expected.to receive(:warn)
|
119
|
+
is_expected.to receive(:paper_trail_originator)
|
120
|
+
subject.originator
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should display a deprecation warning' do
|
124
|
+
is_expected.to receive(:warn).with(warning_msg)
|
125
|
+
subject.originator
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#version_at' do
|
109
130
|
it { should respond_to(:version_at) }
|
110
131
|
|
111
132
|
context "Timestamp argument is AFTER object has been destroyed" do
|
@@ -200,7 +221,7 @@ describe Widget do
|
|
200
221
|
end
|
201
222
|
|
202
223
|
it 'should display a deprecation warning' do
|
203
|
-
subject.should_receive(:warn).with("DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail
|
224
|
+
subject.should_receive(:warn).with("DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail 4.0")
|
204
225
|
subject.paper_trail_on
|
205
226
|
end
|
206
227
|
end
|
@@ -229,7 +250,7 @@ describe Widget do
|
|
229
250
|
end
|
230
251
|
|
231
252
|
it 'should display a deprecation warning' do
|
232
|
-
subject.should_receive(:warn).with("DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail
|
253
|
+
subject.should_receive(:warn).with("DEPRECATED: use `paper_trail_on!` instead of `paper_trail_on`. Support for `paper_trail_on` will be removed in PaperTrail 4.0")
|
233
254
|
subject.paper_trail_on
|
234
255
|
end
|
235
256
|
end
|
@@ -15,12 +15,22 @@ class Person < ActiveRecord::Base
|
|
15
15
|
|
16
16
|
# Store TimeZone objects as strings when serialized to database
|
17
17
|
class TimeZoneSerializer
|
18
|
+
class << self
|
19
|
+
def dump(zone)
|
20
|
+
zone.try(:name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def load(value)
|
24
|
+
::Time.find_zone!(value) rescue nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
18
28
|
def dump(zone)
|
19
|
-
|
29
|
+
self.class.dump(zone)
|
20
30
|
end
|
21
|
-
|
31
|
+
|
22
32
|
def load(value)
|
23
|
-
|
33
|
+
self.class.load(value)
|
24
34
|
end
|
25
35
|
end
|
26
36
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Example from 'Overwriting default accessors' in ActiveRecord::Base.
|
2
2
|
class Song < ActiveRecord::Base
|
3
3
|
has_paper_trail
|
4
|
+
attr_accessor :name
|
4
5
|
|
5
6
|
# Uses an integer of seconds to hold the length of the song
|
6
7
|
def length=(minutes)
|
@@ -9,4 +10,23 @@ class Song < ActiveRecord::Base
|
|
9
10
|
def length
|
10
11
|
read_attribute(:length) / 60
|
11
12
|
end
|
13
|
+
|
14
|
+
# override attributes hashes like some libraries do
|
15
|
+
def attributes_with_name
|
16
|
+
if name
|
17
|
+
attributes_without_name.merge(:name => name)
|
18
|
+
else
|
19
|
+
attributes_without_name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
alias_method_chain :attributes, :name
|
23
|
+
|
24
|
+
def changed_attributes_with_name
|
25
|
+
if name
|
26
|
+
changed_attributes_without_name.merge(:name => name)
|
27
|
+
else
|
28
|
+
changed_attributes_without_name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
alias_method_chain :changed_attributes, :name
|
12
32
|
end
|
@@ -59,5 +59,8 @@ module Dummy
|
|
59
59
|
|
60
60
|
# Rails 4 key for generating secret key
|
61
61
|
config.secret_key_base = 'A fox regularly kicked the screaming pile of biscuits.'
|
62
|
+
|
63
|
+
# supress warnings about raises in transactional callbacks on AR 4.2+
|
64
|
+
config.active_record.raise_in_transactional_callbacks = true if ActiveRecord::VERSION::STRING >= '4.2'
|
62
65
|
end
|
63
66
|
end
|
data/test/unit/model_test.rb
CHANGED
@@ -567,9 +567,9 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
567
567
|
|
568
568
|
should 'track who made the change' do
|
569
569
|
assert_equal 'Alice', @version.whodunnit
|
570
|
-
assert_nil @version.
|
570
|
+
assert_nil @version.paper_trail_originator
|
571
571
|
assert_equal 'Alice', @version.terminator
|
572
|
-
assert_equal 'Alice', @widget.
|
572
|
+
assert_equal 'Alice', @widget.paper_trail_originator
|
573
573
|
end
|
574
574
|
|
575
575
|
context 'when a record is updated' do
|
@@ -581,9 +581,9 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
581
581
|
|
582
582
|
should 'track who made the change' do
|
583
583
|
assert_equal 'Bob', @version.whodunnit
|
584
|
-
assert_equal 'Alice', @version.
|
584
|
+
assert_equal 'Alice', @version.paper_trail_originator
|
585
585
|
assert_equal 'Bob', @version.terminator
|
586
|
-
assert_equal 'Bob', @widget.
|
586
|
+
assert_equal 'Bob', @widget.paper_trail_originator
|
587
587
|
end
|
588
588
|
|
589
589
|
context 'when a record is destroyed' do
|
@@ -595,9 +595,9 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
595
595
|
|
596
596
|
should 'track who made the change' do
|
597
597
|
assert_equal 'Charlie', @version.whodunnit
|
598
|
-
assert_equal 'Bob', @version.
|
598
|
+
assert_equal 'Bob', @version.paper_trail_originator
|
599
599
|
assert_equal 'Charlie', @version.terminator
|
600
|
-
assert_equal 'Charlie', @widget.
|
600
|
+
assert_equal 'Charlie', @widget.paper_trail_originator
|
601
601
|
end
|
602
602
|
end
|
603
603
|
end
|
@@ -616,15 +616,18 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
616
616
|
assert_not_nil @wotsit.versions.last.reify.updated_at
|
617
617
|
end
|
618
618
|
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
619
|
+
# Currently the gem generates a bunch of deprecation warnings about serialized attributes on AR 4.2
|
620
|
+
if ActiveRecord::VERSION::STRING < '4.2'
|
621
|
+
should 'not generate warning' do
|
622
|
+
# Tests that it doesn't try to write created_on as an attribute just because a created_on
|
623
|
+
# method exists.
|
624
|
+
warnings = capture(:stderr) { # Deprecation warning in Rails 3.2
|
625
|
+
assert_nothing_raised { # ActiveModel::MissingAttributeError in Rails 4
|
626
|
+
@wotsit.update_attributes! :name => 'changed'
|
627
|
+
}
|
625
628
|
}
|
626
|
-
|
627
|
-
|
629
|
+
assert_equal '', warnings
|
630
|
+
end
|
628
631
|
end
|
629
632
|
|
630
633
|
end
|
@@ -646,7 +649,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
646
649
|
should 'should return the correct originator' do
|
647
650
|
PaperTrail.whodunnit = 'Ben'
|
648
651
|
@foo.update_attribute(:name, 'Geoffrey')
|
649
|
-
assert_equal PaperTrail.whodunnit, @foo.
|
652
|
+
assert_equal PaperTrail.whodunnit, @foo.paper_trail_originator
|
650
653
|
end
|
651
654
|
|
652
655
|
context 'when destroyed' do
|
@@ -1052,12 +1055,14 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1052
1055
|
should 'version.object_changes attribute should have stored the value returned by the attribute serializer' do
|
1053
1056
|
as_stored_in_version = HashWithIndifferentAccess[YAML::load(@person.versions.last.object_changes)]
|
1054
1057
|
assert_equal [nil, 'Samoa'], as_stored_in_version[:time_zone]
|
1055
|
-
|
1058
|
+
serialized_value = Person::TimeZoneSerializer.dump(@person.time_zone)
|
1059
|
+
assert_equal serialized_value, as_stored_in_version[:time_zone].last
|
1056
1060
|
end
|
1057
1061
|
|
1058
1062
|
# Tests for unserialization:
|
1059
1063
|
should 'version.changeset should convert the attribute value back to its original, unserialized value' do
|
1060
|
-
|
1064
|
+
unserialized_value = Person::TimeZoneSerializer.load(@person.time_zone)
|
1065
|
+
assert_equal unserialized_value, @person.versions.last.changeset[:time_zone].last
|
1061
1066
|
end
|
1062
1067
|
should "record.changes (before save) returns the original, unserialized values" do
|
1063
1068
|
assert_equal [NilClass, ActiveSupport::TimeZone], @changes_before_save[:time_zone].map(&:class)
|
@@ -1069,7 +1074,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1069
1074
|
|
1070
1075
|
context 'when that attribute is updated' do
|
1071
1076
|
setup do
|
1072
|
-
@attribute_value_before_change = @person.
|
1077
|
+
@attribute_value_before_change = @person.time_zone
|
1073
1078
|
@person.assign_attributes({ :time_zone => 'Pacific Time (US & Canada)' })
|
1074
1079
|
@changes_before_save = @person.changes.dup
|
1075
1080
|
@person.save!
|
@@ -1078,7 +1083,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1078
1083
|
# Tests for serialization:
|
1079
1084
|
# Before the serialized attributes fix, the object/object_changes value that was stored was ridiculously long (58723).
|
1080
1085
|
should 'version.object should not have stored the default, ridiculously long (to_yaml) serialization of the TimeZone object' do
|
1081
|
-
assert @person.versions.last.object.
|
1086
|
+
assert @person.versions.last.object.length < 105, "object length was #{@person.versions.last.object.length}"
|
1082
1087
|
end
|
1083
1088
|
# Need an additional clause to detect what version of ActiveRecord is being used for this test because AR4 injects the `updated_at` column into the changeset for updates to models
|
1084
1089
|
should 'version.object_changes should not have stored the default, ridiculously long (to_yaml) serialization of the TimeZone object' do
|
@@ -1088,20 +1093,24 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1088
1093
|
should 'version.object attribute should have stored the value returned by the attribute serializer' do
|
1089
1094
|
as_stored_in_version = HashWithIndifferentAccess[YAML::load(@person.versions.last.object)]
|
1090
1095
|
assert_equal 'Samoa', as_stored_in_version[:time_zone]
|
1091
|
-
|
1096
|
+
serialized_value = Person::TimeZoneSerializer.dump(@attribute_value_before_change)
|
1097
|
+
assert_equal serialized_value, as_stored_in_version[:time_zone]
|
1092
1098
|
end
|
1093
1099
|
should 'version.object_changes attribute should have stored the value returned by the attribute serializer' do
|
1094
1100
|
as_stored_in_version = HashWithIndifferentAccess[YAML::load(@person.versions.last.object_changes)]
|
1095
1101
|
assert_equal ['Samoa', 'Pacific Time (US & Canada)'], as_stored_in_version[:time_zone]
|
1096
|
-
|
1102
|
+
serialized_value = Person::TimeZoneSerializer.dump(@person.time_zone)
|
1103
|
+
assert_equal serialized_value, as_stored_in_version[:time_zone].last
|
1097
1104
|
end
|
1098
1105
|
|
1099
1106
|
# Tests for unserialization:
|
1100
1107
|
should 'version.reify should convert the attribute value back to its original, unserialized value' do
|
1101
|
-
|
1108
|
+
unserialized_value = Person::TimeZoneSerializer.load(@attribute_value_before_change)
|
1109
|
+
assert_equal unserialized_value, @person.versions.last.reify.time_zone
|
1102
1110
|
end
|
1103
1111
|
should 'version.changeset should convert the attribute value back to its original, unserialized value' do
|
1104
|
-
|
1112
|
+
unserialized_value = Person::TimeZoneSerializer.load(@person.time_zone)
|
1113
|
+
assert_equal unserialized_value, @person.versions.last.changeset[:time_zone].last
|
1105
1114
|
end
|
1106
1115
|
should "record.changes (before save) returns the original, unserialized values" do
|
1107
1116
|
assert_equal [ActiveSupport::TimeZone, ActiveSupport::TimeZone], @changes_before_save[:time_zone].map(&:class)
|
@@ -1165,6 +1174,21 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1165
1174
|
should 'return "overwritten" value on reified instance' do
|
1166
1175
|
assert_equal 4, @song.versions.last.reify.length
|
1167
1176
|
end
|
1177
|
+
|
1178
|
+
context 'Has a virtual attribute injected into the ActiveModel::Dirty changes' do
|
1179
|
+
setup do
|
1180
|
+
@song.name = 'Good Vibrations'
|
1181
|
+
@song.save
|
1182
|
+
@song.name = nil
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
should 'return persist the changes on the live instance properly' do
|
1186
|
+
assert_equal nil, @song.name
|
1187
|
+
end
|
1188
|
+
should 'return "overwritten" virtual attribute on the reified instance' do
|
1189
|
+
assert_equal 'Good Vibrations', @song.versions.last.reify.name
|
1190
|
+
end
|
1191
|
+
end
|
1168
1192
|
end
|
1169
1193
|
|
1170
1194
|
|