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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/paper_trail/install_generator.rb +91 -17
  3. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb.erb +12 -0
  4. data/lib/generators/paper_trail/templates/{add_transaction_id_column_to_versions.rb → add_transaction_id_column_to_versions.rb.erb} +3 -1
  5. data/lib/generators/paper_trail/templates/create_version_associations.rb.erb +22 -0
  6. data/lib/generators/paper_trail/templates/{create_versions.rb → create_versions.rb.erb} +9 -7
  7. data/lib/paper_trail.rb +180 -148
  8. data/lib/paper_trail/attribute_serializers/README.md +10 -0
  9. data/lib/paper_trail/attribute_serializers/cast_attribute_serializer.rb +80 -0
  10. data/lib/paper_trail/attribute_serializers/legacy_active_record_shim.rb +48 -0
  11. data/lib/paper_trail/attribute_serializers/object_attribute.rb +39 -0
  12. data/lib/paper_trail/attribute_serializers/object_changes_attribute.rb +42 -0
  13. data/lib/paper_trail/cleaner.rb +16 -10
  14. data/lib/paper_trail/config.rb +28 -27
  15. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
  16. data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
  17. data/lib/paper_trail/frameworks/cucumber.rb +1 -0
  18. data/lib/paper_trail/frameworks/rails.rb +2 -7
  19. data/lib/paper_trail/frameworks/rails/controller.rb +20 -18
  20. data/lib/paper_trail/frameworks/rails/engine.rb +6 -1
  21. data/lib/paper_trail/frameworks/rspec.rb +17 -6
  22. data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
  23. data/lib/paper_trail/has_paper_trail.rb +25 -503
  24. data/lib/paper_trail/model_config.rb +207 -0
  25. data/lib/paper_trail/queries/versions/where_object.rb +60 -0
  26. data/lib/paper_trail/queries/versions/where_object_changes.rb +68 -0
  27. data/lib/paper_trail/record_history.rb +2 -12
  28. data/lib/paper_trail/record_trail.rb +573 -0
  29. data/lib/paper_trail/reifier.rb +164 -215
  30. data/lib/paper_trail/reifiers/belongs_to.rb +48 -0
  31. data/lib/paper_trail/reifiers/has_and_belongs_to_many.rb +50 -0
  32. data/lib/paper_trail/reifiers/has_many.rb +110 -0
  33. data/lib/paper_trail/reifiers/has_many_through.rb +90 -0
  34. data/lib/paper_trail/reifiers/has_one.rb +76 -0
  35. data/lib/paper_trail/serializers/json.rb +16 -7
  36. data/lib/paper_trail/serializers/yaml.rb +9 -13
  37. data/lib/paper_trail/version_association_concern.rb +3 -5
  38. data/lib/paper_trail/version_concern.rb +138 -111
  39. data/lib/paper_trail/version_number.rb +10 -9
  40. metadata +95 -327
  41. data/.gitignore +0 -22
  42. data/.rspec +0 -2
  43. data/.travis.yml +0 -41
  44. data/CHANGELOG.md +0 -362
  45. data/CONTRIBUTING.md +0 -84
  46. data/Gemfile +0 -2
  47. data/MIT-LICENSE +0 -20
  48. data/README.md +0 -1535
  49. data/Rakefile +0 -30
  50. data/doc/bug_report_template.rb +0 -65
  51. data/gemfiles/ar3.gemfile +0 -61
  52. data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +0 -10
  53. data/lib/generators/paper_trail/templates/create_version_associations.rb +0 -17
  54. data/lib/paper_trail/attributes_serialization.rb +0 -89
  55. data/lib/paper_trail/frameworks/sinatra.rb +0 -38
  56. data/paper_trail.gemspec +0 -59
  57. data/spec/generators/install_generator_spec.rb +0 -67
  58. data/spec/models/animal_spec.rb +0 -36
  59. data/spec/models/boolit_spec.rb +0 -48
  60. data/spec/models/callback_modifier_spec.rb +0 -96
  61. data/spec/models/fluxor_spec.rb +0 -19
  62. data/spec/models/gadget_spec.rb +0 -70
  63. data/spec/models/joined_version_spec.rb +0 -47
  64. data/spec/models/json_version_spec.rb +0 -103
  65. data/spec/models/kitchen/banana_spec.rb +0 -14
  66. data/spec/models/not_on_update_spec.rb +0 -19
  67. data/spec/models/post_with_status_spec.rb +0 -17
  68. data/spec/models/skipper_spec.rb +0 -46
  69. data/spec/models/thing_spec.rb +0 -11
  70. data/spec/models/version_spec.rb +0 -239
  71. data/spec/models/widget_spec.rb +0 -298
  72. data/spec/modules/paper_trail_spec.rb +0 -27
  73. data/spec/modules/version_concern_spec.rb +0 -32
  74. data/spec/modules/version_number_spec.rb +0 -44
  75. data/spec/paper_trail/config_spec.rb +0 -52
  76. data/spec/paper_trail_spec.rb +0 -66
  77. data/spec/rails_helper.rb +0 -34
  78. data/spec/requests/articles_spec.rb +0 -30
  79. data/spec/spec_helper.rb +0 -95
  80. data/spec/support/alt_db_init.rb +0 -59
  81. data/test/custom_json_serializer.rb +0 -13
  82. data/test/dummy/Rakefile +0 -7
  83. data/test/dummy/app/controllers/application_controller.rb +0 -20
  84. data/test/dummy/app/controllers/articles_controller.rb +0 -17
  85. data/test/dummy/app/controllers/test_controller.rb +0 -5
  86. data/test/dummy/app/controllers/widgets_controller.rb +0 -31
  87. data/test/dummy/app/helpers/application_helper.rb +0 -2
  88. data/test/dummy/app/models/animal.rb +0 -6
  89. data/test/dummy/app/models/article.rb +0 -16
  90. data/test/dummy/app/models/authorship.rb +0 -5
  91. data/test/dummy/app/models/book.rb +0 -9
  92. data/test/dummy/app/models/boolit.rb +0 -4
  93. data/test/dummy/app/models/callback_modifier.rb +0 -45
  94. data/test/dummy/app/models/cat.rb +0 -2
  95. data/test/dummy/app/models/chapter.rb +0 -9
  96. data/test/dummy/app/models/citation.rb +0 -5
  97. data/test/dummy/app/models/customer.rb +0 -4
  98. data/test/dummy/app/models/document.rb +0 -4
  99. data/test/dummy/app/models/dog.rb +0 -2
  100. data/test/dummy/app/models/editor.rb +0 -4
  101. data/test/dummy/app/models/editorship.rb +0 -5
  102. data/test/dummy/app/models/elephant.rb +0 -3
  103. data/test/dummy/app/models/fluxor.rb +0 -3
  104. data/test/dummy/app/models/foo_widget.rb +0 -2
  105. data/test/dummy/app/models/fruit.rb +0 -5
  106. data/test/dummy/app/models/gadget.rb +0 -3
  107. data/test/dummy/app/models/kitchen/banana.rb +0 -5
  108. data/test/dummy/app/models/legacy_widget.rb +0 -4
  109. data/test/dummy/app/models/line_item.rb +0 -4
  110. data/test/dummy/app/models/not_on_update.rb +0 -4
  111. data/test/dummy/app/models/order.rb +0 -5
  112. data/test/dummy/app/models/paragraph.rb +0 -5
  113. data/test/dummy/app/models/person.rb +0 -38
  114. data/test/dummy/app/models/post.rb +0 -3
  115. data/test/dummy/app/models/post_with_status.rb +0 -8
  116. data/test/dummy/app/models/protected_widget.rb +0 -3
  117. data/test/dummy/app/models/quotation.rb +0 -5
  118. data/test/dummy/app/models/section.rb +0 -6
  119. data/test/dummy/app/models/skipper.rb +0 -6
  120. data/test/dummy/app/models/song.rb +0 -32
  121. data/test/dummy/app/models/thing.rb +0 -3
  122. data/test/dummy/app/models/translation.rb +0 -4
  123. data/test/dummy/app/models/whatchamajigger.rb +0 -4
  124. data/test/dummy/app/models/widget.rb +0 -15
  125. data/test/dummy/app/models/wotsit.rb +0 -8
  126. data/test/dummy/app/versions/joined_version.rb +0 -5
  127. data/test/dummy/app/versions/json_version.rb +0 -3
  128. data/test/dummy/app/versions/kitchen/banana_version.rb +0 -5
  129. data/test/dummy/app/versions/post_version.rb +0 -3
  130. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  131. data/test/dummy/config.ru +0 -4
  132. data/test/dummy/config/application.rb +0 -69
  133. data/test/dummy/config/boot.rb +0 -10
  134. data/test/dummy/config/database.mysql.yml +0 -19
  135. data/test/dummy/config/database.postgres.yml +0 -15
  136. data/test/dummy/config/database.sqlite.yml +0 -15
  137. data/test/dummy/config/environment.rb +0 -5
  138. data/test/dummy/config/environments/development.rb +0 -40
  139. data/test/dummy/config/environments/production.rb +0 -73
  140. data/test/dummy/config/environments/test.rb +0 -41
  141. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  142. data/test/dummy/config/initializers/inflections.rb +0 -10
  143. data/test/dummy/config/initializers/mime_types.rb +0 -5
  144. data/test/dummy/config/initializers/paper_trail.rb +0 -10
  145. data/test/dummy/config/initializers/secret_token.rb +0 -7
  146. data/test/dummy/config/initializers/session_store.rb +0 -8
  147. data/test/dummy/config/locales/en.yml +0 -5
  148. data/test/dummy/config/routes.rb +0 -4
  149. data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +0 -287
  150. data/test/dummy/db/schema.rb +0 -246
  151. data/test/dummy/script/rails +0 -6
  152. data/test/functional/controller_test.rb +0 -91
  153. data/test/functional/enabled_for_controller_test.rb +0 -29
  154. data/test/functional/modular_sinatra_test.rb +0 -48
  155. data/test/functional/sinatra_test.rb +0 -49
  156. data/test/functional/thread_safety_test.rb +0 -48
  157. data/test/paper_trail_test.rb +0 -38
  158. data/test/test_helper.rb +0 -105
  159. data/test/time_travel_helper.rb +0 -15
  160. data/test/unit/associations_test.rb +0 -726
  161. data/test/unit/cleaner_test.rb +0 -182
  162. data/test/unit/inheritance_column_test.rb +0 -43
  163. data/test/unit/model_test.rb +0 -1373
  164. data/test/unit/protected_attrs_test.rb +0 -47
  165. data/test/unit/serializer_test.rb +0 -117
  166. data/test/unit/serializers/json_test.rb +0 -88
  167. data/test/unit/serializers/mixin_json_test.rb +0 -36
  168. data/test/unit/serializers/mixin_yaml_test.rb +0 -49
  169. data/test/unit/serializers/yaml_test.rb +0 -52
  170. data/test/unit/timestamp_test.rb +0 -43
  171. 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,5 +0,0 @@
1
- class TestController < ActionController::Base
2
- def user_for_paper_trail
3
- Thread.current.object_id
4
- end
5
- 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,2 +0,0 @@
1
- module ApplicationHelper
2
- end
@@ -1,6 +0,0 @@
1
- class Animal < ActiveRecord::Base
2
- has_paper_trail
3
- self.inheritance_column = 'species'
4
-
5
- attr_accessible :species, :name if ::PaperTrail.active_record_protected_attributes?
6
- 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,5 +0,0 @@
1
- class Authorship < ActiveRecord::Base
2
- belongs_to :book
3
- belongs_to :person
4
- has_paper_trail
5
- 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,4 +0,0 @@
1
- class Boolit < ActiveRecord::Base
2
- default_scope { where(:scoped => true) }
3
- has_paper_trail
4
- 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,2 +0,0 @@
1
- class Cat < Animal
2
- end
@@ -1,9 +0,0 @@
1
- class Chapter < ActiveRecord::Base
2
- has_many :sections, :dependent => :destroy
3
- has_many :paragraphs, :through => :sections
4
-
5
- has_many :quotations, :dependent => :destroy
6
- has_many :citations, :through => :quotations
7
-
8
- has_paper_trail
9
- end
@@ -1,5 +0,0 @@
1
- class Citation < ActiveRecord::Base
2
- belongs_to :quotation
3
-
4
- has_paper_trail
5
- end
@@ -1,4 +0,0 @@
1
- class Customer < ActiveRecord::Base
2
- has_many :orders, :dependent => :destroy
3
- has_paper_trail
4
- end
@@ -1,4 +0,0 @@
1
- class Document < ActiveRecord::Base
2
- has_paper_trail :versions => :paper_trail_versions,
3
- :on => [:create, :update]
4
- end
@@ -1,2 +0,0 @@
1
- class Dog < Animal
2
- end
@@ -1,4 +0,0 @@
1
- # to demonstrate a has_through association that does not have paper_trail enabled
2
- class Editor < ActiveRecord::Base
3
- has_many :editorships, :dependent => :destroy
4
- end
@@ -1,5 +0,0 @@
1
- class Editorship < ActiveRecord::Base
2
- belongs_to :book
3
- belongs_to :editor
4
- has_paper_trail
5
- end
@@ -1,3 +0,0 @@
1
- class Elephant < Animal
2
- paper_trail_off!
3
- end
@@ -1,3 +0,0 @@
1
- class Fluxor < ActiveRecord::Base
2
- belongs_to :widget
3
- end
@@ -1,2 +0,0 @@
1
- class FooWidget < Widget
2
- end
@@ -1,5 +0,0 @@
1
- class Fruit < ActiveRecord::Base
2
- if ENV['DB'] == 'postgres' || JsonVersion.table_exists?
3
- has_paper_trail :class_name => 'JsonVersion'
4
- end
5
- end
@@ -1,3 +0,0 @@
1
- class Gadget < ActiveRecord::Base
2
- has_paper_trail :ignore => :brand
3
- end
@@ -1,5 +0,0 @@
1
- module Kitchen
2
- class Banana < ActiveRecord::Base
3
- has_paper_trail :class_name => "Kitchen::BananaVersion"
4
- end
5
- end
@@ -1,4 +0,0 @@
1
- class LegacyWidget < ActiveRecord::Base
2
- has_paper_trail :ignore => :version,
3
- :version => 'custom_version'
4
- end
@@ -1,4 +0,0 @@
1
- class LineItem < ActiveRecord::Base
2
- belongs_to :order, :dependent => :destroy
3
- has_paper_trail
4
- end
@@ -1,4 +0,0 @@
1
- # This model does not record versions when updated.
2
- class NotOnUpdate < ActiveRecord::Base
3
- has_paper_trail :on => [:create, :destroy]
4
- end
@@ -1,5 +0,0 @@
1
- class Order < ActiveRecord::Base
2
- belongs_to :customer
3
- has_many :line_items
4
- has_paper_trail
5
- end
@@ -1,5 +0,0 @@
1
- class Paragraph < ActiveRecord::Base
2
- belongs_to :section
3
-
4
- has_paper_trail
5
- 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,3 +0,0 @@
1
- class Post < ActiveRecord::Base
2
- has_paper_trail :class_name => "PostVersion"
3
- end
@@ -1,8 +0,0 @@
1
- class PostWithStatus < ActiveRecord::Base
2
- has_paper_trail
3
-
4
- # ActiveRecord::Enum is only supported in AR4.1+
5
- if defined?(ActiveRecord::Enum)
6
- enum :status => { :draft => 0, :published => 1, :archived => 2 }
7
- end
8
- end
@@ -1,3 +0,0 @@
1
- class ProtectedWidget < Widget
2
- attr_accessible :name, :a_text if ::PaperTrail.active_record_protected_attributes?
3
- end
@@ -1,5 +0,0 @@
1
- class Quotation < ActiveRecord::Base
2
- belongs_to :chapter
3
- has_many :citations, :dependent => :destroy
4
- has_paper_trail
5
- end
@@ -1,6 +0,0 @@
1
- class Section < ActiveRecord::Base
2
- belongs_to :chapter
3
- has_many :paragraphs, :dependent => :destroy
4
-
5
- has_paper_trail
6
- end
@@ -1,6 +0,0 @@
1
- class Skipper < ActiveRecord::Base
2
- has_paper_trail(
3
- :ignore => [:created_at],
4
- :skip => [:another_timestamp]
5
- )
6
- 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