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.
- checksums.yaml +5 -5
- data/lib/generators/paper_trail/install/USAGE +3 -0
- data/lib/generators/paper_trail/install/install_generator.rb +75 -0
- data/lib/generators/paper_trail/{templates/add_object_changes_to_versions.rb → install/templates/add_object_changes_to_versions.rb.erb} +1 -1
- data/lib/generators/paper_trail/install/templates/create_versions.rb.erb +36 -0
- data/lib/generators/paper_trail/migration_generator.rb +38 -0
- data/lib/generators/paper_trail/update_item_subtype/USAGE +4 -0
- data/lib/generators/paper_trail/update_item_subtype/templates/update_versions_for_item_subtype.rb.erb +85 -0
- data/lib/generators/paper_trail/update_item_subtype/update_item_subtype_generator.rb +17 -0
- data/lib/paper_trail.rb +82 -130
- data/lib/paper_trail/attribute_serializers/attribute_serializer_factory.rb +27 -0
- data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +15 -44
- data/lib/paper_trail/attribute_serializers/object_attribute.rb +2 -0
- data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +2 -0
- data/lib/paper_trail/cleaner.rb +3 -1
- data/lib/paper_trail/compatibility.rb +51 -0
- data/lib/paper_trail/config.rb +11 -49
- data/lib/paper_trail/events/base.rb +323 -0
- data/lib/paper_trail/events/create.rb +32 -0
- data/lib/paper_trail/events/destroy.rb +42 -0
- data/lib/paper_trail/events/update.rb +60 -0
- data/lib/paper_trail/frameworks/active_record.rb +2 -1
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +8 -3
- data/lib/paper_trail/frameworks/cucumber.rb +5 -3
- data/lib/paper_trail/frameworks/rails.rb +2 -0
- data/lib/paper_trail/frameworks/rails/controller.rb +33 -43
- data/lib/paper_trail/frameworks/rails/engine.rb +34 -1
- data/lib/paper_trail/frameworks/rspec.rb +17 -4
- data/lib/paper_trail/frameworks/rspec/helpers.rb +2 -0
- data/lib/paper_trail/has_paper_trail.rb +22 -310
- data/lib/paper_trail/model_config.rb +157 -109
- data/lib/paper_trail/queries/versions/where_object.rb +65 -0
- data/lib/paper_trail/queries/versions/where_object_changes.rb +75 -0
- data/lib/paper_trail/record_history.rb +3 -9
- data/lib/paper_trail/record_trail.rb +169 -319
- data/lib/paper_trail/reifier.rb +53 -374
- data/lib/paper_trail/request.rb +166 -0
- data/lib/paper_trail/serializers/json.rb +9 -10
- data/lib/paper_trail/serializers/yaml.rb +15 -28
- data/lib/paper_trail/type_serializers/postgres_array_serializer.rb +48 -0
- data/lib/paper_trail/version_concern.rb +160 -155
- data/lib/paper_trail/version_number.rb +12 -4
- metadata +77 -372
- data/.github/CONTRIBUTING.md +0 -109
- data/.github/ISSUE_TEMPLATE.md +0 -13
- data/.gitignore +0 -23
- data/.rspec +0 -2
- data/.rubocop.yml +0 -99
- data/.rubocop_todo.yml +0 -22
- data/.travis.yml +0 -41
- data/Appraisals +0 -38
- data/CHANGELOG.md +0 -560
- data/Gemfile +0 -2
- data/MIT-LICENSE +0 -20
- data/README.md +0 -1654
- data/Rakefile +0 -30
- data/doc/bug_report_template.rb +0 -69
- data/doc/warning_about_not_setting_whodunnit.md +0 -32
- data/gemfiles/ar3.gemfile +0 -19
- data/gemfiles/ar4.gemfile +0 -8
- data/gemfiles/ar5.gemfile +0 -9
- data/lib/generators/paper_trail/USAGE +0 -2
- data/lib/generators/paper_trail/default_initializer.rb +0 -0
- data/lib/generators/paper_trail/install_generator.rb +0 -57
- data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +0 -13
- data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -22
- data/lib/generators/paper_trail/templates/create_versions.rb +0 -80
- data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +0 -48
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +0 -11
- data/lib/paper_trail/frameworks/sinatra.rb +0 -40
- data/lib/paper_trail/version_association_concern.rb +0 -17
- data/paper_trail.gemspec +0 -56
- data/spec/generators/install_generator_spec.rb +0 -66
- data/spec/generators/paper_trail/templates/create_versions_spec.rb +0 -51
- data/spec/models/animal_spec.rb +0 -36
- data/spec/models/boolit_spec.rb +0 -48
- data/spec/models/callback_modifier_spec.rb +0 -96
- data/spec/models/car_spec.rb +0 -13
- data/spec/models/custom_primary_key_record_spec.rb +0 -18
- data/spec/models/fluxor_spec.rb +0 -17
- data/spec/models/gadget_spec.rb +0 -68
- data/spec/models/joined_version_spec.rb +0 -47
- data/spec/models/json_version_spec.rb +0 -102
- data/spec/models/kitchen/banana_spec.rb +0 -14
- data/spec/models/not_on_update_spec.rb +0 -22
- data/spec/models/post_with_status_spec.rb +0 -50
- data/spec/models/skipper_spec.rb +0 -46
- data/spec/models/thing_spec.rb +0 -11
- data/spec/models/truck_spec.rb +0 -5
- data/spec/models/vehicle_spec.rb +0 -5
- data/spec/models/version_spec.rb +0 -272
- data/spec/models/widget_spec.rb +0 -343
- data/spec/modules/paper_trail_spec.rb +0 -27
- data/spec/modules/version_concern_spec.rb +0 -31
- data/spec/modules/version_number_spec.rb +0 -43
- data/spec/paper_trail/config_spec.rb +0 -33
- data/spec/paper_trail_spec.rb +0 -79
- data/spec/rails_helper.rb +0 -34
- data/spec/requests/articles_spec.rb +0 -34
- data/spec/spec_helper.rb +0 -114
- data/spec/support/alt_db_init.rb +0 -54
- data/test/custom_json_serializer.rb +0 -13
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/application_controller.rb +0 -33
- data/test/dummy/app/controllers/articles_controller.rb +0 -20
- data/test/dummy/app/controllers/test_controller.rb +0 -5
- data/test/dummy/app/controllers/widgets_controller.rb +0 -32
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/animal.rb +0 -6
- data/test/dummy/app/models/article.rb +0 -24
- data/test/dummy/app/models/authorship.rb +0 -5
- data/test/dummy/app/models/bar_habtm.rb +0 -4
- data/test/dummy/app/models/book.rb +0 -9
- data/test/dummy/app/models/boolit.rb +0 -4
- data/test/dummy/app/models/callback_modifier.rb +0 -45
- data/test/dummy/app/models/car.rb +0 -3
- data/test/dummy/app/models/cat.rb +0 -2
- data/test/dummy/app/models/chapter.rb +0 -9
- data/test/dummy/app/models/citation.rb +0 -5
- data/test/dummy/app/models/custom_primary_key_record.rb +0 -13
- data/test/dummy/app/models/customer.rb +0 -4
- data/test/dummy/app/models/document.rb +0 -4
- data/test/dummy/app/models/dog.rb +0 -2
- data/test/dummy/app/models/editor.rb +0 -4
- data/test/dummy/app/models/editorship.rb +0 -5
- data/test/dummy/app/models/elephant.rb +0 -3
- data/test/dummy/app/models/fluxor.rb +0 -3
- data/test/dummy/app/models/foo_habtm.rb +0 -5
- data/test/dummy/app/models/foo_widget.rb +0 -2
- data/test/dummy/app/models/fruit.rb +0 -5
- data/test/dummy/app/models/gadget.rb +0 -3
- data/test/dummy/app/models/kitchen/banana.rb +0 -5
- data/test/dummy/app/models/legacy_widget.rb +0 -4
- data/test/dummy/app/models/line_item.rb +0 -4
- data/test/dummy/app/models/not_on_update.rb +0 -4
- data/test/dummy/app/models/order.rb +0 -5
- data/test/dummy/app/models/paragraph.rb +0 -5
- data/test/dummy/app/models/person.rb +0 -38
- data/test/dummy/app/models/post.rb +0 -3
- data/test/dummy/app/models/post_with_status.rb +0 -8
- data/test/dummy/app/models/protected_widget.rb +0 -3
- data/test/dummy/app/models/quotation.rb +0 -5
- data/test/dummy/app/models/section.rb +0 -6
- data/test/dummy/app/models/skipper.rb +0 -6
- data/test/dummy/app/models/song.rb +0 -41
- data/test/dummy/app/models/thing.rb +0 -3
- data/test/dummy/app/models/translation.rb +0 -4
- data/test/dummy/app/models/truck.rb +0 -4
- data/test/dummy/app/models/vehicle.rb +0 -4
- data/test/dummy/app/models/whatchamajigger.rb +0 -4
- data/test/dummy/app/models/widget.rb +0 -16
- data/test/dummy/app/models/wotsit.rb +0 -8
- data/test/dummy/app/versions/custom_primary_key_record_version.rb +0 -3
- data/test/dummy/app/versions/joined_version.rb +0 -6
- data/test/dummy/app/versions/json_version.rb +0 -3
- data/test/dummy/app/versions/kitchen/banana_version.rb +0 -5
- data/test/dummy/app/versions/post_version.rb +0 -3
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -80
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/database.mysql.yml +0 -19
- data/test/dummy/config/database.postgres.yml +0 -15
- data/test/dummy/config/database.sqlite.yml +0 -15
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -41
- data/test/dummy/config/environments/production.rb +0 -74
- data/test/dummy/config/environments/test.rb +0 -51
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -9
- data/test/dummy/config/initializers/inflections.rb +0 -10
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/paper_trail.rb +0 -9
- data/test/dummy/config/initializers/secret_token.rb +0 -9
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -4
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +0 -361
- data/test/dummy/db/schema.rb +0 -288
- data/test/dummy/script/rails +0 -8
- data/test/functional/controller_test.rb +0 -90
- data/test/functional/enabled_for_controller_test.rb +0 -28
- data/test/functional/modular_sinatra_test.rb +0 -46
- data/test/functional/sinatra_test.rb +0 -51
- data/test/functional/thread_safety_test.rb +0 -46
- data/test/test_helper.rb +0 -127
- data/test/time_travel_helper.rb +0 -1
- data/test/unit/associations_test.rb +0 -1016
- data/test/unit/cleaner_test.rb +0 -188
- data/test/unit/inheritance_column_test.rb +0 -43
- data/test/unit/model_test.rb +0 -1489
- data/test/unit/protected_attrs_test.rb +0 -52
- data/test/unit/serializer_test.rb +0 -119
- data/test/unit/serializers/json_test.rb +0 -95
- data/test/unit/serializers/mixin_json_test.rb +0 -37
- data/test/unit/serializers/mixin_yaml_test.rb +0 -53
- data/test/unit/serializers/yaml_test.rb +0 -54
- data/test/unit/timestamp_test.rb +0 -41
- 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]
|
data/doc/bug_report_template.rb
DELETED
@@ -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
|
-
```
|
data/gemfiles/ar3.gemfile
DELETED
@@ -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 => "../"
|
data/gemfiles/ar4.gemfile
DELETED
data/gemfiles/ar5.gemfile
DELETED
File without changes
|
@@ -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
|