paper_trail 4.0.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +105 -0
  3. data/.github/ISSUE_TEMPLATE.md +13 -0
  4. data/.gitignore +2 -0
  5. data/.rubocop.yml +100 -0
  6. data/.rubocop_todo.yml +14 -0
  7. data/.travis.yml +11 -10
  8. data/Appraisals +37 -0
  9. data/CHANGELOG.md +173 -8
  10. data/Gemfile +1 -1
  11. data/README.md +641 -470
  12. data/Rakefile +19 -19
  13. data/doc/bug_report_template.rb +71 -0
  14. data/doc/warning_about_not_setting_whodunnit.md +32 -0
  15. data/gemfiles/ar3.gemfile +18 -0
  16. data/gemfiles/ar4.gemfile +7 -0
  17. data/gemfiles/ar5.gemfile +13 -0
  18. data/lib/generators/paper_trail/install_generator.rb +26 -18
  19. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +3 -1
  20. data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
  21. data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
  22. data/lib/generators/paper_trail/templates/create_versions.rb +53 -5
  23. data/lib/paper_trail/attribute_serializers/README.md +10 -0
  24. data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +58 -0
  25. data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
  26. data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
  27. data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
  28. data/lib/paper_trail/cleaner.rb +41 -18
  29. data/lib/paper_trail/config.rb +42 -26
  30. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
  31. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
  32. data/lib/paper_trail/frameworks/active_record.rb +2 -2
  33. data/lib/paper_trail/frameworks/cucumber.rb +1 -0
  34. data/lib/paper_trail/frameworks/rails/controller.rb +50 -14
  35. data/lib/paper_trail/frameworks/rails/engine.rb +6 -1
  36. data/lib/paper_trail/frameworks/rails.rb +2 -7
  37. data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
  38. data/lib/paper_trail/frameworks/rspec.rb +5 -5
  39. data/lib/paper_trail/frameworks/sinatra.rb +8 -5
  40. data/lib/paper_trail/has_paper_trail.rb +381 -221
  41. data/lib/paper_trail/record_history.rb +57 -0
  42. data/lib/paper_trail/reifier.rb +450 -0
  43. data/lib/paper_trail/serializers/json.rb +7 -7
  44. data/lib/paper_trail/serializers/yaml.rb +31 -12
  45. data/lib/paper_trail/version_association_concern.rb +6 -2
  46. data/lib/paper_trail/version_concern.rb +200 -287
  47. data/lib/paper_trail/version_number.rb +6 -9
  48. data/lib/paper_trail.rb +169 -137
  49. data/paper_trail.gemspec +41 -43
  50. data/spec/generators/install_generator_spec.rb +24 -25
  51. data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
  52. data/spec/models/animal_spec.rb +23 -6
  53. data/spec/models/boolit_spec.rb +8 -8
  54. data/spec/models/callback_modifier_spec.rb +96 -0
  55. data/spec/models/car_spec.rb +13 -0
  56. data/spec/models/fluxor_spec.rb +3 -3
  57. data/spec/models/gadget_spec.rb +19 -19
  58. data/spec/models/joined_version_spec.rb +3 -3
  59. data/spec/models/json_version_spec.rb +50 -28
  60. data/spec/models/kitchen/banana_spec.rb +3 -3
  61. data/spec/models/not_on_update_spec.rb +7 -4
  62. data/spec/models/post_with_status_spec.rb +13 -3
  63. data/spec/models/skipper_spec.rb +40 -11
  64. data/spec/models/thing_spec.rb +4 -4
  65. data/spec/models/truck_spec.rb +5 -0
  66. data/spec/models/vehicle_spec.rb +5 -0
  67. data/spec/models/version_spec.rb +103 -59
  68. data/spec/models/widget_spec.rb +86 -55
  69. data/spec/modules/paper_trail_spec.rb +2 -2
  70. data/spec/modules/version_concern_spec.rb +11 -12
  71. data/spec/modules/version_number_spec.rb +3 -4
  72. data/spec/paper_trail/config_spec.rb +33 -0
  73. data/spec/paper_trail_spec.rb +16 -14
  74. data/spec/rails_helper.rb +10 -9
  75. data/spec/requests/articles_spec.rb +11 -7
  76. data/spec/spec_helper.rb +42 -17
  77. data/spec/support/alt_db_init.rb +8 -13
  78. data/test/custom_json_serializer.rb +3 -3
  79. data/test/dummy/Rakefile +2 -2
  80. data/test/dummy/app/controllers/application_controller.rb +21 -8
  81. data/test/dummy/app/controllers/articles_controller.rb +11 -8
  82. data/test/dummy/app/controllers/widgets_controller.rb +13 -12
  83. data/test/dummy/app/models/animal.rb +1 -1
  84. data/test/dummy/app/models/article.rb +19 -11
  85. data/test/dummy/app/models/authorship.rb +1 -1
  86. data/test/dummy/app/models/bar_habtm.rb +4 -0
  87. data/test/dummy/app/models/book.rb +4 -4
  88. data/test/dummy/app/models/boolit.rb +1 -1
  89. data/test/dummy/app/models/callback_modifier.rb +45 -0
  90. data/test/dummy/app/models/car.rb +3 -0
  91. data/test/dummy/app/models/chapter.rb +9 -0
  92. data/test/dummy/app/models/citation.rb +5 -0
  93. data/test/dummy/app/models/customer.rb +1 -1
  94. data/test/dummy/app/models/document.rb +2 -2
  95. data/test/dummy/app/models/editor.rb +1 -1
  96. data/test/dummy/app/models/foo_habtm.rb +5 -0
  97. data/test/dummy/app/models/fruit.rb +2 -2
  98. data/test/dummy/app/models/gadget.rb +1 -1
  99. data/test/dummy/app/models/kitchen/banana.rb +1 -1
  100. data/test/dummy/app/models/legacy_widget.rb +2 -2
  101. data/test/dummy/app/models/line_item.rb +1 -1
  102. data/test/dummy/app/models/not_on_update.rb +1 -1
  103. data/test/dummy/app/models/paragraph.rb +5 -0
  104. data/test/dummy/app/models/person.rb +6 -6
  105. data/test/dummy/app/models/post.rb +1 -1
  106. data/test/dummy/app/models/post_with_status.rb +1 -1
  107. data/test/dummy/app/models/quotation.rb +5 -0
  108. data/test/dummy/app/models/section.rb +6 -0
  109. data/test/dummy/app/models/skipper.rb +2 -2
  110. data/test/dummy/app/models/song.rb +13 -4
  111. data/test/dummy/app/models/thing.rb +2 -2
  112. data/test/dummy/app/models/translation.rb +2 -2
  113. data/test/dummy/app/models/truck.rb +4 -0
  114. data/test/dummy/app/models/vehicle.rb +4 -0
  115. data/test/dummy/app/models/whatchamajigger.rb +1 -1
  116. data/test/dummy/app/models/widget.rb +7 -6
  117. data/test/dummy/app/versions/joined_version.rb +4 -3
  118. data/test/dummy/app/versions/json_version.rb +1 -1
  119. data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
  120. data/test/dummy/app/versions/post_version.rb +2 -2
  121. data/test/dummy/config/application.rb +20 -9
  122. data/test/dummy/config/boot.rb +5 -5
  123. data/test/dummy/config/database.postgres.yml +1 -1
  124. data/test/dummy/config/environment.rb +1 -1
  125. data/test/dummy/config/environments/development.rb +4 -3
  126. data/test/dummy/config/environments/production.rb +3 -2
  127. data/test/dummy/config/environments/test.rb +15 -5
  128. data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
  129. data/test/dummy/config/initializers/paper_trail.rb +4 -3
  130. data/test/dummy/config/initializers/secret_token.rb +3 -1
  131. data/test/dummy/config/initializers/session_store.rb +1 -1
  132. data/test/dummy/config/routes.rb +2 -2
  133. data/test/dummy/config.ru +1 -1
  134. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +148 -68
  135. data/test/dummy/db/schema.rb +119 -31
  136. data/test/dummy/script/rails +6 -4
  137. data/test/functional/controller_test.rb +34 -35
  138. data/test/functional/enabled_for_controller_test.rb +6 -7
  139. data/test/functional/modular_sinatra_test.rb +43 -38
  140. data/test/functional/sinatra_test.rb +49 -40
  141. data/test/functional/thread_safety_test.rb +4 -6
  142. data/test/paper_trail_test.rb +15 -14
  143. data/test/test_helper.rb +78 -18
  144. data/test/time_travel_helper.rb +1 -15
  145. data/test/unit/associations_test.rb +1016 -0
  146. data/test/unit/cleaner_test.rb +66 -60
  147. data/test/unit/inheritance_column_test.rb +19 -19
  148. data/test/unit/model_test.rb +646 -1071
  149. data/test/unit/protected_attrs_test.rb +19 -14
  150. data/test/unit/serializer_test.rb +44 -43
  151. data/test/unit/serializers/json_test.rb +28 -21
  152. data/test/unit/serializers/mixin_json_test.rb +15 -14
  153. data/test/unit/serializers/mixin_yaml_test.rb +20 -16
  154. data/test/unit/serializers/yaml_test.rb +16 -14
  155. data/test/unit/timestamp_test.rb +10 -12
  156. data/test/unit/version_test.rb +88 -70
  157. metadata +166 -72
  158. data/gemfiles/3.0.gemfile +0 -52
@@ -1,100 +1,118 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
- class PaperTrail::VersionTest < ActiveSupport::TestCase
4
- setup do
5
- change_schema
6
- @animal = Animal.create
7
- assert PaperTrail::Version.creates.present?
8
- end
3
+ module PaperTrail
4
+ class VersionTest < ActiveSupport::TestCase
5
+ setup do
6
+ change_schema
7
+ @animal = Animal.create
8
+ assert Version.creates.present?
9
+ end
9
10
 
10
- teardown do
11
- restore_schema
12
- Animal.connection.schema_cache.clear!
13
- Animal.reset_column_information
14
- end
11
+ teardown do
12
+ restore_schema
13
+ Animal.connection.schema_cache.clear!
14
+ Animal.reset_column_information
15
+ end
15
16
 
16
- context "PaperTrail::Version.creates" do
17
- should "return only create events" do
18
- PaperTrail::Version.creates.each do |version|
19
- assert_equal "create", version.event
17
+ context ".creates" do
18
+ should "return only create events" do
19
+ Version.creates.each do |version|
20
+ assert_equal "create", version.event
21
+ end
20
22
  end
21
23
  end
22
- end
23
24
 
24
- context "PaperTrail::Version.updates" do
25
- setup {
26
- @animal.update_attributes(:name => 'Animal')
27
- assert PaperTrail::Version.updates.present?
28
- }
25
+ context ".updates" do
26
+ setup {
27
+ @animal.update_attributes(name: "Animal")
28
+ assert Version.updates.present?
29
+ }
29
30
 
30
- should "return only update events" do
31
- PaperTrail::Version.updates.each do |version|
32
- assert_equal "update", version.event
31
+ should "return only update events" do
32
+ Version.updates.each do |version|
33
+ assert_equal "update", version.event
34
+ end
33
35
  end
34
36
  end
35
- end
36
37
 
37
- context "PaperTrail::Version.destroys" do
38
- setup {
39
- @animal.destroy
40
- assert PaperTrail::Version.destroys.present?
41
- }
38
+ context ".destroys" do
39
+ setup {
40
+ @animal.destroy
41
+ assert Version.destroys.present?
42
+ }
42
43
 
43
- should "return only destroy events" do
44
- PaperTrail::Version.destroys.each do |version|
45
- assert_equal "destroy", version.event
44
+ should "return only destroy events" do
45
+ Version.destroys.each do |version|
46
+ assert_equal "destroy", version.event
47
+ end
46
48
  end
47
49
  end
48
- end
49
50
 
50
- context "PaperTrail::Version.not_creates" do
51
- setup {
52
- @animal.update_attributes(:name => 'Animal')
53
- @animal.destroy
54
- assert PaperTrail::Version.not_creates.present?
55
- }
51
+ context ".not_creates" do
52
+ setup {
53
+ @animal.update_attributes(name: "Animal")
54
+ @animal.destroy
55
+ assert Version.not_creates.present?
56
+ }
56
57
 
57
- should "return all versions except create events" do
58
- PaperTrail::Version.not_creates.each do |version|
59
- assert_not_equal "create", version.event
58
+ should "return all versions except create events" do
59
+ Version.not_creates.each do |version|
60
+ assert_not_equal "create", version.event
61
+ end
60
62
  end
61
63
  end
62
- end
63
64
 
64
- context "PaperTrail::Version.subsequent" do
65
- setup { 2.times { @animal.update_attributes(:name => Faker::Lorem.word) } }
65
+ context ".subsequent" do
66
+ setup do
67
+ 2.times do
68
+ @animal.update_attributes(name: FFaker::Lorem.word)
69
+ end
70
+ end
66
71
 
67
- context "receiving a TimeStamp" do
68
- should "return all versions that were created before the Timestamp" do
69
- value = PaperTrail::Version.subsequent(1.hour.ago, true)
70
- assert_equal value, @animal.versions.to_a
71
- assert_not_nil value.to_sql.match(/ORDER BY #{PaperTrail::Version.arel_table[:created_at].asc.to_sql}/)
72
+ context "given a timestamp" do
73
+ should "return all versions that were created after the timestamp" do
74
+ value = Version.subsequent(1.hour.ago, true)
75
+ assert_equal @animal.versions.to_a, value
76
+ assert_match(
77
+ /ORDER BY #{Version.arel_table[:created_at].asc.to_sql}/,
78
+ value.to_sql
79
+ )
80
+ end
72
81
  end
73
- end
74
82
 
75
- context "receiving a `PaperTrail::Version`" do
76
- should "grab the Timestamp from the version and use that as the value" do
77
- value = PaperTrail::Version.subsequent(@animal.versions.first)
78
- assert_equal value, @animal.versions.to_a.tap { |assoc| assoc.shift }
83
+ context "given a Version" do
84
+ should "grab the timestamp from the version and use that as the value" do
85
+ expected = @animal.versions.to_a.tap(&:shift)
86
+ actual = Version.subsequent(@animal.versions.first)
87
+ assert_equal expected, actual
88
+ end
79
89
  end
80
90
  end
81
- end
82
91
 
83
- context "PaperTrail::Version.preceding" do
84
- setup { 2.times { @animal.update_attributes(:name => Faker::Lorem.word) } }
92
+ context ".preceding" do
93
+ setup do
94
+ 2.times do
95
+ @animal.update_attributes(name: FFaker::Lorem.word)
96
+ end
97
+ end
85
98
 
86
- context "receiving a TimeStamp" do
87
- should "return all versions that were created before the Timestamp" do
88
- value = PaperTrail::Version.preceding(5.seconds.from_now, true)
89
- assert_equal value, @animal.versions.reverse
90
- assert_not_nil value.to_sql.match(/ORDER BY #{PaperTrail::Version.arel_table[:created_at].desc.to_sql}/)
99
+ context "given a timestamp" do
100
+ should "return all versions that were created before the timestamp" do
101
+ value = Version.preceding(5.seconds.from_now, true)
102
+ assert_equal @animal.versions.reverse, value
103
+ assert_match(
104
+ /ORDER BY #{Version.arel_table[:created_at].desc.to_sql}/,
105
+ value.to_sql
106
+ )
107
+ end
91
108
  end
92
- end
93
109
 
94
- context "receiving a `PaperTrail::Version`" do
95
- should "grab the Timestamp from the version and use that as the value" do
96
- value = PaperTrail::Version.preceding(@animal.versions.last)
97
- assert_equal value, @animal.versions.to_a.tap { |assoc| assoc.pop }.reverse
110
+ context "given a Version" do
111
+ should "grab the timestamp from the version and use that as the value" do
112
+ expected = @animal.versions.to_a.tap(&:pop).reverse
113
+ actual = Version.preceding(@animal.versions.last)
114
+ assert_equal expected, actual
115
+ end
98
116
  end
99
117
  end
100
118
  end