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
@@ -1,13 +0,0 @@
|
|
1
|
-
# This custom serializer excludes nil values
|
2
|
-
module CustomJsonSerializer
|
3
|
-
extend PaperTrail::Serializers::JSON
|
4
|
-
|
5
|
-
def self.load(string)
|
6
|
-
parsed_value = super(string)
|
7
|
-
parsed_value.is_a?(Hash) ? parsed_value.reject { |k,v| k.blank? || v.blank? } : parsed_value
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.dump(object)
|
11
|
-
object.is_a?(Hash) ? super(object.reject { |k,v| v.nil? }) : super
|
12
|
-
end
|
13
|
-
end
|
data/test/dummy/Rakefile
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
-
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
|
-
|
4
|
-
require File.expand_path('../config/application', __FILE__)
|
5
|
-
require 'rake'
|
6
|
-
|
7
|
-
Dummy::Application.load_tasks
|
@@ -1,20 +0,0 @@
|
|
1
|
-
class ApplicationController < ActionController::Base
|
2
|
-
protect_from_forgery
|
3
|
-
|
4
|
-
def rescue_action(e)
|
5
|
-
raise e
|
6
|
-
end
|
7
|
-
|
8
|
-
# Returns id of hypothetical current user
|
9
|
-
def current_user
|
10
|
-
@current_user ||= OpenStruct.new(:id => 153).tap do |obj|
|
11
|
-
# Invoking `id` returns the `object_id` value in Ruby18 unless specifically overwritten
|
12
|
-
def obj.id; 153; end if RUBY_VERSION < '1.9'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def info_for_paper_trail
|
17
|
-
{:ip => request.remote_ip, :user_agent => request.user_agent}
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class ArticlesController < ApplicationController
|
2
|
-
def create
|
3
|
-
if PaperTrail.active_record_protected_attributes?
|
4
|
-
@article = Article.create params[:article]
|
5
|
-
else
|
6
|
-
@article = Article.create params.require(:article).permit!
|
7
|
-
end
|
8
|
-
head :ok
|
9
|
-
end
|
10
|
-
|
11
|
-
def current_user
|
12
|
-
'foobar'.tap do |string|
|
13
|
-
# Invoking `id` returns the `object_id` value in Ruby18 by default
|
14
|
-
string.class_eval { undef_method(:id) } if RUBY_VERSION < '1.9'
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
class WidgetsController < ApplicationController
|
2
|
-
|
3
|
-
def paper_trail_enabled_for_controller
|
4
|
-
request.user_agent != 'Disable User-Agent'
|
5
|
-
end
|
6
|
-
|
7
|
-
def create
|
8
|
-
if PaperTrail.active_record_protected_attributes?
|
9
|
-
@widget = Widget.create params[:widget]
|
10
|
-
else
|
11
|
-
@widget = Widget.create params[:widget].permit!
|
12
|
-
end
|
13
|
-
head :ok
|
14
|
-
end
|
15
|
-
|
16
|
-
def update
|
17
|
-
@widget = Widget.find params[:id]
|
18
|
-
if PaperTrail.active_record_protected_attributes?
|
19
|
-
@widget.update_attributes params[:widget]
|
20
|
-
else
|
21
|
-
@widget.update_attributes params[:widget].permit!
|
22
|
-
end
|
23
|
-
head :ok
|
24
|
-
end
|
25
|
-
|
26
|
-
def destroy
|
27
|
-
@widget = Widget.find params[:id]
|
28
|
-
@widget.destroy
|
29
|
-
head :ok
|
30
|
-
end
|
31
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class Article < ActiveRecord::Base
|
2
|
-
has_paper_trail :ignore => [:title, { :abstract => Proc.new { |obj| ['ignore abstract', 'Other abstract'].include? obj.abstract } } ],
|
3
|
-
:only => [:content, { :abstract => Proc.new { |obj| obj.abstract.present? } } ],
|
4
|
-
:skip => [:file_upload],
|
5
|
-
:meta => {
|
6
|
-
:answer => 42,
|
7
|
-
:action => :action_data_provider_method,
|
8
|
-
:question => Proc.new { "31 + 11 = #{31 + 11}" },
|
9
|
-
:article_id => Proc.new { |article| article.id },
|
10
|
-
:title => :title
|
11
|
-
}
|
12
|
-
|
13
|
-
def action_data_provider_method
|
14
|
-
self.object_id.to_s
|
15
|
-
end
|
16
|
-
end
|
@@ -1,9 +0,0 @@
|
|
1
|
-
class Book < ActiveRecord::Base
|
2
|
-
has_many :authorships, :dependent => :destroy
|
3
|
-
has_many :authors, :through => :authorships, :source => :person
|
4
|
-
|
5
|
-
has_many :editorships, :dependent => :destroy
|
6
|
-
has_many :editors, :through => :editorships
|
7
|
-
|
8
|
-
has_paper_trail
|
9
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
class CallbackModifier < ActiveRecord::Base
|
2
|
-
has_paper_trail :on => []
|
3
|
-
|
4
|
-
def test_destroy
|
5
|
-
transaction do
|
6
|
-
run_callbacks(:destroy) do
|
7
|
-
self.deleted = true
|
8
|
-
save!
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def flagged_deleted?
|
14
|
-
deleted?
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class BeforeDestroyModifier < CallbackModifier
|
19
|
-
has_paper_trail :on => []
|
20
|
-
paper_trail_on_destroy :before
|
21
|
-
end
|
22
|
-
|
23
|
-
class AfterDestroyModifier < CallbackModifier
|
24
|
-
has_paper_trail :on => []
|
25
|
-
paper_trail_on_destroy :after
|
26
|
-
end
|
27
|
-
|
28
|
-
class NoArgDestroyModifier < CallbackModifier
|
29
|
-
has_paper_trail :on => []
|
30
|
-
paper_trail_on_destroy
|
31
|
-
end
|
32
|
-
|
33
|
-
class UpdateModifier < CallbackModifier
|
34
|
-
has_paper_trail :on => []
|
35
|
-
paper_trail_on_update
|
36
|
-
end
|
37
|
-
|
38
|
-
class CreateModifier < CallbackModifier
|
39
|
-
has_paper_trail :on => []
|
40
|
-
paper_trail_on_create
|
41
|
-
end
|
42
|
-
|
43
|
-
class DefaultModifier < CallbackModifier
|
44
|
-
has_paper_trail
|
45
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
class Person < ActiveRecord::Base
|
2
|
-
has_many :authorships, :dependent => :destroy
|
3
|
-
has_many :books, :through => :authorships
|
4
|
-
has_paper_trail
|
5
|
-
|
6
|
-
# Convert strings to TimeZone objects when assigned
|
7
|
-
def time_zone=(value)
|
8
|
-
if value.is_a? ActiveSupport::TimeZone
|
9
|
-
super
|
10
|
-
else
|
11
|
-
zone = ::Time.find_zone(value) # nil if can't find time zone
|
12
|
-
super zone
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Store TimeZone objects as strings when serialized to database
|
17
|
-
class TimeZoneSerializer
|
18
|
-
class << self
|
19
|
-
def dump(zone)
|
20
|
-
zone.try(:name)
|
21
|
-
end
|
22
|
-
|
23
|
-
def load(value)
|
24
|
-
::Time.find_zone!(value) rescue nil
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def dump(zone)
|
29
|
-
self.class.dump(zone)
|
30
|
-
end
|
31
|
-
|
32
|
-
def load(value)
|
33
|
-
self.class.load(value)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
serialize :time_zone, TimeZoneSerializer.new
|
38
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# Example from 'Overwriting default accessors' in ActiveRecord::Base.
|
2
|
-
class Song < ActiveRecord::Base
|
3
|
-
has_paper_trail
|
4
|
-
attr_accessor :name
|
5
|
-
|
6
|
-
# Uses an integer of seconds to hold the length of the song
|
7
|
-
def length=(minutes)
|
8
|
-
write_attribute(:length, minutes.to_i * 60)
|
9
|
-
end
|
10
|
-
def length
|
11
|
-
read_attribute(:length) / 60
|
12
|
-
end
|
13
|
-
|
14
|
-
# override attributes hashes like some libraries do
|
15
|
-
def attributes_with_name
|
16
|
-
if name
|
17
|
-
attributes_without_name.merge(:name => name)
|
18
|
-
else
|
19
|
-
attributes_without_name
|
20
|
-
end
|
21
|
-
end
|
22
|
-
alias_method_chain :attributes, :name
|
23
|
-
|
24
|
-
def changed_attributes_with_name
|
25
|
-
if name
|
26
|
-
changed_attributes_without_name.merge(:name => name)
|
27
|
-
else
|
28
|
-
changed_attributes_without_name
|
29
|
-
end
|
30
|
-
end
|
31
|
-
alias_method_chain :changed_attributes, :name
|
32
|
-
end
|