paper-trail-gem--paper_trail/lib/paper_trail/compatibility.rb

52 lines
2.1 KiB
Ruby

# 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 `.github/workflows/test.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 = ">= 5.2" # enforced in gemspec
ACTIVERECORD_LT = "< 7.1" # not enforced in gemspec
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