diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 7c432df6..9b6ab7a2 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -44,7 +44,6 @@ Metrics/AbcSize: - 'lib/hanami/cli/commands/app/db/prepare.rb' - 'lib/hanami/cli/commands/app/db/rollback.rb' - 'lib/hanami/cli/commands/app/db/structure/dump.rb' - - 'lib/hanami/cli/commands/app/db/structure/load.rb' - 'lib/hanami/cli/commands/app/db/utils/postgres.rb' - 'lib/hanami/cli/generators/app/slice.rb' diff --git a/lib/hanami/cli/commands/app/db/create.rb b/lib/hanami/cli/commands/app/db/create.rb index 385b08e3..15c144b2 100644 --- a/lib/hanami/cli/commands/app/db/create.rb +++ b/lib/hanami/cli/commands/app/db/create.rb @@ -16,9 +16,9 @@ def call(app: false, slice: nil, gateway: nil, command_exit: method(:exit), **) databases(app: app, slice: slice, gateway: gateway).each do |database| result = database.exec_create_command - exit_codes << result.exit_code if result.respond_to?(:exit_code) + exit_codes << result.exit_code - if result == true || result.successful? + if result.successful? out.puts "=> database #{database.name} created" else out.puts "=> failed to create database #{database.name}" diff --git a/lib/hanami/cli/commands/app/db/drop.rb b/lib/hanami/cli/commands/app/db/drop.rb index 227e5405..61b76394 100644 --- a/lib/hanami/cli/commands/app/db/drop.rb +++ b/lib/hanami/cli/commands/app/db/drop.rb @@ -16,9 +16,9 @@ def call(app: false, slice: nil, gateway: nil, command_exit: method(:exit), **) databases(app: app, slice: slice, gateway: gateway).each do |database| result = database.exec_drop_command - exit_codes << result.exit_code if result.respond_to?(:exit_code) + exit_codes << result.exit_code - if result == true || result.successful? + if result.successful? out.puts "=> database #{database.name} dropped" else out.puts "=> failed to drop database #{database.name}" diff --git a/lib/hanami/cli/commands/app/db/structure/dump.rb b/lib/hanami/cli/commands/app/db/structure/dump.rb index 5a58a9a0..1f7d36ce 100644 --- a/lib/hanami/cli/commands/app/db/structure/dump.rb +++ b/lib/hanami/cli/commands/app/db/structure/dump.rb @@ -24,7 +24,7 @@ def call(app: false, slice: nil, gateway: nil, command_exit: method(:exit), **) measure("#{database.name} structure dumped to #{relative_structure_path}") do catch :dump_failed do result = database.structure_sql_dump - exit_codes << result.exit_code if result.respond_to?(:exit_code) + exit_codes << result.exit_code unless result.successful? out.puts result.err diff --git a/lib/hanami/cli/commands/app/db/structure/load.rb b/lib/hanami/cli/commands/app/db/structure/load.rb index 25999a9c..e586d03e 100644 --- a/lib/hanami/cli/commands/app/db/structure/load.rb +++ b/lib/hanami/cli/commands/app/db/structure/load.rb @@ -17,7 +17,7 @@ class Load < DB::Command option :gateway, required: false, desc: "Use database for gateway" # @api private - def call(app: false, slice: nil, gateway: nil, command_exit: method(:exit), **) # rubocop:disable Metrics/AbcSize + def call(app: false, slice: nil, gateway: nil, command_exit: method(:exit), **) exit_codes = [] databases(app: app, slice: slice, gateway: gateway).each do |database| @@ -29,7 +29,7 @@ def call(app: false, slice: nil, gateway: nil, command_exit: method(:exit), **) measure("#{database.name} structure loaded from #{relative_structure_path}") do catch :load_failed do result = database.exec_load_command - exit_codes << result.exit_code if result.respond_to?(:exit_code) + exit_codes << result.exit_code unless result.successful? out.puts result.err diff --git a/lib/hanami/cli/commands/app/db/utils/mysql.rb b/lib/hanami/cli/commands/app/db/utils/mysql.rb index f14d943e..99756253 100644 --- a/lib/hanami/cli/commands/app/db/utils/mysql.rb +++ b/lib/hanami/cli/commands/app/db/utils/mysql.rb @@ -12,7 +12,7 @@ module Utils class Mysql < Database # @api private def exec_create_command - return true if exists? + return success_result if exists? exec_cli("mysql", %(-e "CREATE DATABASE #{escaped_name}")) end @@ -20,7 +20,7 @@ def exec_create_command # @api private # @since 2.2.0 def exec_drop_command - return true unless exists? + return success_result unless exists? exec_cli("mysql", %(-e "DROP DATABASE #{escaped_name}")) end @@ -56,6 +56,10 @@ def exec_load_command private + def success_result + @success_result ||= SystemCall::Result.new(exit_code: 0, out: "", err: "") + end + def escaped_name Shellwords.escape(name) end diff --git a/lib/hanami/cli/commands/app/db/utils/postgres.rb b/lib/hanami/cli/commands/app/db/utils/postgres.rb index 5aedbaad..e65777f5 100644 --- a/lib/hanami/cli/commands/app/db/utils/postgres.rb +++ b/lib/hanami/cli/commands/app/db/utils/postgres.rb @@ -21,7 +21,7 @@ class Postgres < Database # @api private # @since 2.2.0 def exec_create_command - return true if exists? + return success_result if exists? system_call.call("createdb #{escaped_name}", env: cli_env_vars) end @@ -29,7 +29,7 @@ def exec_create_command # @api private # @since 2.2.0 def exec_drop_command - return true unless exists? + return success_result unless exists? system_call.call("dropdb #{escaped_name}", env: cli_env_vars) end @@ -76,6 +76,10 @@ def schema_migrations_sql_dump private + def success_result + @success_result ||= SystemCall::Result.new(exit_code: 0, out: "", err: "") + end + def post_process_dump(sql) sql.lines.reject do |line| SCHEMA_DUMP_FILTERS.any? { |filter| line =~ filter } diff --git a/lib/hanami/cli/commands/app/db/utils/sqlite.rb b/lib/hanami/cli/commands/app/db/utils/sqlite.rb index e3a9275a..49a06e21 100644 --- a/lib/hanami/cli/commands/app/db/utils/sqlite.rb +++ b/lib/hanami/cli/commands/app/db/utils/sqlite.rb @@ -13,20 +13,28 @@ module Utils class Sqlite < Database # @api private # @since 2.2.0 - Failure = Struct.new(:err) do - def successful? - false + class Failure + def initialize(err) + @err = err end - def exit_code - 1 - end + attr_reader :err + + def successful? = false + def exit_code = 1 + end + + # @api private + # @since 2.2.0 + class Success + def successful? = true + def exit_code = 0 end # @api private # @since 2.2.0 def exec_create_command - return true if exists? + return Success.new if exists? FileUtils.mkdir_p(File.dirname(file_path)) @@ -43,7 +51,8 @@ def exec_drop_command return Failure.new(exception.message) end - true + # Mimic a system_call result + Success.new end # @api private