Skip to content

Add Ruby 3.1 for 5-0-maintenance #2564

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jan 22, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 36 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,31 @@ on:
branches:
- '*'
jobs:
rubocop:
name: Rubocop
runs-on: 'ubuntu-20.04'
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
- run: script/update_rubygems_and_install_bundler
- run: bundle install --standalone
- run: bundle binstubs --all
- run: script/run_rubocop

test:
name: 'Ruby: ${{ matrix.ruby }}, Rails: ${{ matrix.env.RAILS_VERSION }}'
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
include:
# Rails Master (7.0) builds >= 2.7
- ruby: 3.0
allow_failure: true
env:
RAILS_VERSION: 'master'
- ruby: 2.7
allow_failure: true
env:
RAILS_VERSION: 'master'

# Rails 6.1 builds >= 2.5
- ruby: 3.0
allow_failure: true
- ruby: 3.1
env:
RAILS_VERSION: '~> 6.1.0'
- ruby: '3.0'
env:
RAILS_VERSION: '~> 6.1.0'
- ruby: 2.7
Expand All @@ -40,9 +45,14 @@ jobs:
- ruby: 2.5
env:
RAILS_VERSION: '~> 6.1.0'
- ruby: jruby-9.3.1.0
env:
RAILS_VERSION: '~> 6.1.0'
JRUBY_OPT: '--dev'
JAVA_OPTS: '--add-opens java.base/sun.nio.ch=org.jruby.dist --add-opens java.base/java.io=org.jruby.dist --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.security.cert=ALL-UNNAMED --add-opens=java.base/java.util.zip=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util.regex=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/javax.crypto=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED'

# Rails 6.0 builds >= 2.5.0
- ruby: 3.0
- ruby: '3.0'
env:
RAILS_VERSION: '~> 6.0.0'
- ruby: 2.7
Expand All @@ -54,6 +64,12 @@ jobs:
- ruby: 2.5
env:
RAILS_VERSION: '~> 6.0.0'
- ruby: jruby-9.3.1.0
env:
RAILS_VERSION: '~> 6.0.0'
JRUBY_OPT: '--dev'
JAVA_OPTS: '--add-opens java.base/sun.nio.ch=org.jruby.dist --add-opens java.base/java.io=org.jruby.dist --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.security.cert=ALL-UNNAMED --add-opens=java.base/java.util.zip=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util.regex=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/javax.crypto=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED'

# Rails 5.2 builds >= 2.2.2
- ruby: 2.6.6
env:
Expand All @@ -74,12 +90,19 @@ jobs:
- ruby: 2.2.10
env:
RAILS_VERSION: '5-2-stable'
- ruby: jruby-9.3.1.0
env:
RAILS_VERSION: '~> 5.2.0'
JRUBY_OPT: '--dev'
JAVA_OPTS: '--add-opens java.base/sun.nio.ch=org.jruby.dist --add-opens java.base/java.io=org.jruby.dist --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.security.cert=ALL-UNNAMED --add-opens=java.base/java.util.zip=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util.regex=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/javax.crypto=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED'

env: ${{ matrix.env }}
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- run: script/update_rubygems_and_install_bundler
- run: script/clone_all_rspec_repos
- run: bundle install --binstubs
- run: script/run_build
Expand Down
2 changes: 2 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ AllCops:
Exclude:
# Templates are really ERB which Rubocop does not parse
- bin/**/*
- bundle/**/*
- lib/generators/rspec/*/templates/**/*
- tmp/**/*

Bundler/DuplicatedGem:
Enabled: false
Expand Down
4 changes: 4 additions & 0 deletions .rubocop_todo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ Layout/LineLength:
# Over time we'd like to get this down, but this is what we're at now.
Metrics/MethodLength:
Max: 43 # default: 10

Metrics/ClassLength:
Exclude:
- lib/rspec/rails/matchers/have_enqueued_mail.rb
69 changes: 0 additions & 69 deletions .travis.yml

This file was deleted.

11 changes: 11 additions & 0 deletions Gemfile-rails-dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,15 @@ else
gem "puma"
gem 'activerecord-jdbcsqlite3-adapter', platforms: [:jruby]
gem 'selenium-webdriver', require: false

# This is required for Ruby 3.1 and Rails 6.1.x as of time
# of writing, because in Ruby 3.1 these gems are no longer
# automatically included. This issue was fixed on the Rails
# side in Rails 7.0.1, but is not yet fixed in the Rails 6.1.x
# branch. Discussion can be found here - https://github.com/mikel/mail/pull/1439
if RUBY_VERSION >= '3.1' && version.split(' ').last < '7.0'
gem 'net-smtp', require: false
gem 'net-imap', require: false
gem 'net-pop', require: false
end
end
4 changes: 4 additions & 0 deletions lib/rspec/rails/feature_check.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ def has_action_mailbox?
defined?(::ActionMailbox)
end

def ruby_3_1?
RUBY_VERSION >= "3.1"
end

def type_metatag(type)
"type: :#{type}"
end
Expand Down
43 changes: 38 additions & 5 deletions lib/rspec/rails/matchers/have_enqueued_mail.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ def job_match?(job)
def arguments_match?(job)
@args =
if @mail_args.any?
base_mailer_args + @mail_args
base_mailer_args + process_arguments(job, @mail_args)
elsif @mailer_class && @method_name
base_mailer_args + [any_args]
elsif @mailer_class
Expand All @@ -88,12 +88,38 @@ def arguments_match?(job)
super(job)
end

def process_arguments(job, given_mail_args)
# Old matcher behavior working with all builtin classes but ActionMailer::MailDeliveryJob
return given_mail_args if use_given_mail_args?(job)

# If matching args starts with a hash and job instance has params match with them
if given_mail_args.first.is_a?(Hash) && job[:args][3]['params'].present?
[hash_including(params: given_mail_args[0], args: given_mail_args.drop(1))]
else
[hash_including(args: given_mail_args)]
end
end

def use_given_mail_args?(job)
return true if FeatureCheck.has_action_mailer_parameterized? && job[:job] <= ActionMailer::Parameterized::DeliveryJob
return false if FeatureCheck.ruby_3_1?

!(FeatureCheck.has_action_mailer_unified_delivery? && job[:job] <= ActionMailer::MailDeliveryJob)
end

def base_mailer_args
[mailer_class_name, @method_name.to_s, MAILER_JOB_METHOD]
end

def yield_mail_args(block)
proc { |*job_args| block.call(*(job_args - base_mailer_args)) }
proc do |*job_args|
mailer_args = job_args - base_mailer_args
if mailer_args.first.is_a?(Hash)
block.call(*mailer_args.first[:args])
else
block.call(*mailer_args)
end
end
end

def check_active_job_adapter
Expand All @@ -120,16 +146,23 @@ def unmatching_mail_jobs_message

def mail_job_message(job)
mailer_method = job[:args][0..1].join('.')

mailer_args = job[:args][3..-1]
mailer_args = deserialize_arguments(job)[3..-1]
mailer_args = mailer_args.first[:args] if unified_mail?(job)
msg_parts = []
msg_parts << "with #{mailer_args}" if mailer_args.any?
display_args = display_mailer_args(mailer_args)
msg_parts << "with #{display_args}" if display_args.any?
msg_parts << "on queue #{job[:queue]}" if job[:queue] && job[:queue] != 'mailers'
msg_parts << "at #{Time.at(job[:at])}" if job[:at]

"#{mailer_method} #{msg_parts.join(', ')}".strip
end

def display_mailer_args(mailer_args)
return mailer_args unless mailer_args.first.is_a?(Hash) && mailer_args.first.key?(:args)

mailer_args.first[:args]
end

def legacy_mail?(job)
job[:job] <= ActionMailer::DeliveryJob
end
Expand Down
8 changes: 0 additions & 8 deletions script/predicate_functions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,3 @@ function documentation_enforced {
return 1
fi
}

function style_and_lint_enforced {
if [ -x ./bin/rubocop ]; then
return 0
else
return 1
fi
}
4 changes: 0 additions & 4 deletions script/run_build
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@ if documentation_enforced; then
fold "doc check" check_documentation_coverage
fi

if style_and_lint_enforced; then
fold "rubocop" check_style_and_lint
fi

if is_mri; then
fold "one-by-one specs" run_specs_one_by_one
run_all_spec_suites
Expand Down
14 changes: 14 additions & 0 deletions script/run_rubocop
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash
# This file was generated on 2022-01-10T22:24:10+00:00 from the rspec-dev repo.
# DO NOT modify it by hand as your changes will get lost the next time it is generated.

set -e
source script/functions.sh

# Allow repos to override the default functions and add their own
if [ -f script/custom_build_functions.sh ]; then
source script/custom_build_functions.sh
fi


fold "rubocop" check_style_and_lint
18 changes: 11 additions & 7 deletions spec/rspec/rails/matchers/have_enqueued_mail_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -393,18 +393,22 @@ def self.name; "NonMailerJob"; end
}.to have_enqueued_mail(UnifiedMailer, :test_email).and have_enqueued_mail(UnifiedMailer, :email_with_args)
end

it "passes with provided argument matchers" do
it "matches arguments when mailer has only args" do
expect {
UnifiedMailer.email_with_args(1, 2).deliver_later
}.to have_enqueued_mail(UnifiedMailer, :email_with_args).with(1, 2)
end

it "matches arguments when mailer is parameterized" do
expect {
UnifiedMailer.with('foo' => 'bar').test_email.deliver_later
}.to have_enqueued_mail(UnifiedMailer, :test_email).with(
a_hash_including(params: {'foo' => 'bar'})
)
}.to have_enqueued_mail(UnifiedMailer, :test_email).with('foo' => 'bar')
end

it "matches arguments when mixing parameterized and non-parameterized emails" do
expect {
UnifiedMailer.with('foo' => 'bar').email_with_args(1, 2).deliver_later
}.to have_enqueued_mail(UnifiedMailer, :email_with_args).with(
a_hash_including(params: {'foo' => 'bar'}, args: [1, 2])
)
}.to have_enqueued_mail(UnifiedMailer, :email_with_args).with({'foo' => 'bar'}, 1, 2)
end

it "passes when using a mailer with `delivery_job` set to a sub class of `ActionMailer::DeliveryJob`" do
Expand Down