rspec-interactive 0.9.4 → 0.9.7

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
2
  SHA256:
3
- metadata.gz: 58b63742b50c16f44d1cf19e2957e29ed07ef4a19c3ee91debed0624f519684a
4
- data.tar.gz: 0217f523599d1ee0a104718bd3c2bd79aeaf9366d18a22f5abfdadb2ce1fc229
3
+ metadata.gz: 19e7c3fad7abad85f3523490ddfcfd3d6091e042d99fd940c6a9a19991e7dc06
4
+ data.tar.gz: 02d25e506765d4f0c40b8b3e64ae751f6da34e06af9e845830bdc05071fc8112
5
5
  SHA512:
6
- metadata.gz: 7d5dbf2e0ec74668264fee718f5e2edaa60f0bff510433f376ac8264a64afb61b2a3538e8604f3c8cc4e0c1e48b409bb4bccfaedb25e0b587145d7b9f4abbb11
7
- data.tar.gz: 86bba6bf0ad9728ba06d9374a3efb7b74cb4736fb24f5a81799e7ed4d54c499c012153ca2e90096caf0ab3965098c38cccc28b2b9c0d031723e7cc698b0a4fcc
6
+ metadata.gz: 89b49ff9d0e888b8304e0c70a2fded4dd780381750fed960af5f282246accc6ae6d52eb71c5402d2be31bfb9a827c64e04cffcb7f4935d12d97e3d632843a8bf
7
+ data.tar.gz: 36320560582c44d1459e0590aa469f56e70b5411d8c3c88a499ca9f46c5075163aa3778869f65bb5cfd85dc3fc7dd196fff65c87733b5b0057352353583215c6
data/.gitignore CHANGED
@@ -2,3 +2,5 @@ rspec-interactive-*.gem
2
2
  .rspec_interactive_history
3
3
  .rspec_interactive_config
4
4
  .idea
5
+ vendor
6
+ .bundle
data/Gemfile CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ruby '3.0.0'
4
-
5
3
  source "https://rubygems.org"
6
4
 
7
5
  gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-interactive (0.9.3)
4
+ rspec-interactive (0.9.6)
5
5
  listen
6
6
  pry
7
7
  rspec-core
@@ -13,6 +13,7 @@ GEM
13
13
  coderay (1.1.3)
14
14
  diff-lcs (1.4.4)
15
15
  ffi (1.15.5)
16
+ ffi (1.15.5-java)
16
17
  listen (3.7.1)
17
18
  rb-fsevent (~> 0.10, >= 0.10.3)
18
19
  rb-inotify (~> 0.9, >= 0.9.10)
@@ -20,6 +21,10 @@ GEM
20
21
  pry (0.14.1)
21
22
  coderay (~> 1.1)
22
23
  method_source (~> 1.0)
24
+ pry (0.14.1-java)
25
+ coderay (~> 1.1)
26
+ method_source (~> 1.0)
27
+ spoon (~> 0.0)
23
28
  rb-fsevent (0.11.1)
24
29
  rb-inotify (0.10.1)
25
30
  ffi (~> 1.0)
@@ -38,16 +43,16 @@ GEM
38
43
  rspec-support (3.9.4)
39
44
  rspec-teamcity (1.0.0)
40
45
  rspec (>= 2.99, >= 2.14.2, < 4)
46
+ spoon (0.0.6)
47
+ ffi
41
48
 
42
49
  PLATFORMS
50
+ universal-java-11
43
51
  x86_64-darwin-20
44
52
 
45
53
  DEPENDENCIES
46
54
  rspec-expectations
47
55
  rspec-interactive!
48
56
 
49
- RUBY VERSION
50
- ruby 3.0.0p0
51
-
52
57
  BUNDLED WITH
53
58
  2.2.17
@@ -6,7 +6,15 @@ module RSpec
6
6
  end
7
7
 
8
8
  def print(str = "")
9
- @client.print(str&.to_s || '')
9
+ @client.print(str.to_s)
10
+ end
11
+
12
+ def write(str = "")
13
+ @client.print(str.to_s)
14
+ end
15
+
16
+ def puts(str = "")
17
+ @client.print(str.to_s + "\n")
10
18
  end
11
19
 
12
20
  def string
@@ -4,7 +4,7 @@ class Pry
4
4
  alias_method :old_eval, :eval
5
5
 
6
6
  def eval(line, options = {})
7
- RSpec::Interactive.eval do
7
+ RSpec::Interactive.eval(line, options) do
8
8
  old_eval(line, options)
9
9
  end
10
10
  end
@@ -1,10 +1,18 @@
1
1
  module RSpec
2
2
  module Interactive
3
3
  class Stdio
4
- def self.capture(output)
4
+ def self.capture2(stdout:, stderr:)
5
+ old_stdout, old_stderr = $stdout, $stderr
6
+ $stdout, $stderr = stdout, stderr
7
+ yield
8
+ ensure
9
+ $stdout, $stderr = old_stdout, old_stderr
10
+ end
11
+
12
+ def self.capture(stdout:, stderr:)
5
13
  raise ArgumentError, 'missing block' unless block_given?
6
14
 
7
- stdout, stderr = STDOUT.dup, STDERR.dup
15
+ old_stdout, old_stderr = STDOUT.dup, STDERR.dup
8
16
 
9
17
  IO.pipe do |stdout_read, stdout_write|
10
18
  IO.pipe do |stderr_read, stderr_write|
@@ -16,13 +24,13 @@ module RSpec
16
24
 
17
25
  stdout_thread = Thread.new do
18
26
  while line = stdout_read.gets do
19
- output.print(line)
27
+ stdout.print(line)
20
28
  end
21
29
  end
22
30
 
23
31
  stderr_thread = Thread.new do
24
32
  while line = stderr_read.gets do
25
- output.print(line)
33
+ stderr.print(line)
26
34
  end
27
35
  end
28
36
 
@@ -30,8 +38,8 @@ module RSpec
30
38
  yield
31
39
  ensure
32
40
  # TODO: should the threads be killed here?
33
- STDOUT.reopen stdout
34
- STDERR.reopen stderr
41
+ STDOUT.reopen old_stdout
42
+ STDERR.reopen old_stderr
35
43
  end
36
44
 
37
45
  stdout_thread.join
@@ -0,0 +1,23 @@
1
+ module RSpec
2
+ module Interactive
3
+ class StringOutput
4
+ attr_reader :string
5
+
6
+ def initialize
7
+ @string = ''
8
+ end
9
+
10
+ def write(name, str = "")
11
+ @string += str.to_s
12
+ end
13
+
14
+ def puts(str = "")
15
+ @string += str.to_s + "\n"
16
+ end
17
+
18
+ def print(str = "")
19
+ @string += str.to_s
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module Interactive
5
- VERSION = "0.9.4"
5
+ VERSION = "0.9.7"
6
6
  end
7
7
  end
@@ -18,6 +18,7 @@ require 'rspec-interactive/rspec_core_example'
18
18
  require 'rspec-interactive/rubo_cop_command'
19
19
  require 'rspec-interactive/runner'
20
20
  require 'rspec-interactive/stdio'
21
+ require 'rspec-interactive/string_output'
21
22
 
22
23
  module RSpec
23
24
  module Interactive
@@ -56,29 +57,30 @@ module RSpec
56
57
  load config_file if config_file
57
58
 
58
59
  check_rails
59
- trap_interrupt
60
+ maybe_trap_interrupt
60
61
  configure_pry
61
- load_rspec_configuration
62
62
 
63
- start_file_watcher
64
-
65
- if server
66
- @output_stream.puts "listening on port #{port}"
67
- server_thread = Thread.start do
68
- server = TCPServer.new port
69
-
70
- while client = server.accept
71
- request = client.gets
72
- args = Shellwords.split(request)
73
- rspec_for_server(client, args)
74
- client.close
63
+ @startup_thread = Thread.start do
64
+ @config_cache.record_configuration { @configuration.configure_rspec.call }
65
+ start_file_watcher
66
+
67
+ if server
68
+ @server_thread = Thread.start do
69
+ server = TCPServer.new port
70
+
71
+ while client = server.accept
72
+ request = client.gets
73
+ args = Shellwords.split(request)
74
+ rspec_for_server(client, args)
75
+ client.close
76
+ end
75
77
  end
76
78
  end
77
79
  end
78
80
 
79
81
  Pry.start
80
82
  @listener.stop if @listener
81
- server_thread.exit if server_thread
83
+ @server_thread.exit if @server_thread
82
84
  0
83
85
  end
84
86
 
@@ -90,7 +92,17 @@ module RSpec
90
92
  end
91
93
  end
92
94
 
93
- def self.trap_interrupt
95
+ def self.maybe_trap_interrupt
96
+ return unless RbConfig::CONFIG['ruby_install_name'] == 'jruby'
97
+
98
+ # When on JRuby, Pry traps interrupts and raises an Interrupt exception.
99
+ # Unfortunately, raising Interrupt is not enough when RSpec is running since it
100
+ # will only cause the current example to fail. We want to kill RSpec entirely
101
+ # if it is running so here we disable Pry's handling and rewrite it to include
102
+ # special handling for RSpec.
103
+
104
+ Pry.config.should_trap_interrupts = false
105
+
94
106
  trap('INT') do
95
107
  if @runner
96
108
  # We are on a different thread. There is a race here. Ignore nil.
@@ -113,24 +125,7 @@ module RSpec
113
125
  @listener.start
114
126
  end
115
127
 
116
- def self.load_rspec_configuration
117
- start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
118
- config_thread = Thread.start do
119
- @config_cache.record_configuration { @configuration.configure_rspec.call }
120
- end
121
- unless config_thread.join(3)
122
- @output_stream.puts "executing configure_rspec hook..."
123
- end
124
- config_thread.join
125
-
126
- end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
127
- @output_stream.puts "configure_rspec hook took #{(end_time - start_time).round} seconds" if end_time - start_time > 5
128
- end
129
-
130
128
  def self.configure_pry
131
- # Prevent Pry from trapping too. It will break ctrl-c handling.
132
- Pry.config.should_trap_interrupts = false
133
-
134
129
  # Set up IO.
135
130
  Pry.config.input = Readline
136
131
  Pry.config.output = @output_stream
@@ -161,14 +156,24 @@ module RSpec
161
156
  end
162
157
 
163
158
  def self.parse_args(args)
164
- args.flat_map do |arg|
165
- if arg.match(/[\*\?\[]/)
166
- glob = Dir.glob(arg)
167
- glob.empty? ? [arg] : glob
159
+ i = 0
160
+ parsed_args = []
161
+ until i == args.length
162
+ case args[i]
163
+ when /[\*\?\[]/
164
+ glob = Dir.glob(args[i])
165
+ parsed_args.concat(glob.empty? ? args[i] : glob)
166
+ when '--pattern'
167
+ # RubyMine passes --pattern when running all specs in a dir.
168
+ # We don't want to expand this since it is used as a glob by RSpec.
169
+ parsed_args.concat(args[i..(i + 1)])
170
+ i += 1
168
171
  else
169
- [arg]
172
+ parsed_args << args[i]
170
173
  end
174
+ i += 1
171
175
  end
176
+ parsed_args
172
177
  end
173
178
 
174
179
  def self.rspec(args)
@@ -187,7 +192,8 @@ module RSpec
187
192
  end
188
193
 
189
194
  # Run.
190
- exit_code = @runner.run
195
+ @runner.run
196
+ ensure
191
197
  @runner = nil
192
198
 
193
199
  # Reenable history
@@ -197,18 +203,17 @@ module RSpec
197
203
  RSpec.clear_examples
198
204
  RSpec.reset
199
205
  @config_cache.replay_configuration
200
- ensure
201
- @runner = nil
202
206
  end
203
207
 
204
208
  def self.rspec_for_server(client, args)
205
209
  @command_mutex.synchronize do
206
- # Prevent the debugger from being used. The server isn't interactive.
210
+ output = ClientOutput.new(client)
207
211
  disable_pry = ENV['DISABLE_PRY']
208
- ENV['DISABLE_PRY'] = 'true'
209
212
 
210
- output = ClientOutput.new(client)
211
- Stdio.capture(ClientOutput.new(client)) do
213
+ Stdio.capture(stdout: output, stderr: output) do
214
+ # Prevent the debugger from being used. The server isn't interactive.
215
+ ENV['DISABLE_PRY'] = 'true'
216
+
212
217
  @runner = RSpec::Interactive::Runner.new(parse_args(args))
213
218
 
214
219
  refresh
@@ -232,15 +237,16 @@ module RSpec
232
237
  RSpec.configuration.formatter = Spec::Runner::Formatter::TeamcityFormatter
233
238
 
234
239
  # Run.
235
- exit_code = @runner.run
240
+ @runner.run
241
+ ensure
242
+ @runner = nil
243
+ ENV['DISABLE_PRY'] = disable_pry
236
244
 
237
245
  # Reset
238
246
  RSpec.clear_examples
239
247
  RSpec.reset
240
248
  @config_cache.replay_configuration
241
249
  end
242
- ensure
243
- ENV['DISABLE_PRY'] = disable_pry
244
250
  end
245
251
  end
246
252
 
@@ -252,12 +258,19 @@ module RSpec
252
258
  end
253
259
  end
254
260
 
255
- def self.eval(&block)
256
- if Thread.current.thread_variable_get('holding_lock')
261
+ def self.eval(line, options, &block)
262
+ if line.nil? || Thread.current.thread_variable_get('holding_lock')
257
263
  yield
258
264
  else
259
265
  @command_mutex.synchronize do
260
266
  Thread.current.thread_variable_set('holding_lock', true)
267
+ if @startup_thread
268
+ if @startup_thread.alive?
269
+ @output_stream.puts 'waiting for configure_rspec...'
270
+ end
271
+ @startup_thread.join
272
+ @startup_thread = nil
273
+ end
261
274
  yield
262
275
  ensure
263
276
  Thread.current.thread_variable_set('holding_lock', false)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-interactive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Dower
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-25 00:00:00.000000000 Z
11
+ date: 2022-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core
@@ -102,6 +102,7 @@ files:
102
102
  - lib/rspec-interactive/rubo_cop_command.rb
103
103
  - lib/rspec-interactive/runner.rb
104
104
  - lib/rspec-interactive/stdio.rb
105
+ - lib/rspec-interactive/string_output.rb
105
106
  - lib/rspec-interactive/version.rb
106
107
  - lib/teamcity/spec/runner/formatter/teamcity/formatter.rb
107
108
  - rspec-interactive.gemspec