rspec-interactive 0.9.1 → 0.9.2

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
  SHA256:
3
- metadata.gz: dbc1f295bcf16bf85e5d6a6281de27ea2b51aa08f373272fb7d9e472ec13f3e9
4
- data.tar.gz: 36d80a0af500094c129970d522b2a3a3e6bbfc117549b9453f8a5f07ccbcbe33
3
+ metadata.gz: 17f3d7cb90e4271d19e1eb1a835a9c759084d12baf1f7404bedc521d8ff54047
4
+ data.tar.gz: 98688109728bbaa18e0b64339987fc0d2320331095ad09f2761d2162254ad868
5
5
  SHA512:
6
- metadata.gz: 11ba7e2f1e90ddc985f6154b7fec1b738b2477481eb40efe92a822d11a39970799ed147a4ae5da4736b226d1fcb25fe372083fbb7a2346754f5a771456a9a01f
7
- data.tar.gz: e10376660d90bace5ea870d3b9f046780157c65e3ec489ca21aa409ae0dcbdacf60cfa11e49d9ba2ab947b06b71e9e3fd5d35b976346ee370b552e8fd07e0bb6
6
+ metadata.gz: f0fbe89b3308f29db1302f28b265c0374a6b5c586b32b5c2bee2351d035faaf82c5f5d0362bb95158966d5ea9354de404dc126efd7b899d1bb9d2f8bee40edde
7
+ data.tar.gz: a8bbeaf1ca9e8f51b975cde6bf51be7cc5c6a57b1266bc4ee527c1e1ffcf995b9ac8c78ac77fe1a8ca79b937c4c31d712c9d58119ca4283854da8a6c4f78ccc9
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-interactive (0.9.0)
4
+ rspec-interactive (0.9.1)
5
5
  listen
6
6
  pry
7
7
  rspec-core
@@ -4,20 +4,20 @@ require 'optparse'
4
4
  require 'rspec-interactive'
5
5
 
6
6
  @options = {
7
- server: false,
8
- port: RSpec::Interactive::DEFAULT_PORT
7
+ server: true,
8
+ server_port: RSpec::Interactive::DEFAULT_PORT
9
9
  }
10
10
 
11
11
  parser = OptionParser.new do |opts|
12
12
  opts.banner = "Starts an interactive RSpec shell.\n\n"\
13
- "Usage: bundle exec rspec-interactive [--config config-file] [--server [--port <port>]]"
13
+ "Usage: bundle exec rspec-interactive [--config config-file] [--no-server] [--port <port>]"
14
14
 
15
15
  opts.on("-c", "--config <config-file>", String, "Optional. Path to the RSpec Interactive config file.") do |config_file|
16
16
  @options[:config_file] = config_file
17
17
  end
18
18
 
19
- opts.on("-s", "--server", "Optional. Enable server used by IDEs.") do
20
- @options[:server] = true
19
+ opts.on("--no-server", "Optional. Disable server.") do
20
+ @options[:server] = false
21
21
  end
22
22
 
23
23
  opts.on("-p", "--port <port>", Integer, "Optional. Server port. Defaults to #{RSpec::Interactive::DEFAULT_PORT}.") do |port|
@@ -26,4 +26,4 @@ parser = OptionParser.new do |opts|
26
26
 
27
27
  end.parse!
28
28
 
29
- RSpec::Interactive.start(config_file: @options[:config_file], server: @options[:server], port: @options[:port])
29
+ RSpec::Interactive.start(config_file: @options[:config_file], server: @options[:server], port: @options[:server_port])
@@ -0,0 +1,7 @@
1
+ RSpec::Interactive.configure do |config|
2
+ config.watch_dirs += ['lib']
3
+
4
+ config.configure_rspec do
5
+ RSpec.configuration.formatter = :documentation
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ module RSpec
2
+ module Interactive
3
+ class ClientOutput
4
+ def initialize(client)
5
+ @client = client
6
+ end
7
+
8
+ def puts(str = "")
9
+ @client.puts(str&.to_s || '')
10
+ end
11
+
12
+ def string
13
+ @output
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require 'pry'
2
+
3
+ class Pry
4
+ alias_method :old_eval, :eval
5
+
6
+ def eval(line, options = {})
7
+ RSpec::Interactive.eval do
8
+ old_eval(line, options)
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,15 @@
1
+ require 'rspec/core'
2
+
3
+ module RSpec
4
+ module Core
5
+ class Example
6
+ alias_method :old_run, :run
7
+
8
+ def run(example_group_instance, reporter)
9
+ execution_result.started_at = RSpec::Core::Time.now
10
+ old_run(example_group_instance, reporter)
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,39 @@
1
+ module RSpec
2
+ module Interactive
3
+ class Stdio
4
+ def self.capture(output)
5
+ raise ArgumentError, 'missing block' unless block_given?
6
+
7
+ stdout, stderr = STDOUT.dup, STDERR.dup
8
+
9
+ IO.pipe do |stdout_read, stdout_write|
10
+ IO.pipe do |stderr_read, stderr_write|
11
+ STDOUT.reopen(stdout_write)
12
+ STDERR.reopen(stderr_write)
13
+
14
+ stdout_write.close
15
+ stderr_write.close
16
+
17
+ thread = Thread.new do
18
+ until stdout_read.eof? && stderr_read.eof? do
19
+ line = stdout_read.gets
20
+ output.puts line if line
21
+ line = stderr_read.gets
22
+ output.puts if line
23
+ end
24
+ end
25
+
26
+ begin
27
+ yield
28
+ ensure
29
+ STDOUT.reopen stdout
30
+ STDERR.reopen stderr
31
+ end
32
+
33
+ thread.join
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module Interactive
5
- VERSION = "0.9.1"
5
+ VERSION = "0.9.2"
6
6
  end
7
7
  end
@@ -7,13 +7,17 @@ require 'shellwords'
7
7
  require 'socket'
8
8
  require 'teamcity/spec/runner/formatter/teamcity/formatter'
9
9
 
10
+ require 'rspec-interactive/client_output'
10
11
  require 'rspec-interactive/config'
11
12
  require 'rspec-interactive/input_completer'
13
+ require 'rspec-interactive/pry'
12
14
  require 'rspec-interactive/refresh_command'
13
15
  require 'rspec-interactive/rspec_command'
14
16
  require 'rspec-interactive/rspec_config_cache'
17
+ require 'rspec-interactive/rspec_core_example'
15
18
  require 'rspec-interactive/rubo_cop_command'
16
19
  require 'rspec-interactive/runner'
20
+ require 'rspec-interactive/stdio'
17
21
 
18
22
  module RSpec
19
23
  module Interactive
@@ -42,7 +46,7 @@ module RSpec
42
46
  @updated_files = []
43
47
  @stty_save = %x`stty -g`.chomp
44
48
  @file_change_mutex = Mutex.new
45
- @rspec_mutex = Mutex.new
49
+ @command_mutex = Mutex.new
46
50
  @output_stream = output_stream
47
51
  @input_stream = input_stream
48
52
  @error_stream = error_stream
@@ -54,12 +58,19 @@ module RSpec
54
58
  check_rails
55
59
  configure_pry
56
60
 
61
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
57
62
  @config_cache.record_configuration { @configuration.configure_rspec.call }
63
+ end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
64
+ if end_time - start_time > 5
65
+ @output_stream.puts "Configuring RSpec took #{(end_time - start_time).round} seconds."
66
+ end
67
+
58
68
  start_file_watcher
59
69
 
60
70
  if server
71
+ @output_stream.puts "Listening on port #{port}."
61
72
  server_thread = Thread.start do
62
- server = TCPServer.new 5678
73
+ server = TCPServer.new port
63
74
 
64
75
  while client = server.accept
65
76
  request = client.gets
@@ -146,63 +157,70 @@ module RSpec
146
157
  end
147
158
 
148
159
  def self.rspec(args)
149
- @rspec_mutex.synchronize do
150
-
151
- @runner = RSpec::Interactive::Runner.new(parse_args(args))
160
+ @runner = RSpec::Interactive::Runner.new(parse_args(args))
152
161
 
153
- refresh
162
+ refresh
154
163
 
155
- # Stop saving history in case a new Pry session is started for debugging.
156
- Pry.config.history_save = false
164
+ # Stop saving history in case a new Pry session is started for debugging.
165
+ Pry.config.history_save = false
157
166
 
158
- # RSpec::Interactive-specific RSpec configuration
159
- configure_rspec
167
+ # RSpec::Interactive-specific RSpec configuration
168
+ configure_rspec
160
169
 
161
- # Run.
162
- exit_code = @runner.run
163
- @runner = nil
170
+ # Run.
171
+ exit_code = @runner.run
172
+ @runner = nil
164
173
 
165
- # Reenable history
166
- Pry.config.history_save = true
174
+ # Reenable history
175
+ Pry.config.history_save = true
167
176
 
168
- # Reset
169
- RSpec.clear_examples
170
- RSpec.reset
171
- @config_cache.replay_configuration
172
- rescue Interrupt
173
- @runner&.quit
174
- ensure
175
- @runner = nil
176
- end
177
+ # Reset
178
+ RSpec.clear_examples
179
+ RSpec.reset
180
+ @config_cache.replay_configuration
181
+ rescue Interrupt => e
182
+ @runner&.quit
183
+ raise e
184
+ ensure
185
+ @runner = nil
177
186
  end
178
187
 
179
188
  def self.rspec_for_server(client, args)
180
- @rspec_mutex.synchronize do
181
- # Set the client so that logs are written to the client rathe than STDOUT.
182
- Spec::Runner::Formatter::TeamcityFormatter.client = client
183
-
184
- @runner = RSpec::Interactive::Runner.new(parse_args(args))
185
-
186
- refresh
187
-
188
- # Stop saving history in case a new Pry session is started for debugging.
189
- Pry.config.history_save = false
190
-
191
- # RSpec::Interactive-specific RSpec configuration
192
- configure_rspec
193
- RSpec.configuration.instance_variable_set(
194
- :@formatter_loader,
195
- RSpec::Core::Formatters::Loader.new(RSpec::Core::Reporter.new(RSpec.configuration)))
196
- RSpec.configuration.formatter = Spec::Runner::Formatter::TeamcityFormatter
197
-
198
- # Run.
199
- exit_code = @runner.run
200
-
201
- # Reset
202
- Spec::Runner::Formatter::TeamcityFormatter.client = nil
203
- RSpec.clear_examples
204
- RSpec.reset
205
- @config_cache.replay_configuration
189
+ @command_mutex.synchronize do
190
+ # Prevent the debugger from being used. The server isn't interactive.
191
+ disable_pry = ENV['DISABLE_PRY']
192
+ ENV['DISABLE_PRY'] = 'true'
193
+
194
+ output = ClientOutput.new(client)
195
+ Stdio.capture(ClientOutput.new(client)) do
196
+ @runner = RSpec::Interactive::Runner.new(parse_args(args))
197
+
198
+ refresh
199
+
200
+ # RSpec::Interactive-specific RSpec configuration
201
+ configure_rspec
202
+
203
+ # RubyMine specifies --format. That causes a formatter to be added. It does not override
204
+ # the existing formatter (if one is set by default). Clear any formatters but resetting
205
+ # the loader.
206
+ RSpec.configuration.instance_variable_set(
207
+ :@formatter_loader,
208
+ RSpec::Core::Formatters::Loader.new(RSpec::Core::Reporter.new(RSpec.configuration)))
209
+
210
+ # Always use the teamcity formatter, even though RubyMine always specifies it.
211
+ # This make manual testing of rspec-interactive easier.
212
+ RSpec.configuration.formatter = Spec::Runner::Formatter::TeamcityFormatter
213
+
214
+ # Run.
215
+ exit_code = @runner.run
216
+
217
+ # Reset
218
+ RSpec.clear_examples
219
+ RSpec.reset
220
+ @config_cache.replay_configuration
221
+ end
222
+ ensure
223
+ ENV['DISABLE_PRY'] = disable_pry
206
224
  end
207
225
  end
208
226
 
@@ -214,5 +232,17 @@ module RSpec
214
232
  end
215
233
  end
216
234
 
235
+ def self.eval(&block)
236
+ if Thread.current.thread_variable_get('holding_lock')
237
+ yield
238
+ else
239
+ @command_mutex.synchronize do
240
+ Thread.current.thread_variable_set('holding_lock', true)
241
+ yield
242
+ ensure
243
+ Thread.current.thread_variable_set('holding_lock', false)
244
+ end
245
+ end
246
+ end
217
247
  end
218
248
  end
@@ -4,14 +4,6 @@ module Spec
4
4
  module Runner
5
5
  module Formatter
6
6
  class TeamcityFormatter
7
- class << self
8
- attr_accessor :client
9
- end
10
-
11
- def log(msg)
12
- TeamcityFormatter.client.puts(msg)
13
- msg
14
- end
15
7
  end
16
8
  end
17
9
  end
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
23
23
  end
24
24
  spec.bindir = 'bin'
25
25
  spec.executables << 'rspec-interactive'
26
- spec.executables << 'rspec-interactive-run'
27
26
  spec.require_paths = ["lib"]
28
27
 
29
28
  spec.add_dependency 'rspec-core'
data/runner/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ ruby '3.0.0'
4
+
5
+ source "https://rubygems.org"
@@ -0,0 +1,14 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+
5
+ PLATFORMS
6
+ x86_64-darwin-20
7
+
8
+ DEPENDENCIES
9
+
10
+ RUBY VERSION
11
+ ruby 3.0.0p0
12
+
13
+ BUNDLED WITH
14
+ 2.3.6
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'optparse'
4
- require 'rspec-interactive'
5
4
  require 'shellwords'
6
5
  require 'socket'
7
6
 
@@ -25,8 +24,8 @@ parser = OptionParser.new do |opts|
25
24
  end.parse
26
25
 
27
26
  server = TCPSocket.open(@options[:host], @options[:port])
28
- server.puts ARGV.map{|arg| Shellwords.escape arg}.join(' ')
27
+ server.puts ARGV.map{ |arg| Shellwords.escape arg }.join(' ')
29
28
  while response = server.gets do
30
- puts "response: #{response}"
29
+ puts response
31
30
  end
32
31
  server.close
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-interactive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Dower
@@ -71,7 +71,6 @@ email:
71
71
  - nicholasdower@gmail.com
72
72
  executables:
73
73
  - rspec-interactive
74
- - rspec-interactive-run
75
74
  extensions: []
76
75
  extra_rdoc_files: []
77
76
  files:
@@ -83,25 +82,32 @@ files:
83
82
  - Rakefile
84
83
  - bin/console
85
84
  - bin/rspec-interactive
86
- - bin/rspec-interactive-run
87
85
  - bin/setup
88
86
  - bin/test
87
+ - examples/config.rb
89
88
  - examples/debugged_spec.rb
90
89
  - examples/failing_spec.rb
91
90
  - examples/other_passing_spec.rb
92
91
  - examples/passing_spec.rb
93
92
  - examples/spec_with_syntax_error.rb
94
93
  - lib/rspec-interactive.rb
94
+ - lib/rspec-interactive/client_output.rb
95
95
  - lib/rspec-interactive/config.rb
96
96
  - lib/rspec-interactive/input_completer.rb
97
+ - lib/rspec-interactive/pry.rb
97
98
  - lib/rspec-interactive/refresh_command.rb
98
99
  - lib/rspec-interactive/rspec_command.rb
99
100
  - lib/rspec-interactive/rspec_config_cache.rb
101
+ - lib/rspec-interactive/rspec_core_example.rb
100
102
  - lib/rspec-interactive/rubo_cop_command.rb
101
103
  - lib/rspec-interactive/runner.rb
104
+ - lib/rspec-interactive/stdio.rb
102
105
  - lib/rspec-interactive/version.rb
103
106
  - lib/teamcity/spec/runner/formatter/teamcity/formatter.rb
104
107
  - rspec-interactive.gemspec
108
+ - runner/Gemfile
109
+ - runner/Gemfile.lock
110
+ - runner/rspec-interactive-run
105
111
  - scripts/release.sh
106
112
  - scripts/run-with-local-dep.sh
107
113
  - tests/debugged_spec_test.rb