parallel-rspec 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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