transpec 0.2.3 → 0.2.4
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/.rubocop.yml +3 -7
- data/CHANGELOG.md +4 -0
- data/README.md +58 -12
- data/README.md.erb +58 -12
- data/lib/transpec/cli.rb +10 -12
- data/lib/transpec/context.rb +98 -49
- data/lib/transpec/syntax/method_stub.rb +1 -1
- data/lib/transpec/syntax/rspec_configure.rb +21 -20
- data/lib/transpec/syntax/should.rb +1 -1
- data/lib/transpec/syntax/should_receive.rb +1 -1
- data/lib/transpec/version.rb +1 -1
- data/spec/.rubocop.yml +4 -0
- data/spec/support/shared_context.rb +1 -1
- data/spec/transpec/context_spec.rb +497 -109
- data/spec/transpec/syntax/method_stub_spec.rb +2 -3
- data/spec/transpec/syntax/should_receive_spec.rb +2 -2
- data/spec/transpec/syntax/should_spec.rb +1 -1
- data/tasks/demo.rake +23 -0
- data/tasks/lib/transpec_demo.rb +51 -0
- data/tasks/lib/transpec_test.rb +148 -0
- data/tasks/test.rake +3 -151
- data/transpec.gemspec +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4282d3fbc1652d1d78046fe2a04392fea0cee1c
|
4
|
+
data.tar.gz: 6eab8ef44e5a6b8e672246b7fd420bf220cd7006
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4e376be4d7ef6f6c33c2cdc9d31a66f2817d0902be4d83541b3d79f637e83c4b23f0a021791a623d4214ee215e3909ffbaa602e0357f0bc1b1989325cb7c3eb
|
7
|
+
data.tar.gz: 4d1b3b9346eea8526948a8475c4c0fba32e2c1c35a1dfeecba9eec5c69f3df11dc0387f38baba7f9b596bfc78e92c0b0c81c18a213998693fc5f5d9fddd5ac50
|
data/.rubocop.yml
CHANGED
@@ -9,7 +9,7 @@ LineLength:
|
|
9
9
|
Max: 100
|
10
10
|
|
11
11
|
MethodLength:
|
12
|
-
Max:
|
12
|
+
Max: 17
|
13
13
|
|
14
14
|
WordArray:
|
15
15
|
Enabled: false
|
@@ -48,10 +48,6 @@ Documentation:
|
|
48
48
|
IndentationWidth:
|
49
49
|
Enabled: false
|
50
50
|
|
51
|
-
#
|
52
|
-
RaiseArgs:
|
53
|
-
Enabled: false
|
54
|
-
|
55
|
-
# Currently ClassLength counts innner class' codes in a namespace class.
|
51
|
+
# TODO: Shorten to 100.
|
56
52
|
ClassLength:
|
57
|
-
|
53
|
+
Max: 186
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
## Master
|
4
4
|
|
5
|
+
## v0.2.4
|
6
|
+
|
7
|
+
* Improve context detection
|
8
|
+
|
5
9
|
## v0.2.3
|
6
10
|
|
7
11
|
* Fix a bug where arguments of positive error expectation with block were removed (e.g. `expect { }.to raise_error(SpecificErrorClass) { |e| ... }` was converted to `expect { }.to raise_error { |e| ... }` unintentionally)
|
data/README.md
CHANGED
@@ -16,7 +16,7 @@ Note that Transpec does not yet support all conversions for the RSpec changes,
|
|
16
16
|
and also the changes for RSpec 3 is not fixed and may vary in the future.
|
17
17
|
So it's recommended to follow updates of both RSpec and Transpec.
|
18
18
|
|
19
|
-
##
|
19
|
+
## Examples
|
20
20
|
|
21
21
|
Here's an example spec:
|
22
22
|
|
@@ -91,6 +91,14 @@ describe Account do
|
|
91
91
|
end
|
92
92
|
```
|
93
93
|
|
94
|
+
### Real Examples
|
95
|
+
|
96
|
+
You can see real conversion examples below:
|
97
|
+
|
98
|
+
* https://github.com/yujinakayama/guard/commit/transpec-demo
|
99
|
+
* https://github.com/yujinakayama/mail/commit/transpec-demo
|
100
|
+
* https://github.com/yujinakayama/twitter/commit/transpec-demo
|
101
|
+
|
94
102
|
## Installation
|
95
103
|
|
96
104
|
```bash
|
@@ -234,12 +242,50 @@ describe 'converted spec with -p/--no-parentheses-matcher-arg option' do
|
|
234
242
|
end
|
235
243
|
```
|
236
244
|
|
245
|
+
## Troubleshooting
|
246
|
+
|
247
|
+
You might see the following warning while conversion:
|
248
|
+
|
249
|
+
```
|
250
|
+
Cannot convert #should into #expect since #expect is not available in the context.
|
251
|
+
spec/awesome_spec.rb:4: 1.should == 1
|
252
|
+
```
|
253
|
+
|
254
|
+
This message would be shown with specs like this:
|
255
|
+
|
256
|
+
```ruby
|
257
|
+
describe '#should that cannot be converted to #expect' do
|
258
|
+
class MyAwesomeTestRunner
|
259
|
+
def run
|
260
|
+
1.should == 1
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'is 1' do
|
265
|
+
test_runner = MyAwesomeTestRunner.new
|
266
|
+
test_runner.run
|
267
|
+
end
|
268
|
+
end
|
269
|
+
```
|
270
|
+
|
271
|
+
### Reason
|
272
|
+
|
273
|
+
* `should` is defined on `Kernel` (included by `Object`), so you can use `should` almost everywhere.
|
274
|
+
* `expect` is defined on `RSpec::Matchers` (included by `RSpec::Core::ExampleGroup`), so you can use `expect` only where `self` is an instance of `RSpec::Core::ExampleGroup`.
|
275
|
+
|
276
|
+
With the above example, in the context of `1.should == 1`, the `self` is an instance of `MyAwesomeTestRunner`.
|
277
|
+
So Transpec tracks contexts and skips conversion if the target syntax cannot be converted in a case like this.
|
278
|
+
|
279
|
+
### Solution
|
280
|
+
|
281
|
+
You need to rewrite the spec by yourself.
|
282
|
+
|
237
283
|
## Supported Conversions
|
238
284
|
|
239
285
|
### Standard expectations
|
240
286
|
|
241
287
|
```ruby
|
242
|
-
#
|
288
|
+
# Targets
|
243
289
|
obj.should matcher
|
244
290
|
obj.should_not matcher
|
245
291
|
|
@@ -255,7 +301,7 @@ expect(obj).to_not matcher # with `--negative-form to_not`
|
|
255
301
|
### Operator matchers
|
256
302
|
|
257
303
|
```ruby
|
258
|
-
#
|
304
|
+
# Targets
|
259
305
|
1.should == 1
|
260
306
|
1.should < 2
|
261
307
|
Integer.should === 1
|
@@ -275,7 +321,7 @@ expect([1, 2, 3]).to match_array([2, 1, 3])
|
|
275
321
|
### `be_close` matcher
|
276
322
|
|
277
323
|
```ruby
|
278
|
-
#
|
324
|
+
# Targets
|
279
325
|
(1.0 / 3.0).should be_close(0.333, 0.001)
|
280
326
|
|
281
327
|
# Converted
|
@@ -288,7 +334,7 @@ expect([1, 2, 3]).to match_array([2, 1, 3])
|
|
288
334
|
### Expectations on Proc
|
289
335
|
|
290
336
|
```ruby
|
291
|
-
#
|
337
|
+
# Targets
|
292
338
|
lambda { do_something }.should raise_error
|
293
339
|
proc { do_something }.should raise_error
|
294
340
|
-> { do_something }.should raise_error
|
@@ -303,7 +349,7 @@ expect { do_something }.to raise_error
|
|
303
349
|
### Negative error expectations with specific error
|
304
350
|
|
305
351
|
```ruby
|
306
|
-
#
|
352
|
+
# Targets
|
307
353
|
expect { do_something }.not_to raise_error(SomeErrorClass)
|
308
354
|
expect { do_something }.not_to raise_error('message')
|
309
355
|
expect { do_something }.not_to raise_error(SomeErrorClass, 'message')
|
@@ -320,7 +366,7 @@ lambda { do_something }.should_not raise_error # with `--disable expect_to_match
|
|
320
366
|
### Message expectations
|
321
367
|
|
322
368
|
```ruby
|
323
|
-
#
|
369
|
+
# Targets
|
324
370
|
obj.should_receive(:foo)
|
325
371
|
SomeClass.any_instance.should_receive(:foo)
|
326
372
|
|
@@ -335,7 +381,7 @@ expect_any_instance_of(SomeClass).to receive(:foo)
|
|
335
381
|
### Message expectations that are actually method stubs
|
336
382
|
|
337
383
|
```ruby
|
338
|
-
#
|
384
|
+
# Targets
|
339
385
|
obj.should_receive(:foo).any_number_of_times
|
340
386
|
obj.should_receive(:foo).at_least(0)
|
341
387
|
|
@@ -356,7 +402,7 @@ SomeClass.any_instance.stub(:foo) # with `--disable allow_to_receive`
|
|
356
402
|
### Method stubs
|
357
403
|
|
358
404
|
```ruby
|
359
|
-
#
|
405
|
+
# Targets
|
360
406
|
obj.stub(:foo)
|
361
407
|
|
362
408
|
obj.stub!(:foo)
|
@@ -382,7 +428,7 @@ allow_any_instance_of(SomeClass).to receive(:foo)
|
|
382
428
|
### Deprecated method stub aliases
|
383
429
|
|
384
430
|
```ruby
|
385
|
-
#
|
431
|
+
# Targets
|
386
432
|
obj.stub!(:foo)
|
387
433
|
obj.unstub!(:foo)
|
388
434
|
|
@@ -397,7 +443,7 @@ obj.unstub(:foo)
|
|
397
443
|
### Method stubs with deprecated specification of number of times
|
398
444
|
|
399
445
|
```ruby
|
400
|
-
#
|
446
|
+
# Targets
|
401
447
|
obj.stub(:foo).any_number_of_times
|
402
448
|
obj.stub(:foo).at_least(0)
|
403
449
|
|
@@ -412,7 +458,7 @@ obj.stub(:foo) # with `--disable allow_to_receive`
|
|
412
458
|
### Deprecated test double aliases
|
413
459
|
|
414
460
|
```ruby
|
415
|
-
#
|
461
|
+
# Targets
|
416
462
|
stub('something')
|
417
463
|
mock('something')
|
418
464
|
|
data/README.md.erb
CHANGED
@@ -16,7 +16,7 @@ Note that Transpec does not yet support all conversions for the RSpec changes,
|
|
16
16
|
and also the changes for RSpec 3 is not fixed and may vary in the future.
|
17
17
|
So it's recommended to follow updates of both RSpec and Transpec.
|
18
18
|
|
19
|
-
##
|
19
|
+
## Examples
|
20
20
|
|
21
21
|
Here's an example spec:
|
22
22
|
|
@@ -64,6 +64,14 @@ Transpec would convert it to the following form:
|
|
64
64
|
<%= Transpec::Rewriter.new.rewrite(example) -%>
|
65
65
|
```
|
66
66
|
|
67
|
+
### Real Examples
|
68
|
+
|
69
|
+
You can see real conversion examples below:
|
70
|
+
|
71
|
+
* https://github.com/yujinakayama/guard/commit/transpec-demo
|
72
|
+
* https://github.com/yujinakayama/mail/commit/transpec-demo
|
73
|
+
* https://github.com/yujinakayama/twitter/commit/transpec-demo
|
74
|
+
|
67
75
|
## Installation
|
68
76
|
|
69
77
|
```bash
|
@@ -230,12 +238,50 @@ rewriter.rewrite(parenthesizing_example)
|
|
230
238
|
-%>
|
231
239
|
```
|
232
240
|
|
241
|
+
## Troubleshooting
|
242
|
+
|
243
|
+
You might see the following warning while conversion:
|
244
|
+
|
245
|
+
```
|
246
|
+
Cannot convert #should into #expect since #expect is not available in the context.
|
247
|
+
spec/awesome_spec.rb:4: 1.should == 1
|
248
|
+
```
|
249
|
+
|
250
|
+
This message would be shown with specs like this:
|
251
|
+
|
252
|
+
```ruby
|
253
|
+
describe '#should that cannot be converted to #expect' do
|
254
|
+
class MyAwesomeTestRunner
|
255
|
+
def run
|
256
|
+
1.should == 1
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'is 1' do
|
261
|
+
test_runner = MyAwesomeTestRunner.new
|
262
|
+
test_runner.run
|
263
|
+
end
|
264
|
+
end
|
265
|
+
```
|
266
|
+
|
267
|
+
### Reason
|
268
|
+
|
269
|
+
* `should` is defined on `Kernel` (included by `Object`), so you can use `should` almost everywhere.
|
270
|
+
* `expect` is defined on `RSpec::Matchers` (included by `RSpec::Core::ExampleGroup`), so you can use `expect` only where `self` is an instance of `RSpec::Core::ExampleGroup`.
|
271
|
+
|
272
|
+
With the above example, in the context of `1.should == 1`, the `self` is an instance of `MyAwesomeTestRunner`.
|
273
|
+
So Transpec tracks contexts and skips conversion if the target syntax cannot be converted in a case like this.
|
274
|
+
|
275
|
+
### Solution
|
276
|
+
|
277
|
+
You need to rewrite the spec by yourself.
|
278
|
+
|
233
279
|
## Supported Conversions
|
234
280
|
|
235
281
|
### Standard expectations
|
236
282
|
|
237
283
|
```ruby
|
238
|
-
#
|
284
|
+
# Targets
|
239
285
|
obj.should matcher
|
240
286
|
obj.should_not matcher
|
241
287
|
|
@@ -251,7 +297,7 @@ expect(obj).to_not matcher # with `--negative-form to_not`
|
|
251
297
|
### Operator matchers
|
252
298
|
|
253
299
|
```ruby
|
254
|
-
#
|
300
|
+
# Targets
|
255
301
|
1.should == 1
|
256
302
|
1.should < 2
|
257
303
|
Integer.should === 1
|
@@ -271,7 +317,7 @@ expect([1, 2, 3]).to match_array([2, 1, 3])
|
|
271
317
|
### `be_close` matcher
|
272
318
|
|
273
319
|
```ruby
|
274
|
-
#
|
320
|
+
# Targets
|
275
321
|
(1.0 / 3.0).should be_close(0.333, 0.001)
|
276
322
|
|
277
323
|
# Converted
|
@@ -284,7 +330,7 @@ expect([1, 2, 3]).to match_array([2, 1, 3])
|
|
284
330
|
### Expectations on Proc
|
285
331
|
|
286
332
|
```ruby
|
287
|
-
#
|
333
|
+
# Targets
|
288
334
|
lambda { do_something }.should raise_error
|
289
335
|
proc { do_something }.should raise_error
|
290
336
|
-> { do_something }.should raise_error
|
@@ -299,7 +345,7 @@ expect { do_something }.to raise_error
|
|
299
345
|
### Negative error expectations with specific error
|
300
346
|
|
301
347
|
```ruby
|
302
|
-
#
|
348
|
+
# Targets
|
303
349
|
expect { do_something }.not_to raise_error(SomeErrorClass)
|
304
350
|
expect { do_something }.not_to raise_error('message')
|
305
351
|
expect { do_something }.not_to raise_error(SomeErrorClass, 'message')
|
@@ -316,7 +362,7 @@ lambda { do_something }.should_not raise_error # with `--disable expect_to_match
|
|
316
362
|
### Message expectations
|
317
363
|
|
318
364
|
```ruby
|
319
|
-
#
|
365
|
+
# Targets
|
320
366
|
obj.should_receive(:foo)
|
321
367
|
SomeClass.any_instance.should_receive(:foo)
|
322
368
|
|
@@ -331,7 +377,7 @@ expect_any_instance_of(SomeClass).to receive(:foo)
|
|
331
377
|
### Message expectations that are actually method stubs
|
332
378
|
|
333
379
|
```ruby
|
334
|
-
#
|
380
|
+
# Targets
|
335
381
|
obj.should_receive(:foo).any_number_of_times
|
336
382
|
obj.should_receive(:foo).at_least(0)
|
337
383
|
|
@@ -352,7 +398,7 @@ SomeClass.any_instance.stub(:foo) # with `--disable allow_to_receive`
|
|
352
398
|
### Method stubs
|
353
399
|
|
354
400
|
```ruby
|
355
|
-
#
|
401
|
+
# Targets
|
356
402
|
obj.stub(:foo)
|
357
403
|
|
358
404
|
obj.stub!(:foo)
|
@@ -378,7 +424,7 @@ allow_any_instance_of(SomeClass).to receive(:foo)
|
|
378
424
|
### Deprecated method stub aliases
|
379
425
|
|
380
426
|
```ruby
|
381
|
-
#
|
427
|
+
# Targets
|
382
428
|
obj.stub!(:foo)
|
383
429
|
obj.unstub!(:foo)
|
384
430
|
|
@@ -393,7 +439,7 @@ obj.unstub(:foo)
|
|
393
439
|
### Method stubs with deprecated specification of number of times
|
394
440
|
|
395
441
|
```ruby
|
396
|
-
#
|
442
|
+
# Targets
|
397
443
|
obj.stub(:foo).any_number_of_times
|
398
444
|
obj.stub(:foo).at_least(0)
|
399
445
|
|
@@ -408,7 +454,7 @@ obj.stub(:foo) # with `--disable allow_to_receive`
|
|
408
454
|
### Deprecated test double aliases
|
409
455
|
|
410
456
|
```ruby
|
411
|
-
#
|
457
|
+
# Targets
|
412
458
|
stub('something')
|
413
459
|
mock('something')
|
414
460
|
|
data/lib/transpec/cli.rb
CHANGED
@@ -39,17 +39,9 @@ module Transpec
|
|
39
39
|
|
40
40
|
fail_if_should_not_continue!
|
41
41
|
|
42
|
-
|
42
|
+
base_paths = base_target_paths(non_option_args)
|
43
43
|
|
44
|
-
|
45
|
-
if Dir.exists?('spec')
|
46
|
-
paths = ['spec']
|
47
|
-
else
|
48
|
-
fail ArgumentError, 'Specify target files or directories.'
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
target_files(paths).each do |file_path|
|
44
|
+
target_files(base_paths).each do |file_path|
|
53
45
|
process_file(file_path)
|
54
46
|
end
|
55
47
|
|
@@ -71,7 +63,7 @@ module Transpec
|
|
71
63
|
@report.invalid_context_errors.concat(rewriter.invalid_context_errors)
|
72
64
|
|
73
65
|
rewriter.invalid_context_errors.each do |error|
|
74
|
-
|
66
|
+
warn_invalid_context_error(error)
|
75
67
|
end
|
76
68
|
rescue Parser::SyntaxError => error
|
77
69
|
@report.syntax_errors << error
|
@@ -176,6 +168,12 @@ module Transpec
|
|
176
168
|
|
177
169
|
private
|
178
170
|
|
171
|
+
def base_target_paths(args)
|
172
|
+
return args unless args.empty?
|
173
|
+
return ['spec'] if Dir.exists?('spec')
|
174
|
+
fail ArgumentError, 'Specify target files or directories.'
|
175
|
+
end
|
176
|
+
|
179
177
|
def ruby_files_in_directory(directory_path)
|
180
178
|
ruby_file_paths = []
|
181
179
|
|
@@ -229,7 +227,7 @@ module Transpec
|
|
229
227
|
warn "Syntax error at #{error.diagnostic.location}. Skipping the file.".color(:red)
|
230
228
|
end
|
231
229
|
|
232
|
-
def
|
230
|
+
def warn_invalid_context_error(error)
|
233
231
|
message = error.message.color(:yellow) + $RS
|
234
232
|
message << highlighted_source(error)
|
235
233
|
warn message
|
data/lib/transpec/context.rb
CHANGED
@@ -8,11 +8,45 @@ module Transpec
|
|
8
8
|
|
9
9
|
SCOPE_TYPES = [:module, :class, :sclass, :def, :defs, :block].freeze
|
10
10
|
|
11
|
-
|
11
|
+
EXAMPLE_GROUP_METHODS = [
|
12
12
|
:describe, :context,
|
13
13
|
:shared_examples, :shared_context, :share_examples_for, :shared_examples_for
|
14
14
|
].freeze
|
15
15
|
|
16
|
+
EXAMPLE_METHODS = [
|
17
|
+
:example, :it, :specify,
|
18
|
+
:focus, :focused, :fit,
|
19
|
+
:pending, :xexample, :xit, :xspecify
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
HOOK_METHODS = [:before, :after, :around].freeze
|
23
|
+
|
24
|
+
HELPER_METHODS = [:subject, :subject!, :let, :let!]
|
25
|
+
|
26
|
+
NON_MONKEY_PATCH_EXPECTATION_AVAILABLE_CONTEXT = [
|
27
|
+
[:example_group, :example],
|
28
|
+
[:example_group, :each_before_after],
|
29
|
+
[:example_group, :all_before_after],
|
30
|
+
[:example_group, :around],
|
31
|
+
[:example_group, :helper],
|
32
|
+
[:example_group, :def],
|
33
|
+
[:rspec_configure, :each_before_after],
|
34
|
+
[:rspec_configure, :all_before_after],
|
35
|
+
[:rspec_configure, :around],
|
36
|
+
[:rspec_configure, :def],
|
37
|
+
[:module, :def]
|
38
|
+
].freeze
|
39
|
+
|
40
|
+
NON_MONKEY_PATCH_MOCK_AVAILABLE_CONTEXT = [
|
41
|
+
[:example_group, :example],
|
42
|
+
[:example_group, :each_before_after],
|
43
|
+
[:example_group, :helper],
|
44
|
+
[:example_group, :def],
|
45
|
+
[:rspec_configure, :each_before_after],
|
46
|
+
[:rspec_configure, :def],
|
47
|
+
[:module, :def]
|
48
|
+
].freeze
|
49
|
+
|
16
50
|
attr_reader :nodes
|
17
51
|
|
18
52
|
# @param nodes [Array] An array containing from root node to the target node.
|
@@ -23,79 +57,94 @@ module Transpec
|
|
23
57
|
def scopes
|
24
58
|
@scopes ||= begin
|
25
59
|
scopes = @nodes.map { |node| scope_type(node) }
|
26
|
-
scopes.compact
|
60
|
+
scopes.compact!
|
61
|
+
scopes.extend(ArrayExtension)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def non_monkey_patch_expectation_available?
|
66
|
+
return @expectation_available if instance_variable_defined?(:@expectation_available)
|
67
|
+
|
68
|
+
return @expectation_available = true if scopes == [:def]
|
69
|
+
|
70
|
+
@expectation_available = NON_MONKEY_PATCH_EXPECTATION_AVAILABLE_CONTEXT.any? do |suffix|
|
71
|
+
scopes.end_with?(suffix)
|
27
72
|
end
|
28
73
|
end
|
29
74
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
75
|
+
alias_method :expect_to_matcher_available?, :non_monkey_patch_expectation_available?
|
76
|
+
|
77
|
+
def non_monkey_patch_mock_available?
|
78
|
+
return @mock_available if instance_variable_defined?(:@mock_available)
|
79
|
+
|
80
|
+
return @mock_available = true if scopes == [:def]
|
81
|
+
|
82
|
+
@mock_available = NON_MONKEY_PATCH_MOCK_AVAILABLE_CONTEXT.any? do |suffix|
|
83
|
+
scopes.end_with?(suffix)
|
84
|
+
end
|
36
85
|
end
|
37
86
|
|
87
|
+
alias_method :expect_to_receive_available?, :non_monkey_patch_mock_available?
|
88
|
+
alias_method :allow_to_receive_available?, :non_monkey_patch_mock_available?
|
89
|
+
|
38
90
|
private
|
39
91
|
|
40
92
|
def scope_type(node)
|
41
93
|
return nil unless SCOPE_TYPES.include?(node.type)
|
42
|
-
return node.type unless node.type == :block
|
43
94
|
|
44
|
-
|
95
|
+
case node.type
|
96
|
+
when :block
|
97
|
+
special_block_type(node)
|
98
|
+
when :defs
|
99
|
+
if node.children.first.type == :self
|
100
|
+
nil
|
101
|
+
else
|
102
|
+
node.type
|
103
|
+
end
|
104
|
+
else
|
105
|
+
node.type
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def special_block_type(block_node)
|
110
|
+
send_node = block_node.children.first
|
45
111
|
receiver_node, method_name, *_ = *send_node
|
46
112
|
|
47
113
|
if const_name(receiver_node) == 'RSpec' && method_name == :configure
|
48
114
|
:rspec_configure
|
115
|
+
elsif HOOK_METHODS.include?(method_name)
|
116
|
+
hook_type(send_node)
|
49
117
|
elsif receiver_node
|
50
|
-
|
51
|
-
elsif
|
118
|
+
nil
|
119
|
+
elsif EXAMPLE_GROUP_METHODS.include?(method_name)
|
52
120
|
:example_group
|
121
|
+
elsif EXAMPLE_METHODS.include?(method_name)
|
122
|
+
:example
|
123
|
+
elsif HELPER_METHODS.include?(method_name)
|
124
|
+
:helper
|
53
125
|
else
|
54
|
-
|
126
|
+
nil
|
55
127
|
end
|
56
128
|
end
|
57
129
|
|
58
|
-
def
|
59
|
-
|
60
|
-
return false unless scopes_in_example_group
|
61
|
-
return false if include_class_scope?(scopes_in_example_group)
|
62
|
-
include_method_or_block_scope?(scopes_in_example_group)
|
63
|
-
end
|
64
|
-
|
65
|
-
def in_method_or_block_in_rspec_configure?
|
66
|
-
scopes_in_rspec_configure = inner_scopes_of(:rspec_configure)
|
67
|
-
return false unless scopes_in_rspec_configure
|
68
|
-
return false if include_class_scope?(scopes_in_rspec_configure)
|
69
|
-
include_method_or_block_scope?(scopes_in_rspec_configure)
|
70
|
-
end
|
71
|
-
|
72
|
-
def in_method_in_module?
|
73
|
-
scopes_in_module = inner_scopes_of(:module)
|
74
|
-
return false unless scopes_in_module
|
75
|
-
return false if include_class_scope?(scopes_in_module)
|
76
|
-
scopes_in_module.include?(:def)
|
77
|
-
end
|
130
|
+
def hook_type(send_node)
|
131
|
+
_, method_name, arg_node, *_ = *send_node
|
78
132
|
|
79
|
-
|
80
|
-
return false unless scopes.first == :def
|
81
|
-
scopes_in_method = scopes[1..-1]
|
82
|
-
!include_class_scope?(scopes_in_method)
|
83
|
-
end
|
133
|
+
return :around if method_name == :around
|
84
134
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
135
|
+
if arg_node && [:sym, :str].include?(arg_node.type)
|
136
|
+
hook_arg = arg_node.children.first.to_sym
|
137
|
+
return :all_before_after if hook_arg == :all
|
138
|
+
end
|
90
139
|
|
91
|
-
|
92
|
-
!(scopes & [:class, :sclass]).empty?
|
140
|
+
:each_before_after
|
93
141
|
end
|
94
142
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
143
|
+
module ArrayExtension
|
144
|
+
def end_with?(*args)
|
145
|
+
tail = args.flatten
|
146
|
+
self[-(tail.size)..-1] == tail
|
147
|
+
end
|
99
148
|
end
|
100
149
|
end
|
101
150
|
end
|