DEV: Upgrade Rails to version 7.2
This commit is contained in:
parent
f4d0a77d5f
commit
d6bec460a8
14
Gemfile
14
Gemfile
|
@ -6,13 +6,13 @@ source "https://rubygems.org"
|
|||
|
||||
gem "bootsnap", require: false, platform: :mri
|
||||
|
||||
gem "actionmailer", "~> 7.1.0"
|
||||
gem "actionpack", "~> 7.1.0"
|
||||
gem "actionview", "~> 7.1.0"
|
||||
gem "activemodel", "~> 7.1.0"
|
||||
gem "activerecord", "~> 7.1.0"
|
||||
gem "activesupport", "~> 7.1.0"
|
||||
gem "railties", "~> 7.1.0"
|
||||
gem "actionmailer", "~> 7.2.0"
|
||||
gem "actionpack", "~> 7.2.0"
|
||||
gem "actionview", "~> 7.2.0"
|
||||
gem "activemodel", "~> 7.2.0"
|
||||
gem "activerecord", "~> 7.2.0"
|
||||
gem "activesupport", "~> 7.2.0"
|
||||
gem "railties", "~> 7.2.0"
|
||||
gem "sprockets-rails"
|
||||
|
||||
gem "json"
|
||||
|
|
75
Gemfile.lock
75
Gemfile.lock
|
@ -1,28 +1,26 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionmailer (7.1.5)
|
||||
actionpack (= 7.1.5)
|
||||
actionview (= 7.1.5)
|
||||
activejob (= 7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
actionmailer (7.2.2)
|
||||
actionpack (= 7.2.2)
|
||||
actionview (= 7.2.2)
|
||||
activejob (= 7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
mail (>= 2.8.0)
|
||||
rails-dom-testing (~> 2.2)
|
||||
actionpack (7.1.5)
|
||||
actionview (= 7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
actionpack (7.2.2)
|
||||
actionview (= 7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
nokogiri (>= 1.8.5)
|
||||
racc
|
||||
rack (>= 2.2.4)
|
||||
rack (>= 2.2.4, < 3.2)
|
||||
rack-session (>= 1.0.1)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.2)
|
||||
rails-html-sanitizer (~> 1.6)
|
||||
actionview (7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
useragent (~> 0.16)
|
||||
actionview (7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.11)
|
||||
rails-dom-testing (~> 2.2)
|
||||
|
@ -31,28 +29,27 @@ GEM
|
|||
actionview (>= 6.0.a)
|
||||
active_model_serializers (0.8.4)
|
||||
activemodel (>= 3.0)
|
||||
activejob (7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
activejob (7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
activerecord (7.1.5)
|
||||
activemodel (= 7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
activemodel (7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
activerecord (7.2.2)
|
||||
activemodel (= 7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
timeout (>= 0.4.0)
|
||||
activesupport (7.1.5)
|
||||
activesupport (7.2.2)
|
||||
base64
|
||||
benchmark (>= 0.3)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
concurrent-ruby (~> 1.0, >= 1.3.1)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
logger (>= 1.4.2)
|
||||
minitest (>= 5.1)
|
||||
mutex_m
|
||||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0)
|
||||
tzinfo (~> 2.0, >= 2.0.5)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
annotate (3.2.0)
|
||||
|
@ -263,7 +260,6 @@ GEM
|
|||
multi_xml (0.7.1)
|
||||
bigdecimal (~> 3.1)
|
||||
mustache (1.1.1)
|
||||
mutex_m (0.3.0)
|
||||
net-http (0.5.0)
|
||||
uri
|
||||
net-imap (0.5.1)
|
||||
|
@ -363,7 +359,7 @@ GEM
|
|||
rack (< 3)
|
||||
rack-test (2.1.0)
|
||||
rack (>= 1.3)
|
||||
rackup (1.0.0)
|
||||
rackup (1.0.1)
|
||||
rack (< 3)
|
||||
webrick
|
||||
rails-dom-testing (2.2.0)
|
||||
|
@ -380,10 +376,10 @@ GEM
|
|||
rails_multisite (6.1.0)
|
||||
activerecord (>= 6.0)
|
||||
railties (>= 6.0)
|
||||
railties (7.1.5)
|
||||
actionpack (= 7.1.5)
|
||||
activesupport (= 7.1.5)
|
||||
irb
|
||||
railties (7.2.2)
|
||||
actionpack (= 7.2.2)
|
||||
activesupport (= 7.2.2)
|
||||
irb (~> 1.13)
|
||||
rackup (>= 1.0.0)
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0, >= 1.2.2)
|
||||
|
@ -571,6 +567,7 @@ GEM
|
|||
raindrops (~> 0.7)
|
||||
uniform_notifier (1.16.0)
|
||||
uri (1.0.2)
|
||||
useragent (0.16.10)
|
||||
version_gem (1.1.4)
|
||||
web-push (3.0.1)
|
||||
jwt (~> 2.0)
|
||||
|
@ -603,14 +600,14 @@ PLATFORMS
|
|||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
actionmailer (~> 7.1.0)
|
||||
actionpack (~> 7.1.0)
|
||||
actionview (~> 7.1.0)
|
||||
actionmailer (~> 7.2.0)
|
||||
actionpack (~> 7.2.0)
|
||||
actionview (~> 7.2.0)
|
||||
actionview_precompiler
|
||||
active_model_serializers (~> 0.8.3)
|
||||
activemodel (~> 7.1.0)
|
||||
activerecord (~> 7.1.0)
|
||||
activesupport (~> 7.1.0)
|
||||
activemodel (~> 7.2.0)
|
||||
activerecord (~> 7.2.0)
|
||||
activesupport (~> 7.2.0)
|
||||
addressable
|
||||
annotate
|
||||
aws-sdk-s3
|
||||
|
@ -699,7 +696,7 @@ DEPENDENCIES
|
|||
rails-dom-testing
|
||||
rails_failover
|
||||
rails_multisite
|
||||
railties (~> 7.1.0)
|
||||
railties (~> 7.2.0)
|
||||
rake
|
||||
rb-fsevent
|
||||
rbtrace
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
class ApplicationRequest < ActiveRecord::Base
|
||||
enum req_type: {
|
||||
enum :req_type,
|
||||
{
|
||||
http_total: 0,
|
||||
http_2xx: 1,
|
||||
http_background: 2,
|
||||
|
|
|
@ -4,7 +4,7 @@ class DirectoryColumn < ActiveRecord::Base
|
|||
self.ignored_columns = ["automatic"] # TODO: Remove when 20240212034010_drop_deprecated_columns has been promoted to pre-deploy
|
||||
self.inheritance_column = nil
|
||||
|
||||
enum type: { automatic: 0, user_field: 1, plugin: 2 }, _scopes: false
|
||||
enum :type, { automatic: 0, user_field: 1, plugin: 2 }, scopes: false
|
||||
|
||||
def self.automatic_column_names
|
||||
@automatic_column_names ||= %i[
|
||||
|
|
|
@ -3,7 +3,8 @@
|
|||
class PostHotlinkedMedia < ActiveRecord::Base
|
||||
belongs_to :post
|
||||
belongs_to :upload
|
||||
enum status: {
|
||||
enum :status,
|
||||
{
|
||||
downloaded: "downloaded",
|
||||
too_large: "too_large",
|
||||
download_failed: "download_failed",
|
||||
|
|
|
@ -417,7 +417,7 @@ class RemoteTheme < ActiveRecord::Base
|
|||
self.commits_behind = 0
|
||||
end
|
||||
|
||||
transaction_block = -> do
|
||||
transaction_block = ->(*) do
|
||||
# Destroy fields that no longer exist in the remote theme
|
||||
field_ids_to_destroy = theme.theme_fields.pluck(:id) - updated_fields.map { |tf| tf&.id }
|
||||
ThemeField.where(id: field_ids_to_destroy).destroy_all
|
||||
|
|
|
@ -4,10 +4,10 @@ class ReviewableHistory < ActiveRecord::Base
|
|||
belongs_to :reviewable
|
||||
belongs_to :created_by, class_name: "User"
|
||||
|
||||
enum status: { pending: 0, approved: 1, rejected: 2, ignored: 3, deleted: 4 }
|
||||
enum :status, { pending: 0, approved: 1, rejected: 2, ignored: 3, deleted: 4 }
|
||||
|
||||
alias_attribute :type, :reviewable_history_type
|
||||
enum type: { created: 0, transitioned: 1, edited: 2, claimed: 3, unclaimed: 4 }
|
||||
enum :type, { created: 0, transitioned: 1, edited: 2, claimed: 3, unclaimed: 4 }
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
|
|
|
@ -6,7 +6,7 @@ class ReviewableScore < ActiveRecord::Base
|
|||
belongs_to :reviewed_by, class_name: "User"
|
||||
belongs_to :meta_topic, class_name: "Topic"
|
||||
|
||||
enum status: { pending: 0, agreed: 1, disagreed: 2, ignored: 3 }
|
||||
enum :status, { pending: 0, agreed: 1, disagreed: 2, ignored: 3 }
|
||||
|
||||
# To keep things simple the types correspond to `PostActionType` for backwards
|
||||
# compatibility, but we can add extra reasons for scores.
|
||||
|
|
|
@ -863,7 +863,7 @@ class Theme < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def migrate_settings(start_transaction: true, fields: nil, allow_out_of_sequence_migration: false)
|
||||
block = -> do
|
||||
block = ->(*) do
|
||||
runner = ThemeSettingsMigrationsRunner.new(self)
|
||||
results =
|
||||
runner.run(fields:, raise_error_on_out_of_sequence: !allow_out_of_sequence_migration)
|
||||
|
|
|
@ -238,31 +238,34 @@ class TopicTrackingState
|
|||
end
|
||||
|
||||
def self.new_filter_sql
|
||||
TopicQuery
|
||||
.new_filter(Topic, treat_as_new_topic_clause_sql: treat_as_new_topic_clause)
|
||||
.where_clause
|
||||
.ast
|
||||
.to_sql + " AND topics.created_at > :min_new_topic_date" +
|
||||
" AND dismissed_topic_users.id IS NULL"
|
||||
ActiveRecord::Base.connection.to_sql(
|
||||
TopicQuery
|
||||
.new_filter(Topic, treat_as_new_topic_clause_sql: treat_as_new_topic_clause)
|
||||
.where_clause
|
||||
.ast,
|
||||
) + " AND topics.created_at > :min_new_topic_date" + " AND dismissed_topic_users.id IS NULL"
|
||||
end
|
||||
|
||||
def self.unread_filter_sql(whisperer: false)
|
||||
TopicQuery.unread_filter(Topic, whisperer: whisperer).where_clause.ast.to_sql
|
||||
ActiveRecord::Base.connection.to_sql(
|
||||
TopicQuery.unread_filter(Topic, whisperer: whisperer).where_clause.ast,
|
||||
)
|
||||
end
|
||||
|
||||
def self.treat_as_new_topic_clause
|
||||
User
|
||||
.where(
|
||||
"GREATEST(CASE
|
||||
ActiveRecord::Base.connection.to_sql(
|
||||
User
|
||||
.where(
|
||||
"GREATEST(CASE
|
||||
WHEN COALESCE(uo.new_topic_duration_minutes, :default_duration) = :always THEN u.created_at
|
||||
WHEN COALESCE(uo.new_topic_duration_minutes, :default_duration) = :last_visit THEN COALESCE(u.previous_visit_at,u.created_at)
|
||||
ELSE (:now::timestamp - INTERVAL '1 MINUTE' * COALESCE(uo.new_topic_duration_minutes, :default_duration))
|
||||
END, u.created_at, :min_date)",
|
||||
treat_as_new_topic_params,
|
||||
)
|
||||
.where_clause
|
||||
.ast
|
||||
.to_sql
|
||||
treat_as_new_topic_params,
|
||||
)
|
||||
.where_clause
|
||||
.ast,
|
||||
)
|
||||
end
|
||||
|
||||
def self.treat_as_new_topic_params
|
||||
|
|
|
@ -52,7 +52,7 @@ class TranslationOverride < ActiveRecord::Base
|
|||
validate :check_MF_string, if: :message_format?
|
||||
|
||||
attribute :status, :integer
|
||||
enum status: { up_to_date: 0, outdated: 1, invalid_interpolation_keys: 2, deprecated: 3 }
|
||||
enum :status, { up_to_date: 0, outdated: 1, invalid_interpolation_keys: 2, deprecated: 3 }
|
||||
|
||||
scope :mf_locales,
|
||||
->(locale) { not_deprecated.where(locale: locale).where("translation_key LIKE '%_MF'") }
|
||||
|
|
|
@ -26,7 +26,7 @@ class UserOption < ActiveRecord::Base
|
|||
|
||||
scope :human_users, -> { where("user_id > 0") }
|
||||
|
||||
enum default_calendar: { none_selected: 0, ics: 1, google: 2 }, _scopes: false
|
||||
enum :default_calendar, { none_selected: 0, ics: 1, google: 2 }, scopes: false
|
||||
|
||||
def self.ensure_consistency!
|
||||
sql = <<~SQL
|
||||
|
|
|
@ -18,7 +18,8 @@ class WebHookEventType < ActiveRecord::Base
|
|||
TOPIC_VOTING = 17
|
||||
CHAT_MESSAGE = 18
|
||||
|
||||
enum group: {
|
||||
enum :group,
|
||||
{
|
||||
topic: 0,
|
||||
post: 1,
|
||||
user: 2,
|
||||
|
@ -37,7 +38,7 @@ class WebHookEventType < ActiveRecord::Base
|
|||
chat: 15,
|
||||
custom: 16,
|
||||
},
|
||||
_scopes: false
|
||||
scopes: false
|
||||
|
||||
TYPES = {
|
||||
topic_created: 101,
|
||||
|
|
|
@ -90,7 +90,8 @@ module Discourse
|
|||
# tiny file needed by site settings
|
||||
require "highlight_js"
|
||||
|
||||
config.load_defaults 7.1
|
||||
config.load_defaults 7.2
|
||||
config.yjit = GlobalSetting.yjit_enabled
|
||||
config.active_record.cache_versioning = false # our custom cache class doesn’t support this
|
||||
config.action_controller.forgery_protection_origin_check = false
|
||||
config.active_record.belongs_to_required_by_default = false
|
||||
|
|
|
@ -405,3 +405,6 @@ log_line_max_chars = 160000
|
|||
# Updating the value will allow site operators to invalidate all asset urls
|
||||
# to recover from configuration issues which may have been cached by CDNs/browsers.
|
||||
asset_url_salt =
|
||||
|
||||
# Enable Ruby YJIT to get better performances at the cost of using more memory.
|
||||
yjit_enabled = false
|
||||
|
|
|
@ -2,10 +2,7 @@
|
|||
|
||||
# Multisite freedom patch defines RailsMultisite::DiscoursePatches.config which is used by 200-first_middlewares.rb
|
||||
# Therefore it can not be postponed with .to_prepare
|
||||
RUN_WITHOUT_PREPARE = [
|
||||
"#{Rails.root}/lib/freedom_patches/rails_multisite.rb",
|
||||
"#{Rails.root}/lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb",
|
||||
]
|
||||
RUN_WITHOUT_PREPARE = ["#{Rails.root}/lib/freedom_patches/rails_multisite.rb"]
|
||||
RUN_WITHOUT_PREPARE.each { |path| require(path) }
|
||||
|
||||
Rails.application.reloader.to_prepare do
|
||||
|
|
|
@ -44,7 +44,7 @@ if defined?(RailsFailover::ActiveRecord)
|
|||
|
||||
# Test connection to the master, and trigger master failover if needed
|
||||
ActiveRecord::Base.connected_to(role: ActiveRecord.writing_role) do
|
||||
ActiveRecord::Base.connection.active?
|
||||
ActiveRecord::Base.connection.connect!.active?
|
||||
rescue PG::ConnectionBad, PG::UnableToSend, PG::ServerError
|
||||
RailsFailover::ActiveRecord.verify_primary(ActiveRecord.writing_role)
|
||||
end
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# On initialize, reset flags cache
|
||||
Rails.application.config.to_prepare do
|
||||
if Discourse.cache.is_a?(Cache) &&
|
||||
!ActiveRecord::Base.connection.migration_context.needs_migration?
|
||||
!ActiveRecord::Base.connection_pool.migration_context.needs_migration?
|
||||
Flag.reset_flag_settings!
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# TODO: Drop this patch when upgrading to Rails 7.2
|
||||
#
|
||||
# Here we use the code from Rails 7.2 because the code from Rails 7.1 has a
|
||||
# nasty bug that happens when there is more than one tagged logger in the
|
||||
# broadcast logger.
|
||||
# The Rails 7.1 implementation calls `#call_app` as many times as there are
|
||||
# tagged loggers, which leads to all sort of strange behaviors.
|
||||
module RailsRackLoggerFromRails7_2
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def call(env)
|
||||
request = ActionDispatch::Request.new(env)
|
||||
|
||||
env["rails.rack_logger_tag_count"] = if logger.respond_to?(:push_tags)
|
||||
logger.push_tags(*compute_tags(request)).size
|
||||
else
|
||||
0
|
||||
end
|
||||
|
||||
call_app(request, env)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def call_app(request, env) # :doc:
|
||||
logger_tag_pop_count = env["rails.rack_logger_tag_count"]
|
||||
|
||||
instrumenter = ActiveSupport::Notifications.instrumenter
|
||||
handle = instrumenter.build_handle("request.action_dispatch", { request: request })
|
||||
handle.start
|
||||
|
||||
logger.info { started_request_message(request) }
|
||||
status, headers, body = response = @app.call(env)
|
||||
body =
|
||||
::Rack::BodyProxy.new(body) { finish_request_instrumentation(handle, logger_tag_pop_count) }
|
||||
|
||||
if response.frozen?
|
||||
[status, headers, body]
|
||||
else
|
||||
response[2] = body
|
||||
response
|
||||
end
|
||||
rescue Exception
|
||||
finish_request_instrumentation(handle, logger_tag_pop_count)
|
||||
raise
|
||||
end
|
||||
|
||||
def finish_request_instrumentation(handle, logger_tag_pop_count)
|
||||
handle.finish
|
||||
if logger.respond_to?(:pop_tags) && logger_tag_pop_count > 0
|
||||
logger.pop_tags(logger_tag_pop_count)
|
||||
end
|
||||
ActiveSupport::LogSubscriber.flush_all!
|
||||
end
|
||||
end
|
||||
Rails::Rack::Logger.prepend(RailsRackLoggerFromRails7_2)
|
|
@ -70,7 +70,7 @@ end
|
|||
|
||||
task "db:rollback" => %w[environment set_locale] do |_, args|
|
||||
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
||||
ActiveRecord::Base.connection.migration_context.rollback(step)
|
||||
ActiveRecord::Base.connection_pool.migration_context.rollback(step)
|
||||
Rake::Task["db:_dump"].invoke
|
||||
end
|
||||
|
||||
|
@ -236,7 +236,7 @@ task "db:migrate" => %w[
|
|||
redis: Discourse.redis.without_namespace,
|
||||
validity: 300,
|
||||
) do
|
||||
migrations = ActiveRecord::Base.connection.migration_context.migrations
|
||||
migrations = ActiveRecord::Base.connection_pool.migration_context.migrations
|
||||
now_timestamp = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
||||
epoch_timestamp = Time.at(0).utc.strftime("%Y%m%d%H%M%S").to_i
|
||||
|
||||
|
|
|
@ -9,15 +9,11 @@ class Poll < ActiveRecord::Base
|
|||
has_many :poll_options, -> { order(:id) }, dependent: :destroy
|
||||
has_many :poll_votes
|
||||
|
||||
enum type: { regular: 0, multiple: 1, number: 2, ranked_choice: 3 }, _scopes: false
|
||||
|
||||
enum status: { open: 0, closed: 1 }, _scopes: false
|
||||
|
||||
enum results: { always: 0, on_vote: 1, on_close: 2, staff_only: 3 }, _scopes: false
|
||||
|
||||
enum visibility: { secret: 0, everyone: 1 }, _scopes: false
|
||||
|
||||
enum chart_type: { bar: 0, pie: 1 }, _scopes: false
|
||||
enum :type, { regular: 0, multiple: 1, number: 2, ranked_choice: 3 }, scopes: false
|
||||
enum :status, { open: 0, closed: 1 }, scopes: false
|
||||
enum :results, { always: 0, on_vote: 1, on_close: 2, staff_only: 3 }, scopes: false
|
||||
enum :visibility, { secret: 0, everyone: 1 }, scopes: false
|
||||
enum :chart_type, { bar: 0, pie: 1 }, scopes: false
|
||||
|
||||
validates :min, numericality: { allow_nil: true, only_integer: true, greater_than_or_equal_to: 0 }
|
||||
validates :max, numericality: { allow_nil: true, only_integer: true, greater_than: 0 }
|
||||
|
|
|
@ -13,8 +13,8 @@ RSpec.describe Migration::SafeMigrate do
|
|||
ActiveRecord::Migrator.new(
|
||||
:up,
|
||||
migrations,
|
||||
ActiveRecord::Base.connection.schema_migration,
|
||||
ActiveRecord::Base.connection.internal_metadata,
|
||||
ActiveRecord::Base.connection_pool.schema_migration,
|
||||
ActiveRecord::Base.connection_pool.internal_metadata,
|
||||
migrations.first.version,
|
||||
).run
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue