Disallow migrations with the wrong versions
This custom Rubocop ensures that we don't end up with migrations that are too new for Solidus's minimum required Rails version. This has happened a few times lately. See #6192 and #6220 for more context. It would be nice to avoid conflicts like these in an automated way.
This commit is contained in:
parent
68cb0c6354
commit
7d1a43d369
@ -5,6 +5,7 @@ inherit_from: .rubocop_todo.yml
|
|||||||
require:
|
require:
|
||||||
- rubocop-performance
|
- rubocop-performance
|
||||||
- rubocop-rails
|
- rubocop-rails
|
||||||
|
- ./tasks/linting/wrong_migration_version.rb
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
@ -5,6 +5,8 @@ module Spree
|
|||||||
|
|
||||||
def self.solidus_version = VERSION
|
def self.solidus_version = VERSION
|
||||||
|
|
||||||
|
def self.minimum_required_rails_version = "7.0"
|
||||||
|
|
||||||
def self.previous_solidus_minor_version = "4.5"
|
def self.previous_solidus_minor_version = "4.5"
|
||||||
|
|
||||||
def self.solidus_gem_version = Gem::Version.new(solidus_version)
|
def self.solidus_gem_version = Gem::Version.new(solidus_version)
|
||||||
|
@ -27,7 +27,10 @@ Gem::Specification.new do |s|
|
|||||||
actionmailer actionpack actionview activejob activemodel activerecord
|
actionmailer actionpack actionview activejob activemodel activerecord
|
||||||
activestorage activesupport railties
|
activestorage activesupport railties
|
||||||
].each do |rails_dep|
|
].each do |rails_dep|
|
||||||
s.add_dependency rails_dep, ['>= 7.0', '< 8.1.0.beta1']
|
s.add_dependency rails_dep, [
|
||||||
|
">= #{Spree.minimum_required_rails_version}",
|
||||||
|
"< 8.1.0.beta1"
|
||||||
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
s.add_dependency 'activemerchant', '~> 1.66'
|
s.add_dependency 'activemerchant', '~> 1.66'
|
||||||
|
27
tasks/linting/wrong_migration_version.rb
Normal file
27
tasks/linting/wrong_migration_version.rb
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require_relative '../../core/lib/spree/core/version'
|
||||||
|
|
||||||
|
module Solidus
|
||||||
|
class WrongMigrationVersion < RuboCop::Cop::Base
|
||||||
|
MSG = "Subclasses of ActiveRecord::Migration must use a migration version " \
|
||||||
|
"of <= #{Spree.minimum_required_rails_version}"
|
||||||
|
|
||||||
|
def on_class(node)
|
||||||
|
return unless (superclass = node.parent_class)
|
||||||
|
return unless superclass.source&.start_with?("ActiveRecord::Migration")
|
||||||
|
return unless (given_version_arg = superclass.arguments.first&.value)
|
||||||
|
|
||||||
|
unless meets_solidus_minimum_required_rails_version? given_version_arg
|
||||||
|
add_offense node, message: MSG
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def meets_solidus_minimum_required_rails_version?(version_argument)
|
||||||
|
Gem::Version.new(version_argument) <=
|
||||||
|
Gem::Version.new(Spree.minimum_required_rails_version)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
53
tasks/linting/wrong_migration_version_spec.rb
Normal file
53
tasks/linting/wrong_migration_version_spec.rb
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "rubocop"
|
||||||
|
require "rubocop/rspec/support"
|
||||||
|
|
||||||
|
require_relative "wrong_migration_version"
|
||||||
|
|
||||||
|
RSpec.describe Solidus::WrongMigrationVersion do
|
||||||
|
include RuboCop::RSpec::ExpectOffense
|
||||||
|
|
||||||
|
subject(:cop) { described_class.new RuboCop::Config.new }
|
||||||
|
|
||||||
|
it "finds migration versions greater than the Solidus minimum required Rails version offensive" do
|
||||||
|
greater_than_minimum_version = Gem::Version
|
||||||
|
.new(Spree.minimum_required_rails_version)
|
||||||
|
.bump
|
||||||
|
.to_s
|
||||||
|
|
||||||
|
expect_offense(<<~RUBY)
|
||||||
|
class TestMigration < ActiveRecord::Migration[#{greater_than_minimum_version}]
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Solidus/WrongMigrationVersion: Subclasses of ActiveRecord::Migration must use a migration version of <= 7.0
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "finds migration versions less than the Solidus minimum required Rails version inoffensive" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class TestMigration < ActiveRecord::Migration[3.0]
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "finds migration versions equal to the Solidus minimum required Rails version inoffensive" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class TestMigration < ActiveRecord::Migration[#{Spree.minimum_required_rails_version}]
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "finds non-migration classes inoffensive" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class NotAMigration
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
it "finds non-migration subclasses inoffensive" do
|
||||||
|
expect_no_offenses(<<~RUBY)
|
||||||
|
class SubclassOfNotAMigration < NotAMigration
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user