paper_trail 5.2.3 → 11.0.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 (198) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/paper_trail/install/USAGE +3 -0
  3. data/lib/generators/paper_trail/install/install_generator.rb +75 -0
  4. data/lib/generators/paper_trail/{templates/add_object_changes_to_versions.rb → install/templates/add_object_changes_to_versions.rb.erb} +1 -1
  5. data/lib/generators/paper_trail/install/templates/create_versions.rb.erb +36 -0
  6. data/lib/generators/paper_trail/migration_generator.rb +38 -0
  7. data/lib/generators/paper_trail/update_item_subtype/USAGE +4 -0
  8. data/lib/generators/paper_trail/update_item_subtype/templates/update_versions_for_item_subtype.rb.erb +85 -0
  9. data/lib/generators/paper_trail/update_item_subtype/update_item_subtype_generator.rb +17 -0
  10. data/lib/paper_trail.rb +82 -130
  11. data/lib/paper_trail/attribute_serializers/attribute_serializer_factory.rb +27 -0
  12. data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +15 -44
  13. data/lib/paper_trail/attribute_serializers/object_attribute.rb +2 -0
  14. data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +2 -0
  15. data/lib/paper_trail/cleaner.rb +3 -1
  16. data/lib/paper_trail/compatibility.rb +51 -0
  17. data/lib/paper_trail/config.rb +11 -49
  18. data/lib/paper_trail/events/base.rb +323 -0
  19. data/lib/paper_trail/events/create.rb +32 -0
  20. data/lib/paper_trail/events/destroy.rb +42 -0
  21. data/lib/paper_trail/events/update.rb +60 -0
  22. data/lib/paper_trail/frameworks/active_record.rb +2 -1
  23. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +8 -3
  24. data/lib/paper_trail/frameworks/cucumber.rb +5 -3
  25. data/lib/paper_trail/frameworks/rails.rb +2 -0
  26. data/lib/paper_trail/frameworks/rails/controller.rb +33 -43
  27. data/lib/paper_trail/frameworks/rails/engine.rb +34 -1
  28. data/lib/paper_trail/frameworks/rspec.rb +17 -4
  29. data/lib/paper_trail/frameworks/rspec/helpers.rb +2 -0
  30. data/lib/paper_trail/has_paper_trail.rb +22 -310
  31. data/lib/paper_trail/model_config.rb +157 -109
  32. data/lib/paper_trail/queries/versions/where_object.rb +65 -0
  33. data/lib/paper_trail/queries/versions/where_object_changes.rb +75 -0
  34. data/lib/paper_trail/record_history.rb +3 -9
  35. data/lib/paper_trail/record_trail.rb +169 -319
  36. data/lib/paper_trail/reifier.rb +53 -374
  37. data/lib/paper_trail/request.rb +166 -0
  38. data/lib/paper_trail/serializers/json.rb +9 -10
  39. data/lib/paper_trail/serializers/yaml.rb +15 -28
  40. data/lib/paper_trail/type_serializers/postgres_array_serializer.rb +48 -0
  41. data/lib/paper_trail/version_concern.rb +160 -155
  42. data/lib/paper_trail/version_number.rb +12 -4
  43. metadata +77 -372
  44. data/.github/CONTRIBUTING.md +0 -109
  45. data/.github/ISSUE_TEMPLATE.md +0 -13
  46. data/.gitignore +0 -23
  47. data/.rspec +0 -2
  48. data/.rubocop.yml +0 -99
  49. data/.rubocop_todo.yml +0 -22
  50. data/.travis.yml +0 -41
  51. data/Appraisals +0 -38
  52. data/CHANGELOG.md +0 -560
  53. data/Gemfile +0 -2
  54. data/MIT-LICENSE +0 -20
  55. data/README.md +0 -1654
  56. data/Rakefile +0 -30
  57. data/doc/bug_report_template.rb +0 -69
  58. data/doc/warning_about_not_setting_whodunnit.md +0 -32
  59. data/gemfiles/ar3.gemfile +0 -19
  60. data/gemfiles/ar4.gemfile +0 -8
  61. data/gemfiles/ar5.gemfile +0 -9
  62. data/lib/generators/paper_trail/USAGE +0 -2
  63. data/lib/generators/paper_trail/default_initializer.rb +0 -0
  64. data/lib/generators/paper_trail/install_generator.rb +0 -57
  65. data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +0 -13
  66. data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -22
  67. data/lib/generators/paper_trail/templates/create_versions.rb +0 -80
  68. data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +0 -48
  69. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +0 -11
  70. data/lib/paper_trail/frameworks/sinatra.rb +0 -40
  71. data/lib/paper_trail/version_association_concern.rb +0 -17
  72. data/paper_trail.gemspec +0 -56
  73. data/spec/generators/install_generator_spec.rb +0 -66
  74. data/spec/generators/paper_trail/templates/create_versions_spec.rb +0 -51
  75. data/spec/models/animal_spec.rb +0 -36
  76. data/spec/models/boolit_spec.rb +0 -48
  77. data/spec/models/callback_modifier_spec.rb +0 -96
  78. data/spec/models/car_spec.rb +0 -13
  79. data/spec/models/custom_primary_key_record_spec.rb +0 -18
  80. data/spec/models/fluxor_spec.rb +0 -17
  81. data/spec/models/gadget_spec.rb +0 -68
  82. data/spec/models/joined_version_spec.rb +0 -47
  83. data/spec/models/json_version_spec.rb +0 -102
  84. data/spec/models/kitchen/banana_spec.rb +0 -14
  85. data/spec/models/not_on_update_spec.rb +0 -22
  86. data/spec/models/post_with_status_spec.rb +0 -50
  87. data/spec/models/skipper_spec.rb +0 -46
  88. data/spec/models/thing_spec.rb +0 -11
  89. data/spec/models/truck_spec.rb +0 -5
  90. data/spec/models/vehicle_spec.rb +0 -5
  91. data/spec/models/version_spec.rb +0 -272
  92. data/spec/models/widget_spec.rb +0 -343
  93. data/spec/modules/paper_trail_spec.rb +0 -27
  94. data/spec/modules/version_concern_spec.rb +0 -31
  95. data/spec/modules/version_number_spec.rb +0 -43
  96. data/spec/paper_trail/config_spec.rb +0 -33
  97. data/spec/paper_trail_spec.rb +0 -79
  98. data/spec/rails_helper.rb +0 -34
  99. data/spec/requests/articles_spec.rb +0 -34
  100. data/spec/spec_helper.rb +0 -114
  101. data/spec/support/alt_db_init.rb +0 -54
  102. data/test/custom_json_serializer.rb +0 -13
  103. data/test/dummy/Rakefile +0 -7
  104. data/test/dummy/app/controllers/application_controller.rb +0 -33
  105. data/test/dummy/app/controllers/articles_controller.rb +0 -20
  106. data/test/dummy/app/controllers/test_controller.rb +0 -5
  107. data/test/dummy/app/controllers/widgets_controller.rb +0 -32
  108. data/test/dummy/app/helpers/application_helper.rb +0 -2
  109. data/test/dummy/app/models/animal.rb +0 -6
  110. data/test/dummy/app/models/article.rb +0 -24
  111. data/test/dummy/app/models/authorship.rb +0 -5
  112. data/test/dummy/app/models/bar_habtm.rb +0 -4
  113. data/test/dummy/app/models/book.rb +0 -9
  114. data/test/dummy/app/models/boolit.rb +0 -4
  115. data/test/dummy/app/models/callback_modifier.rb +0 -45
  116. data/test/dummy/app/models/car.rb +0 -3
  117. data/test/dummy/app/models/cat.rb +0 -2
  118. data/test/dummy/app/models/chapter.rb +0 -9
  119. data/test/dummy/app/models/citation.rb +0 -5
  120. data/test/dummy/app/models/custom_primary_key_record.rb +0 -13
  121. data/test/dummy/app/models/customer.rb +0 -4
  122. data/test/dummy/app/models/document.rb +0 -4
  123. data/test/dummy/app/models/dog.rb +0 -2
  124. data/test/dummy/app/models/editor.rb +0 -4
  125. data/test/dummy/app/models/editorship.rb +0 -5
  126. data/test/dummy/app/models/elephant.rb +0 -3
  127. data/test/dummy/app/models/fluxor.rb +0 -3
  128. data/test/dummy/app/models/foo_habtm.rb +0 -5
  129. data/test/dummy/app/models/foo_widget.rb +0 -2
  130. data/test/dummy/app/models/fruit.rb +0 -5
  131. data/test/dummy/app/models/gadget.rb +0 -3
  132. data/test/dummy/app/models/kitchen/banana.rb +0 -5
  133. data/test/dummy/app/models/legacy_widget.rb +0 -4
  134. data/test/dummy/app/models/line_item.rb +0 -4
  135. data/test/dummy/app/models/not_on_update.rb +0 -4
  136. data/test/dummy/app/models/order.rb +0 -5
  137. data/test/dummy/app/models/paragraph.rb +0 -5
  138. data/test/dummy/app/models/person.rb +0 -38
  139. data/test/dummy/app/models/post.rb +0 -3
  140. data/test/dummy/app/models/post_with_status.rb +0 -8
  141. data/test/dummy/app/models/protected_widget.rb +0 -3
  142. data/test/dummy/app/models/quotation.rb +0 -5
  143. data/test/dummy/app/models/section.rb +0 -6
  144. data/test/dummy/app/models/skipper.rb +0 -6
  145. data/test/dummy/app/models/song.rb +0 -41
  146. data/test/dummy/app/models/thing.rb +0 -3
  147. data/test/dummy/app/models/translation.rb +0 -4
  148. data/test/dummy/app/models/truck.rb +0 -4
  149. data/test/dummy/app/models/vehicle.rb +0 -4
  150. data/test/dummy/app/models/whatchamajigger.rb +0 -4
  151. data/test/dummy/app/models/widget.rb +0 -16
  152. data/test/dummy/app/models/wotsit.rb +0 -8
  153. data/test/dummy/app/versions/custom_primary_key_record_version.rb +0 -3
  154. data/test/dummy/app/versions/joined_version.rb +0 -6
  155. data/test/dummy/app/versions/json_version.rb +0 -3
  156. data/test/dummy/app/versions/kitchen/banana_version.rb +0 -5
  157. data/test/dummy/app/versions/post_version.rb +0 -3
  158. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  159. data/test/dummy/config.ru +0 -4
  160. data/test/dummy/config/application.rb +0 -80
  161. data/test/dummy/config/boot.rb +0 -10
  162. data/test/dummy/config/database.mysql.yml +0 -19
  163. data/test/dummy/config/database.postgres.yml +0 -15
  164. data/test/dummy/config/database.sqlite.yml +0 -15
  165. data/test/dummy/config/environment.rb +0 -5
  166. data/test/dummy/config/environments/development.rb +0 -41
  167. data/test/dummy/config/environments/production.rb +0 -74
  168. data/test/dummy/config/environments/test.rb +0 -51
  169. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -9
  170. data/test/dummy/config/initializers/inflections.rb +0 -10
  171. data/test/dummy/config/initializers/mime_types.rb +0 -5
  172. data/test/dummy/config/initializers/paper_trail.rb +0 -9
  173. data/test/dummy/config/initializers/secret_token.rb +0 -9
  174. data/test/dummy/config/initializers/session_store.rb +0 -8
  175. data/test/dummy/config/locales/en.yml +0 -5
  176. data/test/dummy/config/routes.rb +0 -4
  177. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +0 -361
  178. data/test/dummy/db/schema.rb +0 -288
  179. data/test/dummy/script/rails +0 -8
  180. data/test/functional/controller_test.rb +0 -90
  181. data/test/functional/enabled_for_controller_test.rb +0 -28
  182. data/test/functional/modular_sinatra_test.rb +0 -46
  183. data/test/functional/sinatra_test.rb +0 -51
  184. data/test/functional/thread_safety_test.rb +0 -46
  185. data/test/test_helper.rb +0 -127
  186. data/test/time_travel_helper.rb +0 -1
  187. data/test/unit/associations_test.rb +0 -1016
  188. data/test/unit/cleaner_test.rb +0 -188
  189. data/test/unit/inheritance_column_test.rb +0 -43
  190. data/test/unit/model_test.rb +0 -1489
  191. data/test/unit/protected_attrs_test.rb +0 -52
  192. data/test/unit/serializer_test.rb +0 -119
  193. data/test/unit/serializers/json_test.rb +0 -95
  194. data/test/unit/serializers/mixin_json_test.rb +0 -37
  195. data/test/unit/serializers/mixin_yaml_test.rb +0 -53
  196. data/test/unit/serializers/yaml_test.rb +0 -54
  197. data/test/unit/timestamp_test.rb +0 -41
  198. data/test/unit/version_test.rb +0 -119
data/Rakefile DELETED
@@ -1,30 +0,0 @@
1
- require "bundler"
2
- Bundler::GemHelper.install_tasks
3
-
4
- desc "Set a relevant database.yml for testing"
5
- task :prepare do
6
- ENV["DB"] ||= "sqlite"
7
- FileUtils.cp "test/dummy/config/database.#{ENV['DB']}.yml", "test/dummy/config/database.yml"
8
- end
9
-
10
- require "rake/testtask"
11
- desc "Run tests on PaperTrail with Test::Unit."
12
- Rake::TestTask.new(:test) do |t|
13
- t.libs << "lib"
14
- t.libs << "test"
15
- t.pattern = "test/**/*_test.rb"
16
- t.verbose = false
17
- end
18
-
19
- require "rspec/core/rake_task"
20
- desc "Run tests on PaperTrail with RSpec"
21
- task(:spec).clear
22
- RSpec::Core::RakeTask.new(:spec) do |t|
23
- t.verbose = false # hide list of specs bit.ly/1nVq3Jn
24
- end
25
-
26
- require "rubocop/rake_task"
27
- RuboCop::RakeTask.new
28
-
29
- desc "Default: run all available test suites"
30
- task default: [:rubocop, :prepare, :test, :spec]
@@ -1,69 +0,0 @@
1
- # Use this template to report PaperTrail bugs.
2
- # Please include only the minimum code necessary to reproduce your issue.
3
- require "bundler/inline"
4
-
5
- # STEP ONE: What versions are you using?
6
- gemfile(true) do
7
- ruby "2.3.1"
8
- source "https://rubygems.org"
9
- gem "activerecord", "5.0.0"
10
- gem "minitest", "5.9.0"
11
- gem "paper_trail", "5.2.0", require: false
12
- gem "sqlite3"
13
- end
14
-
15
- require "active_record"
16
- require "minitest/autorun"
17
- require "logger"
18
- ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
19
- ActiveRecord::Base.logger = nil
20
- ActiveRecord::Schema.define do
21
- # STEP TWO: Define your tables here.
22
- create_table :users, force: true do |t|
23
- t.text :first_name, null: false
24
- t.timestamps null: false
25
- end
26
-
27
- create_table :versions do |t|
28
- t.string :item_type, null: false
29
- t.integer :item_id, null: false
30
- t.string :event, null: false
31
- t.string :whodunnit
32
- t.text :object, limit: 1_073_741_823
33
- t.text :object_changes, limit: 1_073_741_823
34
- t.integer :transaction_id
35
- t.datetime :created_at
36
- end
37
- add_index :versions, [:item_type, :item_id]
38
- add_index :versions, [:transaction_id]
39
-
40
- create_table :version_associations do |t|
41
- t.integer :version_id
42
- t.string :foreign_key_name, null: false
43
- t.integer :foreign_key_id
44
- end
45
- add_index :version_associations, [:version_id]
46
- add_index :version_associations, [:foreign_key_name, :foreign_key_id],
47
- name: "index_version_associations_on_foreign_key"
48
- end
49
- ActiveRecord::Base.logger = Logger.new(STDOUT)
50
- require "paper_trail/config"
51
-
52
- # STEP THREE: Configure PaperTrail as you would in your initializer
53
- PaperTrail::Config.instance.track_associations = true
54
-
55
- require "paper_trail"
56
-
57
- # STEP FOUR: Define your AR models here.
58
- class User < ActiveRecord::Base
59
- has_paper_trail
60
- end
61
-
62
- # STEP FIVE: Please write a test that demonstrates your issue.
63
- class BugTest < ActiveSupport::TestCase
64
- def test_1
65
- assert_difference(-> { PaperTrail::Version.count }, +1) {
66
- User.create(first_name: "Jane")
67
- }
68
- end
69
- end
@@ -1,32 +0,0 @@
1
- # The warning about not setting whodunnit
2
-
3
- After upgrading to PaperTrail 5, you see this warning:
4
-
5
- > user_for_paper_trail is present, but whodunnit has not been set. PaperTrail no
6
- > longer adds the set_paper_trail_whodunnit before_action for you. Please add this
7
- > before_action to your ApplicationController to continue recording whodunnit.
8
-
9
- ## You want to track whodunnit
10
-
11
- Add the set_paper_trail_whodunnit before_action to your ApplicationController.
12
- See the PaperTrail readme for an example (https://git.io/vrsbt).
13
-
14
- ## You don't want to track whodunnit
15
-
16
- If you no longer want to track whodunnit, you may disable this
17
- warning by overriding user_for_paper_trail to return nil.
18
-
19
- ```
20
- # in application_controller.rb
21
- def user_for_paper_trail
22
- nil # disable whodunnit tracking
23
- end
24
- ```
25
-
26
- ## You just want the warning to go away
27
-
28
- To disable this warning for any other reason, use `skip_after_action`.
29
-
30
- ```
31
- skip_after_action :warn_about_not_setting_whodunnit
32
- ```
@@ -1,19 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 3.2.22"
6
- gem "i18n", "~> 0.6.11"
7
- gem "request_store", "~> 1.1.0"
8
- gem "sinatra", "~> 1.4.6"
9
-
10
- group :development, :test do
11
- gem "railties", "~> 3.2.22"
12
- gem "test-unit", "~> 3.1.5"
13
-
14
- platforms :ruby do
15
- gem "mysql2", "~> 0.3.20"
16
- end
17
- end
18
-
19
- gemspec :path => "../"
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 4.2"
6
- gem "sinatra", "~> 1.4.6"
7
-
8
- gemspec :path => "../"
@@ -1,9 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activerecord", "~> 5.0.0"
6
- gem "rspec-rails", "~> 3.5.1"
7
- gem "rails-controller-testing"
8
-
9
- gemspec :path => "../"
@@ -1,2 +0,0 @@
1
- Description:
2
- Generates (but does not run) a migration to add a versions table.
@@ -1,57 +0,0 @@
1
- require "rails/generators"
2
- require "rails/generators/active_record"
3
-
4
- module PaperTrail
5
- # Installs PaperTrail in a rails app.
6
- class InstallGenerator < ::Rails::Generators::Base
7
- include ::Rails::Generators::Migration
8
-
9
- source_root File.expand_path("../templates", __FILE__)
10
- class_option(
11
- :with_changes,
12
- type: :boolean,
13
- default: false,
14
- desc: "Store changeset (diff) with each version"
15
- )
16
- class_option(
17
- :with_associations,
18
- type: :boolean,
19
- default: false,
20
- desc: "Store transactional IDs to support association restoration"
21
- )
22
-
23
- desc "Generates (but does not run) a migration to add a versions table." \
24
- " Also generates an initializer file for configuring PaperTrail"
25
-
26
- def create_migration_file
27
- add_paper_trail_migration("create_versions")
28
- add_paper_trail_migration("add_object_changes_to_versions") if options.with_changes?
29
- if options.with_associations?
30
- add_paper_trail_migration("create_version_associations")
31
- add_paper_trail_migration("add_transaction_id_column_to_versions")
32
- end
33
- end
34
-
35
- def create_initializer
36
- create_file(
37
- "config/initializers/paper_trail.rb",
38
- "PaperTrail.config.track_associations = #{!!options.with_associations?}"
39
- )
40
- end
41
-
42
- def self.next_migration_number(dirname)
43
- ::ActiveRecord::Generators::Base.next_migration_number(dirname)
44
- end
45
-
46
- protected
47
-
48
- def add_paper_trail_migration(template)
49
- migration_dir = File.expand_path("db/migrate")
50
- if self.class.migration_exists?(migration_dir, template)
51
- ::Kernel.warn "Migration already exists: #{template}"
52
- else
53
- migration_template "#{template}.rb", "db/migrate/#{template}.rb"
54
- end
55
- end
56
- end
57
- end
@@ -1,13 +0,0 @@
1
- # This migration and CreateVersionAssociations provide the necessary
2
- # schema for tracking associations.
3
- class AddTransactionIdColumnToVersions < ActiveRecord::Migration
4
- def self.up
5
- add_column :versions, :transaction_id, :integer
6
- add_index :versions, [:transaction_id]
7
- end
8
-
9
- def self.down
10
- remove_index :versions, [:transaction_id]
11
- remove_column :versions, :transaction_id
12
- end
13
- end
@@ -1,22 +0,0 @@
1
- # This migration and AddTransactionIdColumnToVersions provide the necessary
2
- # schema for tracking associations.
3
- class CreateVersionAssociations < ActiveRecord::Migration
4
- def self.up
5
- create_table :version_associations do |t|
6
- t.integer :version_id
7
- t.string :foreign_key_name, null: false
8
- t.integer :foreign_key_id
9
- end
10
- add_index :version_associations, [:version_id]
11
- add_index :version_associations,
12
- [:foreign_key_name, :foreign_key_id],
13
- name: "index_version_associations_on_foreign_key"
14
- end
15
-
16
- def self.down
17
- remove_index :version_associations, [:version_id]
18
- remove_index :version_associations,
19
- name: "index_version_associations_on_foreign_key"
20
- drop_table :version_associations
21
- end
22
- end
@@ -1,80 +0,0 @@
1
- # This migration creates the `versions` table, the only schema PT requires.
2
- # All other migrations PT provides are optional.
3
- class CreateVersions < ActiveRecord::Migration
4
- # Class names of MySQL adapters.
5
- # - `MysqlAdapter` - Used by gems: `mysql`, `activerecord-jdbcmysql-adapter`.
6
- # - `Mysql2Adapter` - Used by `mysql2` gem.
7
- MYSQL_ADAPTERS = [
8
- "ActiveRecord::ConnectionAdapters::MysqlAdapter",
9
- "ActiveRecord::ConnectionAdapters::Mysql2Adapter"
10
- ].freeze
11
-
12
- # The largest text column available in all supported RDBMS is
13
- # 1024^3 - 1 bytes, roughly one gibibyte. We specify a size
14
- # so that MySQL will use `longtext` instead of `text`. Otherwise,
15
- # when serializing very large objects, `text` might not be big enough.
16
- TEXT_BYTES = 1_073_741_823
17
-
18
- def change
19
- create_table :versions, versions_table_options do |t|
20
- t.string :item_type, item_type_options
21
- t.integer :item_id, null: false
22
- t.string :event, null: false
23
- t.string :whodunnit
24
- t.text :object, limit: TEXT_BYTES
25
-
26
- # Known issue in MySQL: fractional second precision
27
- # -------------------------------------------------
28
- #
29
- # MySQL timestamp columns do not support fractional seconds unless
30
- # defined with "fractional seconds precision". MySQL users should manually
31
- # add fractional seconds precision to this migration, specifically, to
32
- # the `created_at` column.
33
- # (https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html)
34
- #
35
- # MySQL users should also upgrade to rails 4.2, which is the first
36
- # version of ActiveRecord with support for fractional seconds in MySQL.
37
- # (https://github.com/rails/rails/pull/14359)
38
- #
39
- t.datetime :created_at
40
- end
41
- add_index :versions, [:item_type, :item_id]
42
- end
43
-
44
- private
45
-
46
- # MySQL 5.6 utf8mb4 limit is 191 chars for keys used in indexes.
47
- # See https://github.com/airblade/paper_trail/issues/651
48
- def item_type_options
49
- opt = { null: false }
50
- opt[:limit] = 191 if mysql?
51
- opt
52
- end
53
-
54
- def mysql?
55
- MYSQL_ADAPTERS.include?(connection.class.name)
56
- end
57
-
58
- # Even modern versions of MySQL still use `latin1` as the default character
59
- # encoding. Many users are not aware of this, and run into trouble when they
60
- # try to use PaperTrail in apps that otherwise tend to use UTF-8. Postgres, by
61
- # comparison, uses UTF-8 except in the unusual case where the OS is configured
62
- # with a custom locale.
63
- #
64
- # - https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
65
- # - http://www.postgresql.org/docs/9.4/static/multibyte.html
66
- #
67
- # Furthermore, MySQL's original implementation of UTF-8 was flawed, and had
68
- # to be fixed later by introducing a new charset, `utf8mb4`.
69
- #
70
- # - https://mathiasbynens.be/notes/mysql-utf8mb4
71
- # - https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
72
- #
73
- def versions_table_options
74
- if mysql?
75
- { options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci" }
76
- else
77
- {}
78
- end
79
- end
80
- end
@@ -1,48 +0,0 @@
1
- module PaperTrail
2
- module AttributeSerializers
3
- # Included into model if AR version is < 4.2. Backport Rails 4.2 and later's
4
- # `type_for_attribute` so we can build on a common interface.
5
- module LegacyActiveRecordShim
6
- # An attribute which needs no processing. It is part of our backport (shim)
7
- # of rails 4.2's attribute API. See `type_for_attribute` below.
8
- class NoOpAttribute
9
- def type_cast_for_database(value)
10
- value
11
- end
12
-
13
- def type_cast_from_database(data)
14
- data
15
- end
16
- end
17
- NO_OP_ATTRIBUTE = NoOpAttribute.new
18
-
19
- # An attribute which requires manual (de)serialization to/from what we get
20
- # from the database. It is part of our backport (shim) of rails 4.2's
21
- # attribute API. See `type_for_attribute` below.
22
- class SerializedAttribute
23
- def initialize(coder)
24
- @coder = coder.respond_to?(:dump) ? coder : PaperTrail.serializer
25
- end
26
-
27
- def type_cast_for_database(value)
28
- @coder.dump(value)
29
- end
30
-
31
- def type_cast_from_database(data)
32
- @coder.load(data)
33
- end
34
- end
35
-
36
- def type_for_attribute(attr_name)
37
- serialized_attribute_types[attr_name.to_s] || NO_OP_ATTRIBUTE
38
- end
39
-
40
- def serialized_attribute_types
41
- @attribute_types ||= Hash[serialized_attributes.map do |attr_name, coder|
42
- [attr_name, SerializedAttribute.new(coder)]
43
- end]
44
- end
45
- private :serialized_attribute_types
46
- end
47
- end
48
- end
@@ -1,11 +0,0 @@
1
- require "paper_trail/version_association_concern"
2
-
3
- module PaperTrail
4
- # This is the default ActiveRecord model provided by PaperTrail. Most simple
5
- # applications will only use this and its partner, `Version`, but it is
6
- # possible to sub-class, extend, or even do without this model entirely.
7
- # See the readme for details.
8
- class VersionAssociation < ::ActiveRecord::Base
9
- include PaperTrail::VersionAssociationConcern
10
- end
11
- end
@@ -1,40 +0,0 @@
1
- require "active_support/core_ext/object" # provides the `try` method
2
-
3
- module PaperTrail
4
- # Extensions to `Sinatra`.
5
- module Sinatra
6
- # Register this module inside your Sinatra application to gain access to
7
- # controller-level methods used by PaperTrail.
8
- def self.registered(app)
9
- app.use RequestStore::Middleware
10
- app.helpers self
11
- app.before { set_paper_trail_whodunnit }
12
- end
13
-
14
- protected
15
-
16
- # Returns the user who is responsible for any changes that occur.
17
- # By default this calls `current_user` and returns the result.
18
- #
19
- # Override this method in your controller to call a different
20
- # method, e.g. `current_person`, or anything you like.
21
- def user_for_paper_trail
22
- return unless defined?(current_user)
23
- ActiveSupport::VERSION::MAJOR >= 4 ? current_user.try!(:id) : current_user.try(:id)
24
- rescue NoMethodError
25
- current_user
26
- end
27
-
28
- private
29
-
30
- # Tells PaperTrail who is responsible for any changes that occur.
31
- def set_paper_trail_whodunnit
32
- @set_paper_trail_whodunnit_called = true
33
- ::PaperTrail.whodunnit = user_for_paper_trail if ::PaperTrail.enabled?
34
- end
35
- end
36
- end
37
-
38
- if defined?(::Sinatra)
39
- ::Sinatra.register(::PaperTrail::Sinatra)
40
- end