paper_trail 7.0.2 → 7.0.3
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 +4 -4
- data/.github/CONTRIBUTING.md +1 -1
- data/.rubocop_todo.yml +10 -0
- data/.travis.yml +4 -4
- data/Appraisals +3 -5
- data/CHANGELOG.md +16 -1
- data/README.md +70 -119
- data/Rakefile +6 -1
- data/doc/bug_report_template.rb +4 -2
- data/doc/warning_about_not_setting_whodunnit.md +6 -5
- data/gemfiles/ar_4.0.gemfile +1 -1
- data/gemfiles/ar_4.2.gemfile +1 -1
- data/gemfiles/ar_5.0.gemfile +2 -3
- data/gemfiles/ar_5.1.gemfile +8 -0
- data/gemfiles/ar_master.gemfile +2 -2
- data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb.erb +1 -1
- data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb.erb +1 -1
- data/lib/generators/paper_trail/templates/create_version_associations.rb.erb +1 -1
- data/lib/paper_trail/model_config.rb +4 -4
- data/lib/paper_trail/version_concern.rb +4 -4
- data/lib/paper_trail/version_number.rb +1 -1
- data/paper_trail.gemspec +5 -5
- data/spec/controllers/articles_controller_spec.rb +1 -1
- data/spec/generators/install_generator_spec.rb +2 -2
- data/spec/models/animal_spec.rb +5 -5
- data/spec/models/boolit_spec.rb +2 -2
- data/spec/models/callback_modifier_spec.rb +2 -2
- data/spec/models/car_spec.rb +2 -2
- data/spec/models/custom_primary_key_record_spec.rb +2 -2
- data/spec/models/document_spec.rb +2 -2
- data/spec/models/gadget_spec.rb +2 -2
- data/spec/models/joined_version_spec.rb +1 -1
- data/spec/models/json_version_spec.rb +4 -4
- data/spec/models/kitchen/banana_spec.rb +2 -2
- data/spec/models/not_on_update_spec.rb +2 -2
- data/spec/models/post_with_status_spec.rb +4 -4
- data/spec/models/skipper_spec.rb +1 -1
- data/spec/models/thing_spec.rb +2 -2
- data/spec/models/vehicle_spec.rb +2 -2
- data/spec/models/version_spec.rb +26 -5
- data/spec/models/widget_spec.rb +10 -2
- data/spec/modules/paper_trail_spec.rb +2 -2
- data/spec/modules/version_concern_spec.rb +2 -2
- data/spec/modules/version_number_spec.rb +1 -1
- data/spec/paper_trail/associations_spec.rb +965 -0
- data/spec/paper_trail/cleaner_spec.rb +2 -2
- data/spec/paper_trail/config_spec.rb +2 -2
- data/spec/paper_trail/model_spec.rb +1421 -0
- data/spec/paper_trail/serializer_spec.rb +85 -0
- data/spec/paper_trail/serializers/custom_yaml_serializer_spec.rb +1 -1
- data/spec/paper_trail/serializers/json_spec.rb +2 -2
- data/spec/paper_trail/serializers/yaml_spec.rb +42 -0
- data/spec/paper_trail/version_limit_spec.rb +2 -2
- data/spec/paper_trail/version_spec.rb +96 -0
- data/spec/paper_trail_spec.rb +1 -1
- data/spec/requests/articles_spec.rb +2 -2
- data/spec/spec_helper.rb +47 -79
- data/{test → spec/support}/custom_json_serializer.rb +0 -0
- data/test/dummy/app/models/document.rb +1 -1
- data/test/dummy/app/models/not_on_update.rb +1 -1
- data/test/dummy/app/models/widget.rb +1 -1
- data/test/dummy/config/routes.rb +1 -1
- data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +18 -9
- data/test/dummy/db/schema.rb +64 -64
- data/test/test_helper.rb +1 -33
- data/test/unit/serializers/mixin_json_test.rb +1 -1
- metadata +27 -32
- data/spec/models/truck_spec.rb +0 -5
- data/spec/rails_helper.rb +0 -34
- data/test/time_travel_helper.rb +0 -1
- data/test/unit/associations_test.rb +0 -1032
- data/test/unit/model_test.rb +0 -1416
- data/test/unit/serializer_test.rb +0 -107
- data/test/unit/serializers/yaml_test.rb +0 -50
- data/test/unit/version_test.rb +0 -112
data/Rakefile
CHANGED
@@ -14,6 +14,11 @@ Rake::TestTask.new(:test) do |t|
|
|
14
14
|
t.libs << "test"
|
15
15
|
t.pattern = "test/**/*_test.rb"
|
16
16
|
t.verbose = false
|
17
|
+
|
18
|
+
# Enabling ruby interpreter warnings (-w) is, sadly, impractical. There are
|
19
|
+
# too many noisy warnings that we have no control over, e.g. caused by libs we
|
20
|
+
# depend on.
|
21
|
+
t.warning = false
|
17
22
|
end
|
18
23
|
|
19
24
|
require "rspec/core/rake_task"
|
@@ -27,4 +32,4 @@ require "rubocop/rake_task"
|
|
27
32
|
RuboCop::RakeTask.new
|
28
33
|
|
29
34
|
desc "Default: run all available test suites"
|
30
|
-
task default: %i
|
35
|
+
task default: %i[rubocop prepare test spec]
|
data/doc/bug_report_template.rb
CHANGED
@@ -15,6 +15,8 @@ end
|
|
15
15
|
require "active_record"
|
16
16
|
require "minitest/autorun"
|
17
17
|
require "logger"
|
18
|
+
|
19
|
+
# Please use sqlite for your bug reports, if possible.
|
18
20
|
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
|
19
21
|
ActiveRecord::Base.logger = nil
|
20
22
|
ActiveRecord::Schema.define do
|
@@ -34,7 +36,7 @@ ActiveRecord::Schema.define do
|
|
34
36
|
t.integer :transaction_id
|
35
37
|
t.datetime :created_at
|
36
38
|
end
|
37
|
-
add_index :versions, %i
|
39
|
+
add_index :versions, %i[item_type item_id]
|
38
40
|
add_index :versions, [:transaction_id]
|
39
41
|
|
40
42
|
create_table :version_associations do |t|
|
@@ -43,7 +45,7 @@ ActiveRecord::Schema.define do
|
|
43
45
|
t.integer :foreign_key_id
|
44
46
|
end
|
45
47
|
add_index :version_associations, [:version_id]
|
46
|
-
add_index :version_associations, %i
|
48
|
+
add_index :version_associations, %i[foreign_key_name foreign_key_id],
|
47
49
|
name: "index_version_associations_on_foreign_key"
|
48
50
|
end
|
49
51
|
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
@@ -8,7 +8,7 @@ After upgrading to PaperTrail 5, you see this warning:
|
|
8
8
|
|
9
9
|
## You want to track whodunnit
|
10
10
|
|
11
|
-
Add
|
11
|
+
Add `before_action :set_paper_trail_whodunnit` to your ApplicationController.
|
12
12
|
See the PaperTrail readme for an example (https://git.io/vrsbt).
|
13
13
|
|
14
14
|
## You don't want to track whodunnit
|
@@ -25,8 +25,9 @@ end
|
|
25
25
|
|
26
26
|
## You just want the warning to go away
|
27
27
|
|
28
|
-
|
28
|
+
Upgrade to PT 6.
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
## Why does PT no longer add this callback for me?
|
31
|
+
|
32
|
+
So that you can control the order of callbacks. Maybe you have another callback
|
33
|
+
that must happen first, before `set_paper_trail_whodunnit`.
|
data/gemfiles/ar_4.0.gemfile
CHANGED
data/gemfiles/ar_4.2.gemfile
CHANGED
data/gemfiles/ar_5.0.gemfile
CHANGED
data/gemfiles/ar_master.gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# This migration adds the optional `object_changes` column, in which PaperTrail
|
2
2
|
# will store the `changes` diff for each update event. See the readme for
|
3
3
|
# details.
|
4
|
-
class AddObjectChangesToVersions < ActiveRecord::Migration
|
4
|
+
class AddObjectChangesToVersions < ActiveRecord::Migration<%= migration_version %>
|
5
5
|
# The largest text column available in all supported RDBMS.
|
6
6
|
# See `create_versions.rb` for details.
|
7
7
|
TEXT_BYTES = 1_073_741_823
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This migration and CreateVersionAssociations provide the necessary
|
2
2
|
# schema for tracking associations.
|
3
|
-
class AddTransactionIdColumnToVersions < ActiveRecord::Migration
|
3
|
+
class AddTransactionIdColumnToVersions < ActiveRecord::Migration<%= migration_version %>
|
4
4
|
def self.up
|
5
5
|
add_column :versions, :transaction_id, :integer
|
6
6
|
add_index :versions, [:transaction_id]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# This migration and AddTransactionIdColumnToVersions provide the necessary
|
2
2
|
# schema for tracking associations.
|
3
|
-
class CreateVersionAssociations < ActiveRecord::Migration
|
3
|
+
class CreateVersionAssociations < ActiveRecord::Migration<%= migration_version %>
|
4
4
|
def self.up
|
5
5
|
create_table :version_associations do |t|
|
6
6
|
t.integer :version_id
|
@@ -40,7 +40,7 @@ module PaperTrail
|
|
40
40
|
|
41
41
|
# Adds a callback that records a version before or after a "destroy" event.
|
42
42
|
def on_destroy(recording_order = "before")
|
43
|
-
unless %w
|
43
|
+
unless %w[after before].include?(recording_order.to_s)
|
44
44
|
raise ArgumentError, 'recording order can only be "after" or "before"'
|
45
45
|
end
|
46
46
|
|
@@ -76,7 +76,7 @@ module PaperTrail
|
|
76
76
|
# "class attributes", instance methods, and more.
|
77
77
|
# @api private
|
78
78
|
def setup(options = {})
|
79
|
-
options[:on] ||= %i
|
79
|
+
options[:on] ||= %i[create update destroy]
|
80
80
|
options[:on] = Array(options[:on]) # Support single symbol
|
81
81
|
@model_class.send :include, ::PaperTrail::Model::InstanceMethods
|
82
82
|
if ::ActiveRecord::VERSION::STRING < "4.2"
|
@@ -153,7 +153,7 @@ module PaperTrail
|
|
153
153
|
|
154
154
|
def setup_habtm_change_callbacks(assoc)
|
155
155
|
assoc_name = assoc.name
|
156
|
-
%w
|
156
|
+
%w[add remove].each do |verb|
|
157
157
|
@model_class.send(:"before_#{verb}_for_#{assoc_name}").send(
|
158
158
|
:<<,
|
159
159
|
lambda do |*args|
|
@@ -167,7 +167,7 @@ module PaperTrail
|
|
167
167
|
@model_class.class_attribute :paper_trail_options
|
168
168
|
@model_class.paper_trail_options = options.dup
|
169
169
|
|
170
|
-
%i
|
170
|
+
%i[ignore skip only].each do |k|
|
171
171
|
@model_class.paper_trail_options[k] = [@model_class.paper_trail_options[k]].
|
172
172
|
flatten.
|
173
173
|
compact.
|
@@ -24,7 +24,7 @@ module PaperTrail
|
|
24
24
|
|
25
25
|
validates_presence_of :event
|
26
26
|
after_create :enforce_version_limit!
|
27
|
-
scope
|
27
|
+
scope(:within_transaction, ->(id) { where transaction_id: id })
|
28
28
|
end
|
29
29
|
|
30
30
|
# :nodoc:
|
@@ -162,13 +162,13 @@ module PaperTrail
|
|
162
162
|
# Returns whether the `object` column is using the `json` type supported
|
163
163
|
# by PostgreSQL.
|
164
164
|
def object_col_is_json?
|
165
|
-
%i
|
165
|
+
%i[json jsonb].include?(columns_hash["object"].type)
|
166
166
|
end
|
167
167
|
|
168
168
|
# Returns whether the `object_changes` column is using the `json` type
|
169
169
|
# supported by PostgreSQL.
|
170
170
|
def object_changes_col_is_json?
|
171
|
-
%i
|
171
|
+
%i[json jsonb].include?(columns_hash["object_changes"].try(:type))
|
172
172
|
end
|
173
173
|
end
|
174
174
|
|
@@ -239,7 +239,7 @@ module PaperTrail
|
|
239
239
|
alias version_author terminator
|
240
240
|
|
241
241
|
def sibling_versions(reload = false)
|
242
|
-
if reload || @sibling_versions.nil?
|
242
|
+
if reload || !defined?(@sibling_versions) || @sibling_versions.nil?
|
243
243
|
@sibling_versions = self.class.with_item_keys(item_type, item_id)
|
244
244
|
end
|
245
245
|
@sibling_versions
|
data/paper_trail.gemspec
CHANGED
@@ -29,9 +29,9 @@ has been destroyed.
|
|
29
29
|
s.add_dependency "request_store", "~> 1.1"
|
30
30
|
|
31
31
|
s.add_development_dependency "appraisal", "~> 2.1"
|
32
|
-
s.add_development_dependency "rake", "~>
|
33
|
-
s.add_development_dependency "shoulda", "~> 3.5
|
34
|
-
s.add_development_dependency "ffaker", "~> 2.
|
32
|
+
s.add_development_dependency "rake", "~> 12.0"
|
33
|
+
s.add_development_dependency "shoulda", "~> 3.5"
|
34
|
+
s.add_development_dependency "ffaker", "~> 2.5"
|
35
35
|
|
36
36
|
# Why `railties`? Possibly used by `test/dummy` boot up?
|
37
37
|
s.add_development_dependency "railties", [">= 4.0", "< 5.2"]
|
@@ -40,8 +40,8 @@ has been destroyed.
|
|
40
40
|
s.add_development_dependency "rspec-rails", "~> 3.5"
|
41
41
|
s.add_development_dependency "generator_spec", "~> 0.9.3"
|
42
42
|
s.add_development_dependency "database_cleaner", "~> 1.2"
|
43
|
-
s.add_development_dependency "pry-
|
44
|
-
s.add_development_dependency "rubocop", "0.48.
|
43
|
+
s.add_development_dependency "pry-byebug", "~> 3.4"
|
44
|
+
s.add_development_dependency "rubocop", "0.48.1"
|
45
45
|
s.add_development_dependency "rubocop-rspec", "~> 1.15.0"
|
46
46
|
s.add_development_dependency "timecop", "~> 0.8.0"
|
47
47
|
s.add_development_dependency "sqlite3", "~> 1.2"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
require "generator_spec/test_case"
|
3
3
|
require File.expand_path("../../../lib/generators/paper_trail/install_generator", __FILE__)
|
4
4
|
|
@@ -50,7 +50,7 @@ RSpec.describe PaperTrail::InstallGenerator, type: :generator do
|
|
50
50
|
describe "`--with-changes` option set to `true`" do
|
51
51
|
before(:all) do
|
52
52
|
prepare_destination
|
53
|
-
run_generator %w
|
53
|
+
run_generator %w[--with-changes]
|
54
54
|
end
|
55
55
|
|
56
56
|
it "generates a migration for creating the 'versions' table" do
|
data/spec/models/animal_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
describe Animal, type: :model, versioning: true do
|
3
|
+
RSpec.describe Animal, type: :model, versioning: true do
|
4
4
|
it "baseline test setup" do
|
5
5
|
expect(Animal.new).to be_versioned
|
6
6
|
expect(Animal.inheritance_column).to eq("species")
|
@@ -28,11 +28,11 @@ describe Animal, type: :model, versioning: true do
|
|
28
28
|
dog_versions = PaperTrail::Version.where(item_id: dog.id).order(:created_at)
|
29
29
|
expect(dog_versions.count).to(eq(4))
|
30
30
|
expect(dog_versions.first.reify).to(be_nil)
|
31
|
-
expect(dog_versions.map { |v| v.reify.class.name }).to eq(%w
|
31
|
+
expect(dog_versions.map { |v| v.reify.class.name }).to eq(%w[NilClass Dog Dog Dog])
|
32
32
|
cat_versions = PaperTrail::Version.where(item_id: cat.id).order(:created_at)
|
33
33
|
expect(cat_versions.count).to(eq(4))
|
34
34
|
expect(cat_versions.first.reify).to(be_nil)
|
35
|
-
expect(cat_versions.map { |v| v.reify.class.name }).to eq(%w
|
35
|
+
expect(cat_versions.map { |v| v.reify.class.name }).to eq(%w[NilClass Cat Cat Cat])
|
36
36
|
end
|
37
37
|
|
38
38
|
it "allows the inheritance_column (species) to be updated" do
|
@@ -49,7 +49,7 @@ describe Animal, type: :model, versioning: true do
|
|
49
49
|
it "trails all events" do
|
50
50
|
callback_cat.update_attributes(name: "Billie")
|
51
51
|
callback_cat.destroy
|
52
|
-
expect(callback_cat.versions.collect(&:event)).to eq %w
|
52
|
+
expect(callback_cat.versions.collect(&:event)).to eq %w[create update destroy]
|
53
53
|
end
|
54
54
|
|
55
55
|
it "does not break reify" do
|
data/spec/models/boolit_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
RSpec.describe CallbackModifier, type: :model, versioning: true do
|
4
4
|
describe "paper_trail_on_destroy" do
|
@@ -60,7 +60,7 @@ RSpec.describe CallbackModifier, type: :model, versioning: true do
|
|
60
60
|
context "when no callback-method used" do
|
61
61
|
it "sets paper_trail_options[:on] to [:create, :update, :destroy]" do
|
62
62
|
modifier = DefaultModifier.create!(some_content: FFaker::Lorem.sentence)
|
63
|
-
expect(modifier.paper_trail_options[:on]).to eq %i
|
63
|
+
expect(modifier.paper_trail_options[:on]).to eq %i[create update destroy]
|
64
64
|
end
|
65
65
|
|
66
66
|
it "tracks destroy" do
|
data/spec/models/car_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
describe Document, type: :model do
|
3
|
+
RSpec.describe Document, type: :model do
|
4
4
|
describe "`have_a_version_with` matcher", versioning: true do
|
5
5
|
it "works with custom versions association" do
|
6
6
|
document = Document.create!(name: "Foo")
|
data/spec/models/gadget_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
# The `json_versions` table tests postgres' `json` data type. So, that
|
4
4
|
# table is only created when testing against postgres and ActiveRecord >= 4.
|
@@ -31,7 +31,7 @@ if JsonVersion.table_exists?
|
|
31
31
|
end
|
32
32
|
|
33
33
|
context "valid arguments", versioning: true do
|
34
|
-
let(:fruit_names) { %w
|
34
|
+
let(:fruit_names) { %w[apple orange lemon banana lime coconut strawberry blueberry] }
|
35
35
|
let(:fruit) { Fruit.new }
|
36
36
|
let(:name) { "pomegranate" }
|
37
37
|
let(:color) { FFaker::Color.name }
|
@@ -70,9 +70,9 @@ if JsonVersion.table_exists?
|
|
70
70
|
end
|
71
71
|
|
72
72
|
context "valid arguments", versioning: true do
|
73
|
-
let(:color) { %w
|
73
|
+
let(:color) { %w[red green] }
|
74
74
|
let(:fruit) { Fruit.create!(name: name[0]) }
|
75
|
-
let(:name) { %w
|
75
|
+
let(:name) { %w[banana kiwi mango] }
|
76
76
|
|
77
77
|
before do
|
78
78
|
fruit.update_attributes!(name: name[1], color: color[0])
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
describe PostWithStatus, type: :model do
|
3
|
+
RSpec.describe PostWithStatus, type: :model do
|
4
4
|
with_versioning do
|
5
5
|
let(:post) { described_class.create!(status: "draft") }
|
6
6
|
|
@@ -17,7 +17,7 @@ describe PostWithStatus, type: :model do
|
|
17
17
|
# Simulate behavior PT 4, which used to save the string version of
|
18
18
|
# enums to `object_changes`
|
19
19
|
version.update(object_changes: "---\nid:\n- \n- 1\nstatus:\n- draft\n- published\n")
|
20
|
-
assert_equal %w
|
20
|
+
assert_equal %w[draft published], version.changeset["status"]
|
21
21
|
end
|
22
22
|
|
23
23
|
context "storing enum object_changes" do
|
@@ -26,7 +26,7 @@ describe PostWithStatus, type: :model do
|
|
26
26
|
it "saves the enum value properly in versions object_changes" do
|
27
27
|
post.published!
|
28
28
|
post.archived!
|
29
|
-
expect(subject.changeset["status"]).to eql %w
|
29
|
+
expect(subject.changeset["status"]).to eql %w[published archived]
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
data/spec/models/skipper_spec.rb
CHANGED