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