rspec-interactive 0.9.2 → 0.9.5
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/rspec-interactive/client_output.rb +9 -1
- data/lib/rspec-interactive/stdio.rb +24 -11
- data/lib/rspec-interactive/string_output.rb +23 -0
- data/lib/rspec-interactive/version.rb +1 -1
- data/lib/rspec-interactive.rb +66 -34
- data/runner/README.md +3 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfaebc90c8fc0856566eb671fb122248778540ce78832af3a4c7b8cc3e8374a2
|
4
|
+
data.tar.gz: 476896ae26c3acf5fef26486ba7d3b5ee4caa2de220bb2c42b61f740989d6d92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20746051789c2591c9e398e65e645b343c994b1cae438f5c509d107217298af9bbef9d0c12327f446ed47214a7800c3ed594acad929fc48873280f5aed380c36
|
7
|
+
data.tar.gz: e844ef291294500ca6702a876662f03f6c20ec261a4864eb43dacca7d8b17fd29b995ea567ccbb3c0d9170c204e24902679b0ca4e24aa4e3925c86026ba5eca3
|
data/Gemfile.lock
CHANGED
@@ -5,8 +5,16 @@ module RSpec
|
|
5
5
|
@client = client
|
6
6
|
end
|
7
7
|
|
8
|
+
def print(str = "")
|
9
|
+
@client.print(str.to_s)
|
10
|
+
end
|
11
|
+
|
12
|
+
def write(str = "")
|
13
|
+
@client.print(str.to_s)
|
14
|
+
end
|
15
|
+
|
8
16
|
def puts(str = "")
|
9
|
-
@client.
|
17
|
+
@client.print(str.to_s + "\n")
|
10
18
|
end
|
11
19
|
|
12
20
|
def string
|
@@ -1,10 +1,18 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Interactive
|
3
3
|
class Stdio
|
4
|
-
def self.
|
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
|
-
|
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|
|
@@ -14,23 +22,28 @@ module RSpec
|
|
14
22
|
stdout_write.close
|
15
23
|
stderr_write.close
|
16
24
|
|
17
|
-
|
18
|
-
|
19
|
-
line
|
20
|
-
|
21
|
-
|
22
|
-
|
25
|
+
stdout_thread = Thread.new do
|
26
|
+
while line = stdout_read.gets do
|
27
|
+
stdout.print(line)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
stderr_thread = Thread.new do
|
32
|
+
while line = stderr_read.gets do
|
33
|
+
stderr.print(line)
|
23
34
|
end
|
24
35
|
end
|
25
36
|
|
26
37
|
begin
|
27
38
|
yield
|
28
39
|
ensure
|
29
|
-
|
30
|
-
|
40
|
+
# TODO: should the threads be killed here?
|
41
|
+
STDOUT.reopen old_stdout
|
42
|
+
STDERR.reopen old_stderr
|
31
43
|
end
|
32
44
|
|
33
|
-
|
45
|
+
stdout_thread.join
|
46
|
+
stderr_thread.join
|
34
47
|
end
|
35
48
|
end
|
36
49
|
end
|
@@ -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
|
data/lib/rspec-interactive.rb
CHANGED
@@ -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,34 +57,33 @@ module RSpec
|
|
56
57
|
load config_file if config_file
|
57
58
|
|
58
59
|
check_rails
|
60
|
+
trap_interrupt
|
59
61
|
configure_pry
|
60
62
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
start_file_watcher
|
63
|
+
@startup_thread = Thread.start do
|
64
|
+
@startup_output = StringOutput.new
|
65
|
+
Stdio.capture2(stdout: @startup_output, stderr: @startup_output) do
|
66
|
+
@config_cache.record_configuration { @configuration.configure_rspec.call }
|
67
|
+
start_file_watcher
|
68
|
+
end
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
server = TCPServer.new port
|
70
|
+
if server
|
71
|
+
@server_thread = Thread.start do
|
72
|
+
server = TCPServer.new port
|
74
73
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
while client = server.accept
|
75
|
+
request = client.gets
|
76
|
+
args = Shellwords.split(request)
|
77
|
+
rspec_for_server(client, args)
|
78
|
+
client.close
|
79
|
+
end
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
84
|
Pry.start
|
85
85
|
@listener.stop if @listener
|
86
|
-
server_thread.exit if server_thread
|
86
|
+
@server_thread.exit if @server_thread
|
87
87
|
0
|
88
88
|
end
|
89
89
|
|
@@ -95,11 +95,14 @@ module RSpec
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
def self.
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
98
|
+
def self.trap_interrupt
|
99
|
+
trap('INT') do
|
100
|
+
if @runner
|
101
|
+
# We are on a different thread. There is a race here. Ignore nil.
|
102
|
+
@runner&.quit
|
103
|
+
else
|
104
|
+
raise Interrupt
|
105
|
+
end
|
103
106
|
end
|
104
107
|
end
|
105
108
|
|
@@ -116,6 +119,9 @@ module RSpec
|
|
116
119
|
end
|
117
120
|
|
118
121
|
def self.configure_pry
|
122
|
+
# Prevent Pry from trapping too. It will break ctrl-c handling.
|
123
|
+
Pry.config.should_trap_interrupts = false
|
124
|
+
|
119
125
|
# Set up IO.
|
120
126
|
Pry.config.input = Readline
|
121
127
|
Pry.config.output = @output_stream
|
@@ -146,14 +152,24 @@ module RSpec
|
|
146
152
|
end
|
147
153
|
|
148
154
|
def self.parse_args(args)
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
155
|
+
i = 0
|
156
|
+
parsed_args = []
|
157
|
+
until i == args.length
|
158
|
+
case args[i]
|
159
|
+
when /[\*\?\[]/
|
160
|
+
glob = Dir.glob(args[i])
|
161
|
+
parsed_args.concat(glob.empty? ? args[i] : glob)
|
162
|
+
when '--pattern'
|
163
|
+
# RubyMine passes --pattern when running all specs in a dir.
|
164
|
+
# We don't want to expand this since it is used as a glob by RSpec.
|
165
|
+
parsed_args.concat(args[i..(i + 1)])
|
166
|
+
i += 1
|
153
167
|
else
|
154
|
-
[
|
168
|
+
parsed_args << args[i]
|
155
169
|
end
|
170
|
+
i += 1
|
156
171
|
end
|
172
|
+
parsed_args
|
157
173
|
end
|
158
174
|
|
159
175
|
def self.rspec(args)
|
@@ -165,7 +181,11 @@ module RSpec
|
|
165
181
|
Pry.config.history_save = false
|
166
182
|
|
167
183
|
# RSpec::Interactive-specific RSpec configuration
|
168
|
-
|
184
|
+
RSpec.configure do |config|
|
185
|
+
config.error_stream = @error_stream
|
186
|
+
config.output_stream = @output_stream
|
187
|
+
config.start_time = RSpec::Core::Time.now
|
188
|
+
end
|
169
189
|
|
170
190
|
# Run.
|
171
191
|
exit_code = @runner.run
|
@@ -178,9 +198,6 @@ module RSpec
|
|
178
198
|
RSpec.clear_examples
|
179
199
|
RSpec.reset
|
180
200
|
@config_cache.replay_configuration
|
181
|
-
rescue Interrupt => e
|
182
|
-
@runner&.quit
|
183
|
-
raise e
|
184
201
|
ensure
|
185
202
|
@runner = nil
|
186
203
|
end
|
@@ -192,13 +209,17 @@ module RSpec
|
|
192
209
|
ENV['DISABLE_PRY'] = 'true'
|
193
210
|
|
194
211
|
output = ClientOutput.new(client)
|
195
|
-
Stdio.capture(
|
212
|
+
Stdio.capture(stdout: output, stderr: output) do
|
196
213
|
@runner = RSpec::Interactive::Runner.new(parse_args(args))
|
197
214
|
|
198
215
|
refresh
|
199
216
|
|
200
217
|
# RSpec::Interactive-specific RSpec configuration
|
201
|
-
|
218
|
+
RSpec.configure do |config|
|
219
|
+
config.error_stream = @error_stream
|
220
|
+
config.output_stream = @output_stream
|
221
|
+
config.start_time = RSpec::Core::Time.now
|
222
|
+
end
|
202
223
|
|
203
224
|
# RubyMine specifies --format. That causes a formatter to be added. It does not override
|
204
225
|
# the existing formatter (if one is set by default). Clear any formatters but resetting
|
@@ -238,6 +259,17 @@ module RSpec
|
|
238
259
|
else
|
239
260
|
@command_mutex.synchronize do
|
240
261
|
Thread.current.thread_variable_set('holding_lock', true)
|
262
|
+
if @startup_thread
|
263
|
+
if @startup_thread.alive?
|
264
|
+
@output_stream.puts 'waiting for configure_rspec...'
|
265
|
+
end
|
266
|
+
@startup_thread.join
|
267
|
+
@startup_thread = nil
|
268
|
+
unless @startup_output.string.empty?
|
269
|
+
@output_stream.puts(@startup_output.string)
|
270
|
+
end
|
271
|
+
@startup_output = nil
|
272
|
+
end
|
241
273
|
yield
|
242
274
|
ensure
|
243
275
|
Thread.current.thread_variable_set('holding_lock', false)
|
data/runner/README.md
ADDED
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
|
+
version: 0.9.5
|
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-
|
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,11 +102,13 @@ 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
|
108
109
|
- runner/Gemfile
|
109
110
|
- runner/Gemfile.lock
|
111
|
+
- runner/README.md
|
110
112
|
- runner/rspec-interactive-run
|
111
113
|
- scripts/release.sh
|
112
114
|
- scripts/run-with-local-dep.sh
|