From a1be888f7c8df38e2493ac16828c082267e79ad4 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 18:10:16 +0200 Subject: [PATCH 01/11] config: use Rails 5.2 config defaults --- config/application.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/application.rb b/config/application.rb index 0c6d8ea18..d725ae0e4 100644 --- a/config/application.rb +++ b/config/application.rb @@ -11,8 +11,7 @@ Dotenv::Railtie.load module TPS class Application < Rails::Application - config.load_defaults 5.1 - + config.load_defaults 5.2 # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. From e8fa65f79df171ea74d54f56d7227b34729b05ab Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:28:40 +0200 Subject: [PATCH 02/11] config: flip config.action_view.default_enforce_utf8 This prevents charset workaround on IE 8 and lower. We don't support these browsers anyway, so we can flip the feature off. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index 92240ef5f..a43c39dc0 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -7,7 +7,7 @@ # Read the Guide for Upgrading Ruby on Rails for more info on each option. # Don't force requests from old versions of IE to be UTF-8 encoded. -# Rails.application.config.action_view.default_enforce_utf8 = false +Rails.application.config.action_view.default_enforce_utf8 = false # Embed purpose and expiry metadata inside signed and encrypted # cookies for increased security. From 8427f0eb75be02f781631ebe6f35afb130f2499b Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:30:07 +0200 Subject: [PATCH 03/11] config: flip config.action_dispatch.use_cookies_with_metadata This makes cookies more secure, by adding an automatic "purpose" field to each cookie. Cookies generated by Rails 5 are still forward-compatible. However from now on the generated cookies will not be backward-compatible with Rails 6. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index a43c39dc0..d5667abbf 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -14,7 +14,7 @@ Rails.application.config.action_view.default_enforce_utf8 = false # # This option is not backwards compatible with earlier Rails versions. # It's best enabled when your entire app is migrated and stable on 6.0. -# Rails.application.config.action_dispatch.use_cookies_with_metadata = true +Rails.application.config.action_dispatch.use_cookies_with_metadata = true # Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification. # Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false From 65809f8ea0b1df793812859c158bbffc8637b806 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:36:28 +0200 Subject: [PATCH 04/11] config: flip action_dispatch_return_only_media_type_on_content_type This makes `ActionDispatch::Controller#content_type` return not only the MIME type, but also in some circumstances the charset. Example: ```ruby reponse.content_type == 'text/html; charset=utf-8' ``` The MIME type-only fragment can now be accessed using `#media_type`. Changes to the tests are not stricly necessary (because no charset is present in the actual value), but represent the intent better. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- spec/controllers/instructeurs/procedures_controller_spec.rb | 4 ++-- .../attestation_templates_controller_spec.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index d5667abbf..38c836561 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -17,7 +17,7 @@ Rails.application.config.action_view.default_enforce_utf8 = false Rails.application.config.action_dispatch.use_cookies_with_metadata = true # Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification. -# Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false +Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false # Return false instead of self when enqueuing is aborted from a callback. # Rails.application.config.active_job.return_false_on_aborted_enqueue = true diff --git a/spec/controllers/instructeurs/procedures_controller_spec.rb b/spec/controllers/instructeurs/procedures_controller_spec.rb index d32d7dffa..7e5f2e561 100644 --- a/spec/controllers/instructeurs/procedures_controller_spec.rb +++ b/spec/controllers/instructeurs/procedures_controller_spec.rb @@ -540,8 +540,8 @@ describe Instructeurs::ProceduresController, type: :controller do format: :js end - it "responses in the correct format" do - expect(response.content_type).to eq "text/javascript" + it 'responds in the correct format' do + expect(response.media_type).to eq('text/javascript') expect(response).to have_http_status(:ok) end end diff --git a/spec/controllers/new_administrateur/attestation_templates_controller_spec.rb b/spec/controllers/new_administrateur/attestation_templates_controller_spec.rb index 83079adc6..4e50739e9 100644 --- a/spec/controllers/new_administrateur/attestation_templates_controller_spec.rb +++ b/spec/controllers/new_administrateur/attestation_templates_controller_spec.rb @@ -23,7 +23,7 @@ describe NewAdministrateur::AttestationTemplatesController, type: :controller do render_views it 'renders a PDF' do expect(subject.status).to eq(200) - expect(subject.content_type).to eq('application/pdf') + expect(subject.media_type).to eq('application/pdf') end end From c6cdd083737cd97d8a3f6fbb690abcdf26f0e828 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:38:38 +0200 Subject: [PATCH 05/11] config: flip config.active_job.return_false_on_aborted_enqueue We don't have any instance of aborting inside a job in the code base, so this setting is safe to flip. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index 38c836561..91e3f6efb 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -20,7 +20,7 @@ Rails.application.config.action_dispatch.use_cookies_with_metadata = true Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false # Return false instead of self when enqueuing is aborted from a callback. -# Rails.application.config.active_job.return_false_on_aborted_enqueue = true +Rails.application.config.active_job.return_false_on_aborted_enqueue = true # Send Active Storage analysis and purge jobs to dedicated queues. # Rails.application.config.active_storage.queues.analysis = :active_storage_analysis From 54a4db1c47cef2f6f9a2b56148d8dac64a21cbbc Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:48:09 +0200 Subject: [PATCH 06/11] config: flip config.active_storage.queues ActiveStorage jobs are now moved to their own queue. For consistency, we also move our own analysis jobs (VirusScannerJob) on the same `:active_storage_analysis` queue. --- app/jobs/virus_scanner_job.rb | 2 ++ config/initializers/new_framework_defaults_6_0.rb | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/jobs/virus_scanner_job.rb b/app/jobs/virus_scanner_job.rb index 99b2175af..9cf005e00 100644 --- a/app/jobs/virus_scanner_job.rb +++ b/app/jobs/virus_scanner_job.rb @@ -1,4 +1,6 @@ class VirusScannerJob < ApplicationJob + queue_as :active_storage_analysis + discard_on ActiveRecord::RecordNotFound def perform(blob) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index 91e3f6efb..cef3a753f 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -23,8 +23,8 @@ Rails.application.config.action_dispatch.return_only_media_type_on_content_type Rails.application.config.active_job.return_false_on_aborted_enqueue = true # Send Active Storage analysis and purge jobs to dedicated queues. -# Rails.application.config.active_storage.queues.analysis = :active_storage_analysis -# Rails.application.config.active_storage.queues.purge = :active_storage_purge +Rails.application.config.active_storage.queues.analysis = :active_storage_analysis +Rails.application.config.active_storage.queues.purge = :active_storage_purge # When assigning to a collection of attachments declared via `has_many_attached`, replace existing # attachments instead of appending. Use #attach to add new attachments without replacing existing ones. From b556e2a99af6194c665f49fb374026ee1da321d7 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:50:30 +0200 Subject: [PATCH 07/11] config: flip config.active_storage.replace_on_assign_to_many We don't have any `has_many_attached` relations in the code base, so this is safe. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index cef3a753f..10ac4e20d 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -28,7 +28,7 @@ Rails.application.config.active_storage.queues.purge = :active_storage_purge # When assigning to a collection of attachments declared via `has_many_attached`, replace existing # attachments instead of appending. Use #attach to add new attachments without replacing existing ones. -# Rails.application.config.active_storage.replace_on_assign_to_many = true +Rails.application.config.active_storage.replace_on_assign_to_many = true # Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail. # From 4a9f081cfcc31ae96d0c006b9f6d3e65c57926aa Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:52:40 +0200 Subject: [PATCH 08/11] config: flip config.action_mailer.delivery_job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is safe in all cases – except that it prevents a downgrade to Rails 5. We don't intend to downgrade now, so this is fine. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index 10ac4e20d..11ca26536 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -37,7 +37,7 @@ Rails.application.config.active_storage.replace_on_assign_to_many = true # If you send mail in the background, job workers need to have a copy of # MailDeliveryJob to ensure all delivery jobs are processed properly. # Make sure your entire app is migrated and stable on 6.0 before using this setting. -# Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" +Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" # Enable the same cache key to be reused when the object being cached of type # `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count) From fbbcd9746366c60745505469ff9875e1054ff2a9 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Mon, 13 Jul 2020 17:53:51 +0200 Subject: [PATCH 09/11] config: flip config.active_record.collection_cache_versioning This is related to internal cache implementation, and doesn't affect us. --- config/initializers/new_framework_defaults_6_0.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb index 11ca26536..c2a4c7d03 100644 --- a/config/initializers/new_framework_defaults_6_0.rb +++ b/config/initializers/new_framework_defaults_6_0.rb @@ -42,4 +42,4 @@ Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliver # Enable the same cache key to be reused when the object being cached of type # `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count) # of the relation's cache key into the cache version to support recycling cache key. -# Rails.application.config.active_record.collection_cache_versioning = true +Rails.application.config.active_record.collection_cache_versioning = true From bc0244456cb03185dfad7041ec0376d594f46591 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Wed, 5 Aug 2020 16:58:18 +0200 Subject: [PATCH 10/11] config: explicitely use the classic autoloader I'm sure we can use zeitwerk in the future, but let's retain the classic loader until the config issues are proved to be safe. --- config/application.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/application.rb b/config/application.rb index d725ae0e4..ff5d14f68 100644 --- a/config/application.rb +++ b/config/application.rb @@ -12,10 +12,15 @@ Dotenv::Railtie.load module TPS class Application < Rails::Application config.load_defaults 5.2 + # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. + # The default autoloader since Rails 6.0 defaults is zeitwerk. + # However, to split the work, we will move to zeitwerk only in a future PR. + config.autoloader = :classic + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. config.time_zone = 'Paris' From 527a330c7a4e23b025a610e8b7fcd5d89a11c1c4 Mon Sep 17 00:00:00 2001 From: Pierre de La Morinerie Date: Wed, 5 Aug 2020 15:00:06 +0000 Subject: [PATCH 11/11] config: use Rails 6.0 config defaults We already flipped the new defaults, so this is a no-op. --- config/application.rb | 2 +- .../new_framework_defaults_6_0.rb | 45 ------------------- 2 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 config/initializers/new_framework_defaults_6_0.rb diff --git a/config/application.rb b/config/application.rb index ff5d14f68..d0d95339e 100644 --- a/config/application.rb +++ b/config/application.rb @@ -11,7 +11,7 @@ Dotenv::Railtie.load module TPS class Application < Rails::Application - config.load_defaults 5.2 + config.load_defaults 6.0 # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers diff --git a/config/initializers/new_framework_defaults_6_0.rb b/config/initializers/new_framework_defaults_6_0.rb deleted file mode 100644 index c2a4c7d03..000000000 --- a/config/initializers/new_framework_defaults_6_0.rb +++ /dev/null @@ -1,45 +0,0 @@ -# Be sure to restart your server when you modify this file. -# -# This file contains migration options to ease your Rails 6.0 upgrade. -# -# Once upgraded flip defaults one by one to migrate to the new default. -# -# Read the Guide for Upgrading Ruby on Rails for more info on each option. - -# Don't force requests from old versions of IE to be UTF-8 encoded. -Rails.application.config.action_view.default_enforce_utf8 = false - -# Embed purpose and expiry metadata inside signed and encrypted -# cookies for increased security. -# -# This option is not backwards compatible with earlier Rails versions. -# It's best enabled when your entire app is migrated and stable on 6.0. -Rails.application.config.action_dispatch.use_cookies_with_metadata = true - -# Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification. -Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false - -# Return false instead of self when enqueuing is aborted from a callback. -Rails.application.config.active_job.return_false_on_aborted_enqueue = true - -# Send Active Storage analysis and purge jobs to dedicated queues. -Rails.application.config.active_storage.queues.analysis = :active_storage_analysis -Rails.application.config.active_storage.queues.purge = :active_storage_purge - -# When assigning to a collection of attachments declared via `has_many_attached`, replace existing -# attachments instead of appending. Use #attach to add new attachments without replacing existing ones. -Rails.application.config.active_storage.replace_on_assign_to_many = true - -# Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail. -# -# The default delivery jobs (ActionMailer::Parameterized::DeliveryJob, ActionMailer::DeliveryJob), -# will be removed in Rails 6.1. This setting is not backwards compatible with earlier Rails versions. -# If you send mail in the background, job workers need to have a copy of -# MailDeliveryJob to ensure all delivery jobs are processed properly. -# Make sure your entire app is migrated and stable on 6.0 before using this setting. -Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" - -# Enable the same cache key to be reused when the object being cached of type -# `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count) -# of the relation's cache key into the cache version to support recycling cache key. -Rails.application.config.active_record.collection_cache_versioning = true