Merge pull request #1217 from paper-trail-gem/release-10.3.1

Release 10.3.1
This commit is contained in:
Jared Beck 2019-07-31 17:05:09 -04:00 committed by GitHub
commit ab0846a0f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 216 additions and 154 deletions

View File

@ -88,22 +88,30 @@ markdown-toc -i --maxdepth 3 --bullets='-' README.md
## Releases
1. Checkout the appropriate stable branch, eg. `10-stable`
1. Checkout a new branch, eg. `release-10.0.0`
1. Set the version in `lib/paper_trail/version_number.rb`
1. In the changelog,
- Replace "Unreleased" with the date in ISO-8601 format
- Add a new "Unreleased" section
1. In the readme, update references to version number, including
- documentation links table
- compatability table, if necessary
1. git commit -am 'Release 10.0.0'
1. git push origin release-10.0.0
1. Pull request into `10-stable`
1. git checkout 10-stable && git pull
1. gem build paper_trail.gemspec
1. gem push paper_trail-10.0.0.gem
1. git tag -a -m "v10.0.0" "v10.0.0" # or whatever number
1. git push --tags origin
1. Prepare the appropriate "stable" branch for release, eg. `10-stable`
1. git checkout 10-stable
1. Checkout a new branch, eg. `release-10.3.0`
1. Merge the relevant changes from `master`. This could be a plain merge, or
it could be cherry-picking. The later is more common in backports.
1. Set the version in `lib/paper_trail/version_number.rb`
1. In the changelog,
- Replace "Unreleased" with the date in ISO-8601 format
- Add a new "Unreleased" section
1. In the readme, update references to version number, including
- documentation links table
- compatability table, if necessary
1. git commit -am 'Release 10.3.0'
1. git push origin release-10.3.0
1. Pull request into `10-stable`, CI pass, merge PR
1. Release
1. git checkout 10-stable && git pull
1. gem build paper_trail.gemspec
1. gem push paper_trail-10.3.0.gem
1. git tag -a -m "v10.3.0" "v10.3.0" # or whatever number
1. git push --tags origin
1. Cleanup
1. git checkout master
1. cherry-pick the "Release 10.3.0" commit from the `10-stable` branch
1. git push origin master
[1]: https://github.com/paper-trail-gem/paper_trail/blob/master/.github/ISSUE_TEMPLATE/bug_report.md

View File

@ -1,4 +1,5 @@
require:
- rubocop-performance
- rubocop-rspec
inherit_from: .rubocop_todo.yml

View File

@ -3,11 +3,14 @@ require: rubocop-rspec
# Remove these configuration records
# one by one as the offenses are removed from the code base.
Layout/AlignArguments:
Enabled: false
Metrics/AbcSize:
Max: 21 # Goal: 15
Max: 20 # Goal: 15
Metrics/CyclomaticComplexity:
Max: 8 # Goal: 6
Max: 7 # Goal: 6
Metrics/PerceivedComplexity:
Max: 9 # Goal: 7
@ -18,6 +21,18 @@ Naming/MemoizedInstanceVariableName:
RSpec/ContextWording:
Enabled: false
RSpec/HooksBeforeExamples:
Exclude:
- spec/controllers/articles_controller_spec.rb
- spec/models/version_spec.rb
- spec/paper_trail/config_spec.rb
- spec/paper_trail/request_spec.rb
- spec/paper_trail_spec.rb
RSpec/ImplicitSubject:
Exclude:
- spec/paper_trail/events/base_spec.rb
RSpec/InstanceVariable:
Exclude:
- spec/paper_trail/associations/belongs_to_spec.rb

View File

@ -34,6 +34,10 @@ gemfile:
- gemfiles/ar_5.2.gemfile
- gemfiles/ar_6.0.gemfile
matrix:
allow_failures:
# We haven't changed anything, but mysql builds no longer work on TravisCI.
# Allow failures temporarily until we have time to troubleshoot this.
- env: DB=mysql
exclude:
# rails 6 requires ruby >= 2.5.0
- rvm: 2.3.8

View File

@ -10,7 +10,8 @@
# > https://github.com/thoughtbot/appraisal
appraise "ar-4.2" do
gem "activerecord", [">= 4.2.11.1", "< 4.3"] # CVE-2019-5420
# >= 4.2.11.1 because CVE-2019-5420
gem "activerecord", [">= 4.2.11.1", "< 4.3"]
gem "database_cleaner", "~> 1.6"
# not compatible with mysql2 0.5
@ -22,16 +23,24 @@ appraise "ar-4.2" do
end
appraise "ar-5.1" do
gem "activerecord", [">= 5.1.6.2", "< 5.2"] # CVE-2019-5420
# >= 5.1.6.2 because CVE-2019-5420
gem "activerecord", [">= 5.1.6.2", "< 5.2"]
gem "rails-controller-testing", "~> 1.0.2"
end
appraise "ar-5.2" do
gem "activerecord", [">= 5.2.2.1", "< 5.3"] # CVE-2019-5420
# >= 5.2.2.1 because CVE-2019-5420
gem "activerecord", [">= 5.2.2.1", "< 5.3"]
gem "rails-controller-testing", "~> 1.0.2"
end
appraise "ar-6.0" do
gem "activerecord", [">= 6.0.0.beta3", "< 6.1"] # CVE-2019-5420
# >= 6.0.0.beta3 because CVE-2019-5420
# < rc2 because there seem to have been breaking changes between rc1 and rc2
# re: MigrationContext
gem "activerecord", [">= 6.0.0.beta3", "< 6.0.0.rc2"]
gem "rails-controller-testing", "~> 1.0.3"
# Must match `gem` call in active_record/connection_adapters/sqlite3_adapter.rb
gem "sqlite3", "~> 1.4"
end

View File

@ -17,6 +17,26 @@ recommendations of [keepachangelog.com](http://keepachangelog.com/).
- None
## 10.3.1 (2019-07-31)
### Breaking Changes
- None
### Added
- None
### Fixed
- None
### Dependencies
- [#1213](https://github.com/paper-trail-gem/paper_trail/pull/1213) - Allow
contributors to install incompatible versions of ActiveRecord.
See discussion in paper_trail/compatibility.rb
## 10.3.0 (2019-04-09)
### Breaking Changes
@ -47,20 +67,6 @@ recommendations of [keepachangelog.com](http://keepachangelog.com/).
### Fixed
- None
## 10.2.1 (2019-03-14)
### Breaking Changes
- None
### Added
- None
### Fixed
- [#1184](https://github.com/paper-trail-gem/paper_trail/pull/1184) -
No need to calculate previous values of skipped attributes
- [#1188](https://github.com/paper-trail-gem/paper_trail/pull/1188) -

View File

@ -16,7 +16,7 @@ are welcome.
| Version | Documentation |
| -------------- | ------------- |
| Unreleased | https://github.com/paper-trail-gem/paper_trail/blob/master/README.md |
| 10.3.0 | https://github.com/paper-trail-gem/paper_trail/blob/v10.3.0/README.md |
| 10.3.1 | https://github.com/paper-trail-gem/paper_trail/blob/v10.3.1/README.md |
| 9.2.0 | https://github.com/paper-trail-gem/paper_trail/blob/v9.2.0/README.md |
| 8.1.2 | https://github.com/paper-trail-gem/paper_trail/blob/v8.1.2/README.md |
| 7.1.3 | https://github.com/paper-trail-gem/paper_trail/blob/v7.1.3/README.md |
@ -97,6 +97,9 @@ are welcome.
| 2 | 2.7-stable | >= 1.8.7 | >= 3.0, < 4 |
| 1 | rails2 | >= 1.8.7 | >= 2.3, < 3 |
Experts: to install incompatible versions of activerecord, see
`paper_trail/compatibility.rb`.
### 1.b. Installation
1. Add PaperTrail to your `Gemfile`.
@ -115,6 +118,10 @@ are welcome.
If using [rails_admin][38], you must enable the
experimental [Associations](#4b-associations) feature.
If you're getting "Could not find generator 'paper_trail:install'" errors from
recent Ruby/Rails versions, try running `spring stop`
(see [this thread](https://github.com/paper-trail-gem/paper_trail/issues/459) for more details).
```
bundle exec rake db:migrate
```
@ -1212,14 +1219,25 @@ loop over every record and parse it in Ruby, then write to a temporary column:
```ruby
add_column :versions, :new_object, :jsonb # or :json
# add_column :versions, :new_object_changes, :jsonb # or :json
PaperTrail::Version.reset_column_information
PaperTrail::Version.find_each do |version|
version.update_column :new_object, YAML.load(version.object) if version.object
# PaperTrail::Version.reset_column_information # needed for rails < 6
PaperTrail::Version.where.not(object: nil).find_each do |version|
version.update_column(:new_object, YAML.load(version.object))
# if version.object_changes
# version.update_column(
# :new_object_changes,
# YAML.load(version.object_changes)
# )
# end
end
remove_column :versions, :object
# remove_column :versions, :object_changes
rename_column :versions, :new_object, :object
# rename_column :versions, :new_object_changes, :object_changes
```
This technique can be very slow if you have a lot of data. Though slow, it is
@ -1286,22 +1304,35 @@ end
### 6.c. Custom Object Changes
By default, PaperTrail stores object changes in a before/after array of objects
containing keys of columns that have changed in that particular version. You can
override this behaviour by using the object_changes_adapter config option:
To fully control the contents of their `object_changes` column, expert users
can write an adapter.
```ruby
PaperTrail.config.object_changes_adapter = MyObjectChangesAdapter.new
class MyObjectChangesAdapter
# @param changes Hash
# @return Hash
def diff(changes)
# ...
end
end
```
A valid adapter is a class that contains the following methods:
You should only use this feature if you are comfortable reading PT's source to
see exactly how the adapter is used. For example, see how `diff` is used by
reading `::PaperTrail::Events::Base#recordable_object_changes`.
An adapter can implement any or all of the following methods:
1. diff: Returns the changeset in the desired format given the changeset in the original format
2. load_changeset: Returns the changeset for a given version object
3. where_object_changes: Returns the records resulting from the given hash of attributes.
To preserve the default behavior for some of these, don't define them in your adapter.
Depending on what your adapter does, you may have to implement all three.
For an example of such an implementation, see [paper_trail-hashdiff](https://github.com/hashwin/paper_trail-hashdiff)
For an example of a complete and useful adapter, see
[paper_trail-hashdiff](https://github.com/hashwin/paper_trail-hashdiff)
### 6.d. Excluding the Object Column
@ -1588,8 +1619,8 @@ See our [contribution guidelines][43]
## Inspirations
* [Simply Versioned](http://github.com/github/simply_versioned)
* [Acts As Audited](http://github.com/collectiveidea/acts_as_audited)
* [Simply Versioned](https://github.com/jerome/simply_versioned)
* [Acts As Audited](https://github.com/collectiveidea/audited)
## Intellectual Property

View File

@ -12,3 +12,5 @@ this problem.
Unfortunately, GitHub does not seem to offer a way of disabling the *creation*
of new issues without also hiding existing issues.
You can go to [Stack Overflow](https://stackoverflow.com/questions/tagged/paper-trail-gem) and/or [use google cache to view some issues](https://www.google.com/?q=papertrail+gem+issues+site%3Agithub.com).

View File

@ -2,7 +2,8 @@
source "https://rubygems.org"
gem "activerecord", [">= 6.0.0.beta3", "< 6.1"]
gem "activerecord", [">= 6.0.0.beta3", "< 6.0.0.rc2"]
gem "rails-controller-testing", "~> 1.0.3"
gem "sqlite3", "~> 1.4"
gemspec path: "../"

View File

@ -1,99 +0,0 @@
# frozen_string_literal: true
require "rails/generators"
require "rails/generators/active_record"
module PaperTrail
# Installs PaperTrail in a rails app.
class InstallGenerator < ::Rails::Generators::Base
include ::Rails::Generators::Migration
# Class names of MySQL adapters.
# - `MysqlAdapter` - Used by gems: `mysql`, `activerecord-jdbcmysql-adapter`.
# - `Mysql2Adapter` - Used by `mysql2` gem.
MYSQL_ADAPTERS = [
"ActiveRecord::ConnectionAdapters::MysqlAdapter",
"ActiveRecord::ConnectionAdapters::Mysql2Adapter"
].freeze
source_root File.expand_path("templates", __dir__)
class_option(
:with_changes,
type: :boolean,
default: false,
desc: "Store changeset (diff) with each version"
)
desc "Generates (but does not run) a migration to add a versions table."
def create_migration_file
add_paper_trail_migration("create_versions")
add_paper_trail_migration("add_object_changes_to_versions") if options.with_changes?
end
def self.next_migration_number(dirname)
::ActiveRecord::Generators::Base.next_migration_number(dirname)
end
protected
def add_paper_trail_migration(template)
migration_dir = File.expand_path("db/migrate")
if self.class.migration_exists?(migration_dir, template)
::Kernel.warn "Migration already exists: #{template}"
else
migration_template(
"#{template}.rb.erb",
"db/migrate/#{template}.rb",
item_type_options: item_type_options,
migration_version: migration_version,
versions_table_options: versions_table_options
)
end
end
private
# MySQL 5.6 utf8mb4 limit is 191 chars for keys used in indexes.
# See https://github.com/paper-trail-gem/paper_trail/issues/651
def item_type_options
opt = { null: false }
opt[:limit] = 191 if mysql?
", #{opt}"
end
def migration_version
major = ActiveRecord::VERSION::MAJOR
if major >= 5
"[#{major}.#{ActiveRecord::VERSION::MINOR}]"
end
end
def mysql?
MYSQL_ADAPTERS.include?(ActiveRecord::Base.connection.class.name)
end
# Even modern versions of MySQL still use `latin1` as the default character
# encoding. Many users are not aware of this, and run into trouble when they
# try to use PaperTrail in apps that otherwise tend to use UTF-8. Postgres, by
# comparison, uses UTF-8 except in the unusual case where the OS is configured
# with a custom locale.
#
# - https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
# - http://www.postgresql.org/docs/9.4/static/multibyte.html
#
# Furthermore, MySQL's original implementation of UTF-8 was flawed, and had
# to be fixed later by introducing a new charset, `utf8mb4`.
#
# - https://mathiasbynens.be/notes/mysql-utf8mb4
# - https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
#
def versions_table_options
if mysql?
', { options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci" }'
else
""
end
end
end
end

View File

@ -16,6 +16,7 @@ require "active_record"
require "request_store"
require "paper_trail/cleaner"
require "paper_trail/compatibility"
require "paper_trail/config"
require "paper_trail/has_paper_trail"
require "paper_trail/record_history"
@ -145,3 +146,7 @@ if defined?(::Rails)
else
require "paper_trail/frameworks/active_record"
end
if defined?(::ActiveRecord)
::PaperTrail::Compatibility.check_activerecord(::ActiveRecord.gem_version)
end

View File

@ -0,0 +1,51 @@
# frozen_string_literal: true
module PaperTrail
# Rails does not follow SemVer, makes breaking changes in minor versions.
# Breaking changes are expected, and are generally good for the rails
# ecosystem. However, they often require dozens of hours to fix, even with the
# [help of experts](https://github.com/paper-trail-gem/paper_trail/pull/899).
#
# It is not safe to assume that a new version of rails will be compatible with
# PaperTrail. PT is only compatible with the versions of rails that it is
# tested against. See `.travis.yml`.
#
# However, as of
# [#1213](https://github.com/paper-trail-gem/paper_trail/pull/1213) our
# gemspec allows installation with newer, incompatible rails versions. We hope
# this will make it easier for contributors to work on compatibility with
# newer rails versions. Most PT users should avoid incompatible rails
# versions.
module Compatibility
ACTIVERECORD_GTE = ">= 4.2"
ACTIVERECORD_LT = "< 6.1"
E_INCOMPATIBLE_AR = <<-EOS
PaperTrail %s is not compatible with ActiveRecord %s. We allow PT
contributors to install incompatible versions of ActiveRecord, and this
warning can be silenced with an environment variable, but this is a bad
idea for normal use. Please install a compatible version of ActiveRecord
instead (%s). Please see the discussion in paper_trail/compatibility.rb
for details.
EOS
# Normal users need a warning if they accidentally install an incompatible
# version of ActiveRecord. Contributors can silence this warning with an
# environment variable.
def self.check_activerecord(ar_version)
raise ::TypeError unless ar_version.instance_of?(::Gem::Version)
return if ::ENV["PT_SILENCE_AR_COMPAT_WARNING"].present?
req = ::Gem::Requirement.new([ACTIVERECORD_GTE, ACTIVERECORD_LT])
unless req.satisfied_by?(ar_version)
::Kernel.warn(
format(
E_INCOMPATIBLE_AR,
::PaperTrail.gem_version,
ar_version,
req
)
)
end
end
end
end

View File

@ -9,7 +9,7 @@ module PaperTrail
module VERSION
MAJOR = 10
MINOR = 3
TINY = 0
TINY = 1
# Set PRE to nil unless it's a pre-release (beta, rc, etc.)
PRE = nil

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
$LOAD_PATH.unshift File.expand_path("lib", __dir__)
require "paper_trail/compatibility"
require "paper_trail/version_number"
Gem::Specification.new do |s|
@ -27,8 +28,9 @@ has been destroyed.
s.required_rubygems_version = ">= 1.3.6"
s.required_ruby_version = ">= 2.3.0"
# Rails does not follow semver, makes breaking changes in minor versions.
s.add_dependency "activerecord", [">= 4.2", "< 6.1"]
# We no longer specify a maximum rails version.
# See discussion in paper_trail/compatibility.rb
s.add_dependency "activerecord", ::PaperTrail::Compatibility::ACTIVERECORD_GTE
s.add_dependency "request_store", "~> 1.1"
s.add_development_dependency "appraisal", "~> 2.2"
@ -41,7 +43,8 @@ has been destroyed.
s.add_development_dependency "pg", "~> 1.0"
s.add_development_dependency "rake", "~> 12.3"
s.add_development_dependency "rspec-rails", "~> 3.8"
s.add_development_dependency "rubocop", "~> 0.62.0"
s.add_development_dependency "rubocop-rspec", "~> 1.28.0"
s.add_development_dependency "rubocop", "~> 0.71.0"
s.add_development_dependency "rubocop-performance", "~> 1.3.0"
s.add_development_dependency "rubocop-rspec", "~> 1.33.0"
s.add_development_dependency "sqlite3", "~> 1.3.13"
end

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
module PaperTrail
::RSpec.describe(Compatibility) do
describe ".check_activerecord" do
context "when compatible" do
it "does not produce output" do
ar_version = ::Gem::Version.new("6.0.0")
expect {
described_class.check_activerecord(ar_version)
}.not_to output.to_stderr
end
end
context "when incompatible" do
it "writes a warning to stderr" do
ar_version = ::Gem::Version.new("6.1.0")
expect {
described_class.check_activerecord(ar_version)
}.to output(/not compatible/).to_stderr
end
end
end
end
end