lib/parallel_tests/tasks.rb in parallel_tests-4.4.0 vs lib/parallel_tests/tasks.rb in parallel_tests-4.5.0

- old
+ new

@@ -46,10 +46,13 @@ # - simple system "set -o pipefail" returns nil even though set -o pipefail exists with 0 def suppress_output(command, ignore_regex) activate_pipefail = "set -o pipefail" remove_ignored_lines = %{(grep -v #{Shellwords.escape(ignore_regex)} || true)} + # remove nil values (ex: #purge_before_load returns nil) + command.compact! + if system('/bin/bash', '-c', "#{activate_pipefail} 2>/dev/null") shell_command = "#{activate_pipefail} && (#{Shellwords.shelljoin(command)}) | #{remove_ignored_lines}" ['/bin/bash', '-c', shell_command] else command @@ -123,10 +126,27 @@ command += ['--test-options', options] if options command += Shellwords.shellsplit pass_through if pass_through command end + def configured_databases + return [] unless defined?(ActiveRecord) && rails_61_or_greater? + + @@configured_databases ||= ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml + end + + def for_each_database(&block) + # Use nil to represent all databases + block&.call(nil) + + return unless defined?(ActiveRecord) + + ActiveRecord::Tasks::DatabaseTasks.for_each(configured_databases) do |name| + block&.call(name) + end + end + private def rails_7_or_greater? Gem::Version.new(Rails.version) >= Gem::Version.new('7.0') end @@ -143,29 +163,37 @@ task :setup, :count do |_, args| command = [$0, "db:setup", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"] ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args) end - desc "Create test databases via db:create --> parallel:create[num_cpus]" - task :create, :count do |_, args| - ParallelTests::Tasks.run_in_parallel( - [$0, "db:create", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"], - args - ) + ParallelTests::Tasks.for_each_database do |name| + task_name = 'create' + task_name += ":#{name}" if name + desc "Create test#{" #{name}" if name} database via db:#{task_name} --> parallel:#{task_name}[num_cpus]" + task task_name.to_sym, :count do |_, args| + ParallelTests::Tasks.run_in_parallel( + [$0, "db:#{task_name}", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"], + args + ) + end end - desc "Drop test databases via db:drop --> parallel:drop[num_cpus]" - task :drop, :count do |_, args| - ParallelTests::Tasks.run_in_parallel( - [ - $0, - "db:drop", - "RAILS_ENV=#{ParallelTests::Tasks.rails_env}", - "DISABLE_DATABASE_ENVIRONMENT_CHECK=1" - ], - args - ) + ParallelTests::Tasks.for_each_database do |name| + task_name = 'drop' + task_name += ":#{name}" if name + desc "Drop test#{" #{name}" if name} database via db:#{task_name} --> parallel:#{task_name}[num_cpus]" + task task_name.to_sym, :count do |_, args| + ParallelTests::Tasks.run_in_parallel( + [ + $0, + "db:#{task_name}", + "RAILS_ENV=#{ParallelTests::Tasks.rails_env}", + "DISABLE_DATABASE_ENVIRONMENT_CHECK=1" + ], + args + ) + end end desc "Update test databases by dumping and loading --> parallel:prepare[num_cpus]" task(:prepare, [:count]) do |_, args| ParallelTests::Tasks.check_for_pending_migrations @@ -188,16 +216,20 @@ next end end # when dumping/resetting takes too long - desc "Update test databases via db:migrate --> parallel:migrate[num_cpus]" - task :migrate, :count do |_, args| - ParallelTests::Tasks.run_in_parallel( - [$0, "db:migrate", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"], - args - ) + ParallelTests::Tasks.for_each_database do |name| + task_name = 'migrate' + task_name += ":#{name}" if name + desc "Update test#{" #{name}" if name} database via db:#{task_name} --> parallel:#{task_name}[num_cpus]" + task task_name.to_sym, :count do |_, args| + ParallelTests::Tasks.run_in_parallel( + [$0, "db:#{task_name}", "RAILS_ENV=#{ParallelTests::Tasks.rails_env}"], + args + ) + end end desc "Rollback test databases via db:rollback --> parallel:rollback[num_cpus]" task :rollback, :count do |_, args| ParallelTests::Tasks.run_in_parallel( @@ -205,19 +237,27 @@ args ) end # just load the schema (good for integration server <-> no development db) - desc "Load dumped schema for test databases via db:schema:load --> parallel:load_schema[num_cpus]" - task :load_schema, :count do |_, args| - command = [ - $0, - ParallelTests::Tasks.purge_before_load, - "db:schema:load", - "RAILS_ENV=#{ParallelTests::Tasks.rails_env}", - "DISABLE_DATABASE_ENVIRONMENT_CHECK=1" - ] - ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args) + ParallelTests::Tasks.for_each_database do |name| + rails_task = 'db:schema:load' + rails_task += ":#{name}" if name + + task_name = 'load_schema' + task_name += ":#{name}" if name + + desc "Load dumped schema for test#{" #{name}" if name} database via #{rails_task} --> parallel:#{task_name}[num_cpus]" + task task_name.to_sym, :count do |_, args| + command = [ + $0, + ParallelTests::Tasks.purge_before_load, + rails_task, + "RAILS_ENV=#{ParallelTests::Tasks.rails_env}", + "DISABLE_DATABASE_ENVIRONMENT_CHECK=1" + ] + ParallelTests::Tasks.run_in_parallel(ParallelTests::Tasks.suppress_schema_load_output(command), args) + end end # load the structure from the structure.sql file # (faster for rails < 6.1, deprecated after and only configured by `ActiveRecord::Base.schema_format`) desc "Load structure for test databases via db:schema:load --> parallel:load_structure[num_cpus]"