parallel-rspec 0.1.0 → 0.1.1

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
- SHA1:
3
- metadata.gz: 2820fc1f77e7c926911e9697230f45b46028d82d
4
- data.tar.gz: 11ad9491f170694b49296ed590c189f964ca736f
2
+ SHA256:
3
+ metadata.gz: 8b1cbb0a88df18c96b32c13c67195692a7618c0db805e900a3ae05e750701299
4
+ data.tar.gz: 930f387786a51fd24b6a3d4705a1afc424c84f9e4eb42527576cb2a4d81d60c3
5
5
  SHA512:
6
- metadata.gz: cfaeda33e78559f68b2d013883daa58523b71bcc108db0d627385d7e3657152057bb6526fa9f860413c976e7a9d8a8f5ddf4ff036831aab289f7b3d7a19ae9d8
7
- data.tar.gz: c9d96690ad7703cd798ea486f7ae18c4c6f3cd5d7d84b5844d2d0dd1c5008438380c5e22911331cb8693c264138d2d2735637fd2a79ceef2a7a3ba07c60b84d3
6
+ metadata.gz: cf874688c79e8a413254cc7c0718d57a5fbac581f67498916797bb447235c9c70767ac9931300fa4de5f95c1f4064cacbffdc03c180e67b9852b9e42458be634
7
+ data.tar.gz: 785b1509878689e253125edbe18245f6433180a7dda49b612a7f3ac75b941cc87d1db268a7dc582a81fb4b86a7f54ff5c2000c29dcabcddcf3517b2ff00bd1ad
@@ -0,0 +1,19 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
+ and this project adheres to [Semantic Versioning](http://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.1] - 2019-02-19
10
+ ### Fixed
11
+ - Handle exit code
12
+
13
+ ## 0.1.0 - 2016-12-31
14
+ ### Added
15
+ - Basic implementation
16
+ - README now contains "Getting Started / Usage" and "Controll concurrency"
17
+
18
+ [Unreleased]: https://github.com/yuku/parallel-rspec/compare/v0.1.1...HEAD
19
+ [0.1.1]: https://github.com/yuku/parallel-rspec/compare/v0.1.0...v0.1.1
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Yuku TAKAHASHI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -5,4 +5,5 @@ require "parallel-rspec"
5
5
  helper_path = ENV.fetch("RSPEC_PARALLEL_HELPER", "spec/parallel_spec_helper.rb")
6
6
  Kernel.load(helper_path) if File.readable?(helper_path)
7
7
 
8
- RSpec::Parallel::Runner.new(ARGV).start
8
+ exit_code = RSpec::Parallel::Runner.new(ARGV).start
9
+ Kernel.exit(exit_code)
@@ -38,7 +38,7 @@ module RSpec
38
38
 
39
39
  # @return [Integer]
40
40
  def log_level
41
- @log_level ||= Logger::WARN
41
+ @log_level ||= Logger::INFO
42
42
  end
43
43
 
44
44
  attr_writer :concurrency, :logger, :log_level
@@ -19,6 +19,7 @@ module RSpec
19
19
  @args = args
20
20
  @path = "/tmp/parallel-rspec-#{$PID}.sock"
21
21
  @files_to_run = ::RSpec.configuration.files_to_run.uniq
22
+ @total = @files_to_run.size
22
23
  @server = ::UNIXServer.new(@path)
23
24
  end
24
25
 
@@ -29,15 +30,17 @@ module RSpec
29
30
 
30
31
  # @return [void]
31
32
  def run
33
+ count = 1
32
34
  until files_to_run.empty?
33
35
  rs, _ws, _es = IO.select([server])
34
36
  rs.each do |s|
35
37
  socket = s.accept
36
- method, _data = socket.gets.strip.split("\t", 2)
38
+ method, data = socket.gets.strip.split(" ", 2)
37
39
  case method
38
40
  when Protocol::POP
39
41
  path = files_to_run.pop
40
- RSpec::Parallel.configuration.logger.info("Deliver #{path}")
42
+ RSpec::Parallel.configuration.logger.info("[#{count} / #{total}] Deliver #{path} to worker[#{data}]")
43
+ count += 1
41
44
  socket.write(path)
42
45
  when Protocol::PING
43
46
  socket.write("ok")
@@ -71,6 +74,9 @@ module RSpec
71
74
  # @return [UNIXServer]
72
75
  attr_reader :server
73
76
 
77
+ # @return [Integer]
78
+ attr_reader :total
79
+
74
80
  # @return [void]
75
81
  def remove_socket_file
76
82
  FileUtils.rm(path, force: true)
@@ -20,13 +20,15 @@ module RSpec
20
20
  @master = Master.new(args)
21
21
  end
22
22
 
23
- # @return [void]
23
+ # @return [Integer] exit status code
24
24
  def start
25
+ waiters = []
25
26
  RSpec::Parallel.configuration.concurrency.times do
26
- spawn_worker
27
+ waiters << spawn_worker
27
28
  end
28
29
  master.run
29
- Process.waitall
30
+ statuses = waiters.map {|waiter| waiter.value }
31
+ statuses.all? {|status| status.success? } ? 0 : 1
30
32
  ensure
31
33
  pids.each.with_index do |pid, index|
32
34
  puts "----> output from worker[#{index}]"
@@ -49,7 +51,7 @@ module RSpec
49
51
  pid = Kernel.fork do
50
52
  master.close
51
53
 
52
- File.open(output_file_path($PID), "w") do |file|
54
+ exit_code = File.open(output_file_path($PID), "w") do |file|
53
55
  # Redirect stdout and stderr to temp file
54
56
  STDOUT.reopen(file)
55
57
  STDERR.reopen(STDOUT)
@@ -61,7 +63,7 @@ module RSpec
61
63
  worker.run
62
64
  end
63
65
 
64
- Kernel.exit! # avoid running any `at_exit` functions.
66
+ Kernel.exit!(exit_code == 0) # avoid running any `at_exit` functions.
65
67
  end
66
68
  pids << pid
67
69
  Process.detach(pid)
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Parallel
3
- VERSION = "0.1.0".freeze
3
+ VERSION = "0.1.1".freeze
4
4
  end
5
5
  end
@@ -9,10 +9,10 @@ module RSpec
9
9
  # @param master [RSpec::Parallel::Master]
10
10
  # @param number [Integer]
11
11
  def initialize(master, number)
12
- RSpec::Parallel.configuration.logger.info("Initialize Iterator")
13
- @iterator = Iterator.new(master.socket_builder)
12
+ RSpec::Parallel.configuration.logger.debug("Initialize Iterator")
13
+ @iterator = Iterator.new(self, master.socket_builder)
14
14
  @number = number
15
- RSpec::Parallel.configuration.logger.info("Initialize SpecRunner")
15
+ RSpec::Parallel.configuration.logger.debug("Initialize SpecRunner")
16
16
  @spec_runner = SpecRunner.new(master.args)
17
17
  end
18
18
 
@@ -29,8 +29,10 @@ module RSpec
29
29
  class Iterator
30
30
  include Enumerable
31
31
 
32
+ # @param worker [RSpec::Parallel::Worker]
32
33
  # @param socket_builder [RSpec::Parallel::SocketBuilder]
33
- def initialize(socket_builder)
34
+ def initialize(worker, socket_builder)
35
+ @worker = worker
34
36
  @socket_builder = socket_builder
35
37
  end
36
38
 
@@ -39,11 +41,11 @@ module RSpec
39
41
  loop do
40
42
  socket = connect_to_distributor
41
43
  if socket.nil?
42
- RSpec::Parallel.configuration.logger.info("Sleep a little to wait master process")
44
+ RSpec::Parallel.configuration.logger.debug("Sleep a little to wait master process")
43
45
  sleep 0.5
44
46
  next
45
47
  end
46
- RSpec::Parallel.configuration.logger.info("Send PING request")
48
+ RSpec::Parallel.configuration.logger.debug("Send PING request")
47
49
  socket.puts(Protocol::PING)
48
50
  # TODO: handle socket error and check pong message
49
51
  IO.select([socket])
@@ -58,8 +60,8 @@ module RSpec
58
60
  loop do
59
61
  socket = connect_to_distributor
60
62
  break if socket.nil?
61
- RSpec::Parallel.configuration.logger.info("Send POP request")
62
- socket.puts(Protocol::POP)
63
+ RSpec::Parallel.configuration.logger.debug("Send POP request")
64
+ socket.puts("#{Protocol::POP} #{worker.number}") # TODO: Rescue `Broken pipe (Errno::EPIPE)` error
63
65
  _, _, es = IO.select([socket], nil, [socket])
64
66
  unless es.empty?
65
67
  RSpec::Parallel.configuration.logger.error("Socket error occurs")
@@ -68,7 +70,7 @@ module RSpec
68
70
  path = socket.read(65_536)
69
71
  socket.close
70
72
  RSpec.world.example_groups.clear
71
- RSpec::Parallel.configuration.logger.info("Load #{path}")
73
+ RSpec::Parallel.configuration.logger.debug("Load #{path}")
72
74
  Kernel.load path
73
75
  RSpec.world.example_groups.each do |example_group|
74
76
  yield example_group
@@ -81,6 +83,9 @@ module RSpec
81
83
  # @return [RSpec::Parallel::SocketBuilder]
82
84
  attr_reader :socket_builder
83
85
 
86
+ # @return [RSpec::Parallel::Worker]
87
+ attr_reader :worker
88
+
84
89
  # @return [BasicSocket, nil]
85
90
  def connect_to_distributor
86
91
  socket_builder.run
@@ -102,9 +107,13 @@ module RSpec
102
107
  @configuration.filter_manager = RSpec::Core::FilterManager.new
103
108
 
104
109
  success = @configuration.reporter.report(0) do |reporter|
110
+ # In genaral, ExampleGroup is configured by evaluating `describe`
111
+ # before `with_suite_hooks`
112
+ RSpec::Core::ExampleGroup.ensure_example_groups_are_configured
113
+
105
114
  @configuration.with_suite_hooks do
106
115
  example_groups.map do |g|
107
- RSpec::Parallel.configuration.logger.info("Run #{g.inspect}")
116
+ RSpec::Parallel.configuration.logger.debug("Run #{g.inspect}")
108
117
  g.run(reporter)
109
118
  end.all?
110
119
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallel-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuku Takahashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-31 00:00:00.000000000 Z
11
+ date: 2019-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core
@@ -121,7 +121,9 @@ files:
121
121
  - ".rubocop.yml"
122
122
  - ".simplecov"
123
123
  - ".yardopts"
124
+ - CHANGELOG.md
124
125
  - Gemfile
126
+ - LICENSE
125
127
  - README.md
126
128
  - Rakefile
127
129
  - bin/parallel-rspec
@@ -158,8 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
160
  - !ruby/object:Gem::Version
159
161
  version: '0'
160
162
  requirements: []
161
- rubyforge_project:
162
- rubygems_version: 2.5.1
163
+ rubygems_version: 3.0.1
163
164
  signing_key:
164
165
  specification_version: 4
165
166
  summary: Parallel spec runner for RSpec 3