Skip to content
Permalink
Browse files
Allow to pass a connection to the dbconsole command
Since 0a4f600, it's possible to specify a 3-level database
configuration to gather connections by environment.

The `dbconsole` command will try to look for a database configuration
which points to the current environment but with such flavour, the
environment key is flushed out so let's add the ability to specify
the connection and pick `primary` by default to be consistent with
Active Record.
  • Loading branch information
robin850 committed Jul 16, 2017
1 parent 16f2b20 commit 1acd9a6
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 2 deletions.
@@ -1,3 +1,10 @@
* Allow to pass a custom connection name to the `rails dbconsole`
command when using a 3-level database configuration.

$ bin/rails dbconsole -c replica

*Robin Dupret*, *Jeremy Daer*

* Skip unused components when running `bin/rails app:update`.

If the initial app generation skipped Action Cable, Active Record etc.,
@@ -87,10 +87,15 @@ def start

def config
@config ||= begin
if configurations[environment].blank?
# We need to check whether the user passed the connection the
# first time around to show a consistent error message to people
# relying on 2-level database configuration.
if @options["connection"] && configurations[connection].blank?
raise ActiveRecord::AdapterNotSpecified, "'#{connection}' connection is not configured. Available configuration: #{configurations.inspect}"
elsif configurations[environment].blank? && configurations[connection].blank?
raise ActiveRecord::AdapterNotSpecified, "'#{environment}' database is not configured. Available configuration: #{configurations.inspect}"
else
configurations[environment]
configurations[environment].presence || configurations[connection]
end
end
end
@@ -99,6 +104,10 @@ def environment
Rails.respond_to?(:env) ? Rails.env : Rails::Command.environment
end

def connection
@options.fetch(:connection, "primary")
end

private
def configurations # :doc:
require APP_PATH
@@ -145,6 +154,9 @@ class DbconsoleCommand < Base # :nodoc:
class_option :environment, aliases: "-e", type: :string,
desc: "Specifies the environment to run this console under (test/development/production)."

class_option :connection, aliases: "-c", type: :string,
desc: "Specifies the connection to use."

def perform
extract_environment_option_from_argument

@@ -200,6 +200,49 @@ def test_unknown_command_line_client
assert_match(/Unknown command-line client for db/, output)
end

def test_primary_is_automatically_picked_with_3_level_configuration
sample_config = {
"test" => {
"primary" => {
"adapter" => "postgresql"
}
}
}

app_db_config(sample_config) do
assert_equal "postgresql", Rails::DBConsole.new.config["adapter"]
end
end

def test_specifying_a_custom_connection_and_environment
stub_available_environments(["development"]) do
dbconsole = parse_arguments(["-c", "custom", "-e", "development"])

assert_equal "development", dbconsole[:environment]
assert_equal "custom", dbconsole.connection
end
end

def test_specifying_a_missing_connection
app_db_config({}) do
e = assert_raises(ActiveRecord::AdapterNotSpecified) do
Rails::Command.invoke(:dbconsole, ["-c", "i_do_not_exist"])
end

assert_includes e.message, "'i_do_not_exist' connection is not configured."
end
end

def test_specifying_a_missing_environment
app_db_config({}) do
e = assert_raises(ActiveRecord::AdapterNotSpecified) do
Rails::Command.invoke(:dbconsole)
end

assert_includes e.message, "'test' database is not configured."
end
end

def test_print_help_short
stdout = capture(:stdout) do
Rails::Command.invoke(:dbconsole, ["-h"])

0 comments on commit 1acd9a6

Please sign in to comment.