diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 6232111f82095..d9cc7f4ce7c8f 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,8 @@ +* Add condensed `#inspect` for `ConnectionPool`, `AbstractAdapter`, and + `DatabaseConfig`. + + *Hartley McGuire* + * Add `.shard_keys`, `.sharded?`, & `.connected_to_all_shards` methods. ```ruby diff --git a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb index 63ac58564e6ed..233e27b21178f 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -263,6 +263,13 @@ def initialize(pool_config) @reaper.run end + def inspect # :nodoc: + name_field = " name=#{db_config.name.inspect}" unless db_config.name == "primary" + shard_field = " shard=#{@shard.inspect}" unless @shard == :default + + "#<#{self.class.name} env_name=#{db_config.env_name.inspect}#{name_field} role=#{role.inspect}#{shard_field}>" + end + def schema_cache @schema_cache ||= BoundSchemaReflection.new(schema_reflection, self) end diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 6cca7f2c7f059..38044dcf48b08 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -172,6 +172,13 @@ def initialize(config_or_deprecated_connection, deprecated_logger = nil, depreca @verified = false end + def inspect # :nodoc: + name_field = " name=#{pool.db_config.name.inspect}" unless pool.db_config.name == "primary" + shard_field = " shard=#{shard.inspect}" unless shard == :default + + "#<#{self.class.name}:#{'%#016x' % (object_id << 1)} env_name=#{pool.db_config.env_name.inspect}#{name_field} role=#{role.inspect}#{shard_field}>" + end + def lock_thread=(lock_thread) # :nodoc: @lock = case lock_thread diff --git a/activerecord/lib/active_record/database_configurations/database_config.rb b/activerecord/lib/active_record/database_configurations/database_config.rb index bc433aad2b07a..0a60c33e6a7a4 100644 --- a/activerecord/lib/active_record/database_configurations/database_config.rb +++ b/activerecord/lib/active_record/database_configurations/database_config.rb @@ -18,6 +18,10 @@ def adapter_class @adapter_class ||= ActiveRecord::ConnectionAdapters.resolve(adapter) end + def inspect # :nodoc: + "#<#{self.class.name} env_name=#{@env_name} name=#{@name} adapter_class=#{adapter_class}>" + end + def new_connection adapter_class.new(configuration_hash) end diff --git a/activerecord/test/cases/adapter_test.rb b/activerecord/test/cases/adapter_test.rb index e8ea3cff3bbb6..53080d5e7c383 100644 --- a/activerecord/test/cases/adapter_test.rb +++ b/activerecord/test/cases/adapter_test.rb @@ -323,6 +323,12 @@ def test_select_methods_passing_a_relation test "type_to_sql returns a String for unmapped types" do assert_equal "special_db_type", @connection.type_to_sql(:special_db_type) end + + test "inspect does not show secrets" do + output = @connection.inspect + + assert_match(/ActiveRecord::ConnectionAdapters::\w+:0x[\da-f]+ env_name="\w+" role=:writing>/, output) + end end class AdapterForeignKeyTest < ActiveRecord::TestCase diff --git a/activerecord/test/cases/connection_pool_test.rb b/activerecord/test/cases/connection_pool_test.rb index 7e7b4bdd35659..71a356f1cd3de 100644 --- a/activerecord/test/cases/connection_pool_test.rb +++ b/activerecord/test/cases/connection_pool_test.rb @@ -984,6 +984,16 @@ def test_pin_connection_nesting_lock_inverse assert_equal ActiveSupport::Concurrency::NullLock, @pool.lease_connection.lock end + def test_inspect_does_not_show_secrets + assert_match(/#/, @pool.inspect) + + db_config = ActiveRecord::Base.connection_pool.db_config + pool_config = ActiveRecord::ConnectionAdapters::PoolConfig.new(ActiveRecord::Base, db_config, :reading, :shard_one) + pool = ConnectionPool.new(pool_config) + + assert_match(/#/, pool.inspect) + end + private def active_connections(pool) pool.connections.find_all(&:in_use?) diff --git a/activerecord/test/cases/database_configurations/hash_config_test.rb b/activerecord/test/cases/database_configurations/hash_config_test.rb index 2ed1f527d8e06..82fb442631ab0 100644 --- a/activerecord/test/cases/database_configurations/hash_config_test.rb +++ b/activerecord/test/cases/database_configurations/hash_config_test.rb @@ -174,6 +174,11 @@ def test_validate_checks_the_adapter_exists config.validate! end end + + def test_inspect_does_not_show_secrets + config = HashConfig.new("default_env", "primary", { adapter: "abstract", password: "hunter2" }) + assert_equal "#", config.inspect + end end end end