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
|