paper_trail 7.0.3 → 7.1.0

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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +21 -27
  3. data/.gitignore +4 -4
  4. data/.rubocop.yml +2 -2
  5. data/CHANGELOG.md +17 -0
  6. data/README.md +31 -2
  7. data/Rakefile +4 -1
  8. data/lib/paper_trail.rb +2 -0
  9. data/lib/paper_trail/serializers/json.rb +9 -0
  10. data/lib/paper_trail/version_concern.rb +1 -1
  11. data/lib/paper_trail/version_number.rb +2 -2
  12. data/paper_trail.gemspec +2 -3
  13. data/spec/controllers/widgets_controller_spec.rb +85 -0
  14. data/{test/dummy → spec/dummy_app}/Rakefile +0 -0
  15. data/{test/dummy → spec/dummy_app}/app/controllers/application_controller.rb +0 -0
  16. data/{test/dummy → spec/dummy_app}/app/controllers/articles_controller.rb +0 -0
  17. data/{test/dummy → spec/dummy_app}/app/controllers/test_controller.rb +0 -0
  18. data/{test/dummy → spec/dummy_app}/app/controllers/widgets_controller.rb +0 -0
  19. data/{test/dummy → spec/dummy_app}/app/models/animal.rb +0 -0
  20. data/{test/dummy → spec/dummy_app}/app/models/article.rb +1 -0
  21. data/{test/dummy → spec/dummy_app}/app/models/authorship.rb +0 -0
  22. data/{test/dummy → spec/dummy_app}/app/models/bar_habtm.rb +0 -0
  23. data/{test/dummy → spec/dummy_app}/app/models/book.rb +0 -0
  24. data/{test/dummy → spec/dummy_app}/app/models/boolit.rb +0 -0
  25. data/{test/dummy → spec/dummy_app}/app/models/callback_modifier.rb +0 -0
  26. data/{test/dummy → spec/dummy_app}/app/models/car.rb +0 -0
  27. data/{test/dummy → spec/dummy_app}/app/models/cat.rb +0 -0
  28. data/{test/dummy → spec/dummy_app}/app/models/chapter.rb +0 -0
  29. data/{test/dummy → spec/dummy_app}/app/models/citation.rb +0 -0
  30. data/{test/dummy → spec/dummy_app}/app/models/custom_primary_key_record.rb +0 -0
  31. data/{test/dummy → spec/dummy_app}/app/models/customer.rb +0 -0
  32. data/spec/dummy_app/app/models/document.rb +8 -0
  33. data/{test/dummy → spec/dummy_app}/app/models/dog.rb +0 -0
  34. data/{test/dummy → spec/dummy_app}/app/models/editor.rb +0 -0
  35. data/{test/dummy → spec/dummy_app}/app/models/editorship.rb +0 -0
  36. data/{test/dummy → spec/dummy_app}/app/models/elephant.rb +0 -0
  37. data/{test/dummy → spec/dummy_app}/app/models/fluxor.rb +0 -0
  38. data/{test/dummy → spec/dummy_app}/app/models/foo_habtm.rb +0 -0
  39. data/{test/dummy → spec/dummy_app}/app/models/foo_widget.rb +0 -0
  40. data/{test/dummy → spec/dummy_app}/app/models/fruit.rb +0 -0
  41. data/{test/dummy → spec/dummy_app}/app/models/gadget.rb +0 -0
  42. data/{test/dummy → spec/dummy_app}/app/models/kitchen/banana.rb +0 -0
  43. data/spec/dummy_app/app/models/legacy_widget.rb +6 -0
  44. data/{test/dummy → spec/dummy_app}/app/models/line_item.rb +0 -0
  45. data/{test/dummy → spec/dummy_app}/app/models/not_on_update.rb +0 -0
  46. data/{test/dummy → spec/dummy_app}/app/models/on/create.rb +0 -0
  47. data/{test/dummy → spec/dummy_app}/app/models/on/destroy.rb +0 -0
  48. data/{test/dummy → spec/dummy_app}/app/models/on/empty_array.rb +0 -0
  49. data/{test/dummy → spec/dummy_app}/app/models/on/update.rb +0 -0
  50. data/{test/dummy → spec/dummy_app}/app/models/order.rb +0 -0
  51. data/{test/dummy → spec/dummy_app}/app/models/paragraph.rb +0 -0
  52. data/{test/dummy → spec/dummy_app}/app/models/person.rb +0 -0
  53. data/{test/dummy → spec/dummy_app}/app/models/post.rb +0 -0
  54. data/{test/dummy → spec/dummy_app}/app/models/post_with_status.rb +0 -0
  55. data/{test/dummy → spec/dummy_app}/app/models/quotation.rb +0 -0
  56. data/{test/dummy → spec/dummy_app}/app/models/section.rb +0 -0
  57. data/{test/dummy → spec/dummy_app}/app/models/skipper.rb +0 -0
  58. data/{test/dummy → spec/dummy_app}/app/models/song.rb +0 -0
  59. data/{test/dummy → spec/dummy_app}/app/models/thing.rb +0 -0
  60. data/spec/dummy_app/app/models/translation.rb +11 -0
  61. data/{test/dummy → spec/dummy_app}/app/models/truck.rb +0 -0
  62. data/{test/dummy → spec/dummy_app}/app/models/vehicle.rb +0 -0
  63. data/{test/dummy → spec/dummy_app}/app/models/whatchamajigger.rb +0 -0
  64. data/{test/dummy → spec/dummy_app}/app/models/widget.rb +0 -0
  65. data/{test/dummy → spec/dummy_app}/app/models/wotsit.rb +0 -0
  66. data/{test/dummy → spec/dummy_app}/app/versions/custom_primary_key_record_version.rb +0 -0
  67. data/{test/dummy → spec/dummy_app}/app/versions/joined_version.rb +0 -0
  68. data/{test/dummy → spec/dummy_app}/app/versions/json_version.rb +0 -0
  69. data/{test/dummy → spec/dummy_app}/app/versions/kitchen/banana_version.rb +0 -0
  70. data/{test/dummy → spec/dummy_app}/app/versions/post_version.rb +0 -0
  71. data/{test/dummy → spec/dummy_app}/config.ru +0 -0
  72. data/{test/dummy → spec/dummy_app}/config/application.rb +0 -0
  73. data/{test/dummy → spec/dummy_app}/config/boot.rb +0 -0
  74. data/{test/dummy → spec/dummy_app}/config/database.mysql.yml +0 -0
  75. data/{test/dummy → spec/dummy_app}/config/database.postgres.yml +0 -0
  76. data/{test/dummy → spec/dummy_app}/config/database.sqlite.yml +0 -0
  77. data/{test/dummy → spec/dummy_app}/config/environment.rb +0 -0
  78. data/{test/dummy → spec/dummy_app}/config/environments/development.rb +0 -0
  79. data/{test/dummy → spec/dummy_app}/config/environments/production.rb +0 -0
  80. data/{test/dummy → spec/dummy_app}/config/environments/test.rb +0 -0
  81. data/{test/dummy → spec/dummy_app}/config/initializers/backtrace_silencers.rb +0 -0
  82. data/{test/dummy → spec/dummy_app}/config/initializers/inflections.rb +0 -0
  83. data/{test/dummy → spec/dummy_app}/config/initializers/mime_types.rb +0 -0
  84. data/{test/dummy → spec/dummy_app}/config/initializers/paper_trail.rb +0 -0
  85. data/{test/dummy → spec/dummy_app}/config/initializers/secret_token.rb +0 -0
  86. data/{test/dummy → spec/dummy_app}/config/initializers/session_store.rb +0 -0
  87. data/{test/dummy → spec/dummy_app}/config/locales/en.yml +0 -0
  88. data/{test/dummy → spec/dummy_app}/config/routes.rb +0 -0
  89. data/{test/dummy → spec/dummy_app}/db/migrate/20110208155312_set_up_test_tables.rb +0 -0
  90. data/{test/dummy → spec/dummy_app}/db/schema.rb +0 -0
  91. data/spec/models/article_spec.rb +186 -0
  92. data/spec/models/document_spec.rb +41 -5
  93. data/spec/models/legacy_widget_spec.rb +40 -0
  94. data/spec/models/on/create_spec.rb +27 -0
  95. data/spec/models/on/destroy_spec.rb +27 -0
  96. data/spec/models/on/empty_array_spec.rb +30 -0
  97. data/spec/models/on/update_spec.rb +27 -0
  98. data/spec/models/translation_spec.rb +70 -0
  99. data/spec/models/version_spec.rb +7 -3
  100. data/spec/paper_trail/config_spec.rb +12 -0
  101. data/spec/paper_trail/model_spec.rb +0 -429
  102. data/spec/paper_trail/serializers/custom_json_serializer_spec.rb +18 -0
  103. data/spec/paper_trail/thread_safety_spec.rb +44 -0
  104. data/spec/paper_trail_spec.rb +9 -0
  105. data/spec/spec_helper.rb +6 -10
  106. metadata +178 -179
  107. data/test/dummy/app/models/document.rb +0 -6
  108. data/test/dummy/app/models/legacy_widget.rb +0 -3
  109. data/test/dummy/app/models/translation.rb +0 -6
  110. data/test/functional/controller_test.rb +0 -90
  111. data/test/functional/thread_safety_test.rb +0 -46
  112. data/test/test_helper.rb +0 -68
  113. data/test/unit/serializers/mixin_json_test.rb +0 -39
@@ -1,6 +0,0 @@
1
- class Document < ActiveRecord::Base
2
- has_paper_trail(
3
- versions: :paper_trail_versions,
4
- on: %i[create update]
5
- )
6
- end
@@ -1,3 +0,0 @@
1
- class LegacyWidget < ActiveRecord::Base
2
- has_paper_trail ignore: :version, version: "custom_version"
3
- end
@@ -1,6 +0,0 @@
1
- class Translation < ActiveRecord::Base
2
- has_paper_trail(
3
- if: proc { |t| t.language_code == "US" },
4
- unless: proc { |t| t.type == "DRAFT" }
5
- )
6
- end
@@ -1,90 +0,0 @@
1
- require "test_helper"
2
-
3
- class ControllerTest < ActionController::TestCase
4
- tests WidgetsController
5
-
6
- setup do
7
- @request.env["REMOTE_ADDR"] = "127.0.0.1"
8
- end
9
-
10
- # Mimick what RequestStore will do outside of the test env, since it is
11
- # middleware, and doesn't get executed in controller / request specs
12
- teardown do
13
- RequestStore.store[:paper_trail] = nil
14
- end
15
-
16
- test "disable on create" do
17
- @request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
18
- post :create, params_wrapper(widget: { name: "Flugel" })
19
- assert_equal 0, assigns(:widget).versions.length
20
- end
21
-
22
- test "disable on update" do
23
- @request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
24
- post :create, params_wrapper(widget: { name: "Flugel" })
25
- w = assigns(:widget)
26
- assert_equal 0, w.versions.length
27
- put :update, params_wrapper(id: w.id, widget: { name: "Bugle" })
28
- widget = assigns(:widget)
29
- assert_equal 0, widget.versions.length
30
- end
31
-
32
- test "disable on destroy" do
33
- @request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
34
- post :create, params_wrapper(widget: { name: "Flugel" })
35
- w = assigns(:widget)
36
- assert_equal 0, w.versions.length
37
- delete :destroy, params_wrapper(id: w.id)
38
- assert_equal 0, PaperTrail::Version.with_item_keys("Widget", w.id).size
39
- end
40
-
41
- test "create" do
42
- post :create, params_wrapper(widget: { name: "Flugel" })
43
- widget = assigns(:widget)
44
- assert_equal 1, widget.versions.length
45
- assert_equal 153, widget.versions.last.whodunnit.to_i
46
- assert_equal "127.0.0.1", widget.versions.last.ip
47
- assert_equal "Rails Testing", widget.versions.last.user_agent
48
- end
49
-
50
- test "update" do
51
- w = Widget.create name: "Duvel"
52
- assert_equal 1, w.versions.length
53
- put :update, params_wrapper(id: w.id, widget: { name: "Bugle" })
54
- widget = assigns(:widget)
55
- assert_equal 2, widget.versions.length
56
- assert_equal 153, widget.versions.last.whodunnit.to_i
57
- assert_equal "127.0.0.1", widget.versions.last.ip
58
- assert_equal "Rails Testing", widget.versions.last.user_agent
59
- end
60
-
61
- test "destroy" do
62
- w = Widget.create name: "Roundel"
63
- assert_equal 1, w.versions.length
64
- delete :destroy, params_wrapper(id: w.id)
65
- widget = assigns(:widget)
66
- assert_equal 2, widget.versions.length
67
- assert_equal "127.0.0.1", widget.versions.last.ip
68
- assert_equal "Rails Testing", widget.versions.last.user_agent
69
- assert_equal 153, widget.versions.last.whodunnit.to_i
70
- end
71
-
72
- test "controller metadata methods should get evaluated if PT enabled for controller" do
73
- @request.env["HTTP_USER_AGENT"] = "User-Agent"
74
- post :create, params_wrapper(widget: { name: "Flugel" })
75
- assert PaperTrail.enabled_for_controller?
76
- assert_equal 153, PaperTrail.whodunnit
77
- assert PaperTrail.controller_info.present?
78
- assert PaperTrail.controller_info.keys.include?(:ip)
79
- assert PaperTrail.controller_info.keys.include?(:user_agent)
80
- end
81
-
82
- test "controller metadata methods should not get evaluated if PT disabled for controller" do
83
- @request.env["HTTP_USER_AGENT"] = "Disable User-Agent"
84
- post :create, params_wrapper(widget: { name: "Flugel" })
85
- assert_equal 0, assigns(:widget).versions.length
86
- assert !PaperTrail.enabled_for_controller?
87
- assert PaperTrail.whodunnit.nil?
88
- assert PaperTrail.controller_info.nil?
89
- end
90
- end
@@ -1,46 +0,0 @@
1
- require "test_helper"
2
-
3
- class ThreadSafetyTest < ActionController::TestCase
4
- test "thread-safe when using #set_paper_trail_whodunnit" do
5
- blocked = true
6
-
7
- slow_thread = Thread.new do
8
- controller = TestController.new
9
- controller.send :set_paper_trail_whodunnit
10
- sleep 0.001 while blocked
11
- PaperTrail.whodunnit
12
- end
13
-
14
- fast_thread = Thread.new do
15
- controller = TestController.new
16
- controller.send :set_paper_trail_whodunnit
17
- who = PaperTrail.whodunnit
18
- blocked = false
19
- who
20
- end
21
-
22
- assert_not_equal slow_thread.value, fast_thread.value
23
- end
24
-
25
- test "thread-safe when using #without_versioning" do
26
- enabled = nil
27
-
28
- slow_thread = Thread.new do
29
- Widget.new.paper_trail.without_versioning do
30
- sleep(0.01)
31
- enabled = Widget.paper_trail.enabled?
32
- sleep(0.01)
33
- end
34
- enabled
35
- end
36
-
37
- fast_thread = Thread.new do
38
- sleep(0.005)
39
- Widget.paper_trail.enabled?
40
- end
41
-
42
- assert_not_equal slow_thread.value, fast_thread.value
43
- assert Widget.paper_trail.enabled?
44
- assert PaperTrail.enabled_for_model?(Widget)
45
- end
46
- end
data/test/test_helper.rb DELETED
@@ -1,68 +0,0 @@
1
- require "pry"
2
-
3
- ENV["RAILS_ENV"] = "test"
4
- ENV["DB"] ||= "sqlite"
5
-
6
- unless File.exist?(File.expand_path("../../test/dummy/config/database.yml", __FILE__))
7
- warn "WARNING: No database.yml detected for the dummy app, please run `rake prepare` first"
8
- end
9
-
10
- def using_mysql?
11
- @using_mysql ||= ActiveRecord::Base.connection_config[:adapter].to_sym == :mysql2
12
- end
13
-
14
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
15
- require "rails/test_help"
16
- require "shoulda"
17
- require "ffaker"
18
- require "database_cleaner"
19
-
20
- def active_record_gem_version
21
- Gem::Version.new(ActiveRecord::VERSION::STRING)
22
- end
23
-
24
- if active_record_gem_version >= Gem::Version.new("5.0.0.beta1")
25
- # See https://github.com/rails/rails-controller-testing/issues/5
26
- ActionController::TestCase.send(:include, Rails::Controller::Testing::TestProcess)
27
- end
28
-
29
- Rails.backtrace_cleaner.remove_silencers!
30
-
31
- # Run any available migration
32
- ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
33
-
34
- # Load support files
35
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
36
-
37
- # DatabaseCleaner is apparently necessary for doing proper transactions within MySQL (ugh)
38
- DatabaseCleaner.strategy = :truncation
39
-
40
- # global setup block resetting Thread.current
41
- module ActiveSupport
42
- class TestCase
43
- if using_mysql?
44
- if respond_to? :use_transactional_tests=
45
- self.use_transactional_tests = false
46
- else
47
- self.use_transactional_fixtures = false
48
- end
49
- setup { DatabaseCleaner.start }
50
- end
51
-
52
- teardown do
53
- DatabaseCleaner.clean if using_mysql?
54
- Thread.current[:paper_trail] = nil
55
- end
56
- end
57
- end
58
-
59
- # Wrap args in a hash to support the ActionController::TestCase and
60
- # ActionDispatch::Integration HTTP request method switch to keyword args
61
- # (see https://github.com/rails/rails/blob/master/actionpack/CHANGELOG.md)
62
- def params_wrapper(args)
63
- if defined?(::Rails) && active_record_gem_version >= Gem::Version.new("5.0.0.beta1")
64
- { params: args }
65
- else
66
- args
67
- end
68
- end
@@ -1,39 +0,0 @@
1
- require "test_helper"
2
- require_relative "../../../spec/support/custom_json_serializer"
3
-
4
- class MixinJsonTest < ActiveSupport::TestCase
5
- setup do
6
- # Setup a hash with random values, ensuring some values are nil
7
- @hash = {}
8
- (1..4).each do |i|
9
- @hash["key#{i}"] = [FFaker::Lorem.word, nil].sample
10
- end
11
- @hash["tkey"] = nil
12
- @hash[""] = "foo"
13
- @hash_as_json = @hash.to_json
14
- end
15
-
16
- context "`load` class method" do
17
- should "exist" do
18
- assert CustomJsonSerializer.respond_to?(:load)
19
- end
20
-
21
- should "`deserialize` JSON to Ruby, removing pairs with `blank` keys or values" do
22
- assert_equal(
23
- @hash.reject { |k, v| k.blank? || v.blank? },
24
- CustomJsonSerializer.load(@hash_as_json)
25
- )
26
- end
27
- end
28
-
29
- context "`dump` class method" do
30
- should "exist" do
31
- assert CustomJsonSerializer.respond_to?(:dump)
32
- end
33
-
34
- should "`serialize` Ruby to JSON, removing pairs with `nil` values" do
35
- assert_equal @hash.reject { |_k, v| v.nil? }.to_json,
36
- CustomJsonSerializer.dump(@hash)
37
- end
38
- end
39
- end