paper_trail 4.2.0 → 5.0.0
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/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +28 -9
 - data/.github/ISSUE_TEMPLATE.md +13 -0
 - data/.gitignore +2 -1
 - data/.rubocop.yml +100 -0
 - data/.rubocop_todo.yml +14 -0
 - data/.travis.yml +8 -9
 - data/Appraisals +41 -0
 - data/CHANGELOG.md +49 -9
 - data/Gemfile +1 -1
 - data/README.md +130 -109
 - data/Rakefile +19 -19
 - data/doc/bug_report_template.rb +20 -14
 - data/gemfiles/ar3.gemfile +10 -53
 - data/gemfiles/ar4.gemfile +7 -0
 - data/gemfiles/ar5.gemfile +13 -0
 - data/lib/generators/paper_trail/install_generator.rb +26 -18
 - data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +4 -2
 - data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
 - data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
 - data/lib/generators/paper_trail/templates/create_versions.rb +39 -5
 - data/lib/paper_trail.rb +169 -146
 - data/lib/paper_trail/attributes_serialization.rb +89 -17
 - data/lib/paper_trail/cleaner.rb +15 -9
 - data/lib/paper_trail/config.rb +28 -11
 - data/lib/paper_trail/frameworks/active_record.rb +4 -0
 - 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 +29 -9
 - data/lib/paper_trail/frameworks/rails/engine.rb +7 -1
 - data/lib/paper_trail/frameworks/rspec.rb +5 -5
 - data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
 - data/lib/paper_trail/frameworks/sinatra.rb +6 -4
 - data/lib/paper_trail/has_paper_trail.rb +199 -106
 - data/lib/paper_trail/record_history.rb +1 -3
 - data/lib/paper_trail/reifier.rb +297 -118
 - data/lib/paper_trail/serializers/json.rb +3 -3
 - data/lib/paper_trail/serializers/yaml.rb +27 -8
 - data/lib/paper_trail/version_association_concern.rb +3 -1
 - data/lib/paper_trail/version_concern.rb +75 -35
 - data/lib/paper_trail/version_number.rb +6 -9
 - data/paper_trail.gemspec +44 -51
 - data/spec/generators/install_generator_spec.rb +24 -25
 - data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
 - data/spec/models/animal_spec.rb +12 -12
 - data/spec/models/boolit_spec.rb +8 -8
 - data/spec/models/callback_modifier_spec.rb +47 -47
 - data/spec/models/car_spec.rb +13 -0
 - data/spec/models/fluxor_spec.rb +3 -3
 - data/spec/models/gadget_spec.rb +19 -19
 - data/spec/models/joined_version_spec.rb +3 -3
 - data/spec/models/json_version_spec.rb +23 -24
 - data/spec/models/kitchen/banana_spec.rb +3 -3
 - data/spec/models/not_on_update_spec.rb +7 -4
 - data/spec/models/post_with_status_spec.rb +13 -3
 - data/spec/models/skipper_spec.rb +10 -10
 - data/spec/models/thing_spec.rb +4 -4
 - data/spec/models/truck_spec.rb +5 -0
 - data/spec/models/vehicle_spec.rb +5 -0
 - data/spec/models/version_spec.rb +103 -59
 - data/spec/models/widget_spec.rb +82 -52
 - data/spec/modules/paper_trail_spec.rb +2 -2
 - data/spec/modules/version_concern_spec.rb +11 -12
 - data/spec/modules/version_number_spec.rb +2 -4
 - data/spec/paper_trail/config_spec.rb +10 -29
 - data/spec/paper_trail_spec.rb +16 -14
 - data/spec/rails_helper.rb +10 -9
 - data/spec/requests/articles_spec.rb +11 -7
 - data/spec/spec_helper.rb +41 -22
 - data/spec/support/alt_db_init.rb +8 -13
 - data/test/custom_json_serializer.rb +3 -3
 - data/test/dummy/Rakefile +2 -2
 - data/test/dummy/app/controllers/application_controller.rb +21 -8
 - data/test/dummy/app/controllers/articles_controller.rb +11 -8
 - data/test/dummy/app/controllers/widgets_controller.rb +13 -12
 - data/test/dummy/app/models/animal.rb +1 -1
 - data/test/dummy/app/models/article.rb +19 -11
 - data/test/dummy/app/models/authorship.rb +1 -1
 - data/test/dummy/app/models/bar_habtm.rb +4 -0
 - data/test/dummy/app/models/book.rb +4 -4
 - data/test/dummy/app/models/boolit.rb +1 -1
 - data/test/dummy/app/models/callback_modifier.rb +6 -6
 - data/test/dummy/app/models/car.rb +3 -0
 - data/test/dummy/app/models/chapter.rb +4 -4
 - data/test/dummy/app/models/customer.rb +1 -1
 - data/test/dummy/app/models/document.rb +2 -2
 - data/test/dummy/app/models/editor.rb +1 -1
 - data/test/dummy/app/models/foo_habtm.rb +4 -0
 - data/test/dummy/app/models/fruit.rb +2 -2
 - data/test/dummy/app/models/gadget.rb +1 -1
 - data/test/dummy/app/models/kitchen/banana.rb +1 -1
 - data/test/dummy/app/models/legacy_widget.rb +2 -2
 - data/test/dummy/app/models/line_item.rb +1 -1
 - data/test/dummy/app/models/not_on_update.rb +1 -1
 - data/test/dummy/app/models/person.rb +6 -6
 - data/test/dummy/app/models/post.rb +1 -1
 - data/test/dummy/app/models/post_with_status.rb +1 -1
 - data/test/dummy/app/models/quotation.rb +1 -1
 - data/test/dummy/app/models/section.rb +1 -1
 - data/test/dummy/app/models/skipper.rb +2 -2
 - data/test/dummy/app/models/song.rb +13 -4
 - data/test/dummy/app/models/thing.rb +2 -2
 - data/test/dummy/app/models/translation.rb +2 -2
 - data/test/dummy/app/models/truck.rb +4 -0
 - data/test/dummy/app/models/vehicle.rb +4 -0
 - data/test/dummy/app/models/whatchamajigger.rb +1 -1
 - data/test/dummy/app/models/widget.rb +7 -6
 - data/test/dummy/app/versions/joined_version.rb +4 -3
 - data/test/dummy/app/versions/json_version.rb +1 -1
 - data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
 - data/test/dummy/app/versions/post_version.rb +2 -2
 - data/test/dummy/config.ru +1 -1
 - data/test/dummy/config/application.rb +20 -9
 - data/test/dummy/config/boot.rb +5 -5
 - data/test/dummy/config/environment.rb +1 -1
 - data/test/dummy/config/environments/development.rb +4 -3
 - data/test/dummy/config/environments/production.rb +3 -2
 - data/test/dummy/config/environments/test.rb +15 -5
 - data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
 - data/test/dummy/config/initializers/paper_trail.rb +1 -2
 - data/test/dummy/config/initializers/secret_token.rb +3 -1
 - data/test/dummy/config/initializers/session_store.rb +1 -1
 - data/test/dummy/config/routes.rb +2 -2
 - data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +120 -74
 - data/test/dummy/db/schema.rb +29 -6
 - data/test/dummy/script/rails +6 -4
 - data/test/functional/controller_test.rb +34 -35
 - data/test/functional/enabled_for_controller_test.rb +6 -7
 - data/test/functional/modular_sinatra_test.rb +43 -38
 - data/test/functional/sinatra_test.rb +49 -40
 - data/test/functional/thread_safety_test.rb +4 -6
 - data/test/paper_trail_test.rb +15 -14
 - data/test/test_helper.rb +68 -44
 - data/test/time_travel_helper.rb +1 -15
 - data/test/unit/associations_test.rb +517 -251
 - data/test/unit/cleaner_test.rb +66 -60
 - data/test/unit/inheritance_column_test.rb +17 -17
 - data/test/unit/model_test.rb +611 -504
 - data/test/unit/protected_attrs_test.rb +16 -12
 - data/test/unit/serializer_test.rb +44 -43
 - data/test/unit/serializers/json_test.rb +17 -18
 - data/test/unit/serializers/mixin_json_test.rb +15 -14
 - data/test/unit/serializers/mixin_yaml_test.rb +20 -16
 - data/test/unit/serializers/yaml_test.rb +12 -13
 - data/test/unit/timestamp_test.rb +10 -12
 - data/test/unit/version_test.rb +7 -7
 - metadata +92 -40
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a998b8383ac675662fac129fce0617b3c2f13351
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c431eeedc5dec2b6882775a95ea6ef79df63f2a9
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 1108f2949a0a98f6ad9e7f75eba6b2d40d21209de2beb6c856142930aa58b8f0f7c65fa1cf9fe73dd9fc3b70c22afc8886846581d992eb0ac9934504205db960
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 1db8e0b3427d3801672829e014dcf1035f55ea75fecb54bebbeb5d6d54f0203d57bedce6ed5307fd5dfa8a68ebd971bc16ed4ad923fac4d9a46ff1c9f1aea0e5
         
     | 
| 
         @@ -3,7 +3,7 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            Thanks for your interest in PaperTrail!
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            Ask usage questions on Stack Overflow:
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
            https://stackoverflow.com/tags/paper-trail-gem
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            **Please do not use github issues to ask usage questions.**
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
         @@ -20,8 +20,15 @@ Please use our [bug report template][1]. 
     | 
|
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            Testing is a little awkward because the test suite:
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
            1.  
     | 
| 
       24 
     | 
    
         
            -
            1.  
     | 
| 
      
 23 
     | 
    
         
            +
            1. Supports three major versions of rails: 3, 4, 5
         
     | 
| 
      
 24 
     | 
    
         
            +
            1. Contains a "dummy" rails app with three databases (test, foo, and bar)
         
     | 
| 
      
 25 
     | 
    
         
            +
            1. Supports three different RDBMS': sqlite, mysql, and postgres
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            Test against rails 3:
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ```
         
     | 
| 
      
 30 
     | 
    
         
            +
            bundle exec appraisal ar3 rake
         
     | 
| 
      
 31 
     | 
    
         
            +
            ```
         
     | 
| 
       25 
32 
     | 
    
         | 
| 
       26 
33 
     | 
    
         
             
            Run tests with sqlite:
         
     | 
| 
       27 
34 
     | 
    
         | 
| 
         @@ -69,16 +76,28 @@ DB=postgres bundle exec rake prepare 
     | 
|
| 
       69 
76 
     | 
    
         
             
            # If this is the first test run ever, create databases.
         
     | 
| 
       70 
77 
     | 
    
         
             
            # Unlike mysql, use create/migrate instead of setup.
         
     | 
| 
       71 
78 
     | 
    
         
             
            cd test/dummy
         
     | 
| 
       72 
     | 
    
         
            -
            RAILS_ENV=test bundle exec rake db:create
         
     | 
| 
       73 
     | 
    
         
            -
            RAILS_ENV=test bundle exec rake db:migrate
         
     | 
| 
       74 
     | 
    
         
            -
            RAILS_ENV=foo bundle exec rake db:create
         
     | 
| 
       75 
     | 
    
         
            -
            RAILS_ENV=foo bundle exec rake db:migrate
         
     | 
| 
       76 
     | 
    
         
            -
            RAILS_ENV=bar bundle exec rake db:create
         
     | 
| 
       77 
     | 
    
         
            -
            RAILS_ENV=bar bundle exec rake db:migrate
         
     | 
| 
      
 79 
     | 
    
         
            +
            DB=postgres RAILS_ENV=test bundle exec rake db:create
         
     | 
| 
      
 80 
     | 
    
         
            +
            DB=postgres RAILS_ENV=test bundle exec rake db:migrate
         
     | 
| 
      
 81 
     | 
    
         
            +
            DB=postgres RAILS_ENV=foo bundle exec rake db:create
         
     | 
| 
      
 82 
     | 
    
         
            +
            DB=postgres RAILS_ENV=foo bundle exec rake db:migrate
         
     | 
| 
      
 83 
     | 
    
         
            +
            DB=postgres RAILS_ENV=bar bundle exec rake db:create
         
     | 
| 
      
 84 
     | 
    
         
            +
            DB=postgres RAILS_ENV=bar bundle exec rake db:migrate
         
     | 
| 
       78 
85 
     | 
    
         
             
            cd ../..
         
     | 
| 
       79 
86 
     | 
    
         | 
| 
       80 
87 
     | 
    
         
             
            # Run tests
         
     | 
| 
       81 
88 
     | 
    
         
             
            DB=postgres bundle exec rake
         
     | 
| 
       82 
89 
     | 
    
         
             
            ```
         
     | 
| 
       83 
90 
     | 
    
         | 
| 
      
 91 
     | 
    
         
            +
            ### Releases
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            1. Set the version in lib/paper_trail/version_number.rb
         
     | 
| 
      
 94 
     | 
    
         
            +
              - Set PRE to nil unless it's a pre-release (beta, rc, etc.)
         
     | 
| 
      
 95 
     | 
    
         
            +
            1. In the changelog, replace "Unreleased" with the date.
         
     | 
| 
      
 96 
     | 
    
         
            +
            1. In the readme,
         
     | 
| 
      
 97 
     | 
    
         
            +
              - remove "unreleased" from the doc versions table
         
     | 
| 
      
 98 
     | 
    
         
            +
              - update any other references to version number
         
     | 
| 
      
 99 
     | 
    
         
            +
            1. Commit and tag with `git tag -a -m "v5.0.0" "v5.0.0"`
         
     | 
| 
      
 100 
     | 
    
         
            +
            1. `git push --tags origin master`
         
     | 
| 
      
 101 
     | 
    
         
            +
            1. `gem push paper_trail`
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
       84 
103 
     | 
    
         
             
            [1]: https://github.com/airblade/paper_trail/blob/master/doc/bug_report_template.rb
         
     | 
| 
         @@ -0,0 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Thanks for your interest in PaperTrail! Our volunteers' time is limited, so we
         
     | 
| 
      
 2 
     | 
    
         
            +
            can only respond on GitHub to bug reports and feature requests. Please ask
         
     | 
| 
      
 3 
     | 
    
         
            +
            *usage questions* on StackOverflow (https://stackoverflow.com/tags/paper-trail-gem)
         
     | 
| 
      
 4 
     | 
    
         
            +
            so that the whole community has a chance to answer your question.
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            Please use our template
         
     | 
| 
      
 7 
     | 
    
         
            +
            (https://github.com/airblade/paper_trail/blob/master/doc/bug_report_template.rb)
         
     | 
| 
      
 8 
     | 
    
         
            +
            when reporting bugs.
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            For other questions, please see our contributing guide.
         
     | 
| 
      
 11 
     | 
    
         
            +
            (https://github.com/airblade/paper_trail/blob/master/.github/CONTRIBUTING.MD)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            Thanks for your contribution!
         
     | 
    
        data/.gitignore
    CHANGED
    
    | 
         @@ -1,3 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            gemfiles/*.lock
         
     | 
| 
       1 
2 
     | 
    
         
             
            NOTES
         
     | 
| 
       2 
3 
     | 
    
         
             
            test/debug.log
         
     | 
| 
       3 
4 
     | 
    
         
             
            test/paper_trail_plugin.sqlite3.db
         
     | 
| 
         @@ -12,7 +13,6 @@ pkg/* 
     | 
|
| 
       12 
13 
     | 
    
         
             
            .bundle
         
     | 
| 
       13 
14 
     | 
    
         
             
            .rbenv-version
         
     | 
| 
       14 
15 
     | 
    
         
             
            Gemfile.lock
         
     | 
| 
       15 
     | 
    
         
            -
            gemfiles/*.lock
         
     | 
| 
       16 
16 
     | 
    
         
             
            vendor/*
         
     | 
| 
       17 
17 
     | 
    
         
             
            .idea
         
     | 
| 
       18 
18 
     | 
    
         
             
            .rvmrc
         
     | 
| 
         @@ -20,3 +20,4 @@ vendor/* 
     | 
|
| 
       20 
20 
     | 
    
         
             
            .tags_sorted_by_file
         
     | 
| 
       21 
21 
     | 
    
         
             
            .ruby-version
         
     | 
| 
       22 
22 
     | 
    
         
             
            .ruby-gemset
         
     | 
| 
      
 23 
     | 
    
         
            +
            .rbenv-gemsets
         
     | 
    
        data/.rubocop.yml
    ADDED
    
    | 
         @@ -0,0 +1,100 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            inherit_from: .rubocop_todo.yml
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # Please:
         
     | 
| 
      
 4 
     | 
    
         
            +
            #
         
     | 
| 
      
 5 
     | 
    
         
            +
            # - Comment any deviations from the Ruby Style Guide
         
     | 
| 
      
 6 
     | 
    
         
            +
            # - Alphabetize cops
         
     | 
| 
      
 7 
     | 
    
         
            +
            # - Only include permanent config; temporary goes in .rubocop_todo.yml
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            # We do not control `schema.rb`. Exclude it from all cops.
         
     | 
| 
      
 10 
     | 
    
         
            +
            AllCops:
         
     | 
| 
      
 11 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 12 
     | 
    
         
            +
                - test/dummy/db/schema.rb
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            # Migrations often contain long up/down methods, and extracting smaller methods
         
     | 
| 
      
 15 
     | 
    
         
            +
            # from these is of questionable value.
         
     | 
| 
      
 16 
     | 
    
         
            +
            Metrics/AbcSize:
         
     | 
| 
      
 17 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 18 
     | 
    
         
            +
                - 'test/dummy/db/migrate/*'
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            Metrics/ClassLength:
         
     | 
| 
      
 21 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 22 
     | 
    
         
            +
                - test/**/*
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            # The Ruby Style Guide recommends to "Limit lines to 80 characters."
         
     | 
| 
      
 25 
     | 
    
         
            +
            # (https://github.com/bbatsov/ruby-style-guide#80-character-limits)
         
     | 
| 
      
 26 
     | 
    
         
            +
            # but 100 is also reasonable.
         
     | 
| 
      
 27 
     | 
    
         
            +
            Metrics/LineLength:
         
     | 
| 
      
 28 
     | 
    
         
            +
              Max: 100
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            # The number of lines in a method is not a useful metric compared to `AbcSize`.
         
     | 
| 
      
 31 
     | 
    
         
            +
            # It's common to have very long methods (> 50 lines) which are quite simple. For
         
     | 
| 
      
 32 
     | 
    
         
            +
            # example, a method that returns a long string with only a few interpolations.
         
     | 
| 
      
 33 
     | 
    
         
            +
            Metrics/MethodLength:
         
     | 
| 
      
 34 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            Style/AlignParameters:
         
     | 
| 
      
 37 
     | 
    
         
            +
              EnforcedStyle: with_fixed_indentation
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            # Please use semantic style, e.g. `do` when there's a side-effect, else `{}`.
         
     | 
| 
      
 40 
     | 
    
         
            +
            # The semantic style is too nuanced to lint, so the cop is disabled.
         
     | 
| 
      
 41 
     | 
    
         
            +
            Style/BlockDelimiters:
         
     | 
| 
      
 42 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            Style/DotPosition:
         
     | 
| 
      
 45 
     | 
    
         
            +
              EnforcedStyle: trailing
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            # Use double negation wherever it would otherwise be impractical to convert
         
     | 
| 
      
 48 
     | 
    
         
            +
            # a value to an actual boolean.
         
     | 
| 
      
 49 
     | 
    
         
            +
            Style/DoubleNegation:
         
     | 
| 
      
 50 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            # The decision of when to use a guard clause to improve readability is subtle,
         
     | 
| 
      
 53 
     | 
    
         
            +
            # and it's not clear that it can be linted. Certainly, the default
         
     | 
| 
      
 54 
     | 
    
         
            +
            # `MinBodyLength` of 1 can actually hurt readability.
         
     | 
| 
      
 55 
     | 
    
         
            +
            Style/GuardClause:
         
     | 
| 
      
 56 
     | 
    
         
            +
              MinBodyLength: 3
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            # Use postfix (modifier) conditionals for one-liners, unless doing so would
         
     | 
| 
      
 59 
     | 
    
         
            +
            # exceed 60 characters.
         
     | 
| 
      
 60 
     | 
    
         
            +
            Style/IfUnlessModifier:
         
     | 
| 
      
 61 
     | 
    
         
            +
              MaxLineLength: 60
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
            # The Ruby Style Guide says:
         
     | 
| 
      
 64 
     | 
    
         
            +
            #
         
     | 
| 
      
 65 
     | 
    
         
            +
            # > Use \ instead of + or << to concatenate two string literals at line end.
         
     | 
| 
      
 66 
     | 
    
         
            +
            #
         
     | 
| 
      
 67 
     | 
    
         
            +
            # but in my experience the `\` style is rarely used and less readable. Please
         
     | 
| 
      
 68 
     | 
    
         
            +
            # concatenate multiline strings with `+` or use a HEREDOC.
         
     | 
| 
      
 69 
     | 
    
         
            +
            Style/LineEndConcatenation:
         
     | 
| 
      
 70 
     | 
    
         
            +
              Enabled: false
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            # Using `module_function` instead of `extend self` would make the instance
         
     | 
| 
      
 73 
     | 
    
         
            +
            # methods in these modules private. That would be a breaking change, so these
         
     | 
| 
      
 74 
     | 
    
         
            +
            # modules are excluded. See discussion in:
         
     | 
| 
      
 75 
     | 
    
         
            +
            # - https://github.com/airblade/paper_trail/pull/756
         
     | 
| 
      
 76 
     | 
    
         
            +
            # - https://github.com/bbatsov/ruby-style-guide/issues/556
         
     | 
| 
      
 77 
     | 
    
         
            +
            Style/ModuleFunction:
         
     | 
| 
      
 78 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 79 
     | 
    
         
            +
                - 'lib/paper_trail/serializers/json.rb'
         
     | 
| 
      
 80 
     | 
    
         
            +
                - 'lib/paper_trail/serializers/yaml.rb'
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
            Style/MultilineMethodCallIndentation:
         
     | 
| 
      
 83 
     | 
    
         
            +
              EnforcedStyle: indented
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            Style/MultilineOperationIndentation:
         
     | 
| 
      
 86 
     | 
    
         
            +
              EnforcedStyle: indented
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            Style/PredicateName:
         
     | 
| 
      
 89 
     | 
    
         
            +
              NameWhitelist: has_paper_trail
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            # The Ruby Style Guide does not prescribe a particular quote character, only
         
     | 
| 
      
 92 
     | 
    
         
            +
            # that a project should pick one and be consistent. The decision has no
         
     | 
| 
      
 93 
     | 
    
         
            +
            # performance implications. Double quotes are slightly easier to read.
         
     | 
| 
      
 94 
     | 
    
         
            +
            Style/StringLiterals:
         
     | 
| 
      
 95 
     | 
    
         
            +
              EnforcedStyle: double_quotes
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
            # Use exactly one space on each side of an operator. Do not align operators
         
     | 
| 
      
 98 
     | 
    
         
            +
            # because it makes the code harder to edit, and makes lines unnecessarily long.
         
     | 
| 
      
 99 
     | 
    
         
            +
            Style/SpaceAroundOperators:
         
     | 
| 
      
 100 
     | 
    
         
            +
              AllowForAlignment: false
         
     | 
    
        data/.rubocop_todo.yml
    ADDED
    
    | 
         @@ -0,0 +1,14 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Remove these configuration records
         
     | 
| 
      
 2 
     | 
    
         
            +
            # one by one as the offenses are removed from the code base.
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Metrics/AbcSize:
         
     | 
| 
      
 5 
     | 
    
         
            +
              Max: 30 # Goal: 15
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            Metrics/CyclomaticComplexity:
         
     | 
| 
      
 8 
     | 
    
         
            +
              Max: 13 # Goal: 6
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            Metrics/ModuleLength:
         
     | 
| 
      
 11 
     | 
    
         
            +
              Max: 299
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            Metrics/PerceivedComplexity:
         
     | 
| 
      
 14 
     | 
    
         
            +
              Max: 16 # Goal: 7
         
     | 
    
        data/.travis.yml
    CHANGED
    
    | 
         @@ -1,10 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            language: ruby
         
     | 
| 
       2 
2 
     | 
    
         
             
            rvm:
         
     | 
| 
       3 
     | 
    
         
            -
              - 2. 
     | 
| 
      
 3 
     | 
    
         
            +
              - 2.3.0
         
     | 
| 
       4 
4 
     | 
    
         
             
              - 1.9.3
         
     | 
| 
       5 
     | 
    
         
            -
              - 1.8.7
         
     | 
| 
       6 
5 
     | 
    
         
             
              - jruby-19mode
         
     | 
| 
       7 
     | 
    
         
            -
              - jruby-18mode
         
     | 
| 
       8 
6 
     | 
    
         
             
            env:
         
     | 
| 
       9 
7 
     | 
    
         
             
              global:
         
     | 
| 
       10 
8 
     | 
    
         
             
                - TRAVIS=true
         
     | 
| 
         @@ -26,16 +24,17 @@ before_script: 
     | 
|
| 
       26 
24 
     | 
    
         
             
              - sh -c "if [ \"$DB\" = 'postgres' ]; then psql -c 'create database paper_trail_foo;'  -U postgres; fi"
         
     | 
| 
       27 
25 
     | 
    
         | 
| 
       28 
26 
     | 
    
         
             
            gemfile:
         
     | 
| 
       29 
     | 
    
         
            -
              - Gemfile
         
     | 
| 
       30 
27 
     | 
    
         
             
              - gemfiles/ar3.gemfile
         
     | 
| 
      
 28 
     | 
    
         
            +
              - gemfiles/ar4.gemfile
         
     | 
| 
      
 29 
     | 
    
         
            +
              - gemfiles/ar5.gemfile
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
31 
     | 
    
         
             
            matrix:
         
     | 
| 
       33 
32 
     | 
    
         
             
              fast_finish: true
         
     | 
| 
       34 
     | 
    
         
            -
               
     | 
| 
       35 
     | 
    
         
            -
                -  
     | 
| 
       36 
     | 
    
         
            -
                   
     | 
| 
       37 
     | 
    
         
            -
                -  
     | 
| 
       38 
     | 
    
         
            -
                   
     | 
| 
      
 33 
     | 
    
         
            +
              exclude:
         
     | 
| 
      
 34 
     | 
    
         
            +
                - gemfile: gemfiles/ar5.gemfile
         
     | 
| 
      
 35 
     | 
    
         
            +
                  rvm: 1.9.3
         
     | 
| 
      
 36 
     | 
    
         
            +
                - gemfile: gemfiles/ar5.gemfile
         
     | 
| 
      
 37 
     | 
    
         
            +
                  rvm: jruby-19mode
         
     | 
| 
       39 
38 
     | 
    
         | 
| 
       40 
39 
     | 
    
         
             
            addons:
         
     | 
| 
       41 
40 
     | 
    
         
             
              postgresql: "9.4"
         
     | 
    
        data/Appraisals
    ADDED
    
    | 
         @@ -0,0 +1,41 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Specify here only version constraints that differ from
         
     | 
| 
      
 2 
     | 
    
         
            +
            # `paper_trail.gemspec`.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            # > The dependencies in your Appraisals file are combined with dependencies in
         
     | 
| 
      
 5 
     | 
    
         
            +
            # > your Gemfile, so you don"t need to repeat anything that"s the same for each
         
     | 
| 
      
 6 
     | 
    
         
            +
            # > appraisal. If something is specified in both the Gemfile and an appraisal,
         
     | 
| 
      
 7 
     | 
    
         
            +
            # > the version from the appraisal takes precedence.
         
     | 
| 
      
 8 
     | 
    
         
            +
            # > https://github.com/thoughtbot/appraisal
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            appraise "ar3" do
         
     | 
| 
      
 11 
     | 
    
         
            +
              gem "activerecord", "~> 3.2.22"
         
     | 
| 
      
 12 
     | 
    
         
            +
              gem "i18n", "~> 0.6.11"
         
     | 
| 
      
 13 
     | 
    
         
            +
              gem "request_store", "~> 1.1.0"
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              group :development, :test do
         
     | 
| 
      
 16 
     | 
    
         
            +
                gem 'railties', '~> 3.2.22'
         
     | 
| 
      
 17 
     | 
    
         
            +
                gem 'test-unit', '~> 3.1.5'
         
     | 
| 
      
 18 
     | 
    
         
            +
                platforms :ruby do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  gem 'mysql2', '~> 0.3.20'
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            appraise "ar4" do
         
     | 
| 
      
 25 
     | 
    
         
            +
              gem "activerecord", "~> 4.2"
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            appraise "ar5" do
         
     | 
| 
      
 29 
     | 
    
         
            +
              gem "activerecord", "5.0.0.beta1"
         
     | 
| 
      
 30 
     | 
    
         
            +
              gem "activemodel", "5.0.0.beta1"
         
     | 
| 
      
 31 
     | 
    
         
            +
              gem "actionpack", "5.0.0.beta1"
         
     | 
| 
      
 32 
     | 
    
         
            +
              gem "railties", "5.0.0.beta1"
         
     | 
| 
      
 33 
     | 
    
         
            +
              gem "rspec-rails", github: "rspec/rspec-rails"
         
     | 
| 
      
 34 
     | 
    
         
            +
              gem "rspec-core", github: "rspec/rspec-core"
         
     | 
| 
      
 35 
     | 
    
         
            +
              gem "rspec-expectations", github: "rspec/rspec-expectations"
         
     | 
| 
      
 36 
     | 
    
         
            +
              gem "rspec-mocks", github: "rspec/rspec-mocks"
         
     | 
| 
      
 37 
     | 
    
         
            +
              gem "rspec-support", github: "rspec/rspec-support"
         
     | 
| 
      
 38 
     | 
    
         
            +
              gem 'rails-controller-testing'
         
     | 
| 
      
 39 
     | 
    
         
            +
              # Sinatra stable conflicts with AR5's rack dependency
         
     | 
| 
      
 40 
     | 
    
         
            +
              gem 'sinatra', github: 'sinatra/sinatra'
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,18 +1,58 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ##  
     | 
| 
      
 1 
     | 
    
         
            +
            ## 5.0.0 (2016-05-02)
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            ### Breaking Changes
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            -  
     | 
| 
      
 5 
     | 
    
         
            +
            - [#758](https://github.com/airblade/paper_trail/pull/758) -
         
     | 
| 
      
 6 
     | 
    
         
            +
              `PaperTrail.config.track_associations` getter method removed,
         
     | 
| 
      
 7 
     | 
    
         
            +
              use `track_associations?` instead.
         
     | 
| 
      
 8 
     | 
    
         
            +
            - [#740](https://github.com/airblade/paper_trail/issues/740) -
         
     | 
| 
      
 9 
     | 
    
         
            +
              `PaperTrail.config.track_associations?` now defaults to false
         
     | 
| 
      
 10 
     | 
    
         
            +
            - [#723](https://github.com/airblade/paper_trail/pull/723) -
         
     | 
| 
      
 11 
     | 
    
         
            +
              `PaperTrail.enabled=` now affects all threads
         
     | 
| 
      
 12 
     | 
    
         
            +
            - [#556](https://github.com/airblade/paper_trail/pull/556) /
         
     | 
| 
      
 13 
     | 
    
         
            +
              [#301](https://github.com/airblade/paper_trail/issues/301) -
         
     | 
| 
      
 14 
     | 
    
         
            +
              If you are tracking who is responsible for changes with `whodunnit`, be aware
         
     | 
| 
      
 15 
     | 
    
         
            +
              that PaperTrail no longer adds the `set_paper_trail_whodunnit` before_filter
         
     | 
| 
      
 16 
     | 
    
         
            +
              for you. Please add this before_filter to your ApplicationController to
         
     | 
| 
      
 17 
     | 
    
         
            +
              continue recording whodunnit. See the readme for an example.
         
     | 
| 
      
 18 
     | 
    
         
            +
            - [#683](https://github.com/airblade/paper_trail/pull/683) /
         
     | 
| 
      
 19 
     | 
    
         
            +
              [#682](https://github.com/airblade/paper_trail/issues/682) -
         
     | 
| 
      
 20 
     | 
    
         
            +
              Destroy callback default changed to :before to accommodate ActiveRecord 5
         
     | 
| 
      
 21 
     | 
    
         
            +
              option `belongs_to_required_by_default` and new Rails 5 default.
         
     | 
| 
       6 
22 
     | 
    
         | 
| 
       7 
23 
     | 
    
         
             
            ### Added
         
     | 
| 
       8 
24 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
            - [# 
     | 
| 
       10 
     | 
    
         
            -
               
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 25 
     | 
    
         
            +
            - [#771](https://github.com/airblade/paper_trail/pull/771) -
         
     | 
| 
      
 26 
     | 
    
         
            +
              Added support for has_and_belongs_to_many associations
         
     | 
| 
      
 27 
     | 
    
         
            +
            - [#741](https://github.com/airblade/paper_trail/issues/741) /
         
     | 
| 
      
 28 
     | 
    
         
            +
              [#681](https://github.com/airblade/paper_trail/pull/681)
         
     | 
| 
      
 29 
     | 
    
         
            +
              MySQL unicode support in migration generator
         
     | 
| 
      
 30 
     | 
    
         
            +
            - [#689](https://github.com/airblade/paper_trail/pull/689) -
         
     | 
| 
      
 31 
     | 
    
         
            +
              Rails 5 compatibility
         
     | 
| 
      
 32 
     | 
    
         
            +
            - Added a rails config option: `config.paper_trail.enabled`
         
     | 
| 
      
 33 
     | 
    
         
            +
            - [#503](https://github.com/airblade/paper_trail/pull/730) -
         
     | 
| 
      
 34 
     | 
    
         
            +
              Support for reifying belongs_to associations.
         
     | 
| 
       12 
35 
     | 
    
         | 
| 
       13 
36 
     | 
    
         
             
            ### Fixed
         
     | 
| 
       14 
37 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
            -  
     | 
| 
      
 38 
     | 
    
         
            +
            - [#777](https://github.com/airblade/paper_trail/issues/777) -
         
     | 
| 
      
 39 
     | 
    
         
            +
              Support HMT associations with `:source` option.
         
     | 
| 
      
 40 
     | 
    
         
            +
            - [#738](https://github.com/airblade/paper_trail/issues/738) -
         
     | 
| 
      
 41 
     | 
    
         
            +
              Rare bug where a non-versioned STI parent caused `changeset` to
         
     | 
| 
      
 42 
     | 
    
         
            +
              return an empty hash.
         
     | 
| 
      
 43 
     | 
    
         
            +
            - [#731](https://github.com/airblade/paper_trail/pull/731) -
         
     | 
| 
      
 44 
     | 
    
         
            +
              Map enums to database values before storing in `object_changes` column.
         
     | 
| 
      
 45 
     | 
    
         
            +
            - [#715](https://github.com/airblade/paper_trail/issues/715) -
         
     | 
| 
      
 46 
     | 
    
         
            +
              Optimize post-rollback association reset.
         
     | 
| 
      
 47 
     | 
    
         
            +
            - [#701](https://github.com/airblade/paper_trail/pull/701) /
         
     | 
| 
      
 48 
     | 
    
         
            +
              [#699](https://github.com/airblade/paper_trail/issues/699) -
         
     | 
| 
      
 49 
     | 
    
         
            +
              Cleaning old versions explicitly preserves the most recent
         
     | 
| 
      
 50 
     | 
    
         
            +
              versions instead of relying on database result ordering.
         
     | 
| 
      
 51 
     | 
    
         
            +
            - [#635](https://github.com/airblade/paper_trail/issues/635) -
         
     | 
| 
      
 52 
     | 
    
         
            +
              A bug where it was not possible to disable PT when using a multi-threaded
         
     | 
| 
      
 53 
     | 
    
         
            +
              webserver.
         
     | 
| 
      
 54 
     | 
    
         
            +
            - [#584](https://github.com/airblade/paper_trail/issues/584) -
         
     | 
| 
      
 55 
     | 
    
         
            +
              Fixed deprecation warning for Active Record after_callback / after_commit
         
     | 
| 
       16 
56 
     | 
    
         | 
| 
       17 
57 
     | 
    
         
             
            ## 4.1.0 (2016-01-30)
         
     | 
| 
       18 
58 
     | 
    
         | 
| 
         @@ -31,7 +71,7 @@ 
     | 
|
| 
       31 
71 
     | 
    
         | 
| 
       32 
72 
     | 
    
         
             
            - None
         
     | 
| 
       33 
73 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
            ## 4.0.2
         
     | 
| 
      
 74 
     | 
    
         
            +
            ## 4.0.2 (2016-01-19)
         
     | 
| 
       35 
75 
     | 
    
         | 
| 
       36 
76 
     | 
    
         
             
            ### Breaking Changes
         
     | 
| 
       37 
77 
     | 
    
         | 
| 
         @@ -47,7 +87,7 @@ 
     | 
|
| 
       47 
87 
     | 
    
         
             
              [#697](https://github.com/airblade/paper_trail/pull/697)
         
     | 
| 
       48 
88 
     | 
    
         
             
              Bind JSON query parameters in `where_object` and `where_object_changes`.
         
     | 
| 
       49 
89 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
            ## 4.0.1
         
     | 
| 
      
 90 
     | 
    
         
            +
            ## 4.0.1 (2015-12-14)
         
     | 
| 
       51 
91 
     | 
    
         | 
| 
       52 
92 
     | 
    
         
             
            ### Breaking Changes
         
     | 
| 
       53 
93 
     | 
    
         | 
| 
         @@ -65,7 +105,7 @@ 
     | 
|
| 
       65 
105 
     | 
    
         
             
              [#588](https://github.com/airblade/paper_trail/issues/588) -
         
     | 
| 
       66 
106 
     | 
    
         
             
              Fixes timestamp for "create" versions
         
     | 
| 
       67 
107 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
            ## 4.0.0
         
     | 
| 
      
 108 
     | 
    
         
            +
            ## 4.0.0 (2015-07-30)
         
     | 
| 
       69 
109 
     | 
    
         | 
| 
       70 
110 
     | 
    
         
             
            This major release adds JSON column support in PostgreSQL, limited support for
         
     | 
| 
       71 
111 
     | 
    
         
             
            versioning associations, various new configuration options, and a year's worth
         
     | 
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -1,2 +1,2 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            source  
     | 
| 
      
 1 
     | 
    
         
            +
            source "https://rubygems.org"
         
     | 
| 
       2 
2 
     | 
    
         
             
            gemspec
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -10,7 +10,9 @@ has been destroyed. 
     | 
|
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            | Version        | Documentation |
         
     | 
| 
       12 
12 
     | 
    
         
             
            | -------------- | ------------- |
         
     | 
| 
       13 
     | 
    
         
            -
            |  
     | 
| 
      
 13 
     | 
    
         
            +
            | 5              | https://github.com/airblade/paper_trail/blob/master/README.md |
         
     | 
| 
      
 14 
     | 
    
         
            +
            | 4.1            | https://github.com/airblade/paper_trail/blob/4.1-stable/README.md |
         
     | 
| 
      
 15 
     | 
    
         
            +
            | 4.0            | https://github.com/airblade/paper_trail/blob/4.0-stable/README.md |
         
     | 
| 
       14 
16 
     | 
    
         
             
            | 3              | https://github.com/airblade/paper_trail/blob/3.0-stable/README.md |
         
     | 
| 
       15 
17 
     | 
    
         
             
            | 2              | https://github.com/airblade/paper_trail/blob/2.7-stable/README.md |
         
     | 
| 
       16 
18 
     | 
    
         
             
            | 1              | https://github.com/airblade/paper_trail/blob/rails2/README.md |
         
     | 
| 
         @@ -25,7 +27,7 @@ has been destroyed. 
     | 
|
| 
       25 
27 
     | 
    
         
             
              - [Choosing Lifecycle Events To Monitor](#choosing-lifecycle-events-to-monitor)
         
     | 
| 
       26 
28 
     | 
    
         
             
              - [Choosing When To Save New Versions](#choosing-when-to-save-new-versions)
         
     | 
| 
       27 
29 
     | 
    
         
             
              - [Choosing Attributes To Monitor](#choosing-attributes-to-monitor)
         
     | 
| 
       28 
     | 
    
         
            -
              - [Turning PaperTrail Off 
     | 
| 
      
 30 
     | 
    
         
            +
              - [Turning PaperTrail Off](#turning-papertrail-off)
         
     | 
| 
       29 
31 
     | 
    
         
             
              - [Limiting the Number of Versions Created](#limiting-the-number-of-versions-created)
         
     | 
| 
       30 
32 
     | 
    
         
             
            - Working With Versions
         
     | 
| 
       31 
33 
     | 
    
         
             
              - [Reverting And Undeleting A Model](#reverting-and-undeleting-a-model)
         
     | 
| 
         @@ -38,25 +40,25 @@ has been destroyed. 
     | 
|
| 
       38 
40 
     | 
    
         
             
              - [Storing metadata](#storing-metadata)
         
     | 
| 
       39 
41 
     | 
    
         
             
            - Extensibility
         
     | 
| 
       40 
42 
     | 
    
         
             
              - [Custom Version Classes](#custom-version-classes)
         
     | 
| 
       41 
     | 
    
         
            -
              - [Custom Serializer](# 
     | 
| 
       42 
     | 
    
         
            -
            - [SerializedAttributes support](#serializedattributes-support)
         
     | 
| 
      
 43 
     | 
    
         
            +
              - [Custom Serializer](#custom-serializer)
         
     | 
| 
       43 
44 
     | 
    
         
             
            - [Testing](#testing)
         
     | 
| 
       44 
45 
     | 
    
         
             
            - [Sinatra](#sinatra)
         
     | 
| 
       45 
46 
     | 
    
         | 
| 
       46 
47 
     | 
    
         
             
            ## Compatibility
         
     | 
| 
       47 
48 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
            | paper_trail 
     | 
| 
       49 
     | 
    
         
            -
            |  
     | 
| 
       50 
     | 
    
         
            -
            |  
     | 
| 
       51 
     | 
    
         
            -
            |  
     | 
| 
       52 
     | 
    
         
            -
            |  
     | 
| 
       53 
     | 
    
         
            -
            |  
     | 
| 
      
 49 
     | 
    
         
            +
            | paper_trail    | branch     | tags   | ruby     | activerecord |
         
     | 
| 
      
 50 
     | 
    
         
            +
            | -------------- | ---------- | ------ | -------- | ------------ |
         
     | 
| 
      
 51 
     | 
    
         
            +
            | 5              | master     | v5.x   | >= 1.9.3 | >= 3.0, < 6  |
         
     | 
| 
      
 52 
     | 
    
         
            +
            | 4              | 4.0-stable | v4.x   | >= 1.8.7 | >= 3.0, < 6  |
         
     | 
| 
      
 53 
     | 
    
         
            +
            | 3              | 3.0-stable | v3.x   | >= 1.8.7 | >= 3.0, < 5  |
         
     | 
| 
      
 54 
     | 
    
         
            +
            | 2              | 2.7-stable | v2.x   | >= 1.8.7 | >= 3.0, < 4  |
         
     | 
| 
      
 55 
     | 
    
         
            +
            | 1              | rails2     | v1.x   | >= 1.8.7 | >= 2.3, < 3  |
         
     | 
| 
       54 
56 
     | 
    
         | 
| 
       55 
57 
     | 
    
         
             
            ## Installation
         
     | 
| 
       56 
58 
     | 
    
         | 
| 
       57 
59 
     | 
    
         
             
            1. Add PaperTrail to your `Gemfile`.
         
     | 
| 
       58 
60 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
                `gem 'paper_trail' 
     | 
| 
      
 61 
     | 
    
         
            +
                `gem 'paper_trail'`
         
     | 
| 
       60 
62 
     | 
    
         | 
| 
       61 
63 
     | 
    
         
             
            1. Add a `versions` table to your database.
         
     | 
| 
       62 
64 
     | 
    
         | 
| 
         @@ -65,21 +67,31 @@ has been destroyed. 
     | 
|
| 
       65 
67 
     | 
    
         
             
                bundle exec rake db:migrate
         
     | 
| 
       66 
68 
     | 
    
         
             
                ```
         
     | 
| 
       67 
69 
     | 
    
         | 
| 
      
 70 
     | 
    
         
            +
                If using [rails_admin][38], you must enable the experimental
         
     | 
| 
      
 71 
     | 
    
         
            +
                [Associations](#associations) feature.
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
       68 
73 
     | 
    
         
             
            1. Add `has_paper_trail` to the models you want to track.
         
     | 
| 
       69 
74 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
      
 75 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 76 
     | 
    
         
            +
                class Widget < ActiveRecord::Base
         
     | 
| 
      
 77 
     | 
    
         
            +
                  has_paper_trail
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
                ```
         
     | 
| 
       71 
80 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
      
 81 
     | 
    
         
            +
            1. If your controllers have a `current_user` method, you can easily [track who
         
     | 
| 
      
 82 
     | 
    
         
            +
            is responsible for changes](#finding-out-who-was-responsible-for-a-change)
         
     | 
| 
      
 83 
     | 
    
         
            +
            by adding a controller callback.
         
     | 
| 
       74 
84 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
            ```ruby
         
     | 
| 
       76 
     | 
    
         
            -
            class  
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
            end
         
     | 
| 
       79 
     | 
    
         
            -
            ```
         
     | 
| 
      
 85 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 86 
     | 
    
         
            +
                class ApplicationController
         
     | 
| 
      
 87 
     | 
    
         
            +
                  before_filter :set_paper_trail_whodunnit
         
     | 
| 
      
 88 
     | 
    
         
            +
                end
         
     | 
| 
      
 89 
     | 
    
         
            +
                ```
         
     | 
| 
       80 
90 
     | 
    
         | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
      
 91 
     | 
    
         
            +
            ## Basic Usage
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            Your models now have a `versions` method which returns the "paper trail" of
         
     | 
| 
      
 94 
     | 
    
         
            +
            changes to your model.
         
     | 
| 
       83 
95 
     | 
    
         | 
| 
       84 
96 
     | 
    
         
             
            ```ruby
         
     | 
| 
       85 
97 
     | 
    
         
             
            widget = Widget.find 42
         
     | 
| 
         @@ -182,7 +194,8 @@ Widget.paper_trail_enabled_for_model? 
     | 
|
| 
       182 
194 
     | 
    
         
             
            widget.paper_trail_enabled_for_model?
         
     | 
| 
       183 
195 
     | 
    
         
             
            ```
         
     | 
| 
       184 
196 
     | 
    
         | 
| 
       185 
     | 
    
         
            -
            And a `PaperTrail::Version` instance  
     | 
| 
      
 197 
     | 
    
         
            +
            And a `PaperTrail::Version` instance (which is just an ordinary ActiveRecord
         
     | 
| 
      
 198 
     | 
    
         
            +
            instance, with all the usual methods) adds these methods:
         
     | 
| 
       186 
199 
     | 
    
         | 
| 
       187 
200 
     | 
    
         
             
            ```ruby
         
     | 
| 
       188 
201 
     | 
    
         
             
            # Returns the item restored from this version.
         
     | 
| 
         @@ -305,6 +318,11 @@ class Translation < ActiveRecord::Base 
     | 
|
| 
       305 
318 
     | 
    
         
             
            end
         
     | 
| 
       306 
319 
     | 
    
         
             
            ```
         
     | 
| 
       307 
320 
     | 
    
         | 
| 
      
 321 
     | 
    
         
            +
            ### Choosing Based on Changed Attributes
         
     | 
| 
      
 322 
     | 
    
         
            +
             
     | 
| 
      
 323 
     | 
    
         
            +
            Starting with PaperTrail 4.0, versions are saved during an after-callback. If
         
     | 
| 
      
 324 
     | 
    
         
            +
            you decide whether to save a new version based on changed attributes, please
         
     | 
| 
      
 325 
     | 
    
         
            +
            use attribute_name_was instead of attribute_name.
         
     | 
| 
       308 
326 
     | 
    
         | 
| 
       309 
327 
     | 
    
         
             
            ## Choosing Attributes To Monitor
         
     | 
| 
       310 
328 
     | 
    
         | 
| 
         @@ -393,69 +411,30 @@ class Article < ActiveRecord::Base 
     | 
|
| 
       393 
411 
     | 
    
         
             
            end
         
     | 
| 
       394 
412 
     | 
    
         
             
            ```
         
     | 
| 
       395 
413 
     | 
    
         | 
| 
       396 
     | 
    
         
            -
            ## Turning PaperTrail Off 
     | 
| 
      
 414 
     | 
    
         
            +
            ## Turning PaperTrail Off
         
     | 
| 
       397 
415 
     | 
    
         | 
| 
       398 
     | 
    
         
            -
             
     | 
| 
       399 
     | 
    
         
            -
            changes made by your users and don't need to store changes you make yourself in,
         
     | 
| 
       400 
     | 
    
         
            -
            say, a migration -- or when testing your application.
         
     | 
| 
      
 416 
     | 
    
         
            +
            PaperTrail is on by default, but sometimes you don't want to record versions.
         
     | 
| 
       401 
417 
     | 
    
         | 
| 
       402 
     | 
    
         
            -
             
     | 
| 
       403 
     | 
    
         
            -
            class.
         
     | 
| 
      
 418 
     | 
    
         
            +
            ### Per Process
         
     | 
| 
       404 
419 
     | 
    
         | 
| 
       405 
     | 
    
         
            -
             
     | 
| 
       406 
     | 
    
         
            -
             
     | 
| 
       407 
     | 
    
         
            -
            On a global level you can turn PaperTrail off like this:
         
     | 
| 
      
 420 
     | 
    
         
            +
            Turn PaperTrail off for all threads in a `ruby` process.
         
     | 
| 
       408 
421 
     | 
    
         | 
| 
       409 
422 
     | 
    
         
             
            ```ruby
         
     | 
| 
       410 
423 
     | 
    
         
             
            PaperTrail.enabled = false
         
     | 
| 
       411 
424 
     | 
    
         
             
            ```
         
     | 
| 
       412 
425 
     | 
    
         | 
| 
       413 
     | 
    
         
            -
             
     | 
| 
       414 
     | 
    
         
            -
            test environment to speed up your tests.  This will do it (note: this gets done
         
     | 
| 
       415 
     | 
    
         
            -
            automatically for `RSpec` and `Cucumber`, please see the [Testing
         
     | 
| 
       416 
     | 
    
         
            -
            section](#testing)):
         
     | 
| 
       417 
     | 
    
         
            -
             
     | 
| 
       418 
     | 
    
         
            -
            ```ruby
         
     | 
| 
       419 
     | 
    
         
            -
            # in config/environments/test.rb
         
     | 
| 
       420 
     | 
    
         
            -
            config.after_initialize do
         
     | 
| 
       421 
     | 
    
         
            -
              PaperTrail.enabled = false
         
     | 
| 
       422 
     | 
    
         
            -
            end
         
     | 
| 
       423 
     | 
    
         
            -
            ```
         
     | 
| 
       424 
     | 
    
         
            -
             
     | 
| 
       425 
     | 
    
         
            -
            If you disable PaperTrail in your test environment but want to enable it for
         
     | 
| 
       426 
     | 
    
         
            -
            specific tests, you can add a helper like this to your test helper:
         
     | 
| 
       427 
     | 
    
         
            -
             
     | 
| 
       428 
     | 
    
         
            -
            ```ruby
         
     | 
| 
       429 
     | 
    
         
            -
            # in test/test_helper.rb
         
     | 
| 
       430 
     | 
    
         
            -
            def with_versioning
         
     | 
| 
       431 
     | 
    
         
            -
              was_enabled = PaperTrail.enabled?
         
     | 
| 
       432 
     | 
    
         
            -
              was_enabled_for_controller = PaperTrail.enabled_for_controller?
         
     | 
| 
       433 
     | 
    
         
            -
              PaperTrail.enabled = true
         
     | 
| 
       434 
     | 
    
         
            -
              PaperTrail.enabled_for_controller = true
         
     | 
| 
       435 
     | 
    
         
            -
              begin
         
     | 
| 
       436 
     | 
    
         
            -
                yield
         
     | 
| 
       437 
     | 
    
         
            -
              ensure
         
     | 
| 
       438 
     | 
    
         
            -
                PaperTrail.enabled = was_enabled
         
     | 
| 
       439 
     | 
    
         
            -
                PaperTrail.enabled_for_controller = was_enabled_for_controller
         
     | 
| 
       440 
     | 
    
         
            -
              end
         
     | 
| 
       441 
     | 
    
         
            -
            end
         
     | 
| 
       442 
     | 
    
         
            -
            ```
         
     | 
| 
      
 426 
     | 
    
         
            +
            This is commonly used to speed up tests. See [Testing](#testing) below.
         
     | 
| 
       443 
427 
     | 
    
         | 
| 
       444 
     | 
    
         
            -
             
     | 
| 
      
 428 
     | 
    
         
            +
            There is also a rails config option that does the same thing.
         
     | 
| 
       445 
429 
     | 
    
         | 
| 
       446 
430 
     | 
    
         
             
            ```ruby
         
     | 
| 
       447 
     | 
    
         
            -
             
     | 
| 
       448 
     | 
    
         
            -
             
     | 
| 
       449 
     | 
    
         
            -
                # your test
         
     | 
| 
       450 
     | 
    
         
            -
              end
         
     | 
| 
       451 
     | 
    
         
            -
            end
         
     | 
| 
      
 431 
     | 
    
         
            +
            # in config/environments/test.rb
         
     | 
| 
      
 432 
     | 
    
         
            +
            config.paper_trail.enabled = false
         
     | 
| 
       452 
433 
     | 
    
         
             
            ```
         
     | 
| 
       453 
434 
     | 
    
         | 
| 
       454 
     | 
    
         
            -
            ### Per  
     | 
| 
      
 435 
     | 
    
         
            +
            ### Per Request
         
     | 
| 
       455 
436 
     | 
    
         | 
| 
       456 
     | 
    
         
            -
             
     | 
| 
       457 
     | 
    
         
            -
            `paper_trail_enabled_for_controller` method to your controller which returns
         
     | 
| 
       458 
     | 
    
         
            -
            `true` or `false`:
         
     | 
| 
      
 437 
     | 
    
         
            +
            Add a `paper_trail_enabled_for_controller` method to your controller.
         
     | 
| 
       459 
438 
     | 
    
         | 
| 
       460 
439 
     | 
    
         
             
            ```ruby
         
     | 
| 
       461 
440 
     | 
    
         
             
            class ApplicationController < ActionController::Base
         
     | 
| 
         @@ -465,22 +444,14 @@ class ApplicationController < ActionController::Base 
     | 
|
| 
       465 
444 
     | 
    
         
             
            end
         
     | 
| 
       466 
445 
     | 
    
         
             
            ```
         
     | 
| 
       467 
446 
     | 
    
         | 
| 
       468 
     | 
    
         
            -
            ### Per  
     | 
| 
       469 
     | 
    
         
            -
             
     | 
| 
       470 
     | 
    
         
            -
            If you are about to change some widgets and you don't want a paper trail of your
         
     | 
| 
       471 
     | 
    
         
            -
            changes, you can turn PaperTrail off like this:
         
     | 
| 
      
 447 
     | 
    
         
            +
            ### Per Class
         
     | 
| 
       472 
448 
     | 
    
         | 
| 
       473 
449 
     | 
    
         
             
            ```ruby
         
     | 
| 
       474 
450 
     | 
    
         
             
            Widget.paper_trail_off!
         
     | 
| 
       475 
     | 
    
         
            -
            ```
         
     | 
| 
       476 
     | 
    
         
            -
             
     | 
| 
       477 
     | 
    
         
            -
            And on again like this:
         
     | 
| 
       478 
     | 
    
         
            -
             
     | 
| 
       479 
     | 
    
         
            -
            ```ruby
         
     | 
| 
       480 
451 
     | 
    
         
             
            Widget.paper_trail_on!
         
     | 
| 
       481 
452 
     | 
    
         
             
            ```
         
     | 
| 
       482 
453 
     | 
    
         | 
| 
       483 
     | 
    
         
            -
            ### Per  
     | 
| 
      
 454 
     | 
    
         
            +
            ### Per Method
         
     | 
| 
       484 
455 
     | 
    
         | 
| 
       485 
456 
     | 
    
         
             
            You can call a method without creating a new version using `without_versioning`.
         
     | 
| 
       486 
457 
     | 
    
         
             
             It takes either a method name as a symbol:
         
     | 
| 
         @@ -683,28 +654,35 @@ PaperTrail::Version.delete_all ["created_at < ?", 1.week.ago] 
     | 
|
| 
       683 
654 
     | 
    
         | 
| 
       684 
655 
     | 
    
         
             
            ## Finding Out Who Was Responsible For A Change
         
     | 
| 
       685 
656 
     | 
    
         | 
| 
       686 
     | 
    
         
            -
             
     | 
| 
       687 
     | 
    
         
            -
            attempt to store the value returned by `current_user.id` in the version's
         
     | 
| 
      
 657 
     | 
    
         
            +
            Set `PaperTrail.whodunnit=`, and that value will be stored in the version's
         
     | 
| 
       688 
658 
     | 
    
         
             
            `whodunnit` column.
         
     | 
| 
       689 
659 
     | 
    
         | 
| 
       690 
     | 
    
         
            -
             
     | 
| 
       691 
     | 
    
         
            -
             
     | 
| 
       692 
     | 
    
         
            -
             
     | 
| 
      
 660 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 661 
     | 
    
         
            +
            PaperTrail.whodunnit = 'Andy Stewart'
         
     | 
| 
      
 662 
     | 
    
         
            +
            widget.update_attributes :name => 'Wibble'
         
     | 
| 
      
 663 
     | 
    
         
            +
            widget.versions.last.whodunnit              # Andy Stewart
         
     | 
| 
      
 664 
     | 
    
         
            +
            ```
         
     | 
| 
      
 665 
     | 
    
         
            +
             
     | 
| 
      
 666 
     | 
    
         
            +
            If your controller has a `current_user` method, PaperTrail provides a
         
     | 
| 
      
 667 
     | 
    
         
            +
            `before_filter` that will assign `current_user.id` to `PaperTrail.whodunnit`.
         
     | 
| 
      
 668 
     | 
    
         
            +
            You can add this `before_filter` to your `ApplicationController`.
         
     | 
| 
       693 
669 
     | 
    
         | 
| 
       694 
670 
     | 
    
         
             
            ```ruby
         
     | 
| 
       695 
671 
     | 
    
         
             
            class ApplicationController
         
     | 
| 
       696 
     | 
    
         
            -
               
     | 
| 
       697 
     | 
    
         
            -
                logged_in? ? current_member.id : 'Public user'  # or whatever
         
     | 
| 
       698 
     | 
    
         
            -
              end
         
     | 
| 
      
 672 
     | 
    
         
            +
              before_filter :set_paper_trail_whodunnit
         
     | 
| 
       699 
673 
     | 
    
         
             
            end
         
     | 
| 
       700 
674 
     | 
    
         
             
            ```
         
     | 
| 
       701 
675 
     | 
    
         | 
| 
       702 
     | 
    
         
            -
             
     | 
| 
      
 676 
     | 
    
         
            +
            You may want `set_paper_trail_whodunnit` to call a different method to find out
         
     | 
| 
      
 677 
     | 
    
         
            +
            who is responsible. To do so, override the `user_for_paper_trail` method in
         
     | 
| 
      
 678 
     | 
    
         
            +
            your controller like this:
         
     | 
| 
       703 
679 
     | 
    
         | 
| 
       704 
680 
     | 
    
         
             
            ```ruby
         
     | 
| 
       705 
     | 
    
         
            -
             
     | 
| 
       706 
     | 
    
         
            -
             
     | 
| 
       707 
     | 
    
         
            -
             
     | 
| 
      
 681 
     | 
    
         
            +
            class ApplicationController
         
     | 
| 
      
 682 
     | 
    
         
            +
              def user_for_paper_trail
         
     | 
| 
      
 683 
     | 
    
         
            +
                logged_in? ? current_member.id : 'Public user'  # or whatever
         
     | 
| 
      
 684 
     | 
    
         
            +
              end
         
     | 
| 
      
 685 
     | 
    
         
            +
            end
         
     | 
| 
       708 
686 
     | 
    
         
             
            ```
         
     | 
| 
       709 
687 
     | 
    
         | 
| 
       710 
688 
     | 
    
         
             
            See also: [Setting whodunnit in the rails console][33]
         
     | 
| 
         @@ -752,6 +730,11 @@ last_version.paper_trail_originator         # 'Alice' 
     | 
|
| 
       752 
730 
     | 
    
         
             
            last_version.terminator                     # 'Bob'
         
     | 
| 
       753 
731 
     | 
    
         
             
            ```
         
     | 
| 
       754 
732 
     | 
    
         | 
| 
      
 733 
     | 
    
         
            +
            ### Storing an ActiveRecord globalid in whodunnit
         
     | 
| 
      
 734 
     | 
    
         
            +
             
     | 
| 
      
 735 
     | 
    
         
            +
            If you would like `whodunnit` to return an `ActiveRecord` object instead of a
         
     | 
| 
      
 736 
     | 
    
         
            +
            string, please try the [paper_trail-globalid][37] gem.
         
     | 
| 
      
 737 
     | 
    
         
            +
             
     | 
| 
       755 
738 
     | 
    
         
             
            ## Associations
         
     | 
| 
       756 
739 
     | 
    
         | 
| 
       757 
740 
     | 
    
         
             
            **Experimental feature**, see caveats below.
         
     | 
| 
         @@ -770,7 +753,8 @@ the association that are created in the same transaction. 
     | 
|
| 
       770 
753 
     | 
    
         | 
| 
       771 
754 
     | 
    
         
             
            To restore Has-One associations as they were at the time, pass option `:has_one
         
     | 
| 
       772 
755 
     | 
    
         
             
            => true` to `reify`. To restore Has-Many and Has-Many-Through associations, use
         
     | 
| 
       773 
     | 
    
         
            -
            option `:has_many => true`. 
     | 
| 
      
 756 
     | 
    
         
            +
            option `:has_many => true`. To restore Belongs-To association, use
         
     | 
| 
      
 757 
     | 
    
         
            +
            option `:belongs_to => true`. For example:
         
     | 
| 
       774 
758 
     | 
    
         | 
| 
       775 
759 
     | 
    
         
             
            ```ruby
         
     | 
| 
       776 
760 
     | 
    
         
             
            class Location < ActiveRecord::Base
         
     | 
| 
         @@ -1123,7 +1107,7 @@ Postgres. In databases without such protection, such as MySQL, a table lock may 
     | 
|
| 
       1123 
1107 
     | 
    
         
             
            be necessary.
         
     | 
| 
       1124 
1108 
     | 
    
         | 
| 
       1125 
1109 
     | 
    
         
             
            If the above technique is too slow for your needs, and you're okay doing without
         
     | 
| 
       1126 
     | 
    
         
            -
            PaperTrail data temporarily, you can create the new column without  
     | 
| 
      
 1110 
     | 
    
         
            +
            PaperTrail data temporarily, you can create the new column without converting
         
     | 
| 
       1127 
1111 
     | 
    
         
             
            the data.
         
     | 
| 
       1128 
1112 
     | 
    
         | 
| 
       1129 
1113 
     | 
    
         
             
            ```ruby
         
     | 
| 
         @@ -1181,21 +1165,57 @@ end 
     | 
|
| 
       1181 
1165 
     | 
    
         | 
| 
       1182 
1166 
     | 
    
         
             
            ## Testing
         
     | 
| 
       1183 
1167 
     | 
    
         | 
| 
       1184 
     | 
    
         
            -
            You may want to turn PaperTrail off to speed up your tests.  See  
     | 
| 
       1185 
     | 
    
         
            -
            PaperTrail Off 
     | 
| 
       1186 
     | 
    
         
            -
            with `Test::Unit`.
         
     | 
| 
      
 1168 
     | 
    
         
            +
            You may want to turn PaperTrail off to speed up your tests.  See [Turning
         
     | 
| 
      
 1169 
     | 
    
         
            +
            PaperTrail Off](#turning-papertrail-off) above.
         
     | 
| 
       1187 
1170 
     | 
    
         | 
| 
       1188 
     | 
    
         
            -
            ###  
     | 
| 
      
 1171 
     | 
    
         
            +
            ### Minitest
         
     | 
| 
       1189 
1172 
     | 
    
         | 
| 
       1190 
     | 
    
         
            -
             
     | 
| 
       1191 
     | 
    
         
            -
            control when `PaperTrail` is enabled during testing.
         
     | 
| 
      
 1173 
     | 
    
         
            +
            First, disable PT for the entire `ruby` process.
         
     | 
| 
       1192 
1174 
     | 
    
         | 
| 
       1193 
     | 
    
         
            -
             
     | 
| 
       1194 
     | 
    
         
            -
             
     | 
| 
      
 1175 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 1176 
     | 
    
         
            +
            # in config/environments/test.rb
         
     | 
| 
      
 1177 
     | 
    
         
            +
            config.after_initialize do
         
     | 
| 
      
 1178 
     | 
    
         
            +
              PaperTrail.enabled = false
         
     | 
| 
      
 1179 
     | 
    
         
            +
            end
         
     | 
| 
      
 1180 
     | 
    
         
            +
            ```
         
     | 
| 
      
 1181 
     | 
    
         
            +
             
     | 
| 
      
 1182 
     | 
    
         
            +
            Then, to enable PT for specific tests, you can add a `with_versioning` test
         
     | 
| 
      
 1183 
     | 
    
         
            +
            helper method.
         
     | 
| 
       1195 
1184 
     | 
    
         | 
| 
       1196 
1185 
     | 
    
         
             
            ```ruby
         
     | 
| 
       1197 
     | 
    
         
            -
            #  
     | 
| 
      
 1186 
     | 
    
         
            +
            # in test/test_helper.rb
         
     | 
| 
      
 1187 
     | 
    
         
            +
            def with_versioning
         
     | 
| 
      
 1188 
     | 
    
         
            +
              was_enabled = PaperTrail.enabled?
         
     | 
| 
      
 1189 
     | 
    
         
            +
              was_enabled_for_controller = PaperTrail.enabled_for_controller?
         
     | 
| 
      
 1190 
     | 
    
         
            +
              PaperTrail.enabled = true
         
     | 
| 
      
 1191 
     | 
    
         
            +
              PaperTrail.enabled_for_controller = true
         
     | 
| 
      
 1192 
     | 
    
         
            +
              begin
         
     | 
| 
      
 1193 
     | 
    
         
            +
                yield
         
     | 
| 
      
 1194 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 1195 
     | 
    
         
            +
                PaperTrail.enabled = was_enabled
         
     | 
| 
      
 1196 
     | 
    
         
            +
                PaperTrail.enabled_for_controller = was_enabled_for_controller
         
     | 
| 
      
 1197 
     | 
    
         
            +
              end
         
     | 
| 
      
 1198 
     | 
    
         
            +
            end
         
     | 
| 
      
 1199 
     | 
    
         
            +
            ```
         
     | 
| 
      
 1200 
     | 
    
         
            +
             
     | 
| 
      
 1201 
     | 
    
         
            +
            Then, use the helper in your tests.
         
     | 
| 
       1198 
1202 
     | 
    
         | 
| 
      
 1203 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 1204 
     | 
    
         
            +
            test "something that needs versioning" do
         
     | 
| 
      
 1205 
     | 
    
         
            +
              with_versioning do
         
     | 
| 
      
 1206 
     | 
    
         
            +
                # your test
         
     | 
| 
      
 1207 
     | 
    
         
            +
              end
         
     | 
| 
      
 1208 
     | 
    
         
            +
            end
         
     | 
| 
      
 1209 
     | 
    
         
            +
            ```
         
     | 
| 
      
 1210 
     | 
    
         
            +
             
     | 
| 
      
 1211 
     | 
    
         
            +
            ### RSpec
         
     | 
| 
      
 1212 
     | 
    
         
            +
             
     | 
| 
      
 1213 
     | 
    
         
            +
            PaperTrail provides a helper, `paper_trail/frameworks/rspec.rb`, that works with
         
     | 
| 
      
 1214 
     | 
    
         
            +
            [RSpec][27] to make it easier to control when `PaperTrail` is enabled during
         
     | 
| 
      
 1215 
     | 
    
         
            +
            testing.
         
     | 
| 
      
 1216 
     | 
    
         
            +
             
     | 
| 
      
 1217 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 1218 
     | 
    
         
            +
            # spec/rails_helper.rb
         
     | 
| 
       1199 
1219 
     | 
    
         
             
            ENV["RAILS_ENV"] ||= 'test'
         
     | 
| 
       1200 
1220 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       1201 
1221 
     | 
    
         
             
            require File.expand_path("../../config/environment", __FILE__)
         
     | 
| 
         @@ -1204,10 +1224,10 @@ require 'rspec/rails' 
     | 
|
| 
       1204 
1224 
     | 
    
         
             
            require 'paper_trail/frameworks/rspec'
         
     | 
| 
       1205 
1225 
     | 
    
         
             
            ```
         
     | 
| 
       1206 
1226 
     | 
    
         | 
| 
       1207 
     | 
    
         
            -
             
     | 
| 
       1208 
     | 
    
         
            -
            default.  
     | 
| 
      
 1227 
     | 
    
         
            +
            With the helper loaded, PaperTrail will be turned off for all tests by
         
     | 
| 
      
 1228 
     | 
    
         
            +
            default. To enable PaperTrail for a test you can either wrap the
         
     | 
| 
       1209 
1229 
     | 
    
         
             
            test in a `with_versioning` block, or pass in `:versioning => true` option to a
         
     | 
| 
       1210 
     | 
    
         
            -
            spec block 
     | 
| 
      
 1230 
     | 
    
         
            +
            spec block.
         
     | 
| 
       1211 
1231 
     | 
    
         | 
| 
       1212 
1232 
     | 
    
         
             
            ```ruby
         
     | 
| 
       1213 
1233 
     | 
    
         
             
            describe "RSpec test group" do
         
     | 
| 
         @@ -1377,7 +1397,7 @@ setting up your app with PaperTrail will look something like this: 
     | 
|
| 
       1377 
1397 
     | 
    
         | 
| 
       1378 
1398 
     | 
    
         
             
            1. Add PaperTrail to your `Gemfile`.
         
     | 
| 
       1379 
1399 
     | 
    
         | 
| 
       1380 
     | 
    
         
            -
                `gem 'paper_trail' 
     | 
| 
      
 1400 
     | 
    
         
            +
                `gem 'paper_trail'`
         
     | 
| 
       1381 
1401 
     | 
    
         | 
| 
       1382 
1402 
     | 
    
         
             
            2. Generate a migration to add a `versions` table to your database.
         
     | 
| 
       1383 
1403 
     | 
    
         | 
| 
         @@ -1420,7 +1440,6 @@ end 
     | 
|
| 
       1420 
1440 
     | 
    
         
             
              [Ilya Bodrov](http://www.sitepoint.com/author/ibodrov), 10th April 2014
         
     | 
| 
       1421 
1441 
     | 
    
         
             
            * [Using PaperTrail to track stack traces](http://rubyrailsexpert.com/?p=36),
         
     | 
| 
       1422 
1442 
     | 
    
         
             
              T James Corcoran's blog, 1st October 2013.
         
     | 
| 
       1423 
     | 
    
         
            -
            * [RailsCast #255 - Undo with Paper Trail][3], Feb 28, 2011
         
     | 
| 
       1424 
1443 
     | 
    
         
             
            * [RailsCast #255 - Undo with PaperTrail](http://railscasts.com/episodes/255-undo-with-paper-trail),
         
     | 
| 
       1425 
1444 
     | 
    
         
             
              28th February 2011.
         
     | 
| 
       1426 
1445 
     | 
    
         
             
            * [Keep a Paper Trail with PaperTrail](http://www.linux-mag.com/id/7528),
         
     | 
| 
         @@ -1533,3 +1552,5 @@ Released under the MIT licence. 
     | 
|
| 
       1533 
1552 
     | 
    
         
             
            [34]: https://github.com/rails/rails/blob/591a0bb87fff7583e01156696fbbf929d48d3e54/activerecord/lib/active_record/fixtures.rb#L142
         
     | 
| 
       1534 
1553 
     | 
    
         
             
            [35]: https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
         
     | 
| 
       1535 
1554 
     | 
    
         
             
            [36]: http://www.postgresql.org/docs/9.4/interactive/ddl.html
         
     | 
| 
      
 1555 
     | 
    
         
            +
            [37]: https://github.com/ankit1910/paper_trail-globalid
         
     | 
| 
      
 1556 
     | 
    
         
            +
            [38]: https://github.com/sferik/rails_admin
         
     |