transpec 0.2.6 → 1.0.0

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +1 -1
  4. data/CHANGELOG.md +10 -0
  5. data/README.md +111 -56
  6. data/README.md.erb +117 -62
  7. data/lib/transpec/ast/node.rb +41 -0
  8. data/lib/transpec/base_rewriter.rb +55 -0
  9. data/lib/transpec/cli.rb +43 -153
  10. data/lib/transpec/configuration.rb +13 -9
  11. data/lib/transpec/{rewriter.rb → converter.rb} +44 -71
  12. data/lib/transpec/dynamic_analyzer/rewriter.rb +94 -0
  13. data/lib/transpec/dynamic_analyzer/runtime_data.rb +27 -0
  14. data/lib/transpec/dynamic_analyzer.rb +166 -0
  15. data/lib/transpec/file_finder.rb +53 -0
  16. data/lib/transpec/option_parser.rb +166 -0
  17. data/lib/transpec/{context.rb → static_context_inspector.rb} +2 -2
  18. data/lib/transpec/syntax/be_close.rb +7 -9
  19. data/lib/transpec/syntax/double.rb +6 -10
  20. data/lib/transpec/syntax/expect.rb +35 -0
  21. data/lib/transpec/syntax/have.rb +195 -0
  22. data/lib/transpec/syntax/method_stub.rb +22 -27
  23. data/lib/transpec/syntax/mixin/allow_no_message.rb +73 -0
  24. data/lib/transpec/syntax/mixin/any_instance.rb +22 -0
  25. data/lib/transpec/syntax/mixin/expectizable.rb +26 -0
  26. data/lib/transpec/syntax/mixin/have_matcher.rb +23 -0
  27. data/lib/transpec/syntax/mixin/monkey_patch.rb +37 -0
  28. data/lib/transpec/syntax/mixin/send.rb +109 -0
  29. data/lib/transpec/syntax/{matcher.rb → operator_matcher.rb} +27 -14
  30. data/lib/transpec/syntax/raise_error.rb +6 -10
  31. data/lib/transpec/syntax/rspec_configure.rb +29 -28
  32. data/lib/transpec/syntax/should.rb +45 -15
  33. data/lib/transpec/syntax/should_receive.rb +44 -16
  34. data/lib/transpec/syntax.rb +29 -21
  35. data/lib/transpec/util.rb +12 -2
  36. data/lib/transpec/version.rb +3 -3
  37. data/spec/spec_helper.rb +8 -6
  38. data/spec/support/cache_helper.rb +50 -0
  39. data/spec/support/shared_context.rb +49 -1
  40. data/spec/transpec/ast/node_spec.rb +65 -0
  41. data/spec/transpec/cli_spec.rb +33 -242
  42. data/spec/transpec/commit_message_spec.rb +2 -2
  43. data/spec/transpec/configuration_spec.rb +12 -8
  44. data/spec/transpec/{rewriter_spec.rb → converter_spec.rb} +198 -148
  45. data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +183 -0
  46. data/spec/transpec/dynamic_analyzer_spec.rb +164 -0
  47. data/spec/transpec/file_finder_spec.rb +118 -0
  48. data/spec/transpec/option_parser_spec.rb +185 -0
  49. data/spec/transpec/{context_spec.rb → static_context_inspector_spec.rb} +27 -12
  50. data/spec/transpec/syntax/be_close_spec.rb +8 -4
  51. data/spec/transpec/syntax/double_spec.rb +105 -12
  52. data/spec/transpec/syntax/expect_spec.rb +83 -0
  53. data/spec/transpec/syntax/have_spec.rb +599 -0
  54. data/spec/transpec/syntax/method_stub_spec.rb +276 -115
  55. data/spec/transpec/syntax/{matcher_spec.rb → operator_matcher_spec.rb} +277 -98
  56. data/spec/transpec/syntax/raise_error_spec.rb +92 -46
  57. data/spec/transpec/syntax/should_receive_spec.rb +298 -92
  58. data/spec/transpec/syntax/should_spec.rb +230 -44
  59. data/spec/transpec/util_spec.rb +2 -9
  60. data/tasks/lib/transpec_demo.rb +1 -1
  61. data/tasks/lib/transpec_test.rb +5 -7
  62. data/tasks/test.rake +5 -1
  63. data/transpec.gemspec +1 -1
  64. metadata +46 -22
  65. data/lib/transpec/syntax/able_to_allow_no_message.rb +0 -73
  66. data/lib/transpec/syntax/able_to_target_any_instance.rb +0 -24
  67. data/lib/transpec/syntax/expectizable.rb +0 -27
  68. data/lib/transpec/syntax/send_node_syntax.rb +0 -57
@@ -1,26 +1,31 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require 'spec_helper'
4
- require 'transpec/syntax/matcher'
4
+ require 'transpec/syntax/operator_matcher'
5
5
 
6
6
  module Transpec
7
7
  class Syntax
8
- describe Matcher do
8
+ describe OperatorMatcher do
9
+ include ::AST::Sexp
9
10
  include_context 'parsed objects'
10
11
  include_context 'should object'
11
12
 
12
13
  subject(:matcher) do
13
- Matcher.new(should_object.matcher_node, source_rewriter)
14
+ OperatorMatcher.new(should_object.matcher_node, source_rewriter, runtime_data)
14
15
  end
15
16
 
17
+ let(:runtime_data) { nil }
18
+
16
19
  let(:record) { matcher.report.records.first }
17
20
 
18
21
  describe '#method_name' do
19
22
  context 'when it is operator matcher' do
20
23
  let(:source) do
21
24
  <<-END
22
- it 'is 1' do
23
- subject.should == 1
25
+ describe 'example' do
26
+ it 'is 1' do
27
+ subject.should == 1
28
+ end
24
29
  end
25
30
  END
26
31
  end
@@ -42,8 +47,10 @@ module Transpec
42
47
  context 'when it is non-operator matcher' do
43
48
  let(:source) do
44
49
  <<-END
45
- it 'is 1' do
46
- subject.should eq(1)
50
+ describe 'example' do
51
+ it 'is 1' do
52
+ subject.should eq(1)
53
+ end
47
54
  end
48
55
  END
49
56
  end
@@ -73,16 +80,20 @@ module Transpec
73
80
  context 'when it is `== 1` form' do
74
81
  let(:source) do
75
82
  <<-END
76
- it 'is 1' do
77
- subject.should == 1
83
+ describe 'example' do
84
+ it 'is 1' do
85
+ subject.should == 1
86
+ end
78
87
  end
79
88
  END
80
89
  end
81
90
 
82
91
  let(:expected_source) do
83
92
  <<-END
84
- it 'is 1' do
85
- subject.should eq(1)
93
+ describe 'example' do
94
+ it 'is 1' do
95
+ subject.should eq(1)
96
+ end
86
97
  end
87
98
  END
88
99
  end
@@ -107,19 +118,23 @@ module Transpec
107
118
  context 'and its argument is in the next line' do
108
119
  let(:source) do
109
120
  <<-END
110
- it 'is 1' do
111
- subject.should ==
112
- 1
121
+ describe 'example' do
122
+ it 'is 1' do
123
+ subject.should ==
124
+ 1
125
+ end
113
126
  end
114
127
  END
115
128
  end
116
129
 
117
130
  let(:expected_source) do
118
131
  <<-END
119
- it 'is 1' do
120
- subject.should eq(
121
- 1
122
- )
132
+ describe 'example' do
133
+ it 'is 1' do
134
+ subject.should eq(
135
+ 1
136
+ )
137
+ end
123
138
  end
124
139
  END
125
140
  end
@@ -141,16 +156,20 @@ module Transpec
141
156
  context 'when it is `==1` form' do
142
157
  let(:source) do
143
158
  <<-END
144
- it 'is 1' do
145
- subject.should==1
159
+ describe 'example' do
160
+ it 'is 1' do
161
+ subject.should==1
162
+ end
146
163
  end
147
164
  END
148
165
  end
149
166
 
150
167
  let(:expected_source) do
151
168
  <<-END
152
- it 'is 1' do
153
- subject.should eq(1)
169
+ describe 'example' do
170
+ it 'is 1' do
171
+ subject.should eq(1)
172
+ end
154
173
  end
155
174
  END
156
175
  end
@@ -164,8 +183,10 @@ module Transpec
164
183
 
165
184
  let(:expected_source) do
166
185
  <<-END
167
- it 'is 1' do
168
- subject.should eq 1
186
+ describe 'example' do
187
+ it 'is 1' do
188
+ subject.should eq 1
189
+ end
169
190
  end
170
191
  END
171
192
  end
@@ -179,16 +200,20 @@ module Transpec
179
200
  context 'when it is `be == 1` form' do
180
201
  let(:source) do
181
202
  <<-END
182
- it 'is 1' do
183
- subject.should be == 1
203
+ describe 'example' do
204
+ it 'is 1' do
205
+ subject.should be == 1
206
+ end
184
207
  end
185
208
  END
186
209
  end
187
210
 
188
211
  let(:expected_source) do
189
212
  <<-END
190
- it 'is 1' do
191
- subject.should eq(1)
213
+ describe 'example' do
214
+ it 'is 1' do
215
+ subject.should eq(1)
216
+ end
192
217
  end
193
218
  END
194
219
  end
@@ -206,16 +231,20 @@ module Transpec
206
231
  context 'when it is `be.==(1)` form' do
207
232
  let(:source) do
208
233
  <<-END
209
- it 'is 1' do
210
- subject.should be.==(1)
234
+ describe 'example' do
235
+ it 'is 1' do
236
+ subject.should be.==(1)
237
+ end
211
238
  end
212
239
  END
213
240
  end
214
241
 
215
242
  let(:expected_source) do
216
243
  <<-END
217
- it 'is 1' do
218
- subject.should eq(1)
244
+ describe 'example' do
245
+ it 'is 1' do
246
+ subject.should eq(1)
247
+ end
219
248
  end
220
249
  END
221
250
  end
@@ -228,16 +257,20 @@ module Transpec
228
257
  context 'when it is `== (2 - 1)` form' do
229
258
  let(:source) do
230
259
  <<-END
231
- it 'is 1' do
232
- subject.should == (2 - 1)
260
+ describe 'example' do
261
+ it 'is 1' do
262
+ subject.should == (2 - 1)
263
+ end
233
264
  end
234
265
  END
235
266
  end
236
267
 
237
268
  let(:expected_source) do
238
269
  <<-END
239
- it 'is 1' do
240
- subject.should eq(2 - 1)
270
+ describe 'example' do
271
+ it 'is 1' do
272
+ subject.should eq(2 - 1)
273
+ end
241
274
  end
242
275
  END
243
276
  end
@@ -250,16 +283,20 @@ module Transpec
250
283
  context 'when it is `== (5 - 3) / (4 - 2)` form' do
251
284
  let(:source) do
252
285
  <<-END
253
- it 'is 1' do
254
- subject.should == (5 - 3) / (4 - 2)
286
+ describe 'example' do
287
+ it 'is 1' do
288
+ subject.should == (5 - 3) / (4 - 2)
289
+ end
255
290
  end
256
291
  END
257
292
  end
258
293
 
259
294
  let(:expected_source) do
260
295
  <<-END
261
- it 'is 1' do
262
- subject.should eq((5 - 3) / (4 - 2))
296
+ describe 'example' do
297
+ it 'is 1' do
298
+ subject.should eq((5 - 3) / (4 - 2))
299
+ end
263
300
  end
264
301
  END
265
302
  end
@@ -272,16 +309,20 @@ module Transpec
272
309
  context "when it is `== { 'key' => 'value' }` form" do
273
310
  let(:source) do
274
311
  <<-END
275
- it 'is the hash' do
276
- subject.should == { 'key' => 'value' }
312
+ describe 'example' do
313
+ it 'is the hash' do
314
+ subject.should == { 'key' => 'value' }
315
+ end
277
316
  end
278
317
  END
279
318
  end
280
319
 
281
320
  let(:expected_source) do
282
321
  <<-END
283
- it 'is the hash' do
284
- subject.should eq({ 'key' => 'value' })
322
+ describe 'example' do
323
+ it 'is the hash' do
324
+ subject.should eq({ 'key' => 'value' })
325
+ end
285
326
  end
286
327
  END
287
328
  end
@@ -309,16 +350,20 @@ module Transpec
309
350
  context "when it is `#{operator} 1` form" do
310
351
  let(:source) do
311
352
  <<-END
312
- it '#{description} 1' do
313
- subject.should #{operator} 1
353
+ describe 'example' do
354
+ it '#{description} 1' do
355
+ subject.should #{operator} 1
356
+ end
314
357
  end
315
358
  END
316
359
  end
317
360
 
318
361
  let(:expected_source) do
319
362
  <<-END
320
- it '#{description} 1' do
321
- subject.should be #{operator} 1
363
+ describe 'example' do
364
+ it '#{description} 1' do
365
+ subject.should be #{operator} 1
366
+ end
322
367
  end
323
368
  END
324
369
  end
@@ -336,8 +381,10 @@ module Transpec
336
381
  context "when it is `be #{operator} 1` form" do
337
382
  let(:source) do
338
383
  <<-END
339
- it '#{description} 1' do
340
- subject.should be #{operator} 1
384
+ describe 'example' do
385
+ it '#{description} 1' do
386
+ subject.should be #{operator} 1
387
+ end
341
388
  end
342
389
  END
343
390
  end
@@ -355,16 +402,20 @@ module Transpec
355
402
  context 'when it is `=~ /pattern/` form' do
356
403
  let(:source) do
357
404
  <<-END
358
- it 'matches the pattern' do
359
- subject.should =~ /pattern/
405
+ describe 'example' do
406
+ it 'matches the pattern' do
407
+ subject.should =~ /pattern/
408
+ end
360
409
  end
361
410
  END
362
411
  end
363
412
 
364
413
  let(:expected_source) do
365
414
  <<-END
366
- it 'matches the pattern' do
367
- subject.should match(/pattern/)
415
+ describe 'example' do
416
+ it 'matches the pattern' do
417
+ subject.should match(/pattern/)
418
+ end
368
419
  end
369
420
  END
370
421
  end
@@ -382,16 +433,20 @@ module Transpec
382
433
  context 'when it is `=~/pattern/` form' do
383
434
  let(:source) do
384
435
  <<-END
385
- it 'matches the pattern' do
386
- subject.should=~/pattern/
436
+ describe 'example' do
437
+ it 'matches the pattern' do
438
+ subject.should=~/pattern/
439
+ end
387
440
  end
388
441
  END
389
442
  end
390
443
 
391
444
  let(:expected_source) do
392
445
  <<-END
393
- it 'matches the pattern' do
394
- subject.should match(/pattern/)
446
+ describe 'example' do
447
+ it 'matches the pattern' do
448
+ subject.should match(/pattern/)
449
+ end
395
450
  end
396
451
  END
397
452
  end
@@ -404,16 +459,20 @@ module Transpec
404
459
  context 'when it is `be =~ /pattern/` form' do
405
460
  let(:source) do
406
461
  <<-END
407
- it 'matches the pattern' do
408
- subject.should be =~ /pattern/
462
+ describe 'example' do
463
+ it 'matches the pattern' do
464
+ subject.should be =~ /pattern/
465
+ end
409
466
  end
410
467
  END
411
468
  end
412
469
 
413
470
  let(:expected_source) do
414
471
  <<-END
415
- it 'matches the pattern' do
416
- subject.should match(/pattern/)
472
+ describe 'example' do
473
+ it 'matches the pattern' do
474
+ subject.should match(/pattern/)
475
+ end
417
476
  end
418
477
  END
419
478
  end
@@ -426,16 +485,20 @@ module Transpec
426
485
  context 'when it is `=~ [1, 2]` form' do
427
486
  let(:source) do
428
487
  <<-END
429
- it 'contains 1 and 2' do
430
- subject.should =~ [1, 2]
488
+ describe 'example' do
489
+ it 'contains 1 and 2' do
490
+ subject.should =~ [1, 2]
491
+ end
431
492
  end
432
493
  END
433
494
  end
434
495
 
435
496
  let(:expected_source) do
436
497
  <<-END
437
- it 'contains 1 and 2' do
438
- subject.should match_array([1, 2])
498
+ describe 'example' do
499
+ it 'contains 1 and 2' do
500
+ subject.should match_array([1, 2])
501
+ end
439
502
  end
440
503
  END
441
504
  end
@@ -453,16 +516,20 @@ module Transpec
453
516
  context 'when it is `=~[1, 2]` form' do
454
517
  let(:source) do
455
518
  <<-END
456
- it 'contains 1 and 2' do
457
- subject.should=~[1, 2]
519
+ describe 'example' do
520
+ it 'contains 1 and 2' do
521
+ subject.should=~[1, 2]
522
+ end
458
523
  end
459
524
  END
460
525
  end
461
526
 
462
527
  let(:expected_source) do
463
528
  <<-END
464
- it 'contains 1 and 2' do
465
- subject.should match_array([1, 2])
529
+ describe 'example' do
530
+ it 'contains 1 and 2' do
531
+ subject.should match_array([1, 2])
532
+ end
466
533
  end
467
534
  END
468
535
  end
@@ -475,16 +542,20 @@ module Transpec
475
542
  context 'when it is `be =~ [1, 2]` form' do
476
543
  let(:source) do
477
544
  <<-END
478
- it 'contains 1 and 2' do
479
- subject.should be =~ [1, 2]
545
+ describe 'example' do
546
+ it 'contains 1 and 2' do
547
+ subject.should be =~ [1, 2]
548
+ end
480
549
  end
481
550
  END
482
551
  end
483
552
 
484
553
  let(:expected_source) do
485
554
  <<-END
486
- it 'contains 1 and 2' do
487
- subject.should match_array([1, 2])
555
+ describe 'example' do
556
+ it 'contains 1 and 2' do
557
+ subject.should match_array([1, 2])
558
+ end
488
559
  end
489
560
  END
490
561
  end
@@ -493,6 +564,94 @@ module Transpec
493
564
  rewritten_source.should == expected_source
494
565
  end
495
566
  end
567
+
568
+ context 'when it is `=~ variable` form' do
569
+ context 'and runtime type of the variable is array' do
570
+ include_context 'dynamic analysis objects'
571
+
572
+ let(:source) do
573
+ <<-END
574
+ describe 'example' do
575
+ it 'contains 1 and 2' do
576
+ variable = [1, 2]
577
+ [2, 1].should =~ variable
578
+ end
579
+ end
580
+ END
581
+ end
582
+
583
+ let(:expected_source) do
584
+ <<-END
585
+ describe 'example' do
586
+ it 'contains 1 and 2' do
587
+ variable = [1, 2]
588
+ [2, 1].should match_array(variable)
589
+ end
590
+ end
591
+ END
592
+ end
593
+
594
+ it 'converts into `match_array(variable)` form' do
595
+ rewritten_source.should == expected_source
596
+ end
597
+ end
598
+
599
+ context 'and runtime type of the variable is regular expression' do
600
+ include_context 'dynamic analysis objects'
601
+
602
+ let(:source) do
603
+ <<-END
604
+ describe 'example' do
605
+ it 'matches to the pattern' do
606
+ variable = /^str/
607
+ 'string'.should =~ variable
608
+ end
609
+ end
610
+ END
611
+ end
612
+
613
+ let(:expected_source) do
614
+ <<-END
615
+ describe 'example' do
616
+ it 'matches to the pattern' do
617
+ variable = /^str/
618
+ 'string'.should match(variable)
619
+ end
620
+ end
621
+ END
622
+ end
623
+
624
+ it 'converts into `match(variable)` form' do
625
+ rewritten_source.should == expected_source
626
+ end
627
+ end
628
+
629
+ context 'and no runtime type information is provided' do
630
+ let(:source) do
631
+ <<-END
632
+ describe 'example' do
633
+ it 'matches the pattern' do
634
+ subject.should =~ variable
635
+ end
636
+ end
637
+ END
638
+ end
639
+
640
+ let(:expected_source) do
641
+ <<-END
642
+ describe 'example' do
643
+ it 'matches the pattern' do
644
+ subject.should match(variable)
645
+ end
646
+ end
647
+ END
648
+ end
649
+
650
+ it 'converts into `match(variable)` form' do
651
+ rewritten_source.should == expected_source
652
+ end
653
+ end
654
+ end
496
655
  end
497
656
 
498
657
  describe '#parenthesize!' do
@@ -505,8 +664,10 @@ module Transpec
505
664
  context 'when its argument is already in parentheses' do
506
665
  let(:source) do
507
666
  <<-END
508
- it 'is 1' do
509
- subject.should eq(1)
667
+ describe 'example' do
668
+ it 'is 1' do
669
+ subject.should eq(1)
670
+ end
510
671
  end
511
672
  END
512
673
  end
@@ -519,8 +680,10 @@ module Transpec
519
680
  context 'when its argument is not in parentheses' do
520
681
  let(:source) do
521
682
  <<-END
522
- it 'is 1' do
523
- subject.should eq 1
683
+ describe 'example' do
684
+ it 'is 1' do
685
+ subject.should eq 1
686
+ end
524
687
  end
525
688
  END
526
689
  end
@@ -530,8 +693,10 @@ module Transpec
530
693
 
531
694
  let(:expected_source) do
532
695
  <<-END
533
- it 'is 1' do
534
- subject.should eq(1)
696
+ describe 'example' do
697
+ it 'is 1' do
698
+ subject.should eq(1)
699
+ end
535
700
  end
536
701
  END
537
702
  end
@@ -546,8 +711,10 @@ module Transpec
546
711
 
547
712
  let(:expected_source) do
548
713
  <<-END
549
- it 'is 1' do
550
- subject.should eq 1
714
+ describe 'example' do
715
+ it 'is 1' do
716
+ subject.should eq 1
717
+ end
551
718
  end
552
719
  END
553
720
  end
@@ -561,16 +728,20 @@ module Transpec
561
728
  context 'when its multiple arguments are not in parentheses' do
562
729
  let(:source) do
563
730
  <<-END
564
- it 'contains 1 and 2' do
565
- subject.should include 1, 2
731
+ describe 'example' do
732
+ it 'contains 1 and 2' do
733
+ subject.should include 1, 2
734
+ end
566
735
  end
567
736
  END
568
737
  end
569
738
 
570
739
  let(:expected_source) do
571
740
  <<-END
572
- it 'contains 1 and 2' do
573
- subject.should include(1, 2)
741
+ describe 'example' do
742
+ it 'contains 1 and 2' do
743
+ subject.should include(1, 2)
744
+ end
574
745
  end
575
746
  END
576
747
  end
@@ -583,16 +754,20 @@ module Transpec
583
754
  context 'when its argument is a string literal' do
584
755
  let(:source) do
585
756
  <<-END
586
- it "is 'string'" do
587
- subject.should eq 'string'
757
+ describe 'example' do
758
+ it "is 'string'" do
759
+ subject.should eq 'string'
760
+ end
588
761
  end
589
762
  END
590
763
  end
591
764
 
592
765
  let(:expected_source) do
593
766
  <<-END
594
- it "is 'string'" do
595
- subject.should eq('string')
767
+ describe 'example' do
768
+ it "is 'string'" do
769
+ subject.should eq('string')
770
+ end
596
771
  end
597
772
  END
598
773
  end
@@ -605,10 +780,12 @@ module Transpec
605
780
  context 'when its argument is a here document' do
606
781
  let(:source) do
607
782
  <<-END
608
- it 'returns the document' do
609
- subject.should eq <<-HEREDOC
610
- foo
611
- HEREDOC
783
+ describe 'example' do
784
+ it 'returns the document' do
785
+ subject.should eq <<-HEREDOC
786
+ foo
787
+ HEREDOC
788
+ end
612
789
  end
613
790
  END
614
791
  end
@@ -630,10 +807,12 @@ module Transpec
630
807
  context 'when its argument is a here document with chained method' do
631
808
  let(:source) do
632
809
  <<-END
633
- it 'returns the document' do
634
- subject.should eq <<-HEREDOC.gsub('foo', 'bar')
635
- foo
636
- HEREDOC
810
+ describe 'example' do
811
+ it 'returns the document' do
812
+ subject.should eq <<-HEREDOC.gsub('foo', 'bar')
813
+ foo
814
+ HEREDOC
815
+ end
637
816
  end
638
817
  END
639
818
  end