Skip to content

Commit 2a53fe6

Browse files
Deprecate and replace #default_hash and #[]
Database configurations are now objects almost everywhere, so we don't need to fake access to a hash with `#default_hash` or it's alias `#[]`. Applications should `configs_for` and pass `env_name` and `spec_name` to get the database config object. If you're looking for the default for the test environment you can pass `configs_for(env_name: "test", spec_name: "primary")`. Change test to developement to get the dev config, etc. `#default_hash` and `#[]` will be removed in 6.2. Co-authored-by: John Crepezzi <john.crepezzi@gmail.com>
1 parent dd2798c commit 2a53fe6

19 files changed

+73
-42
lines changed

activerecord/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
* Deprecate `#default_hash` and it's alias `#[]` on database configurations
2+
3+
Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
4+
5+
*Eileen M. Uchitelle*, *John Crepezzi*
6+
17
* Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
28

39
*Gannon McGibbon*

activerecord/lib/active_record/database_configurations.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def default_hash(env = default_env)
6767
default.configuration_hash if default
6868
end
6969
alias :[] :default_hash
70+
deprecate "[]": "Use configs_for", default_hash: "Use configs_for"
7071

7172
# Returns a single DatabaseConfig object based on the requested environment.
7273
#

activerecord/lib/active_record/railties/databases.rake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ db_namespace = namespace :db do
467467
end
468468
ensure
469469
if should_reconnect
470-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations.default_hash(ActiveRecord::Tasks::DatabaseTasks.env))
470+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, spec_name: "primary"))
471471
end
472472
end
473473

activerecord/test/cases/adapter_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ def test_show_nonexistent_variable_returns_nil
145145

146146
def test_not_specifying_database_name_for_cross_database_selects
147147
assert_nothing_raised do
148-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations["arunit"].except(:database))
148+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
149+
ActiveRecord::Base.establish_connection(db_config.configuration_hash.except(:database))
149150

150151
config = ARTest.test_configuration_hashes
151152
ActiveRecord::Base.connection.execute(

activerecord/test/cases/adapters/mysql2/connection_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ def teardown
2222

2323
def test_bad_connection
2424
assert_raise ActiveRecord::NoDatabaseError do
25-
configuration = ActiveRecord::Base.configurations["arunit"].merge(database: "inexistent_activerecord_unittest")
25+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
26+
configuration = db_config.configuration_hash.merge(database: "inexistent_activerecord_unittest")
2627
connection = ActiveRecord::Base.mysql2_connection(configuration)
2728
connection.drop_table "ex", if_exists: true
2829
end

activerecord/test/cases/adapters/mysql2/mysql2_adapter_test.rb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ def test_exec_query_nothing_raises_with_no_result_queries
2121
end
2222

2323
def test_database_exists_returns_false_if_database_does_not_exist
24-
config = ActiveRecord::Base.configurations["arunit"].merge(database: "inexistent_activerecord_unittest")
24+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
25+
config = db_config.configuration_hash.merge(database: "inexistent_activerecord_unittest")
2526
assert_not ActiveRecord::ConnectionAdapters::Mysql2Adapter.database_exists?(config),
2627
"expected database to not exist"
2728
end
2829

2930
def test_database_exists_returns_true_when_the_database_exists
30-
config = ActiveRecord::Base.configurations["arunit"]
31-
assert ActiveRecord::ConnectionAdapters::Mysql2Adapter.database_exists?(config),
32-
"expected database #{config[:database]} to exist"
31+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
32+
assert ActiveRecord::ConnectionAdapters::Mysql2Adapter.database_exists?(db_config.configuration_hash),
33+
"expected database #{db_config.database} to exist"
3334
end
3435

3536
def test_columns_for_distinct_zero_orders
@@ -247,8 +248,10 @@ def test_doesnt_error_when_a_read_query_with_leading_chars_is_called_while_preve
247248
end
248249

249250
def test_read_timeout_exception
251+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
252+
250253
ActiveRecord::Base.establish_connection(
251-
ActiveRecord::Base.configurations[:arunit].merge("read_timeout" => 1)
254+
db_config.configuration_hash.merge("read_timeout" => 1)
252255
)
253256

254257
error = assert_raises(ActiveRecord::AdapterTimeout) do
@@ -278,7 +281,7 @@ def test_statement_timeout_error_codes
278281

279282
def test_doesnt_error_when_a_use_query_is_called_while_preventing_writes
280283
@connection_handler.while_preventing_writes do
281-
db_name = ActiveRecord::Base.configurations["arunit"][:database]
284+
db_name = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary").database
282285
assert_nil @conn.execute("USE #{db_name}")
283286
end
284287
end

activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ def setup
1818

1919
def test_bad_connection
2020
assert_raise ActiveRecord::NoDatabaseError do
21-
configuration = ActiveRecord::Base.configurations["arunit"].merge(database: "should_not_exist-cinco-dog-db")
21+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
22+
configuration = db_config.configuration_hash.merge(database: "should_not_exist-cinco-dog-db")
2223
connection = ActiveRecord::Base.postgresql_connection(configuration)
2324
connection.exec_query("SELECT 1")
2425
end
@@ -31,9 +32,9 @@ def test_database_exists_returns_false_when_the_database_does_not_exist
3132
end
3233

3334
def test_database_exists_returns_true_when_the_database_exists
34-
config = ActiveRecord::Base.configurations["arunit"]
35-
assert ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.database_exists?(config),
36-
"expected database #{config[:database]} to exist"
35+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
36+
assert ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.database_exists?(db_config.configuration_hash),
37+
"expected database #{db_config.database} to exist"
3738
end
3839

3940
def test_primary_key
@@ -476,7 +477,8 @@ def with_example_table(definition = "id serial primary key, number integer, data
476477
end
477478

478479
def connection_without_insert_returning
479-
ActiveRecord::Base.postgresql_connection(ActiveRecord::Base.configurations["arunit"].merge(insert_returning: false))
480+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
481+
ActiveRecord::Base.postgresql_connection(db_config.configuration_hash.merge(insert_returning: false))
480482
end
481483
end
482484
end

activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ def test_database_exists_returns_false_when_the_database_does_not_exist
3535
"expected non_extant_db to not exist"
3636
end
3737

38-
def test_database_exists_returns_true_when_databae_exists
39-
config = ActiveRecord::Base.configurations["arunit"]
40-
assert SQLite3Adapter.database_exists?(config),
41-
"expected #{config[:database]} to exist"
38+
def test_database_exists_returns_true_when_database_exists
39+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
40+
assert SQLite3Adapter.database_exists?(db_config.configuration_hash),
41+
"expected #{db_config.database} to exist"
4242
end
4343

4444
unless in_memory_db?
@@ -545,7 +545,9 @@ def test_respond_to_disable_extension
545545
end
546546

547547
def test_statement_closed
548-
db = ::SQLite3::Database.new(ActiveRecord::Base.configurations["arunit"][:database])
548+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
549+
db = ::SQLite3::Database.new(db_config.database)
550+
549551
statement = ::SQLite3::Statement.new(db,
550552
"CREATE TABLE statement_test (number integer not null)")
551553
statement.stub(:step, -> { raise ::SQLite3::BusyException.new("busy") }) do

activerecord/test/cases/adapters/sqlite3/transaction_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,9 @@ def shared_cache_flags
106106
end
107107

108108
def with_connection(options = {})
109+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
109110
conn_options = options.reverse_merge(
110-
database: in_memory_db? ? "file::memory:" : ActiveRecord::Base.configurations["arunit"][:database]
111+
database: in_memory_db? ? "file::memory:" : db_config.database
111112
)
112113
conn = ActiveRecord::Base.sqlite3_connection(conn_options)
113114

activerecord/test/cases/connection_adapters/connection_handler_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class ConnectionHandlerTest < ActiveRecord::TestCase
1313
def setup
1414
@handler = ConnectionHandler.new
1515
@owner_name = "ActiveRecord::Base"
16-
@pool = @handler.establish_connection(ActiveRecord::Base.configurations["arunit"])
16+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
17+
@pool = @handler.establish_connection(db_config)
1718
end
1819

1920
def test_default_env_fall_back_to_default_env_when_rails_env_or_rack_env_is_empty_string

activerecord/test/cases/connection_adapters/connection_handlers_multi_db_test.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ def setup
1515
@rw_handler = @handlers[:writing]
1616
@ro_handler = @handlers[:reading]
1717
@owner_name = "ActiveRecord::Base"
18-
@rw_pool = @handlers[:writing].establish_connection(ActiveRecord::Base.configurations["arunit"])
19-
@ro_pool = @handlers[:reading].establish_connection(ActiveRecord::Base.configurations["arunit"])
18+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
19+
@rw_pool = @handlers[:writing].establish_connection(db_config)
20+
@ro_pool = @handlers[:reading].establish_connection(db_config)
2021
end
2122

2223
def teardown

activerecord/test/cases/database_configurations_test.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ def test_default_hash_returns_config_hash_from_default_env
4747
original_rails_env = ENV["RAILS_ENV"]
4848
ENV["RAILS_ENV"] = "arunit"
4949

50-
assert_equal ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary").configuration_hash, ActiveRecord::Base.configurations.default_hash
50+
assert_deprecated do
51+
assert_equal ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary").configuration_hash, ActiveRecord::Base.configurations.default_hash
52+
end
5153
ensure
5254
ENV["RAILS_ENV"] = original_rails_env
5355
end

activerecord/test/cases/query_cache_test.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ def test_query_cache_is_applied_to_connections_in_all_handlers
8181
}
8282

8383
ActiveRecord::Base.connected_to(role: :reading) do
84-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations["arunit"])
84+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
85+
ActiveRecord::Base.establish_connection(db_config)
8586
end
8687

8788
mw = middleware { |env|
@@ -104,7 +105,8 @@ def test_query_cache_with_multiple_handlers_and_forked_processes
104105
}
105106

106107
ActiveRecord::Base.connected_to(role: :reading) do
107-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations["arunit"])
108+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
109+
ActiveRecord::Base.establish_connection(db_config)
108110
end
109111

110112
rd, wr = IO.pipe
@@ -588,7 +590,8 @@ def test_clear_query_cache_is_called_on_all_connections
588590
}
589591

590592
ActiveRecord::Base.connected_to(role: :reading) do
591-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations["arunit"])
593+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
594+
ActiveRecord::Base.establish_connection(db_config)
592595
end
593596

594597
mw = middleware { |env|

activerecord/test/cases/tasks/database_tasks_test.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,8 @@ def test_truncate_tables
10561056
assert_operator AuthorAddress.count, :>, 0
10571057

10581058
old_configurations = ActiveRecord::Base.configurations
1059-
configurations = { development: ActiveRecord::Base.configurations["arunit"] }
1059+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", spec_name: "primary")
1060+
configurations = { development: db_config.configuration_hash }
10601061
ActiveRecord::Base.configurations = configurations
10611062

10621063
ActiveRecord::Tasks::DatabaseTasks.stub(:root, nil) do

railties/lib/rails/info.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def to_html
9595

9696
# The name of the database adapter for the current environment.
9797
property "Database adapter" do
98-
ActiveRecord::Base.configurations[Rails.env]["adapter"]
98+
ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary").adapter
9999
end
100100

101101
property "Database schema version" do

railties/test/application/initializers/frameworks_test.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,9 @@ def show
236236
orig_rails_env, Rails.env = Rails.env, "development"
237237
ActiveRecord::Base.establish_connection
238238
assert ActiveRecord::Base.connection
239-
assert_match(/#{ActiveRecord::Base.configurations[Rails.env]['database']}/, ActiveRecord::Base.connection_db_config.database)
239+
assert_match(/#{ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary").database}/, ActiveRecord::Base.connection_db_config.database)
240+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary")
241+
assert_match(/#{db_config.database}/, ActiveRecord::Base.connection_db_config.database)
240242
ensure
241243
ActiveRecord::Base.remove_connection
242244
ENV["DATABASE_URL"] = orig_database_url if orig_database_url

railties/test/application/initializers/hooks_test.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,13 @@ def teardown
5252
end
5353

5454
test "after_initialize runs after frameworks have been initialized" do
55-
$activerecord_configurations = nil
55+
$activerecord_configuration = nil
5656
add_to_config <<-RUBY
57-
config.after_initialize { $activerecord_configurations = ActiveRecord::Base.configurations }
57+
config.after_initialize { $activerecord_configuration = ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary") }
5858
RUBY
5959

6060
require "#{app_path}/config/environment"
61-
assert $activerecord_configurations
62-
assert $activerecord_configurations["development"]
61+
assert $activerecord_configuration
6362
end
6463

6564
test "after_initialize happens after to_prepare in development" do

railties/test/application/rake/dbs_test.rb

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ def db_create_with_warning(expected_database)
5151

5252
test "db:create and db:drop without database URL" do
5353
require "#{app_path}/config/environment"
54-
db_create_and_drop ActiveRecord::Base.configurations[Rails.env][:database]
54+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary")
55+
db_create_and_drop db_config.database
5556
end
5657

5758
test "db:create and db:drop with database URL" do
@@ -332,7 +333,8 @@ def db_migrate_and_status(expected_database)
332333

333334
test "db:migrate and db:migrate:status without database_url" do
334335
require "#{app_path}/config/environment"
335-
db_migrate_and_status ActiveRecord::Base.configurations[Rails.env][:database]
336+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary")
337+
db_migrate_and_status db_config.database
336338
end
337339

338340
test "db:migrate and db:migrate:status with database_url" do
@@ -372,7 +374,8 @@ def db_fixtures_load(expected_database)
372374

373375
test "db:fixtures:load without database_url" do
374376
require "#{app_path}/config/environment"
375-
db_fixtures_load ActiveRecord::Base.configurations[Rails.env][:database]
377+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary")
378+
db_fixtures_load db_config.database
376379
end
377380

378381
test "db:fixtures:load with database_url" do
@@ -407,7 +410,8 @@ def db_structure_dump_and_load(expected_database)
407410

408411
test "db:structure:dump and db:structure:load without database_url" do
409412
require "#{app_path}/config/environment"
410-
db_structure_dump_and_load ActiveRecord::Base.configurations[Rails.env][:database]
413+
db_config = ActiveRecord::Base.connection_db_config
414+
db_structure_dump_and_load db_config.database
411415
end
412416

413417
test "db:structure:dump and db:structure:load with database_url" do
@@ -418,7 +422,8 @@ def db_structure_dump_and_load(expected_database)
418422

419423
test "db:structure:dump and db:structure:load set ar_internal_metadata" do
420424
require "#{app_path}/config/environment"
421-
db_structure_dump_and_load ActiveRecord::Base.configurations[Rails.env][:database]
425+
db_config = ActiveRecord::Base.connection_db_config
426+
db_structure_dump_and_load db_config.database
422427

423428
assert_equal "test", rails("runner", "-e", "test", "puts ActiveRecord::InternalMetadata[:environment]").strip
424429
assert_equal "development", rails("runner", "puts ActiveRecord::InternalMetadata[:environment]").strip
@@ -497,8 +502,8 @@ def db_test_load_structure
497502
require "#{app_path}/app/models/book"
498503
# if structure is not loaded correctly, exception would be raised
499504
assert_equal 0, Book.count
500-
assert_match ActiveRecord::Base.configurations["test"][:database],
501-
ActiveRecord::Base.connection_db_config.database
505+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
506+
assert_match db_config.database, ActiveRecord::Base.connection_db_config.database
502507
end
503508
end
504509

railties/test/application/test_runner_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,7 @@ def Minitest.plugin_json_reporter_init(opts)
966966
967967
class EnvironmentTest < ActiveSupport::TestCase
968968
def test_environment
969-
test_db = ActiveRecord::Base.configurations[#{env.dump}][:database]
969+
test_db = ActiveRecord::Base.configurations.configs_for(env_name: #{env.dump}, spec_name: "primary").database
970970
db_file = ActiveRecord::Base.connection_db_config.database
971971
assert_match(test_db, db_file)
972972
assert_equal #{env.dump}, ENV["RAILS_ENV"]

0 commit comments

Comments
 (0)