rspec-multiprocess_runner 1.2.0 → 1.2.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
2
  SHA1:
3
- metadata.gz: da6e498842698e2a4d310674c27cace4b39ca99d
4
- data.tar.gz: dbc698c179206e1233bdb6448bc01611ca5aa036
3
+ metadata.gz: e7232c081ac1d6c3946e41139e61f7eabd655fac
4
+ data.tar.gz: 9a2a5afdf4915f7fc0ba5453a657da788817bce9
5
5
  SHA512:
6
- metadata.gz: ef0ef92395a94c984f6f253cddbec507aac1f4f4e0d330009e2a383063fc35be8d3d7463892ad45a8d7c3810b09724de08ec323f4f551ff1641d7070f682c489
7
- data.tar.gz: 87582349643f471ba15e90da662ab759539572eebc42f47af8f719b491bac36a2764aaf098da705f18d025f738583dc97bb4493b136d82eeb78a423e4d206383
6
+ metadata.gz: 4639ae0212bf4cdc713f1e2738a683e55d561fea521ddb0221e539f23679d917e59ff7d28f8d06c21b72aec7ee1d1ee06399380cef948548ea7b27fa4471cae2
7
+ data.tar.gz: 5698b967a5ff5791ef8ec29f8811502233bd8793c12d8686702c920817b062782da2ec27fece84d937a778a6ae9343745803d28fc6e553774ebca989bfe80c76
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 1.2.1
2
+
3
+ * Fix missing files being triggered by empty files
4
+
5
+ * Fix missing files also being skipped files
6
+
7
+ * Add run identifier option to prevent incorrect spec version execution
8
+
1
9
  # 1.2.0
2
10
 
3
11
  * Can now run tests on multiple machines at a time by running in head node mode
data/README.md CHANGED
@@ -101,6 +101,12 @@ A corresponding set up for a node node using SSH would be:
101
101
 
102
102
  N.B. Ensure that the head node has tcp local port forwarding permitted.
103
103
 
104
+ A set of nodes and head node can be given a unique string in case multiple spec
105
+ file versions may be tested near simultaneously to prevent execution of the
106
+ wrong version.
107
+
108
+ $ multirspec -r a_git_commit_hash
109
+
104
110
  ### Rake
105
111
 
106
112
  There is a rake task wrapper for `multirspec`:
data/exe/multirspec CHANGED
@@ -19,7 +19,8 @@ coordinator = RSpec::MultiprocessRunner::Coordinator.new(
19
19
  head_node: options.head_node,
20
20
  port: options.port,
21
21
  hostname: options.hostname,
22
- max_nodes: options.max_nodes
22
+ max_nodes: options.max_nodes,
23
+ run_identifier: options.run_identifier
23
24
  }
24
25
  )
25
26
 
@@ -7,7 +7,8 @@ module RSpec::MultiprocessRunner
7
7
  class CommandLineOptions
8
8
  attr_accessor :worker_count, :file_timeout_seconds, :example_timeout_seconds,
9
9
  :rspec_options, :explicit_files_or_directories, :pattern, :log_failing_files,
10
- :first_is_1, :use_given_order, :port, :head_node, :hostname, :max_nodes
10
+ :first_is_1, :use_given_order, :port, :head_node, :hostname, :max_nodes,
11
+ :run_identifier
11
12
 
12
13
  DEFAULT_WORKER_COUNT = 3
13
14
 
@@ -139,6 +140,10 @@ module RSpec::MultiprocessRunner
139
140
  self.max_nodes = max_nodes
140
141
  end
141
142
 
143
+ parser.on("-r", "--run-identifier STRING", "A unique string used by nodes to confirm identity (e.g. a git commit hash)") do |string|
144
+ self.run_identifier = string
145
+ end
146
+
142
147
  parser.on_tail("-h", "--help", "Prints this help") do
143
148
  help_requested!
144
149
  end
@@ -27,7 +27,7 @@ module RSpec::MultiprocessRunner
27
27
  run_loop
28
28
  quit_all_workers
29
29
  @file_coordinator.finished
30
- if @file_coordinator.missing_files.any?
30
+ if @file_coordinator.remaining_files.any?
31
31
  run_loop
32
32
  quit_all_workers
33
33
  @file_coordinator.finished
@@ -222,7 +222,7 @@ module RSpec::MultiprocessRunner
222
222
  print_pending_example_details(by_status_and_time["pending"])
223
223
  print_failed_example_details(by_status_and_time["failed"])
224
224
  print_missing_files
225
- log_failed_files(by_status_and_time["failed"].map(&:file_path).uniq + @file_coordinator.missing_files.to_a) if @log_failing_files
225
+ log_failed_files(by_status_and_time["failed"].map(&:filename).uniq + @file_coordinator.missing_files.to_a) if @log_failing_files
226
226
  print_failed_process_details
227
227
  puts
228
228
  print_elapsed_time(elapsed)
@@ -231,7 +231,7 @@ module RSpec::MultiprocessRunner
231
231
  end
232
232
 
233
233
  def combine_example_results
234
- @file_coordinator.results.sort_by { |r| r.time_finished }
234
+ @file_coordinator.results.select { |r| r.run_status == "example_complete" }.sort_by { |r| r.time_finished }
235
235
  end
236
236
 
237
237
  def any_example_failed?
@@ -22,6 +22,7 @@ module RSpec::MultiprocessRunner
22
22
  @port = options[:port]
23
23
  @max_threads = options[:max_nodes]
24
24
  @head_node = options[:head_node]
25
+ @start_string = options[:run_identifier]
25
26
  if @head_node
26
27
  @spec_files = options[:use_given_order] ? files : sort_files(files)
27
28
  Thread.start { run_tcp_server }
@@ -33,7 +34,11 @@ module RSpec::MultiprocessRunner
33
34
  begin
34
35
  @node_socket = TCPSocket.new @hostname, @port
35
36
  raise unless start?
37
+ rescue BadStartStringError
38
+ @node_socket.close if @node_socket
39
+ raise
36
40
  rescue
41
+ @node_socket.close if @node_socket
37
42
  @node_socket = nil
38
43
  raise if count < 0
39
44
  count -= 1
@@ -51,7 +56,7 @@ module RSpec::MultiprocessRunner
51
56
 
52
57
  def missing_files
53
58
  if @head_node
54
- @spec_files_reference - @results.map(&:file_path) - @failed_workers.map(&:current_file)
59
+ @spec_files_reference - @results.map(&:filename) - @failed_workers.map(&:current_file) - @spec_files
55
60
  else
56
61
  []
57
62
  end
@@ -81,9 +86,11 @@ module RSpec::MultiprocessRunner
81
86
 
82
87
  def finished
83
88
  if @head_node
84
- @tcp_server_running = false
85
- @threads.each(&:join)
86
- @spec_files += missing_files.to_a
89
+ if @tcp_server_running
90
+ @tcp_server_running = false
91
+ @threads.each(&:join)
92
+ @spec_files += missing_files.to_a
93
+ end
87
94
  else
88
95
  @node_socket.puts [COMMAND_FINISHED].to_json
89
96
  end
@@ -117,13 +124,18 @@ module RSpec::MultiprocessRunner
117
124
  break unless raw_response
118
125
  command, results, node = JSON.parse(raw_response)
119
126
  if command == COMMAND_START
120
- socket.puts COMMAND_START
127
+ if results == @start_string
128
+ socket.puts COMMAND_START
129
+ else
130
+ socket.puts COMMAND_FINISHED
131
+ break
132
+ end
121
133
  elsif command == COMMAND_FILE
122
134
  socket.puts @spec_files.shift
123
135
  elsif command == COMMAND_PROCESS && results
124
136
  @failed_workers << MockWorker.from_json_parse(results, node || "unknown")
125
137
  elsif command == COMMAND_RESULTS && results = results.map { |result|
126
- ExampleResult.from_json_parse(result) }
138
+ Result.from_json_parse(result) }
127
139
  @results += results
128
140
  elsif command == COMMAND_FINISHED
129
141
  break
@@ -131,18 +143,22 @@ module RSpec::MultiprocessRunner
131
143
  end
132
144
  end
133
145
 
134
- def work_left_to_do?
135
- !@spec_files.empty?
136
- end
137
-
138
146
  def start?
139
147
  begin
140
- @node_socket.puts [COMMAND_START].to_json
148
+ @node_socket.puts [COMMAND_START, @start_string].to_json
141
149
  response = @node_socket.gets
142
- response && response.chomp == COMMAND_START
150
+ response = response.chomp if response
151
+ raise BadStartStringError if response == COMMAND_FINISHED
152
+ response == COMMAND_START
143
153
  rescue Errno::EPIPE
144
154
  false
145
155
  end
146
156
  end
147
157
  end
158
+
159
+ class BadStartStringError < StandardError
160
+ def initialize(msg="An incorrect unique string was passed by the head node.")
161
+ super
162
+ end
163
+ end
148
164
  end
@@ -77,6 +77,9 @@ module RSpec::MultiprocessRunner
77
77
  # Max number of connections to head_node. Defaults to `5`
78
78
  attr_accessor :max_nodes
79
79
 
80
+ #Unique string used by nodes to confirm identity
81
+ attr_accessor :run_identifier
82
+
80
83
  def initialize(*args, &task_block)
81
84
  @name = args.shift || :multispec
82
85
  @verbose = true
@@ -150,6 +153,9 @@ module RSpec::MultiprocessRunner
150
153
  if max_nodes
151
154
  cmd_parts << '--max-nodes' << max_nodes.to_s
152
155
  end
156
+ if run_identifier
157
+ cmd_parts << '--run-identifier' << run-identifier.to_s
158
+ end
153
159
  if files_or_directories
154
160
  cmd_parts.concat(files_or_directories)
155
161
  end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module MultiprocessRunner
3
- VERSION = "1.2.0"
3
+ VERSION = "1.2.1"
4
4
  end
5
5
  end
@@ -175,11 +175,12 @@ module RSpec::MultiprocessRunner
175
175
  return :dead unless message_hash # ignore EOF
176
176
  case message_hash["status"]
177
177
  when STATUS_RUN_COMPLETE
178
+ example_results << Result.new(message_hash)
178
179
  @current_file = nil
179
180
  @current_file_started_at = nil
180
181
  @current_example_started_at = nil
181
182
  when STATUS_EXAMPLE_COMPLETE
182
- example_results << ExampleResult.new(message_hash)
183
+ example_results << Result.new(message_hash)
183
184
  suffix =
184
185
  case message_hash["example_status"]
185
186
  when "failed"
@@ -219,7 +220,7 @@ module RSpec::MultiprocessRunner
219
220
  description: description,
220
221
  line_number: line_number,
221
222
  details: details,
222
- file_path: @current_file
223
+ filename: @current_file
223
224
  )
224
225
  end
225
226
 
@@ -321,15 +322,16 @@ module RSpec::MultiprocessRunner
321
322
  end
322
323
 
323
324
  # @private
324
- class ExampleResult
325
- attr_reader :status, :description, :details, :file_path, :time_finished
326
-
327
- def initialize(example_complete_message, time = Time.now)
328
- @hash = example_complete_message
329
- @status = example_complete_message["example_status"]
330
- @description = example_complete_message["description"]
331
- @details = example_complete_message["details"]
332
- @file_path = example_complete_message["file_path"]
325
+ class Result
326
+ attr_reader :run_status, :status, :description, :details, :filename, :time_finished
327
+
328
+ def initialize(complete_message, time = Time.now)
329
+ @hash = complete_message
330
+ @run_status = complete_message["status"]
331
+ @status = complete_message["example_status"]
332
+ @description = complete_message["description"]
333
+ @details = complete_message["details"]
334
+ @filename = complete_message["filename"]
333
335
  @time_finished = time
334
336
  end
335
337
 
@@ -338,7 +340,7 @@ module RSpec::MultiprocessRunner
338
340
  end
339
341
 
340
342
  def self.from_json_parse(hash)
341
- ExampleResult.new(hash["hash"], Time.iso8601(hash["time"]))
343
+ Result.new(hash["hash"], Time.iso8601(hash["time"]))
342
344
  end
343
345
  end
344
346
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-multiprocess_runner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rhett Sutphin