transpec 1.12.0 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -11,4 +11,6 @@ end
11
11
 
12
12
  task default: %w(spec style readme)
13
13
 
14
- task ci: %w(spec style readme:check test:all)
14
+ ci_tasks = %w(spec)
15
+ ci_tasks.concat(%w(style readme:check test:all)) unless RUBY_ENGINE == 'jruby'
16
+ task ci: ci_tasks
@@ -43,7 +43,7 @@ module Transpec
43
43
 
44
44
  private
45
45
 
46
- def process(ast, source_rewriter)
46
+ def process(ast, source_rewriter) # rubocop:disable UnusedMethodArgument
47
47
  fail NotImplementedError
48
48
  end
49
49
 
data/lib/transpec/cli.rb CHANGED
@@ -85,7 +85,8 @@ module Transpec
85
85
  def fail_if_should_not_continue!
86
86
  unless configuration.forced?
87
87
  if Git.command_available? && Git.inside_of_repository? && !Git.clean?
88
- fail 'The current Git repository is not clean. Aborting.'
88
+ fail 'The current Git repository is not clean. Aborting. ' \
89
+ 'If you want to proceed forcibly, use -f/--force option.'
89
90
  end
90
91
  end
91
92
 
@@ -11,6 +11,8 @@ Transpec::Syntax.require_all
11
11
 
12
12
  module Transpec
13
13
  class Converter < BaseRewriter # rubocop:disable ClassLength
14
+ include Syntax::Dispatcher
15
+
14
16
  attr_reader :spec_suite, :configuration, :rspec_version, :report
15
17
 
16
18
  alias_method :convert_file!, :rewrite_file!
@@ -30,30 +32,14 @@ module Transpec
30
32
 
31
33
  def process(ast, source_rewriter)
32
34
  return unless ast
33
- ast.each_node do |node|
34
- dispatch_node(node, source_rewriter)
35
- end
36
- end
37
-
38
- def dispatch_node(node, source_rewriter)
39
- Syntax.standalone_syntaxes.each do |syntax_class|
40
- syntax = syntax_class.new(node, source_rewriter, runtime_data, report)
41
- next unless syntax.conversion_target?
42
- dispatch_syntax(syntax)
43
- break
44
- end
45
- rescue OverlappedRewriteError # rubocop:disable HandleExceptions
46
- rescue ConversionError => error
47
- report.conversion_errors << error
48
- end
49
35
 
50
- def dispatch_syntax(syntax)
51
- handler_name = "process_#{syntax.class.snake_case_name}"
52
- send(handler_name, syntax)
53
-
54
- syntax.dependent_syntaxes.each do |dependent_syntax|
55
- next unless dependent_syntax.conversion_target?
56
- dispatch_syntax(dependent_syntax)
36
+ ast.each_node do |node|
37
+ begin
38
+ dispatch_node(node, source_rewriter, runtime_data, report)
39
+ rescue OverlappedRewriteError # rubocop:disable HandleExceptions
40
+ rescue ConversionError => error
41
+ report.conversion_errors << error
42
+ end
57
43
  end
58
44
  end
59
45
 
@@ -78,12 +64,6 @@ module Transpec
78
64
  end
79
65
  end
80
66
 
81
- def process_expect(expect)
82
- end
83
-
84
- def process_allow(allow)
85
- end
86
-
87
67
  def process_should_receive(should_receive)
88
68
  if should_receive.useless_expectation?
89
69
  if configuration.convert_deprecated_method?
@@ -98,8 +78,6 @@ module Transpec
98
78
  elsif configuration.convert_should_receive?
99
79
  should_receive.expectize!(configuration.negative_form_of_to)
100
80
  end
101
-
102
- process_messaging_host(should_receive)
103
81
  end
104
82
 
105
83
  def process_double(double)
@@ -120,8 +98,6 @@ module Transpec
120
98
  end
121
99
 
122
100
  method_stub.remove_no_message_allowance! if configuration.convert_deprecated_method?
123
-
124
- process_messaging_host(method_stub)
125
101
  end
126
102
 
127
103
  def process_operator(operator)
@@ -131,10 +107,6 @@ module Transpec
131
107
  operator.convert_operator!(configuration.parenthesize_matcher_arg?)
132
108
  end
133
109
 
134
- def process_receive(receive)
135
- process_messaging_host(receive)
136
- end
137
-
138
110
  def process_be_boolean(be_boolean)
139
111
  return unless rspec_version.be_truthy_available?
140
112
  return unless configuration.convert_deprecated_method?
@@ -190,14 +162,6 @@ module Transpec
190
162
  def process_rspec_configure(rspec_configure)
191
163
  return unless spec_suite.main_rspec_configure_node?(rspec_configure.node)
192
164
 
193
- if need_to_modify_expectation_syntax_configuration?(rspec_configure)
194
- rspec_configure.expectations.syntaxes = :expect
195
- end
196
-
197
- if need_to_modify_mock_syntax_configuration?(rspec_configure)
198
- rspec_configure.mocks.syntaxes = :expect
199
- end
200
-
201
165
  if rspec_version.non_monkey_patch_example_group_available? &&
202
166
  configuration.convert_example_group?
203
167
  rspec_configure.expose_dsl_globally = false
@@ -219,11 +183,6 @@ module Transpec
219
183
  hook.convert_scope_name!
220
184
  end
221
185
 
222
- def process_messaging_host(messaging_host)
223
- process_useless_and_return(messaging_host)
224
- process_any_instance_block(messaging_host)
225
- end
226
-
227
186
  def process_useless_and_return(messaging_host)
228
187
  return unless messaging_host
229
188
  return unless configuration.convert_deprecated_method?
@@ -242,20 +201,5 @@ module Transpec
242
201
  rspec_version.rspec_2_99? && configuration.convert_deprecated_method? &&
243
202
  spec_suite.need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config?
244
203
  end
245
-
246
- def need_to_modify_expectation_syntax_configuration?(rspec_configure)
247
- return false unless configuration.convert_should?
248
- rspec_configure.expectations.syntaxes == [:should]
249
- rescue Syntax::RSpecConfigure::Framework::UnknownSyntaxError
250
- false
251
- end
252
-
253
- def need_to_modify_mock_syntax_configuration?(rspec_configure)
254
- return false if !configuration.convert_should_receive? &&
255
- !configuration.convert_stub?
256
- rspec_configure.mocks.syntaxes == [:should]
257
- rescue Syntax::RSpecConfigure::Framework::UnknownSyntaxError
258
- false
259
- end
260
204
  end
261
205
  end
@@ -8,6 +8,8 @@ Transpec::Syntax.require_all
8
8
 
9
9
  module Transpec
10
10
  class SpecSuite
11
+ include Syntax::Dispatcher
12
+
11
13
  ANALYSIS_TARGET_CLASSES = [Syntax::Mixin::AnyInstanceBlock]
12
14
 
13
15
  attr_reader :runtime_data
@@ -32,7 +34,7 @@ module Transpec
32
34
  specs.each do |spec|
33
35
  next unless spec.ast
34
36
  spec.ast.each_node do |node|
35
- dispatch_node(node)
37
+ dispatch_node(node, nil, runtime_data)
36
38
  end
37
39
  end
38
40
 
@@ -56,41 +58,6 @@ module Transpec
56
58
 
57
59
  private
58
60
 
59
- def dispatch_node(node)
60
- Syntax.standalone_syntaxes.each do |syntax_class|
61
- syntax = syntax_class.new(node, nil, runtime_data)
62
- next unless syntax.conversion_target?
63
- dispatch_syntax(syntax)
64
- break
65
- end
66
- end
67
-
68
- def dispatch_syntax(syntax)
69
- invoke_handler(syntax.class, syntax)
70
-
71
- syntax_mixins.each do |mixin|
72
- next unless syntax.class.ancestors.include?(mixin)
73
- invoke_handler(mixin, syntax)
74
- end
75
-
76
- syntax.dependent_syntaxes.each do |dependent_syntax|
77
- next unless dependent_syntax.conversion_target?
78
- dispatch_syntax(dependent_syntax)
79
- end
80
- end
81
-
82
- def syntax_mixins
83
- Syntax::Mixin.constants.map do |const_name|
84
- Syntax::Mixin.const_get(const_name, false)
85
- end
86
- end
87
-
88
- def invoke_handler(klass, syntax)
89
- class_name = klass.name.split('::').last.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
90
- handler_name = "process_#{class_name}"
91
- send(handler_name, syntax) if respond_to?(handler_name, true)
92
- end
93
-
94
61
  def process_any_instance_block(syntax)
95
62
  @need_to_modify_yield_receiver_to_any_instance_implementation_blocks_config ||=
96
63
  syntax.need_to_add_receiver_arg_to_any_instance_implementation_block?
@@ -28,6 +28,66 @@ module Transpec
28
28
  def standalone_syntaxes
29
29
  @standalone_syntaxes ||= all_syntaxes.select(&:standalone?)
30
30
  end
31
+
32
+ def mixins
33
+ @mixins ||= Mixin.constants.map do |const_name|
34
+ Mixin.const_get(const_name, false)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ module Transpec
42
+ class Syntax
43
+ module ModuleUtil
44
+ module_function
45
+
46
+ def snake_case_name(module_name)
47
+ module_name.split('::').last.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ module Transpec
54
+ class Syntax
55
+ module Dispatcher
56
+ def dispatch_node(node, source_rewriter = nil, runtime_data = nil, report = nil)
57
+ Syntax.standalone_syntaxes.find do |syntax_class|
58
+ syntax = syntax_class.new(node, source_rewriter, runtime_data, report)
59
+ dispatch_syntax(syntax)
60
+ end
61
+ end
62
+
63
+ def dispatch_syntax(syntax)
64
+ return false unless syntax.conversion_target?
65
+
66
+ invoke_handler(syntax.class, syntax)
67
+
68
+ included_mixins = syntax.class.included_modules & Syntax.mixins
69
+ included_mixins.each do |mixin|
70
+ invoke_handler(mixin, syntax)
71
+ end
72
+
73
+ syntax.dependent_syntaxes.each do |dependent_syntax|
74
+ dispatch_syntax(dependent_syntax)
75
+ end
76
+
77
+ true
78
+ end
79
+
80
+ def invoke_handler(klass, syntax)
81
+ handler_name = handler_names[klass]
82
+ send(handler_name, syntax) if respond_to?(handler_name, true)
83
+ end
84
+
85
+ def handler_names
86
+ @handler_names_cache ||= Hash.new do |hash, klass|
87
+ class_name = ModuleUtil.snake_case_name(klass.name)
88
+ hash[klass] = "process_#{class_name}"
89
+ end
90
+ end
31
91
  end
32
92
  end
33
93
  end
@@ -92,10 +152,7 @@ module Transpec
92
152
  end
93
153
 
94
154
  def self.snake_case_name
95
- @snake_cake_name ||= begin
96
- class_name = name.split('::').last
97
- class_name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
98
- end
155
+ @snake_cake_name ||= ModuleUtil.snake_case_name(name)
99
156
  end
100
157
 
101
158
  def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
data/lib/transpec/util.rb CHANGED
@@ -138,12 +138,6 @@ module Transpec
138
138
  Parser::Source::Range.new(range.source_buffer, begin_pos, begin_pos)
139
139
  end
140
140
 
141
- def end_of_line_range(arg)
142
- range = range_from_arg(arg)
143
- begin_pos = beginning_of_line_range(range).begin_pos + range.source_line.size
144
- Parser::Source::Range.new(range.source_buffer, begin_pos, begin_pos)
145
- end
146
-
147
141
  def line_range(arg)
148
142
  range = range_from_arg(arg)
149
143
  beginning_of_line_range(range).resize(range.source_line.size + 1)
@@ -4,7 +4,7 @@ module Transpec
4
4
  # http://semver.org/
5
5
  module Version
6
6
  MAJOR = 1
7
- MINOR = 12
7
+ MINOR = 13
8
8
  PATCH = 0
9
9
 
10
10
  def self.to_s
@@ -90,9 +90,10 @@ module Transpec
90
90
  include_examples 'aborts processing'
91
91
  include_examples 'does not generate commit message'
92
92
 
93
- it 'warns to the user' do
94
- cli.should_receive(:warn) do |arg|
95
- arg.should include('clean')
93
+ it 'warns and suggests the use of -f/--force option' do
94
+ cli.should_receive(:warn) do |message|
95
+ message.should include('clean')
96
+ message.should include('-f/--force')
96
97
  end
97
98
 
98
99
  cli.run(args)
@@ -140,10 +141,7 @@ module Transpec
140
141
  include_examples 'aborts processing'
141
142
 
142
143
  it 'warns to the user' do
143
- cli.should_receive(:warn) do |arg|
144
- arg.should match(/rspec.+dependency/i)
145
- end
146
-
144
+ cli.should_receive(:warn).with(/rspec.+dependency/i)
147
145
  cli.run(args)
148
146
  end
149
147
  end
@@ -275,10 +273,7 @@ module Transpec
275
273
  end
276
274
 
277
275
  it 'warns to user' do
278
- cli.should_receive(:warn) do |message|
279
- message.should =~ /converted.+but.+incorrect/i
280
- end
281
-
276
+ cli.should_receive(:warn).with(/converted.+but.+incorrect/i)
282
277
  cli.convert_spec(processed_source, spec_suite)
283
278
  end
284
279
  end
@@ -475,16 +475,6 @@ module Transpec
475
475
  end
476
476
  end
477
477
  end
478
-
479
- it 'invokes #process_useless_and_return with the should_receive' do
480
- converter.should_receive(:process_useless_and_return).with(should_receive_object)
481
- converter.process_should_receive(should_receive_object)
482
- end
483
-
484
- it 'invokes #process_any_instance_block with the should_receive' do
485
- converter.should_receive(:process_any_instance_block).with(should_receive_object)
486
- converter.process_should_receive(should_receive_object)
487
- end
488
478
  end
489
479
 
490
480
  describe '#process_method_stub' do
@@ -617,16 +607,6 @@ module Transpec
617
607
  include_examples 'does not invoke MethodStub#remove_no_message_allowance!'
618
608
  end
619
609
  end
620
-
621
- it 'invokes #process_useless_and_return with the method stub' do
622
- converter.should_receive(:process_useless_and_return).with(method_stub_object)
623
- converter.process_method_stub(method_stub_object)
624
- end
625
-
626
- it 'invokes #process_any_instance_block with the method stub' do
627
- converter.should_receive(:process_any_instance_block).with(method_stub_object)
628
- converter.process_method_stub(method_stub_object)
629
- end
630
610
  end
631
611
 
632
612
  describe '#process_double' do
@@ -1125,50 +1105,6 @@ module Transpec
1125
1105
  ).as_null_object
1126
1106
  end
1127
1107
 
1128
- context 'when #need_to_modify_expectation_syntax_configuration? returns true' do
1129
- before do
1130
- converter.stub(:need_to_modify_expectation_syntax_configuration?).and_return(true)
1131
- end
1132
-
1133
- it 'invokes RSpecConfigure.expectations.syntaxes= with :expect' do
1134
- rspec_configure.expectations.should_receive(:syntaxes=).with(:expect)
1135
- converter.process_rspec_configure(rspec_configure)
1136
- end
1137
- end
1138
-
1139
- context 'when #need_to_modify_expectation_syntax_configuration? returns false' do
1140
- before do
1141
- converter.stub(:need_to_modify_expectation_syntax_configuration?).and_return(false)
1142
- end
1143
-
1144
- it 'does not invoke RSpecConfigure.expectations.syntaxes=' do
1145
- rspec_configure.expectations.should_not_receive(:syntaxes=)
1146
- converter.process_rspec_configure(rspec_configure)
1147
- end
1148
- end
1149
-
1150
- context 'when #need_to_modify_mock_syntax_configuration? returns true' do
1151
- before do
1152
- converter.stub(:need_to_modify_mock_syntax_configuration?).and_return(true)
1153
- end
1154
-
1155
- it 'invokes RSpecConfigure.mocks.syntaxes= with :expect' do
1156
- rspec_configure.mocks.should_receive(:syntaxes=).with(:expect)
1157
- converter.process_rspec_configure(rspec_configure)
1158
- end
1159
- end
1160
-
1161
- context 'when #need_to_modify_mock_syntax_configuration? returns false' do
1162
- before do
1163
- converter.stub(:need_to_modify_mock_syntax_configuration?).and_return(false)
1164
- end
1165
-
1166
- it 'does not invoke RSpecConfigure.mocks.syntaxes=' do
1167
- rspec_configure.mocks.should_not_receive(:syntaxes=)
1168
- converter.process_rspec_configure(rspec_configure)
1169
- end
1170
- end
1171
-
1172
1108
  context 'when RSpecVersion#rspec_2_99? returns true' do
1173
1109
  before do
1174
1110
  rspec_version.stub(:rspec_2_99?).and_return(true)
@@ -1376,114 +1312,5 @@ module Transpec
1376
1312
  end
1377
1313
  end
1378
1314
  end
1379
-
1380
- shared_examples 'syntaxes' do |framework_type, expectations|
1381
- expectations.each do |current_syntaxes, return_value|
1382
- context "and RSpecConfigure.#{framework_type}.syntaxes returns #{current_syntaxes.inspect}" do
1383
- before do
1384
- rspec_configure.stub_chain(framework_type, :syntaxes).and_return(current_syntaxes)
1385
- end
1386
-
1387
- it "returns #{return_value}" do
1388
- should == return_value
1389
- end
1390
- end
1391
- end
1392
-
1393
- context "and RSpecConfigure.#{framework_type}.syntaxes raises UnknownSyntaxError" do
1394
- before do
1395
- rspec_configure.stub_chain(framework_type, :syntaxes)
1396
- .and_raise(Syntax::RSpecConfigure::Framework::UnknownSyntaxError)
1397
- end
1398
-
1399
- it 'returns false' do
1400
- should be_false
1401
- end
1402
- end
1403
- end
1404
-
1405
- describe '#need_to_modify_expectation_syntax_configuration?' do
1406
- subject { converter.need_to_modify_expectation_syntax_configuration?(rspec_configure) }
1407
- let(:rspec_configure) { double('rspec_configure') }
1408
-
1409
- context 'when Configuration#convert_should? is true' do
1410
- before { configuration.convert_should = true }
1411
-
1412
- include_examples 'syntaxes', :expectations, {
1413
- [] => false,
1414
- [:should] => true,
1415
- [:expect] => false,
1416
- [:should, :expect] => false
1417
- }
1418
- end
1419
-
1420
- context 'when Configuration#convert_should? is false' do
1421
- before { configuration.convert_should = false }
1422
-
1423
- include_examples 'syntaxes', :expectations, {
1424
- [] => false,
1425
- [:should] => false,
1426
- [:expect] => false,
1427
- [:should, :expect] => false
1428
- }
1429
- end
1430
- end
1431
-
1432
- describe '#need_to_modify_mock_syntax_configuration?' do
1433
- subject { converter.need_to_modify_mock_syntax_configuration?(rspec_configure) }
1434
- let(:rspec_configure) { double('rspec_configure') }
1435
-
1436
- context 'when Configuration#convert_should_receive? is true' do
1437
- before { configuration.convert_should_receive = true }
1438
-
1439
- context 'and Configuration#convert_stub? is true' do
1440
- before { configuration.convert_stub = true }
1441
-
1442
- include_examples 'syntaxes', :mocks, {
1443
- [] => false,
1444
- [:should] => true,
1445
- [:expect] => false,
1446
- [:should, :expect] => false
1447
- }
1448
- end
1449
-
1450
- context 'and Configuration#convert_stub? is false' do
1451
- before { configuration.convert_stub = false }
1452
-
1453
- include_examples 'syntaxes', :mocks, {
1454
- [] => false,
1455
- [:should] => true,
1456
- [:expect] => false,
1457
- [:should, :expect] => false
1458
- }
1459
- end
1460
- end
1461
-
1462
- context 'when Configuration#convert_should_receive? is false' do
1463
- before { configuration.convert_should_receive = false }
1464
-
1465
- context 'and Configuration#convert_stub? is true' do
1466
- before { configuration.convert_stub = true }
1467
-
1468
- include_examples 'syntaxes', :mocks, {
1469
- [] => false,
1470
- [:should] => true,
1471
- [:expect] => false,
1472
- [:should, :expect] => false
1473
- }
1474
- end
1475
-
1476
- context 'and Configuration#convert_stub? is false' do
1477
- before { configuration.convert_stub = false }
1478
-
1479
- include_examples 'syntaxes', :mocks, {
1480
- [] => false,
1481
- [:should] => false,
1482
- [:expect] => false,
1483
- [:should, :expect] => false
1484
- }
1485
- end
1486
- end
1487
- end
1488
1315
  end
1489
1316
  end