paper_trail 7.0.2 → 7.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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