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]"