paper_trail 4.2.0 → 7.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/paper_trail/install_generator.rb +91 -17
- data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb.erb +12 -0
- data/lib/generators/paper_trail/templates/{add_transaction_id_column_to_versions.rb → add_transaction_id_column_to_versions.rb.erb} +3 -1
- data/lib/generators/paper_trail/templates/create_version_associations.rb.erb +22 -0
- data/lib/generators/paper_trail/templates/{create_versions.rb → create_versions.rb.erb} +9 -7
- data/lib/paper_trail.rb +180 -148
- data/lib/paper_trail/attribute_serializers/README.md +10 -0
- data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +80 -0
- data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
- data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
- data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
- data/lib/paper_trail/cleaner.rb +16 -10
- data/lib/paper_trail/config.rb +28 -27
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
- data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
- data/lib/paper_trail/frameworks/cucumber.rb +1 -0
- data/lib/paper_trail/frameworks/rails.rb +2 -7
- data/lib/paper_trail/frameworks/rails/controller.rb +20 -18
- data/lib/paper_trail/frameworks/rails/engine.rb +6 -1
- data/lib/paper_trail/frameworks/rspec.rb +17 -6
- data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
- data/lib/paper_trail/has_paper_trail.rb +25 -503
- data/lib/paper_trail/model_config.rb +207 -0
- data/lib/paper_trail/queries/versions/where_object.rb +60 -0
- data/lib/paper_trail/queries/versions/where_object_changes.rb +68 -0
- data/lib/paper_trail/record_history.rb +2 -12
- data/lib/paper_trail/record_trail.rb +573 -0
- data/lib/paper_trail/reifier.rb +164 -215
- data/lib/paper_trail/reifiers/belongs_to.rb +48 -0
- data/lib/paper_trail/reifiers/has_and_belongs_to_many.rb +50 -0
- data/lib/paper_trail/reifiers/has_many.rb +110 -0
- data/lib/paper_trail/reifiers/has_many_through.rb +90 -0
- data/lib/paper_trail/reifiers/has_one.rb +76 -0
- data/lib/paper_trail/serializers/json.rb +16 -7
- data/lib/paper_trail/serializers/yaml.rb +9 -13
- data/lib/paper_trail/version_association_concern.rb +3 -5
- data/lib/paper_trail/version_concern.rb +138 -111
- data/lib/paper_trail/version_number.rb +10 -9
- metadata +95 -327
- data/.gitignore +0 -22
- data/.rspec +0 -2
- data/.travis.yml +0 -41
- data/CHANGELOG.md +0 -362
- data/CONTRIBUTING.md +0 -84
- data/Gemfile +0 -2
- data/MIT-LICENSE +0 -20
- data/README.md +0 -1535
- data/Rakefile +0 -30
- data/doc/bug_report_template.rb +0 -65
- data/gemfiles/ar3.gemfile +0 -61
- data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +0 -10
- data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -17
- data/lib/paper_trail/attributes_serialization.rb +0 -89
- data/lib/paper_trail/frameworks/sinatra.rb +0 -38
- data/paper_trail.gemspec +0 -59
- data/spec/generators/install_generator_spec.rb +0 -67
- 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/fluxor_spec.rb +0 -19
- data/spec/models/gadget_spec.rb +0 -70
- data/spec/models/joined_version_spec.rb +0 -47
- data/spec/models/json_version_spec.rb +0 -103
- data/spec/models/kitchen/banana_spec.rb +0 -14
- data/spec/models/not_on_update_spec.rb +0 -19
- data/spec/models/post_with_status_spec.rb +0 -17
- data/spec/models/skipper_spec.rb +0 -46
- data/spec/models/thing_spec.rb +0 -11
- data/spec/models/version_spec.rb +0 -239
- data/spec/models/widget_spec.rb +0 -298
- data/spec/modules/paper_trail_spec.rb +0 -27
- data/spec/modules/version_concern_spec.rb +0 -32
- data/spec/modules/version_number_spec.rb +0 -44
- data/spec/paper_trail/config_spec.rb +0 -52
- data/spec/paper_trail_spec.rb +0 -66
- data/spec/rails_helper.rb +0 -34
- data/spec/requests/articles_spec.rb +0 -30
- data/spec/spec_helper.rb +0 -95
- data/spec/support/alt_db_init.rb +0 -59
- data/test/custom_json_serializer.rb +0 -13
- data/test/dummy/Rakefile +0 -7
- data/test/dummy/app/controllers/application_controller.rb +0 -20
- data/test/dummy/app/controllers/articles_controller.rb +0 -17
- data/test/dummy/app/controllers/test_controller.rb +0 -5
- data/test/dummy/app/controllers/widgets_controller.rb +0 -31
- 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 -16
- data/test/dummy/app/models/authorship.rb +0 -5
- 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/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/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_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 -32
- data/test/dummy/app/models/thing.rb +0 -3
- data/test/dummy/app/models/translation.rb +0 -4
- data/test/dummy/app/models/whatchamajigger.rb +0 -4
- data/test/dummy/app/models/widget.rb +0 -15
- data/test/dummy/app/models/wotsit.rb +0 -8
- data/test/dummy/app/versions/joined_version.rb +0 -5
- 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 -69
- 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 -40
- data/test/dummy/config/environments/production.rb +0 -73
- data/test/dummy/config/environments/test.rb +0 -41
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- 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 -10
- data/test/dummy/config/initializers/secret_token.rb +0 -7
- 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 -287
- data/test/dummy/db/schema.rb +0 -246
- data/test/dummy/script/rails +0 -6
- data/test/functional/controller_test.rb +0 -91
- data/test/functional/enabled_for_controller_test.rb +0 -29
- data/test/functional/modular_sinatra_test.rb +0 -48
- data/test/functional/sinatra_test.rb +0 -49
- data/test/functional/thread_safety_test.rb +0 -48
- data/test/paper_trail_test.rb +0 -38
- data/test/test_helper.rb +0 -105
- data/test/time_travel_helper.rb +0 -15
- data/test/unit/associations_test.rb +0 -726
- data/test/unit/cleaner_test.rb +0 -182
- data/test/unit/inheritance_column_test.rb +0 -43
- data/test/unit/model_test.rb +0 -1373
- data/test/unit/protected_attrs_test.rb +0 -47
- data/test/unit/serializer_test.rb +0 -117
- data/test/unit/serializers/json_test.rb +0 -88
- data/test/unit/serializers/mixin_json_test.rb +0 -36
- data/test/unit/serializers/mixin_yaml_test.rb +0 -49
- data/test/unit/serializers/yaml_test.rb +0 -52
- data/test/unit/timestamp_test.rb +0 -43
- 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
|
-
if RUBY_VERSION >= '1.9'
|
8
|
-
FileUtils.cp "test/dummy/config/database.#{ENV["DB"]}.yml", "test/dummy/config/database.yml"
|
9
|
-
else
|
10
|
-
require 'ftools'
|
11
|
-
File.cp "test/dummy/config/database.#{ENV["DB"]}.yml", "test/dummy/config/database.yml"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
require 'rake/testtask'
|
17
|
-
desc 'Run tests on PaperTrail with Test::Unit.'
|
18
|
-
Rake::TestTask.new(:test) do |t|
|
19
|
-
t.libs << 'lib'
|
20
|
-
t.libs << 'test'
|
21
|
-
t.pattern = 'test/**/*_test.rb'
|
22
|
-
t.verbose = false
|
23
|
-
end
|
24
|
-
|
25
|
-
require 'rspec/core/rake_task'
|
26
|
-
desc 'Run tests on PaperTrail with RSpec'
|
27
|
-
RSpec::Core::RakeTask.new(:spec)
|
28
|
-
|
29
|
-
desc 'Default: run all available test suites'
|
30
|
-
task :default => [:prepare, :test, :spec]
|
data/doc/bug_report_template.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
# Use this template to report PaperTrail bugs.
|
2
|
-
# It is based on the ActiveRecord template.
|
3
|
-
# https://github.com/rails/rails/blob/master/guides/bug_report_templates/active_record_gem.rb
|
4
|
-
begin
|
5
|
-
require 'bundler/inline'
|
6
|
-
rescue LoadError => e
|
7
|
-
$stderr.puts 'Bundler version 1.10 or later is required. Please update your Bundler'
|
8
|
-
raise e
|
9
|
-
end
|
10
|
-
|
11
|
-
gemfile(true) do
|
12
|
-
ruby '2.2.3'
|
13
|
-
source 'https://rubygems.org'
|
14
|
-
gem 'activerecord', '4.2.0'
|
15
|
-
gem 'minitest', '5.8.3'
|
16
|
-
gem 'paper_trail', '4.0.0', require: false
|
17
|
-
gem 'sqlite3'
|
18
|
-
end
|
19
|
-
|
20
|
-
require 'active_record'
|
21
|
-
require 'minitest/autorun'
|
22
|
-
require 'logger'
|
23
|
-
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
|
24
|
-
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
25
|
-
require 'paper_trail'
|
26
|
-
|
27
|
-
ActiveRecord::Schema.define do
|
28
|
-
create_table :users, force: true do |t|
|
29
|
-
t.text :first_name, null: false
|
30
|
-
t.timestamps null: false
|
31
|
-
end
|
32
|
-
create_table :versions do |t|
|
33
|
-
t.string :item_type, null: false
|
34
|
-
t.integer :item_id, null: false
|
35
|
-
t.string :event, null: false
|
36
|
-
t.string :whodunnit
|
37
|
-
t.text :object, limit: 1_073_741_823
|
38
|
-
t.text :object_changes, limit: 1_073_741_823
|
39
|
-
t.integer :transaction_id
|
40
|
-
t.datetime :created_at
|
41
|
-
end
|
42
|
-
add_index :versions, [:item_type, :item_id]
|
43
|
-
add_index :versions, [:transaction_id]
|
44
|
-
|
45
|
-
create_table :version_associations do |t|
|
46
|
-
t.integer :version_id
|
47
|
-
t.string :foreign_key_name, null: false
|
48
|
-
t.integer :foreign_key_id
|
49
|
-
end
|
50
|
-
add_index :version_associations, [:version_id]
|
51
|
-
add_index :version_associations, [:foreign_key_name, :foreign_key_id],
|
52
|
-
name: 'index_version_associations_on_foreign_key'
|
53
|
-
end
|
54
|
-
|
55
|
-
class User < ActiveRecord::Base
|
56
|
-
has_paper_trail
|
57
|
-
end
|
58
|
-
|
59
|
-
class BugTest < ActiveSupport::TestCase
|
60
|
-
def test_1
|
61
|
-
assert_difference(-> { PaperTrail::Version.count }, +1) {
|
62
|
-
User.create(first_name: "Jane")
|
63
|
-
}
|
64
|
-
end
|
65
|
-
end
|
data/gemfiles/ar3.gemfile
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
gem 'activerecord', '3.2.22.2'
|
4
|
-
gem 'request_store', '~> 1.1.0'
|
5
|
-
|
6
|
-
# i18n 0.7 requires ruby >= 1.9.3, but we still support 1.8.7
|
7
|
-
gem 'i18n', '< 0.7'
|
8
|
-
|
9
|
-
# actionpack 3 depends on rack-cache ~> 1.2, but bundler seems to ignore that.
|
10
|
-
# Also rack-cache 1.3 dropped support for ruby 1.8.7. The simplest thing for now
|
11
|
-
# was to specify rack-cache ~> 1.2 here, though it should be unnecessary given
|
12
|
-
# the actionpack 3 dependency.
|
13
|
-
gem 'rack-cache', '~> 1.2.0'
|
14
|
-
|
15
|
-
group :development, :test do
|
16
|
-
gem 'rake', '~> 10.1.1'
|
17
|
-
gem 'shoulda', '~> 3.5'
|
18
|
-
gem 'ffaker', '<= 1.31.0'
|
19
|
-
|
20
|
-
# Testing of Sinatra
|
21
|
-
gem 'sinatra', '~> 1.1.4'
|
22
|
-
|
23
|
-
# RSpec testing
|
24
|
-
gem 'rspec-rails', '~> 3.4.2'
|
25
|
-
gem 'generator_spec'
|
26
|
-
|
27
|
-
# To do proper transactional testing with ActiveSupport::TestCase on MySQL
|
28
|
-
gem 'database_cleaner', '~> 1.2.0'
|
29
|
-
|
30
|
-
# Allow time travel in testing. timecop is only supported after 1.9.2 but does a better cleanup at 'return'
|
31
|
-
if RUBY_VERSION < "1.9.2"
|
32
|
-
gem 'delorean'
|
33
|
-
else
|
34
|
-
gem 'timecop'
|
35
|
-
end
|
36
|
-
|
37
|
-
platforms :ruby do
|
38
|
-
gem 'sqlite3', '~> 1.2'
|
39
|
-
|
40
|
-
# We would prefer to only constrain mysql2 to '~> 0.3',
|
41
|
-
# but a rails bug (https://github.com/rails/rails/issues/21544)
|
42
|
-
# requires us to constrain to '~> 0.3.20' for now.
|
43
|
-
gem 'mysql2', '~> 0.3.20'
|
44
|
-
|
45
|
-
gem 'pg', '~> 0.17.1'
|
46
|
-
end
|
47
|
-
|
48
|
-
platforms :jruby, :ruby_18 do
|
49
|
-
# shoulda-matchers > 2.0 is not compatible with Ruby18.
|
50
|
-
# Since we can't specify difference between JRuby 18/19, we need to use shoulda-matchers 1.5 for all JRuby testing.
|
51
|
-
gem 'shoulda-matchers', '~> 1.5'
|
52
|
-
end
|
53
|
-
|
54
|
-
platforms :jruby do
|
55
|
-
# Use jRuby's sqlite3 adapter for jRuby
|
56
|
-
gem 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
|
57
|
-
gem 'activerecord-jdbcpostgresql-adapter', '~> 1.3'
|
58
|
-
gem 'activerecord-jdbcmysql-adapter', '~> 1.3'
|
59
|
-
gem 'activerecord-jdbc-adapter', '1.3.15'
|
60
|
-
end
|
61
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
class AddObjectChangesToVersions < ActiveRecord::Migration
|
2
|
-
|
3
|
-
# The largest text column available in all supported RDBMS.
|
4
|
-
# See `create_versions.rb` for details.
|
5
|
-
TEXT_BYTES = 1_073_741_823
|
6
|
-
|
7
|
-
def change
|
8
|
-
add_column :versions, :object_changes, :text, :limit => TEXT_BYTES
|
9
|
-
end
|
10
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class CreateVersionAssociations < ActiveRecord::Migration
|
2
|
-
def self.up
|
3
|
-
create_table :version_associations do |t|
|
4
|
-
t.integer :version_id
|
5
|
-
t.string :foreign_key_name, :null => false
|
6
|
-
t.integer :foreign_key_id
|
7
|
-
end
|
8
|
-
add_index :version_associations, [:version_id]
|
9
|
-
add_index :version_associations, [:foreign_key_name, :foreign_key_id], :name => 'index_version_associations_on_foreign_key'
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.down
|
13
|
-
remove_index :version_associations, [:version_id]
|
14
|
-
remove_index :version_associations, :name => 'index_version_associations_on_foreign_key'
|
15
|
-
drop_table :version_associations
|
16
|
-
end
|
17
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
module PaperTrail
|
2
|
-
module AttributesSerialization
|
3
|
-
class NoOpAttribute
|
4
|
-
def type_cast_for_database(value)
|
5
|
-
value
|
6
|
-
end
|
7
|
-
|
8
|
-
def type_cast_from_database(data)
|
9
|
-
data
|
10
|
-
end
|
11
|
-
end
|
12
|
-
NO_OP_ATTRIBUTE = NoOpAttribute.new
|
13
|
-
|
14
|
-
class SerializedAttribute
|
15
|
-
def initialize(coder)
|
16
|
-
@coder = coder.respond_to?(:dump) ? coder : PaperTrail.serializer
|
17
|
-
end
|
18
|
-
|
19
|
-
def type_cast_for_database(value)
|
20
|
-
@coder.dump(value)
|
21
|
-
end
|
22
|
-
|
23
|
-
def type_cast_from_database(data)
|
24
|
-
@coder.load(data)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
SERIALIZE, DESERIALIZE =
|
29
|
-
if ::ActiveRecord::VERSION::MAJOR >= 5
|
30
|
-
[:serialize, :deserialize]
|
31
|
-
else
|
32
|
-
[:type_cast_for_database, :type_cast_from_database]
|
33
|
-
end
|
34
|
-
|
35
|
-
if ::ActiveRecord::VERSION::STRING < '4.2'
|
36
|
-
# Backport Rails 4.2 and later's `type_for_attribute` to build
|
37
|
-
# on a common interface.
|
38
|
-
def type_for_attribute(attr_name)
|
39
|
-
serialized_attribute_types[attr_name.to_s] || NO_OP_ATTRIBUTE
|
40
|
-
end
|
41
|
-
|
42
|
-
def serialized_attribute_types
|
43
|
-
@attribute_types ||= Hash[serialized_attributes.map do |attr_name, coder|
|
44
|
-
[attr_name, SerializedAttribute.new(coder)]
|
45
|
-
end]
|
46
|
-
end
|
47
|
-
private :serialized_attribute_types
|
48
|
-
end
|
49
|
-
|
50
|
-
# Used for `Version#object` attribute.
|
51
|
-
def serialize_attributes_for_paper_trail!(attributes)
|
52
|
-
alter_attributes_for_paper_trail!(SERIALIZE, attributes)
|
53
|
-
end
|
54
|
-
|
55
|
-
def unserialize_attributes_for_paper_trail!(attributes)
|
56
|
-
alter_attributes_for_paper_trail!(DESERIALIZE, attributes)
|
57
|
-
end
|
58
|
-
|
59
|
-
def alter_attributes_for_paper_trail!(serializer, attributes)
|
60
|
-
# Don't serialize before values before inserting into columns of type
|
61
|
-
# `JSON` on `PostgreSQL` databases.
|
62
|
-
return attributes if paper_trail_version_class.object_col_is_json?
|
63
|
-
|
64
|
-
attributes.each do |key, value|
|
65
|
-
attributes[key] = type_for_attribute(key).send(serializer, value)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# Used for Version#object_changes attribute.
|
70
|
-
def serialize_attribute_changes_for_paper_trail!(changes)
|
71
|
-
alter_attribute_changes_for_paper_trail!(SERIALIZE, changes)
|
72
|
-
end
|
73
|
-
|
74
|
-
def unserialize_attribute_changes_for_paper_trail!(changes)
|
75
|
-
alter_attribute_changes_for_paper_trail!(DESERIALIZE, changes)
|
76
|
-
end
|
77
|
-
|
78
|
-
def alter_attribute_changes_for_paper_trail!(serializer, changes)
|
79
|
-
# Don't serialize before values before inserting into columns of type
|
80
|
-
# `JSON` on `PostgreSQL` databases.
|
81
|
-
return changes if paper_trail_version_class.object_changes_col_is_json?
|
82
|
-
|
83
|
-
changes.clone.each do |key, change|
|
84
|
-
type = type_for_attribute(key)
|
85
|
-
changes[key] = Array(change).map { |value| type.send(serializer, value) }
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/object' # provides the `try` method
|
2
|
-
|
3
|
-
module PaperTrail
|
4
|
-
module Sinatra
|
5
|
-
|
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
|
-
::PaperTrail.whodunnit = user_for_paper_trail if ::PaperTrail.enabled?
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
::Sinatra.register PaperTrail::Sinatra if defined?(::Sinatra)
|
38
|
-
end
|
data/paper_trail.gemspec
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
2
|
-
require 'paper_trail/version_number'
|
3
|
-
|
4
|
-
Gem::Specification.new do |s|
|
5
|
-
s.name = 'paper_trail'
|
6
|
-
s.version = PaperTrail.version
|
7
|
-
s.platform = Gem::Platform::RUBY
|
8
|
-
s.summary = "Track changes to your models' data. Good for auditing or versioning."
|
9
|
-
s.description = s.summary
|
10
|
-
s.homepage = 'https://github.com/airblade/paper_trail'
|
11
|
-
s.authors = ['Andy Stewart', 'Ben Atkins']
|
12
|
-
s.email = 'batkinz@gmail.com'
|
13
|
-
s.license = 'MIT'
|
14
|
-
|
15
|
-
s.files = `git ls-files`.split("\n")
|
16
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
-
s.require_paths = ['lib']
|
19
|
-
|
20
|
-
s.required_rubygems_version = '>= 1.3.6'
|
21
|
-
|
22
|
-
s.add_dependency 'activerecord', ['>= 3.0', '< 6.0']
|
23
|
-
s.add_dependency 'activesupport', ['>= 3.0', '< 6.0']
|
24
|
-
s.add_dependency 'request_store', '~> 1.1'
|
25
|
-
|
26
|
-
s.add_development_dependency 'rake', '~> 10.1.1'
|
27
|
-
s.add_development_dependency 'shoulda', '~> 3.5'
|
28
|
-
# s.add_development_dependency 'shoulda-matchers', '~> 1.5' # needed for ActiveRecord < 4
|
29
|
-
s.add_development_dependency 'ffaker', '<= 1.31.0'
|
30
|
-
s.add_development_dependency 'railties', ['>= 3.0', '< 5.0']
|
31
|
-
s.add_development_dependency 'sinatra', '~> 1.0'
|
32
|
-
s.add_development_dependency 'rack-test', '>= 0.6'
|
33
|
-
s.add_development_dependency 'rspec-rails', '~> 3.1.0'
|
34
|
-
s.add_development_dependency 'generator_spec'
|
35
|
-
s.add_development_dependency 'database_cleaner', '~> 1.2'
|
36
|
-
s.add_development_dependency 'pry-nav'
|
37
|
-
|
38
|
-
# Allow time travel in testing. timecop is only supported after 1.9.2 but does a better cleanup at 'return'
|
39
|
-
if RUBY_VERSION < "1.9.2"
|
40
|
-
s.add_development_dependency 'delorean'
|
41
|
-
else
|
42
|
-
s.add_development_dependency 'timecop'
|
43
|
-
end
|
44
|
-
|
45
|
-
if defined?(JRUBY_VERSION)
|
46
|
-
s.add_development_dependency 'activerecord-jdbcsqlite3-adapter', '~> 1.3'
|
47
|
-
s.add_development_dependency 'activerecord-jdbcpostgresql-adapter', '~> 1.3'
|
48
|
-
s.add_development_dependency 'activerecord-jdbcmysql-adapter', '~> 1.3'
|
49
|
-
else
|
50
|
-
s.add_development_dependency 'sqlite3', '~> 1.2'
|
51
|
-
|
52
|
-
# We would prefer to only constrain mysql2 to '~> 0.3',
|
53
|
-
# but a rails bug (https://github.com/rails/rails/issues/21544)
|
54
|
-
# requires us to constrain to '~> 0.3.20' for now.
|
55
|
-
s.add_development_dependency 'mysql2', '~> 0.3.20'
|
56
|
-
|
57
|
-
s.add_development_dependency 'pg', '~> 0.17'
|
58
|
-
end
|
59
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'rails_helper'
|
2
|
-
require 'generator_spec/test_case'
|
3
|
-
require File.expand_path('../../../lib/generators/paper_trail/install_generator', __FILE__)
|
4
|
-
|
5
|
-
describe PaperTrail::InstallGenerator, :type => :generator do
|
6
|
-
include GeneratorSpec::TestCase
|
7
|
-
destination File.expand_path('../tmp', __FILE__)
|
8
|
-
|
9
|
-
after(:all) { prepare_destination } # cleanup the tmp directory
|
10
|
-
|
11
|
-
describe "no options" do
|
12
|
-
before(:all) do
|
13
|
-
prepare_destination
|
14
|
-
run_generator
|
15
|
-
end
|
16
|
-
|
17
|
-
it "generates a migration for creating the 'versions' table" do
|
18
|
-
expect(destination_root).to have_structure {
|
19
|
-
directory 'db' do
|
20
|
-
directory 'migrate' do
|
21
|
-
migration 'create_versions' do
|
22
|
-
contains 'class CreateVersions'
|
23
|
-
contains 'def change'
|
24
|
-
contains 'create_table :versions do |t|'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
}
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "`--with-changes` option set to `true`" do
|
33
|
-
before(:all) do
|
34
|
-
prepare_destination
|
35
|
-
run_generator %w(--with-changes)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "generates a migration for creating the 'versions' table" do
|
39
|
-
expect(destination_root).to have_structure {
|
40
|
-
directory 'db' do
|
41
|
-
directory 'migrate' do
|
42
|
-
migration 'create_versions' do
|
43
|
-
contains 'class CreateVersions'
|
44
|
-
contains 'def change'
|
45
|
-
contains 'create_table :versions do |t|'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
}
|
50
|
-
end
|
51
|
-
|
52
|
-
it "generates a migration for adding the 'object_changes' column to the 'versions' table" do
|
53
|
-
expect(destination_root).to have_structure {
|
54
|
-
directory 'db' do
|
55
|
-
directory 'migrate' do
|
56
|
-
migration 'add_object_changes_to_versions' do
|
57
|
-
contains 'class AddObjectChangesToVersions'
|
58
|
-
contains 'def change'
|
59
|
-
contains 'add_column :versions, :object_changes, :text'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
}
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|