minitest-parallel_fork 1.1.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42db9e813710ee5326a0df5f24f4b5deb361cc21372e6a87124008039526cddc
4
- data.tar.gz: e29d3ab12e2559a840a9bf92dd4653f0e98397c0381167c3f1dbb1fc6c7391f7
3
+ metadata.gz: b7def66702fe6ea3e7cf52578a812f0ecdbb4b3545c2bd4d04ee5ff73a417af5
4
+ data.tar.gz: 138a5104f9f344284e806a6b90deb20d61fdf2b16562488b8afc3917f9d8738d
5
5
  SHA512:
6
- metadata.gz: 4e45f180446e10b90ab9aaa7051261eec1e5c472422a1b5c522f7d58cd44f4f0adef68f2d875f3061c4902662e2ed190208d8448af6d89b6faf78445e132c9dc
7
- data.tar.gz: 5d8b6fecb607917c6bc3940ad758eae573a32c5f5b803f68bddc2e3bada9a50c0668e0ddfdb84d9cd14ee357a53ae6b15cd2ca33c24830cf1b57ded37b92b463
6
+ metadata.gz: cbc75286347260d6a6cd54e3c8bb1c21f1cd3c9c24c2e843a3942ab7056fc53e4ee092a4a65cb66e52816433a96dfbdfd338b871e334acc1e973fa80ad184d6c
7
+ data.tar.gz: f882ac98930a53fa6ec7d02b3edf50bf9a34b3bb7ce17f72b834879313df0f251c9aa23ea45b5cb1f4d02e969933728dca5ec7f1e8898c3c4cc9b2e7d95fe487
data/CHANGELOG CHANGED
@@ -1,3 +1,19 @@
1
+ === 1.3.0 (2022-07-05)
2
+
3
+ * Bump minimum minitest version to 5.15.0 (jeremyevans)
4
+
5
+ * Detect reporter to use by looking for specific methods, instead of specifically for a Minitest::StatisticsReporter (jeremyevans) (#8)
6
+
7
+ === 1.2.0 (2021-08-16)
8
+
9
+ * Work correctly with Minitest 5.14+ (jeremyevans)
10
+
11
+ * Add on_parallel_fork_marshal_failure hook for handling marshal failures (child process exiting) (jeremyevans)
12
+
13
+ === 1.1.2 (2018-07-05)
14
+
15
+ * Handle raised exceptions containing unmarshallable data (jeremyevans)
16
+
1
17
  === 1.1.1 (2018-05-07)
2
18
 
3
19
  * Work around marshalling issue when there are failures in *_all hooks when using minitest-hooks (jeremyevans)
data/README.rdoc CHANGED
@@ -59,6 +59,15 @@ disconnected, and after forking, the database name is changed in each child to r
59
59
  a child-specific database, so that the child processes do not share a database and are
60
60
  thus independent.
61
61
 
62
+ There is also a hook for debugging. +on_parallel_fork_marshal_failure+ is called if
63
+ there is an error unmarshalling data sent from the child process to the parent process.
64
+ This can happen if one of the child processes exits unexpected during the test, before
65
+ it reports results.
66
+
67
+ Minitest.on_parallel_fork_marshal_failure do
68
+ # Gather relevant logs for more debugging
69
+ end
70
+
62
71
  == ActiveRecord
63
72
 
64
73
  To use this with Rails/ActiveRecord, you probably want to use hooks similar to:
@@ -6,18 +6,28 @@ module Minitest
6
6
  def self.before_parallel_fork(&block)
7
7
  @before_parallel_fork = block
8
8
  end
9
+ @before_parallel_fork = nil
9
10
 
10
11
  # Set the after_parallel_fork block to the given block
11
12
  def self.after_parallel_fork(i=nil, &block)
12
13
  @after_parallel_fork = block
13
14
  end
15
+ @after_parallel_fork = nil
16
+
17
+ # Set the on_parallel_fork_marshal_failure block to the given block
18
+ def self.on_parallel_fork_marshal_failure(&block)
19
+ @on_parallel_fork_marshal_failure = block
20
+ end
21
+ @on_parallel_fork_marshal_failure = nil
14
22
 
15
23
  module Unparallelize
16
24
  define_method(:run_one_method, &Minitest::Test.method(:run_one_method))
17
25
  end
18
26
 
19
27
  def self.parallel_fork_stat_reporter(reporter)
20
- reporter.reporters.detect{|rep| rep.is_a?(StatisticsReporter)}
28
+ reporter.reporters.detect do |rep|
29
+ %w'count assertions results count= assertions='.all?{|meth| rep.respond_to?(meth)}
30
+ end
21
31
  end
22
32
 
23
33
  # Override __run to use a child forks to run the speeds, which
@@ -28,15 +38,15 @@ module Minitest
28
38
 
29
39
  n = (ENV['NCPU'] || 4).to_i
30
40
  reads = []
31
- if defined?(@before_parallel_fork)
41
+ if @before_parallel_fork
32
42
  @before_parallel_fork.call
33
43
  end
34
44
  n.times do |i|
35
45
  read, write = IO.pipe.each{|io| io.binmode}
36
46
  reads << read
37
- fork do
47
+ Process.fork do
38
48
  read.close
39
- if defined?(@after_parallel_fork)
49
+ if @after_parallel_fork
40
50
  @after_parallel_fork.call(i)
41
51
  end
42
52
 
@@ -44,19 +54,13 @@ module Minitest
44
54
  suites.each_with_index{|s, j| p_suites << s if j % n == i}
45
55
  p_suites.each do |s|
46
56
  if s.is_a?(Minitest::Parallel::Test::ClassMethods)
47
- s.extend(Unparallelize)
57
+ s.extend(Unparallelize)
48
58
  end
49
59
 
50
60
  s.run(reporter, options)
51
61
  end
52
62
 
53
63
  data = %w'count assertions results'.map{|meth| stat_reporter.send(meth)}
54
- if data[-1].any?{|result| !result.is_a?(Minitest::Result)}
55
- data[-1] = data[-1].map do |result|
56
- Minitest::Result.from(result)
57
- end
58
- end
59
-
60
64
  write.write(Marshal.dump(data))
61
65
  write.close
62
66
  end
@@ -64,7 +68,14 @@ module Minitest
64
68
  end
65
69
 
66
70
  reads.map{|read| Thread.new(read, &:read)}.map(&:value).each do |data|
67
- count, assertions, results = Marshal.load(data)
71
+ begin
72
+ count, assertions, results = Marshal.load(data)
73
+ rescue ArgumentError
74
+ if @on_parallel_fork_marshal_failure
75
+ @on_parallel_fork_marshal_failure.call
76
+ end
77
+ raise
78
+ end
68
79
  stat_reporter.count += count
69
80
  stat_reporter.assertions += assertions
70
81
  stat_reporter.results.concat(results)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-parallel_fork
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-07 00:00:00.000000000 Z
11
+ date: 2022-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -16,14 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.11.0
19
+ version: 5.15.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.15.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest-hooks
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-global_expectations
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
20
48
  type: :development
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
52
  - - ">="
25
53
  - !ruby/object:Gem::Version
26
- version: 5.11.0
54
+ version: '0'
27
55
  description: |
28
56
  minitest-parallel_fork adds fork-based parallelization to Minitest. Each test/spec
29
57
  suite is run in one of the forks, allowing this to work correctly when using
@@ -42,14 +70,15 @@ files:
42
70
  - CHANGELOG
43
71
  - MIT-LICENSE
44
72
  - README.rdoc
45
- - Rakefile
46
73
  - lib/minitest/parallel_fork.rb
47
- - spec/minitest_parallel_fork_example.rb
48
- - spec/minitest_parallel_fork_spec.rb
49
74
  homepage: http://github.com/jeremyevans/minitest-parallel_fork
50
75
  licenses:
51
76
  - MIT
52
- metadata: {}
77
+ metadata:
78
+ bug_tracker_uri: https://github.com/jeremyevans/minitest-parallel_fork/issues
79
+ changelog_uri: https://github.com/jeremyevans/minitest-parallel_fork/blob/master/CHANGELOG
80
+ mailing_list_uri: https://github.com/jeremyevans/minitest-parallel_fork/discussions
81
+ source_code_uri: https://github.com/jeremyevans/minitest-parallel_fork
53
82
  post_install_message:
54
83
  rdoc_options:
55
84
  - "--quiet"
@@ -72,8 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
101
  - !ruby/object:Gem::Version
73
102
  version: '0'
74
103
  requirements: []
75
- rubyforge_project:
76
- rubygems_version: 2.7.6
104
+ rubygems_version: 3.3.7
77
105
  signing_key:
78
106
  specification_version: 4
79
107
  summary: Fork-based parallelization for minitest
data/Rakefile DELETED
@@ -1,46 +0,0 @@
1
- require "rake"
2
- require "rake/clean"
3
-
4
- CLEAN.include ["minitest-parallel_fork-*.gem", "rdoc", "coverage"]
5
-
6
- desc "Build minitest-parallel_fork gem"
7
- task :package=>[:clean] do |p|
8
- sh %{#{FileUtils::RUBY} -S gem build minitest-parallel_fork.gemspec}
9
- end
10
-
11
- ### Specs
12
-
13
- desc "Run specs"
14
- task :spec do
15
- ENV['RUBY'] = FileUtils::RUBY
16
- sh %{#{FileUtils::RUBY} spec/minitest_parallel_fork_spec.rb}
17
- end
18
-
19
- task :default=>:spec
20
-
21
- ### RDoc
22
-
23
- RDOC_DEFAULT_OPTS = ["--quiet", "--line-numbers", "--inline-source", '--title', 'minitest-parallel_fork: fork-based parallelization for minitest']
24
-
25
- begin
26
- gem 'hanna-nouveau'
27
- RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
28
- rescue Gem::LoadError
29
- end
30
-
31
- rdoc_task_class = begin
32
- require "rdoc/task"
33
- RDoc::Task
34
- rescue LoadError
35
- require "rake/rdoctask"
36
- Rake::RDocTask
37
- end
38
-
39
- RDOC_OPTS = RDOC_DEFAULT_OPTS + ['--main', 'README.rdoc']
40
-
41
- rdoc_task_class.new do |rdoc|
42
- rdoc.rdoc_dir = "rdoc"
43
- rdoc.options += RDOC_OPTS
44
- rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/**/*.rb"
45
- end
46
-
@@ -1,41 +0,0 @@
1
- gem 'minitest'
2
- require 'minitest/autorun'
3
- require 'minitest/parallel_fork'
4
-
5
- a = nil
6
- Minitest.before_parallel_fork do
7
- a = 'a'
8
- print ":parent"
9
- end
10
-
11
- Minitest.after_parallel_fork do |i|
12
- print ":child#{i}#{a}"
13
- end
14
-
15
- 4.times do |i|
16
- describe 'minitest/parallel_fork' do
17
- parallelize_me! if ENV['MPF_PARALLELIZE_ME']
18
-
19
- if ENV['MPF_TEST_ORDER_PARALLEL']
20
- def self.test_order
21
- :parallel
22
- end
23
- end
24
-
25
- it "should work" do
26
- sleep(1).must_equal 1
27
- end
28
-
29
- it "should fail" do
30
- 1.must_equal 2
31
- end
32
-
33
- it "should raise" do
34
- raise
35
- end
36
-
37
- it "should skip" do
38
- skip
39
- end
40
- end
41
- end
@@ -1,26 +0,0 @@
1
- gem 'minitest'
2
- require 'minitest/autorun'
3
-
4
- describe 'minitest/parallel_fork' do
5
- [[nil, ''],
6
- ['MPF_PARALLELIZE_ME', ' when parallelize_me! is used'],
7
- ['MPF_TEST_ORDER_PARALLEL', ' when test_order parallel is used']
8
- ].each do |env_key, msg|
9
- it "should execute in parallel#{msg}" do
10
- t = Time.now
11
- ENV['NCPU'] = '4'
12
- ENV[env_key] = '1' if env_key
13
- output = `#{ENV['RUBY']} -I lib spec/minitest_parallel_fork_example.rb`
14
- ENV.delete(env_key) if env_key
15
-
16
- time = (Time.now - t)
17
- time.must_be :<, 4
18
- time.must_be :>, 1
19
- output.must_match /:parent/
20
- output.must_match /16 runs, 8 assertions, 4 failures, 4 errors, 4 skips/
21
- 4.times do |i|
22
- output.must_match /:child#{i}a/
23
- end
24
- end
25
- end
26
- end