Skip to content
Open
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
30 changes: 26 additions & 4 deletions lib/litestack/railtie.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,33 @@
# lib/litestack/railtie.rb
require "rails/railtie"

module Litestack
class Railtie < ::Rails::Railtie
initializer :disable_production_sqlite_warning do |app|
if config.active_record.key?(:sqlite3_production_warning)
# The whole point of this gem is to use sqlite3 in production.
app.config.active_record.sqlite3_production_warning = false
# Ensure we run before Active Record reads/apply its configuration
initializer :disable_production_sqlite_warning, before: "active_record.set_configs" do |app|
ar = app.config.active_record

# Defensive: some older Rails defaults / templates inject this key
# Rails 8 removed the writer, so delete the key entirely on 8+.
begin
require "active_record"
rails8_or_newer =
defined?(ActiveRecord::VERSION) &&
Gem::Version.new(ActiveRecord::VERSION::STRING) >= Gem::Version.new("8.0.0")
rescue LoadError
rails8_or_newer = false
end

if rails8_or_newer
# On Rails 8+, nuke the unsupported key if present
ar.delete(:sqlite3_production_warning) if ar.respond_to?(:delete)
else
# On Rails 6/7 keep original behavior
if ar.respond_to?(:sqlite3_production_warning=)
ar.sqlite3_production_warning = false
elsif ar.respond_to?(:[]=)
ar[:sqlite3_production_warning] = false
end
end
end
end
Expand Down
43 changes: 43 additions & 0 deletions test/railtie_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# frozen_string_literal: true

require "bundler/setup"
require "minitest/autorun"

# Load Rails + AR Railtie so app.config.active_record exists
require "rails"
require "active_record/railtie"

# Load the gem under test (ensures Litestack::Railtie is defined)
require "litestack"

class RailtieTest < Minitest::Test
class DummyApp < Rails::Application
# Keep noise down during initialize!
config.logger = Logger.new(nil)
config.eager_load = false
config.secret_key_base = "test"

# Use Rails defaults that match the current AR when changes were made
ar_ver = Gem::Version.new(ActiveRecord.version)
defaults = ar_ver >= Gem::Version.new("8.0.0") ? "8.0" : "7.1"
config.load_defaults defaults
end

def test_litestack_railtie_handles_sqlite3_warning_across_rails_versions
# Boot the app — this runs all Railtie initializers including litestack’s
DummyApp.initialize!

keys = DummyApp.config.active_record.respond_to?(:keys) ? DummyApp.config.active_record.keys : []

if Gem::Version.new(ActiveRecord.version) >= Gem::Version.new("8.0.0")
# Rails 8+: key must not be present (writer removed in AR 8)
refute_includes keys, :sqlite3_production_warning
else
# Rails < 8: litestack should still disable the warning
assert_equal false, DummyApp.config.active_record[:sqlite3_production_warning]
end
ensure
# Clean up so other tests (if any) can re-init safely
Rails.application = nil
end
end