paper_trail 5.1.1 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CONTRIBUTING.md +9 -7
- data/.rubocop.yml +0 -4
- data/.rubocop_todo.yml +6 -1
- data/CHANGELOG.md +41 -1
- data/README.md +45 -43
- data/lib/paper_trail.rb +5 -0
- data/lib/paper_trail/attribute_serializers/object_attribute.rb +1 -1
- data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +1 -1
- data/lib/paper_trail/frameworks/rails/controller.rb +7 -2
- data/lib/paper_trail/has_paper_trail.rb +196 -495
- data/lib/paper_trail/model_config.rb +195 -0
- data/lib/paper_trail/record_trail.rb +450 -0
- data/lib/paper_trail/reifier.rb +11 -11
- data/lib/paper_trail/version_number.rb +2 -2
- data/spec/models/boolit_spec.rb +2 -2
- data/spec/models/fluxor_spec.rb +4 -6
- data/spec/models/gadget_spec.rb +5 -7
- data/spec/models/not_on_update_spec.rb +2 -2
- data/spec/models/post_with_status_spec.rb +1 -1
- data/spec/models/widget_spec.rb +36 -66
- data/test/dummy/app/models/callback_modifier.rb +5 -5
- data/test/dummy/app/models/elephant.rb +1 -1
- data/test/functional/thread_safety_test.rb +4 -4
- data/test/unit/cleaner_test.rb +1 -1
- data/test/unit/model_test.rb +58 -48
- data/test/unit/protected_attrs_test.rb +4 -3
- data/test/unit/serializer_test.rb +4 -3
- metadata +4 -2
@@ -26,9 +26,9 @@ class ThreadSafetyTest < ActionController::TestCase
|
|
26
26
|
enabled = nil
|
27
27
|
|
28
28
|
slow_thread = Thread.new do
|
29
|
-
Widget.new.without_versioning do
|
29
|
+
Widget.new.paper_trail.without_versioning do
|
30
30
|
sleep(0.01)
|
31
|
-
enabled = Widget.
|
31
|
+
enabled = Widget.paper_trail.enabled?
|
32
32
|
sleep(0.01)
|
33
33
|
end
|
34
34
|
enabled
|
@@ -36,11 +36,11 @@ class ThreadSafetyTest < ActionController::TestCase
|
|
36
36
|
|
37
37
|
fast_thread = Thread.new do
|
38
38
|
sleep(0.005)
|
39
|
-
Widget.
|
39
|
+
Widget.paper_trail.enabled?
|
40
40
|
end
|
41
41
|
|
42
42
|
assert_not_equal slow_thread.value, fast_thread.value
|
43
|
-
assert Widget.
|
43
|
+
assert Widget.paper_trail.enabled?
|
44
44
|
assert PaperTrail.enabled_for_model?(Widget)
|
45
45
|
end
|
46
46
|
end
|
data/test/unit/cleaner_test.rb
CHANGED
@@ -53,7 +53,7 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase
|
|
53
53
|
should "restrict the versions destroyed to those that were created on the date provided" do
|
54
54
|
assert_equal 10, PaperTrail::Version.count
|
55
55
|
assert_equal 4, @animal.versions.size
|
56
|
-
assert_equal 3, @animal.versions_between(@date, @date + 1.day).size
|
56
|
+
assert_equal 3, @animal.paper_trail.versions_between(@date, @date + 1.day).size
|
57
57
|
PaperTrail.clean_versions!(date: @date)
|
58
58
|
assert_equal 8, PaperTrail::Version.count
|
59
59
|
assert_equal 2, @animal.versions.reload.size
|
data/test/unit/model_test.rb
CHANGED
@@ -242,7 +242,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
242
242
|
end
|
243
243
|
|
244
244
|
should "be live" do
|
245
|
-
assert @widget.live?
|
245
|
+
assert @widget.paper_trail.live?
|
246
246
|
end
|
247
247
|
|
248
248
|
context "which is then created" do
|
@@ -262,7 +262,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
262
262
|
end
|
263
263
|
|
264
264
|
should "be live" do
|
265
|
-
assert @widget.live?
|
265
|
+
assert @widget.paper_trail.live?
|
266
266
|
end
|
267
267
|
|
268
268
|
should "use the widget `updated_at` as the version's `created_at`" do
|
@@ -317,7 +317,9 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
317
317
|
end
|
318
318
|
|
319
319
|
should "have versions that are not live" do
|
320
|
-
assert @widget.versions.map(&:reify).compact.all? { |w|
|
320
|
+
assert @widget.versions.map(&:reify).compact.all? { |w|
|
321
|
+
!w.paper_trail.live?
|
322
|
+
}
|
321
323
|
end
|
322
324
|
|
323
325
|
should "have stored changes" do
|
@@ -566,11 +568,11 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
566
568
|
|
567
569
|
context "with its paper trail turned off" do
|
568
570
|
setup do
|
569
|
-
Widget.
|
571
|
+
Widget.paper_trail.disable
|
570
572
|
@count = @widget.versions.length
|
571
573
|
end
|
572
574
|
|
573
|
-
teardown { Widget.
|
575
|
+
teardown { Widget.paper_trail.enable }
|
574
576
|
|
575
577
|
context "when updated" do
|
576
578
|
setup { @widget.update_attributes name: "Beeblebrox" }
|
@@ -582,13 +584,13 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
582
584
|
|
583
585
|
context 'when destroyed "without versioning"' do
|
584
586
|
should "leave paper trail off after call" do
|
585
|
-
@widget.without_versioning :destroy
|
586
|
-
|
587
|
+
@widget.paper_trail.without_versioning :destroy
|
588
|
+
assert_equal false, Widget.paper_trail.enabled?
|
587
589
|
end
|
588
590
|
end
|
589
591
|
|
590
592
|
context "and then its paper trail turned on" do
|
591
|
-
setup { Widget.
|
593
|
+
setup { Widget.paper_trail.enable }
|
592
594
|
|
593
595
|
context "when updated" do
|
594
596
|
setup { @widget.update_attributes name: "Ford" }
|
@@ -600,11 +602,11 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
600
602
|
|
601
603
|
context 'when updated "without versioning"' do
|
602
604
|
setup do
|
603
|
-
@widget.without_versioning do
|
605
|
+
@widget.paper_trail.without_versioning do
|
604
606
|
@widget.update_attributes name: "Ford"
|
605
607
|
end
|
606
608
|
# The model instance should yield itself for convenience purposes
|
607
|
-
@widget.without_versioning { |w| w.update_attributes name: "Nixon" }
|
609
|
+
@widget.paper_trail.without_versioning { |w| w.update_attributes name: "Nixon" }
|
608
610
|
end
|
609
611
|
|
610
612
|
should "not create new version" do
|
@@ -612,19 +614,19 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
612
614
|
end
|
613
615
|
|
614
616
|
should "enable paper trail after call" do
|
615
|
-
assert Widget.
|
617
|
+
assert Widget.paper_trail.enabled?
|
616
618
|
end
|
617
619
|
end
|
618
620
|
|
619
621
|
context "when receiving a method name as an argument" do
|
620
|
-
setup { @widget.without_versioning(:touch_with_version) }
|
622
|
+
setup { @widget.paper_trail.without_versioning(:touch_with_version) }
|
621
623
|
|
622
624
|
should "not create new version" do
|
623
625
|
assert_equal @count, @widget.versions.length
|
624
626
|
end
|
625
627
|
|
626
628
|
should "enable paper trail after call" do
|
627
|
-
assert Widget.
|
629
|
+
assert Widget.paper_trail.enabled?
|
628
630
|
end
|
629
631
|
end
|
630
632
|
end
|
@@ -645,9 +647,9 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
645
647
|
|
646
648
|
should "track who made the change" do
|
647
649
|
assert_equal "Alice", @version.whodunnit
|
648
|
-
assert_nil
|
650
|
+
assert_nil @version.paper_trail_originator
|
649
651
|
assert_equal "Alice", @version.terminator
|
650
|
-
assert_equal "Alice", @widget.
|
652
|
+
assert_equal "Alice", @widget.paper_trail.originator
|
651
653
|
end
|
652
654
|
|
653
655
|
context "when a record is updated" do
|
@@ -658,10 +660,10 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
658
660
|
end
|
659
661
|
|
660
662
|
should "track who made the change" do
|
661
|
-
assert_equal "Bob",
|
663
|
+
assert_equal "Bob", @version.whodunnit
|
662
664
|
assert_equal "Alice", @version.paper_trail_originator
|
663
|
-
assert_equal "Bob",
|
664
|
-
assert_equal "Bob",
|
665
|
+
assert_equal "Bob", @version.terminator
|
666
|
+
assert_equal "Bob", @widget.paper_trail.originator
|
665
667
|
end
|
666
668
|
|
667
669
|
context "when a record is destroyed" do
|
@@ -673,9 +675,9 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
673
675
|
|
674
676
|
should "track who made the change" do
|
675
677
|
assert_equal "Charlie", @version.whodunnit
|
676
|
-
assert_equal "Bob",
|
678
|
+
assert_equal "Bob", @version.paper_trail_originator
|
677
679
|
assert_equal "Charlie", @version.terminator
|
678
|
-
assert_equal "Charlie", @widget.
|
680
|
+
assert_equal "Charlie", @widget.paper_trail.originator
|
679
681
|
end
|
680
682
|
end
|
681
683
|
end
|
@@ -735,7 +737,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
735
737
|
should "should return the correct originator" do
|
736
738
|
PaperTrail.whodunnit = "Ben"
|
737
739
|
@foo.update_attribute(:name, "Geoffrey")
|
738
|
-
assert_equal PaperTrail.whodunnit, @foo.
|
740
|
+
assert_equal PaperTrail.whodunnit, @foo.paper_trail.originator
|
739
741
|
end
|
740
742
|
|
741
743
|
context "when destroyed" do
|
@@ -768,40 +770,43 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
768
770
|
end
|
769
771
|
|
770
772
|
should "return nil for version_at before it was created" do
|
771
|
-
assert_nil @widget.version_at(@created - 1)
|
773
|
+
assert_nil @widget.paper_trail.version_at(@created - 1)
|
772
774
|
end
|
773
775
|
|
774
776
|
should "return how it looked when created for version_at its creation" do
|
775
|
-
assert_equal "Widget", @widget.version_at(@created).name
|
777
|
+
assert_equal "Widget", @widget.paper_trail.version_at(@created).name
|
776
778
|
end
|
777
779
|
|
778
780
|
should "return how it looked before its first update" do
|
779
|
-
assert_equal "Widget", @widget.version_at(@first_update - 1).name
|
781
|
+
assert_equal "Widget", @widget.paper_trail.version_at(@first_update - 1).name
|
780
782
|
end
|
781
783
|
|
782
784
|
should "return how it looked after its first update" do
|
783
|
-
assert_equal "Fidget", @widget.version_at(@first_update).name
|
785
|
+
assert_equal "Fidget", @widget.paper_trail.version_at(@first_update).name
|
784
786
|
end
|
785
787
|
|
786
788
|
should "return how it looked before its second update" do
|
787
|
-
assert_equal "Fidget", @widget.version_at(@second_update - 1).name
|
789
|
+
assert_equal "Fidget", @widget.paper_trail.version_at(@second_update - 1).name
|
788
790
|
end
|
789
791
|
|
790
792
|
should "return how it looked after its second update" do
|
791
|
-
assert_equal "Digit", @widget.version_at(@second_update).name
|
793
|
+
assert_equal "Digit", @widget.paper_trail.version_at(@second_update).name
|
792
794
|
end
|
793
795
|
|
794
796
|
should "return the current object for version_at after latest update" do
|
795
|
-
assert_equal "Digit", @widget.version_at(1.day.from_now).name
|
797
|
+
assert_equal "Digit", @widget.paper_trail.version_at(1.day.from_now).name
|
796
798
|
end
|
797
799
|
|
798
800
|
context "passing in a string representation of a timestamp" do
|
799
801
|
should "still return a widget when appropriate" do
|
800
802
|
# need to add 1 second onto the timestamps before casting to a string,
|
801
803
|
# since casting a Time to a string drops the microseconds
|
802
|
-
assert_equal "Widget",
|
803
|
-
|
804
|
-
assert_equal "
|
804
|
+
assert_equal "Widget",
|
805
|
+
@widget.paper_trail.version_at((@created + 1.second).to_s).name
|
806
|
+
assert_equal "Fidget",
|
807
|
+
@widget.paper_trail.version_at((@first_update + 1.second).to_s).name
|
808
|
+
assert_equal "Digit",
|
809
|
+
@widget.paper_trail.version_at((@second_update + 1.second).to_s).name
|
805
810
|
end
|
806
811
|
end
|
807
812
|
end
|
@@ -819,13 +824,13 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
819
824
|
|
820
825
|
should "return versions in the time period" do
|
821
826
|
assert_equal ["Fidget"],
|
822
|
-
@widget.versions_between(20.days.ago, 10.days.ago).map(&:name)
|
827
|
+
@widget.paper_trail.versions_between(20.days.ago, 10.days.ago).map(&:name)
|
823
828
|
assert_equal %w(Widget Fidget),
|
824
|
-
@widget.versions_between(45.days.ago, 10.days.ago).map(&:name)
|
829
|
+
@widget.paper_trail.versions_between(45.days.ago, 10.days.ago).map(&:name)
|
825
830
|
assert_equal %w(Fidget Digit Digit),
|
826
|
-
@widget.versions_between(16.days.ago, 1.minute.ago).map(&:name)
|
831
|
+
@widget.paper_trail.versions_between(16.days.ago, 1.minute.ago).map(&:name)
|
827
832
|
assert_equal [],
|
828
|
-
@widget.versions_between(60.days.ago, 45.days.ago).map(&:name)
|
833
|
+
@widget.paper_trail.versions_between(60.days.ago, 45.days.ago).map(&:name)
|
829
834
|
end
|
830
835
|
end
|
831
836
|
|
@@ -948,7 +953,8 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
948
953
|
end
|
949
954
|
|
950
955
|
should "return its previous self" do
|
951
|
-
assert_equal @widget.versions[-2].reify,
|
956
|
+
assert_equal @widget.versions[-2].reify,
|
957
|
+
@widget.paper_trail.previous_version
|
952
958
|
end
|
953
959
|
end
|
954
960
|
|
@@ -956,11 +962,11 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
956
962
|
setup { @widget = Widget.new }
|
957
963
|
|
958
964
|
should "not have a previous version" do
|
959
|
-
assert_nil @widget.previous_version
|
965
|
+
assert_nil @widget.paper_trail.previous_version
|
960
966
|
end
|
961
967
|
|
962
968
|
should "not have a next version" do
|
963
|
-
assert_nil @widget.next_version
|
969
|
+
assert_nil @widget.paper_trail.next_version
|
964
970
|
end
|
965
971
|
|
966
972
|
context "with versions" do
|
@@ -970,11 +976,12 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
970
976
|
end
|
971
977
|
|
972
978
|
should "have a previous version" do
|
973
|
-
assert_equal @widget.versions.last.reify.name,
|
979
|
+
assert_equal @widget.versions.last.reify.name,
|
980
|
+
@widget.paper_trail.previous_version.name
|
974
981
|
end
|
975
982
|
|
976
983
|
should "not have a next version" do
|
977
|
-
assert_nil @widget.next_version
|
984
|
+
assert_nil @widget.paper_trail.next_version
|
978
985
|
end
|
979
986
|
end
|
980
987
|
end
|
@@ -988,13 +995,15 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
988
995
|
end
|
989
996
|
|
990
997
|
should "have a previous version" do
|
991
|
-
|
992
|
-
|
998
|
+
# `create` events return `nil` for `reify`
|
999
|
+
assert_nil @second_widget.paper_trail.previous_version
|
1000
|
+
assert_equal @widget.versions[-2].reify.name,
|
1001
|
+
@last_widget.paper_trail.previous_version.name
|
993
1002
|
end
|
994
1003
|
|
995
1004
|
should "have a next version" do
|
996
|
-
assert_equal @widget.versions[2].reify.name, @second_widget.next_version.name
|
997
|
-
assert_equal @last_widget.next_version.name, @widget.name
|
1005
|
+
assert_equal @widget.versions[2].reify.name, @second_widget.paper_trail.next_version.name
|
1006
|
+
assert_equal @last_widget.paper_trail.next_version.name, @widget.name
|
998
1007
|
end
|
999
1008
|
end
|
1000
1009
|
|
@@ -1270,13 +1279,14 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1270
1279
|
end
|
1271
1280
|
|
1272
1281
|
should "respond to `next_version` as normal" do
|
1273
|
-
|
1282
|
+
reified = @doc.paper_trail_versions.last.reify
|
1283
|
+
assert_equal reified.paper_trail.next_version.name, @doc.name
|
1274
1284
|
end
|
1275
1285
|
|
1276
1286
|
should "respond to `previous_version` as normal" do
|
1277
1287
|
@doc.update_attributes name: "Doc 2"
|
1278
1288
|
assert_equal 3, @doc.paper_trail_versions.length
|
1279
|
-
assert_equal "Doc 1", @doc.previous_version.name
|
1289
|
+
assert_equal "Doc 1", @doc.paper_trail.previous_version.name
|
1280
1290
|
end
|
1281
1291
|
end
|
1282
1292
|
|
@@ -1350,7 +1360,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1350
1360
|
end
|
1351
1361
|
|
1352
1362
|
should "still respond to touch_with_version" do
|
1353
|
-
@fluxor.touch_with_version
|
1363
|
+
@fluxor.paper_trail.touch_with_version
|
1354
1364
|
assert_equal 1, @fluxor.versions.length
|
1355
1365
|
end
|
1356
1366
|
end
|
@@ -1405,7 +1415,7 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase
|
|
1405
1415
|
end
|
1406
1416
|
|
1407
1417
|
should "return its previous self" do
|
1408
|
-
assert_equal @widget.versions[-2].reify, @widget.previous_version
|
1418
|
+
assert_equal @widget.versions[-2].reify, @widget.paper_trail.previous_version
|
1409
1419
|
end
|
1410
1420
|
end
|
1411
1421
|
|
@@ -25,7 +25,7 @@ class ProtectedAttrsTest < ActiveSupport::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
should "be `nil` in its previous version" do
|
28
|
-
assert_nil @widget.previous_version
|
28
|
+
assert_nil @widget.paper_trail.previous_version
|
29
29
|
end
|
30
30
|
|
31
31
|
context "which is then updated" do
|
@@ -36,14 +36,15 @@ class ProtectedAttrsTest < ActiveSupport::TestCase
|
|
36
36
|
end
|
37
37
|
|
38
38
|
should "not be `nil` in its previous version" do
|
39
|
-
assert_not_nil @widget.previous_version
|
39
|
+
assert_not_nil @widget.paper_trail.previous_version
|
40
40
|
end
|
41
41
|
|
42
42
|
should "the previous version should contain right attributes" do
|
43
43
|
# For some reason this test seems to be broken in JRuby 1.9 mode in the
|
44
44
|
# test env even though it works in the console. WTF?
|
45
45
|
unless ActiveRecord::VERSION::MAJOR >= 4 && defined?(JRUBY_VERSION)
|
46
|
-
|
46
|
+
previous_attributes = @widget.paper_trail.previous_version.attributes
|
47
|
+
assert_attributes_equal previous_attributes, @initial_attributes
|
47
48
|
end
|
48
49
|
end
|
49
50
|
end
|
@@ -11,7 +11,7 @@ class SerializerTest < ActiveSupport::TestCase
|
|
11
11
|
@fluxor = Fluxor.create name: "Some text."
|
12
12
|
|
13
13
|
# this is exactly what PaperTrail serializes
|
14
|
-
@original_fluxor_attributes = @fluxor.
|
14
|
+
@original_fluxor_attributes = @fluxor.paper_trail.attributes_before_change
|
15
15
|
|
16
16
|
@fluxor.update_attributes name: "Some more text."
|
17
17
|
end
|
@@ -41,7 +41,7 @@ class SerializerTest < ActiveSupport::TestCase
|
|
41
41
|
@fluxor = Fluxor.create name: "Some text."
|
42
42
|
|
43
43
|
# this is exactly what PaperTrail serializes
|
44
|
-
@original_fluxor_attributes = @fluxor.
|
44
|
+
@original_fluxor_attributes = @fluxor.paper_trail.attributes_before_change
|
45
45
|
|
46
46
|
@fluxor.update_attributes name: "Some more text."
|
47
47
|
end
|
@@ -85,7 +85,8 @@ class SerializerTest < ActiveSupport::TestCase
|
|
85
85
|
|
86
86
|
# this is exactly what PaperTrail serializes
|
87
87
|
@original_fluxor_attributes = @fluxor.
|
88
|
-
|
88
|
+
paper_trail.
|
89
|
+
attributes_before_change.
|
89
90
|
reject { |_k, v| v.nil? }
|
90
91
|
|
91
92
|
@fluxor.update_attributes name: "Some more text."
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paper_trail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Stewart
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-06-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -344,7 +344,9 @@ files:
|
|
344
344
|
- lib/paper_trail/frameworks/rspec/helpers.rb
|
345
345
|
- lib/paper_trail/frameworks/sinatra.rb
|
346
346
|
- lib/paper_trail/has_paper_trail.rb
|
347
|
+
- lib/paper_trail/model_config.rb
|
347
348
|
- lib/paper_trail/record_history.rb
|
349
|
+
- lib/paper_trail/record_trail.rb
|
348
350
|
- lib/paper_trail/reifier.rb
|
349
351
|
- lib/paper_trail/serializers/json.rb
|
350
352
|
- lib/paper_trail/serializers/yaml.rb
|