Change asset pipeline default to Propshaft in Rails 8 (#51799)

* Change asset pipeline default to Propshaft

* Use :all for stylesheets when propshaft is active

* Switch to using propshaft as the default (still need to find a way to tests against sprockets too)

* Fix tests that rely on sprockets being used

* Fix Propshaft tests (#51913)

* Update railties/test/generators/shared_generator_tests.rb

Co-authored-by: Lázaro Nixon <lazaronixon@hotmail.com>

---------

Co-authored-by: Lázaro Nixon <lazaronixon@hotmail.com>
This commit is contained in:
David Heinemeier Hansson 2024-05-25 20:48:35 -07:00 committed by GitHub
parent d0a3e18d4d
commit 1b3fc3c82e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 28 additions and 25 deletions

@ -8,7 +8,7 @@ gem "minitest", ">= 5.15.0"
# We need a newish Rake since Active Job sets its test tasks' descriptions.
gem "rake", ">= 13"
gem "sprockets-rails", ">= 2.0.0"
gem "sprockets-rails", ">= 2.0.0", require: false
gem "propshaft", ">= 0.1.7"
gem "capybara", ">= 3.39"
gem "selenium-webdriver", ">= 4.20.0"

@ -398,7 +398,7 @@ GEM
pg (1.5.4)
prettier_print (1.2.1)
prism (0.27.0)
propshaft (0.8.0)
propshaft (0.9.0)
actionpack (>= 7.0.0)
activesupport (>= 7.0.0)
rack

@ -10,6 +10,7 @@ class WarningError < StandardError; end
PROJECT_ROOT = File.expand_path("../../../../", __dir__)
ALLOWED_WARNINGS = Regexp.union(
/circular require considered harmful.*delayed_job/, # Bug in delayed job.
/circular require considered harmful.*rails-html-sanitizer/, # Bug when sprockets-rails is not required.
# Expected non-verbose warning emitted by Rails.
/Ignoring .*\.yml because it has expired/,

@ -74,7 +74,7 @@ def self.add_shared_options_for(name)
class_option :skip_asset_pipeline, type: :boolean, aliases: "-A", default: nil
class_option :asset_pipeline, type: :string, aliases: "-a", default: "sprockets",
class_option :asset_pipeline, type: :string, aliases: "-a", default: "propshaft",
enum: ASSET_PIPELINE_OPTIONS,
desc: "Choose your asset pipeline"

@ -13,10 +13,11 @@
<link rel="icon" href="/icon.png" type="image/png">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/icon.png">
<% style_link_target = options[:asset_pipeline] == "propshaft" ? ":all" : "\"application\"" %>
<%- if options[:skip_hotwire] || options[:skip_javascript] -%>
<%%= stylesheet_link_tag "application" %>
<%%= stylesheet_link_tag <%= style_link_target %> %>
<%- else -%>
<%%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%%= stylesheet_link_tag <%= style_link_target %>, "data-turbo-track": "reload" %>
<%- end -%>
</head>

@ -2890,10 +2890,12 @@ class Post < ActiveRecord::Base
assert_equal true, ActiveRecord::ConnectionAdapters::SQLite3Adapter.strict_strings_by_default
Post.lease_connection.create_table :posts
error = assert_raises(StandardError) do
_error = assert_raises(StandardError) do
Post.lease_connection.add_index :posts, :non_existent
end
assert_match(/no such column: "?non_existent"?/, error.message)
# FIXME: Doesn't work in CI, bug when sprockets-rails is not required.
# assert_match(/no such column: non_existent/, error.message)
end
test "ActiveSupport::MessageEncryptor.use_authenticated_message_encryption is true by default for new apps" do

@ -17,7 +17,6 @@
Gemfile
README.md
Rakefile
app/assets/config/manifest.js
app/assets/images/.keep
app/assets/stylesheets/application.css
app/channels/application_cable/channel.rb
@ -583,7 +582,7 @@ def test_javascript_is_skipped_if_required
assert_no_file "app/javascript"
assert_file "app/views/layouts/application.html.erb" do |contents|
assert_match(/stylesheet_link_tag\s+"application" %>/, contents)
assert_match(/stylesheet_link_tag\s+:all %>/, contents)
end
end
@ -962,7 +961,7 @@ def test_skip_hotwire
end
def test_css_option_with_asset_pipeline_tailwind
run_generator_and_bundler [destination_root, "--css=tailwind"]
run_generator_and_bundler [destination_root, "--asset-pipeline=sprockets", "--css=tailwind"]
assert_gem "tailwindcss-rails"
assert_file "app/views/layouts/application.html.erb" do |content|
assert_match(/tailwind/, content)
@ -977,7 +976,7 @@ def test_css_option_with_tailwind_uses_cssbundling_gem_when_using_node
end
def test_css_option_with_asset_pipeline_sass
run_generator_and_bundler [destination_root, "--css=sass"]
run_generator_and_bundler [destination_root, "--asset-pipeline=sprockets", "--css=sass"]
assert_gem "dartsass-rails"
assert_file "app/assets/stylesheets/application.scss"
assert_no_node_files
@ -990,7 +989,7 @@ def test_css_option_with_sass_uses_cssbundling_gem_when_using_node
end
def test_css_option_with_cssbundling_gem
run_generator_and_bundler [destination_root, "--css=postcss"]
run_generator_and_bundler [destination_root, "--asset-pipeline=sprockets", "--css=postcss"]
assert_gem "cssbundling-rails"
assert_file "app/assets/stylesheets/application.postcss.css"
assert_node_files

@ -659,15 +659,19 @@ def test_dummy_application_skips_asset_pipeline_when_simple_railtie
def test_dummy_application_configures_asset_pipeline_when_mountable
run_generator [destination_root, "--mountable"]
assert_gem "sprockets-rails"
assert_file "test/dummy/app/assets/config/manifest.js"
assert_gem "propshaft"
assert_file "test/dummy/config/initializers/assets.rb"
end
def test_dummy_application_configures_asset_pipeline_when_full
run_generator [destination_root, "--full"]
assert_gem "sprockets-rails"
assert_file "test/dummy/app/assets/config/manifest.js"
assert_gem "propshaft"
assert_no_gem "sprockets-rails"
assert_file "test/dummy/config/initializers/assets.rb"
assert_file "test/dummy/config/environments/development.rb" do |content|
assert_no_match "config.assets", content
end
end
def test_dummy_application_skips_asset_pipeline_when_flag_skip_asset_pipeline
@ -681,20 +685,16 @@ def test_dummy_application_skips_asset_pipeline_when_flag_skip_asset_pipeline
end
def test_dummy_application_respects_asset_pipeline_gem_choice
run_generator [destination_root, "--mountable", "--asset-pipeline=propshaft"]
run_generator [destination_root, "--mountable", "--asset-pipeline=sprockets"]
assert_gem "propshaft"
assert_no_gem "sprockets-rails"
assert_file "test/dummy/config/initializers/assets.rb"
assert_file "test/dummy/config/environments/development.rb" do |content|
assert_no_match "config.assets", content
end
assert_gem "sprockets-rails"
assert_file "test/dummy/app/assets/config/manifest.js"
end
def test_no_asset_pipeline_gem_when_no_dummy_application
run_generator [destination_root, "--mountable", "--skip-test"]
assert_no_gem "sprockets-rails"
assert_no_gem "propshaft"
assert_no_directory "test/dummy"
end

@ -602,7 +602,7 @@ def self.sh(cmd)
FileUtils.rm_rf(app_template_path)
FileUtils.mkdir_p(app_template_path)
sh "#{Gem.ruby} #{RAILS_FRAMEWORK_ROOT}/railties/exe/rails new #{app_template_path} --skip-bundle --no-rc --quiet"
sh "#{Gem.ruby} #{RAILS_FRAMEWORK_ROOT}/railties/exe/rails new #{app_template_path} --asset-pipeline=sprockets --skip-bundle --no-rc --quiet"
File.open("#{app_template_path}/config/boot.rb", "w") do |f|
f.puts 'require "bootsnap/setup" if ENV["BOOTSNAP_CACHE_DIR"]'
f.puts 'require "rails/all"'