transpec 1.10.4 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -3
  3. data/CHANGELOG.md +9 -0
  4. data/README.md +96 -18
  5. data/README.md.erb +117 -51
  6. data/lib/transpec/base_rewriter.rb +25 -28
  7. data/lib/transpec/cli.rb +27 -14
  8. data/lib/transpec/configuration.rb +2 -1
  9. data/lib/transpec/converter.rb +54 -32
  10. data/lib/transpec/dynamic_analyzer/helper.rb.erb +44 -0
  11. data/lib/transpec/dynamic_analyzer/node_util.rb +17 -0
  12. data/lib/transpec/dynamic_analyzer/rewriter.rb +12 -4
  13. data/lib/transpec/dynamic_analyzer/runtime_data.rb +3 -4
  14. data/lib/transpec/dynamic_analyzer.rb +14 -52
  15. data/lib/transpec/option_parser.rb +89 -81
  16. data/lib/transpec/processed_source.rb +48 -0
  17. data/lib/transpec/record.rb +2 -2
  18. data/lib/transpec/report.rb +5 -1
  19. data/lib/transpec/rspec_dsl.rb +12 -2
  20. data/lib/transpec/rspec_version.rb +8 -7
  21. data/lib/transpec/spec_suite.rb +114 -0
  22. data/lib/transpec/syntax/example.rb +4 -20
  23. data/lib/transpec/syntax/example_group.rb +38 -0
  24. data/lib/transpec/syntax/have.rb +6 -9
  25. data/lib/transpec/syntax/its.rb +5 -7
  26. data/lib/transpec/syntax/method_stub.rb +12 -13
  27. data/lib/transpec/syntax/mixin/any_instance_block.rb +14 -6
  28. data/lib/transpec/syntax/mixin/context_sensitive.rb +41 -0
  29. data/lib/transpec/syntax/mixin/matcher_owner.rb +16 -26
  30. data/lib/transpec/syntax/mixin/monkey_patch_any_instance.rb +1 -1
  31. data/lib/transpec/syntax/mixin/no_message_allowance.rb +2 -2
  32. data/lib/transpec/syntax/mixin/useless_and_return.rb +2 -2
  33. data/lib/transpec/syntax/oneliner_should.rb +9 -13
  34. data/lib/transpec/syntax/operator.rb +3 -7
  35. data/lib/transpec/syntax/pending.rb +4 -20
  36. data/lib/transpec/syntax/rspec_configure/configuration_modification.rb +86 -0
  37. data/lib/transpec/syntax/rspec_configure/framework.rb +45 -86
  38. data/lib/transpec/syntax/rspec_configure.rb +18 -6
  39. data/lib/transpec/syntax/should.rb +3 -5
  40. data/lib/transpec/syntax/should_receive.rb +1 -1
  41. data/lib/transpec/syntax.rb +8 -0
  42. data/lib/transpec/util.rb +0 -8
  43. data/lib/transpec/version.rb +2 -2
  44. data/spec/acceptance/configuration_modification_spec.rb +132 -0
  45. data/spec/acceptance/conversion_spec.rb +114 -0
  46. data/spec/support/shared_context.rb +6 -12
  47. data/spec/transpec/cli_spec.rb +21 -23
  48. data/spec/transpec/configuration_spec.rb +2 -1
  49. data/spec/transpec/converter_spec.rb +292 -213
  50. data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +3 -3
  51. data/spec/transpec/dynamic_analyzer_spec.rb +8 -2
  52. data/spec/transpec/option_parser_spec.rb +42 -4
  53. data/spec/transpec/processed_source_spec.rb +67 -0
  54. data/spec/transpec/rspec_version_spec.rb +8 -2
  55. data/spec/transpec/spec_suite_spec.rb +107 -0
  56. data/spec/transpec/syntax/allow_spec.rb +9 -27
  57. data/spec/transpec/syntax/example_group_spec.rb +172 -0
  58. data/spec/transpec/syntax/expect_spec.rb +18 -54
  59. data/spec/transpec/syntax/have_spec.rb +35 -14
  60. data/spec/transpec/syntax/its_spec.rb +27 -7
  61. data/spec/transpec/syntax/method_stub_spec.rb +31 -8
  62. data/spec/transpec/syntax/oneliner_should_spec.rb +22 -131
  63. data/spec/transpec/syntax/rspec_configure_spec.rb +118 -15
  64. data/spec/transpec/syntax/should_spec.rb +51 -82
  65. data/tasks/fixtures/guard/COMMIT_EDITMSG +80 -0
  66. data/tasks/fixtures/mail/COMMIT_EDITMSG +84 -0
  67. data/tasks/fixtures/twitter/COMMIT_EDITMSG +36 -0
  68. data/tasks/lib/transpec_test.rb +23 -2
  69. data/tasks/readme.rake +35 -0
  70. metadata +22 -4
  71. data/lib/transpec/parser.rb +0 -9
@@ -29,7 +29,7 @@ module Transpec
29
29
 
30
30
  def dynamic_analysis_target?
31
31
  super &&
32
- !receiver_node.nil? &&
32
+ receiver_node &&
33
33
  [:stub, :stub!, :stub_chain, :unstub, :unstub!].include?(method_name)
34
34
  end
35
35
 
@@ -55,9 +55,11 @@ module Transpec
55
55
  arg_node.hash_type?
56
56
  end
57
57
 
58
+ def unstub?
59
+ [:unstub, :unstub!].include?(method_name)
60
+ end
61
+
58
62
  def allowize!(rspec_version)
59
- # There's no way of unstubbing in #allow syntax.
60
- return unless [:stub, :stub!, :stub_chain].include?(method_name)
61
63
  return if method_name == :stub_chain && !rspec_version.receive_message_chain_available?
62
64
 
63
65
  unless allow_to_receive_available?
@@ -133,6 +135,7 @@ module Transpec
133
135
  expression << message_source(message_node)
134
136
  expression << (keep_form_around_arg ? range_after_arg.source : ')')
135
137
  expression << ".and_return(#{value_node.loc.expression.source})" if value_node
138
+ expression << '.and_call_original' if unstub?
136
139
  expression
137
140
  end
138
141
 
@@ -168,16 +171,11 @@ module Transpec
168
171
 
169
172
  def register_record(conversion_type)
170
173
  record_class = case conversion_type
171
- when :deprecated
172
- DeprecatedMethodRecord
173
- when :no_message_allowance
174
- NoMessageAllowanceRecord
175
- when :useless_and_return
176
- MonkeyPatchUselessAndReturnRecord
177
- when :any_instance_block
178
- MonkeyPatchAnyInstanceBlockRecord
179
- else
180
- AllowRecord
174
+ when :deprecated then DeprecatedMethodRecord
175
+ when :no_message_allowance then NoMessageAllowanceRecord
176
+ when :useless_and_return then MonkeyPatchUselessAndReturnRecord
177
+ when :any_instance_block then MonkeyPatchAnyInstanceBlockRecord
178
+ else AllowRecord
181
179
  end
182
180
  report.records << record_class.new(self, conversion_type)
183
181
  end
@@ -207,6 +205,7 @@ module Transpec
207
205
  when :allow_to_receive
208
206
  syntax << 'receive(:message)'
209
207
  syntax << '.and_return(value)' if @method_stub.hash_arg?
208
+ syntax << '.and_call_original' if @method_stub.unstub?
210
209
  when :allow_to_receive_messages
211
210
  syntax << 'receive_messages(:message => value)'
212
211
  when :allow_to_receive_message_chain
@@ -11,18 +11,26 @@ module Transpec
11
11
  extend ActiveSupport::Concern
12
12
  include Send
13
13
 
14
- def add_receiver_arg_to_any_instance_implementation_block!
15
- return unless any_instance_block_node
16
- first_arg_node = any_instance_block_node.children[1].children[0]
17
- return unless first_arg_node
14
+ def need_to_add_receiver_arg_to_any_instance_implementation_block?
15
+ first_arg_node = any_instance_block_first_arg_node
16
+ return false unless first_arg_node
18
17
  first_arg_name = first_arg_node.children.first
19
- return if first_arg_name == :instance
20
- insert_before(first_arg_node.loc.expression, 'instance, ')
18
+ first_arg_name != :instance
19
+ end
20
+
21
+ def add_receiver_arg_to_any_instance_implementation_block!
22
+ return unless need_to_add_receiver_arg_to_any_instance_implementation_block?
23
+ insert_before(any_instance_block_first_arg_node.loc.expression, 'instance, ')
21
24
  true
22
25
  end
23
26
 
24
27
  private
25
28
 
29
+ def any_instance_block_first_arg_node
30
+ return nil unless any_instance_block_node
31
+ any_instance_block_node.children[1].children[0]
32
+ end
33
+
26
34
  def any_instance_block_node
27
35
  return unless any_instance?
28
36
  Util.each_backward_chained_node(node).find(&:block_type?)
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+
3
+ require 'active_support/concern'
4
+ require 'transpec/syntax/mixin/send'
5
+
6
+ module Transpec
7
+ class Syntax
8
+ module Mixin
9
+ module ContextSensitive
10
+ extend ActiveSupport::Concern
11
+ include Send
12
+
13
+ included do
14
+ define_dynamic_analysis do |rewriter|
15
+ code = "is_a?(Class) && ancestors.any? { |a| a.name == 'RSpec::Core::ExampleGroup' }"
16
+ rewriter.register_request(node, :example_group_context?, code, :context)
17
+ end
18
+ end
19
+
20
+ def conversion_target?
21
+ return false unless dynamic_analysis_target?
22
+
23
+ in_example_group_context = if runtime_data.run?(node)
24
+ # If we have runtime data, check with it.
25
+ return false unless defined_by_rspec?
26
+ runtime_data[node, :example_group_context?]
27
+ else
28
+ # Otherwise check statically.
29
+ static_context_inspector.scopes.last == :example_group
30
+ end
31
+
32
+ in_example_group_context == should_be_in_example_group_context?
33
+ end
34
+
35
+ def should_be_in_example_group_context?
36
+ fail NotImplementedError
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -9,37 +9,27 @@ module Transpec
9
9
  extend ActiveSupport::Concern
10
10
 
11
11
  module ClassMethods
12
- def add_matcher(matcher_class) # rubocop:disable MethodLength
13
- matcher_accessor = "#{matcher_class.snake_case_name}_matcher"
14
- matcher_ivar = "@#{matcher_accessor}"
15
- matcher_creator = "create_#{matcher_class.snake_case_name}"
16
-
17
- define_dynamic_analysis do |rewriter|
18
- matcher = send(matcher_creator)
19
- if matcher.dynamic_analysis_target?
20
- matcher.register_dynamic_analysis_request(rewriter)
21
- end
12
+ def add_matcher(matcher_class)
13
+ accessor = "#{matcher_class.snake_case_name}_matcher"
14
+ ivar = "@#{accessor}"
15
+
16
+ define_method(accessor) do
17
+ return instance_variable_get(ivar) if instance_variable_defined?(ivar)
18
+ matcher = matcher_class.new(matcher_node, self, source_rewriter, runtime_data, report)
19
+ instance_variable_set(ivar, matcher)
22
20
  end
23
21
 
24
- define_method(matcher_accessor) do
25
- if instance_variable_defined?(matcher_ivar)
26
- return instance_variable_get(matcher_ivar)
27
- end
28
-
29
- matcher = send(matcher_creator)
30
-
31
- if matcher.conversion_target?
32
- instance_variable_set(matcher_ivar, matcher)
33
- else
34
- instance_variable_set(matcher_ivar, nil)
35
- end
36
- end
22
+ matcher_accessors << accessor
23
+ end
37
24
 
38
- define_method(matcher_creator) do
39
- matcher_class.new(matcher_node, self, source_rewriter, runtime_data, report)
40
- end
25
+ def matcher_accessors
26
+ @matcher_accessors ||= []
41
27
  end
42
28
  end
29
+
30
+ def dependent_syntaxes
31
+ super + self.class.matcher_accessors.map { |accessor| send(accessor) }
32
+ end
43
33
  end
44
34
  end
45
35
  end
@@ -32,7 +32,7 @@ module Transpec
32
32
 
33
33
  def any_instance?
34
34
  return true unless any_instance_target_node.nil?
35
- !runtime_data[subject_node, :any_instance_target_class_name].nil?
35
+ runtime_data[subject_node, :any_instance_target_class_name]
36
36
  end
37
37
 
38
38
  private
@@ -22,11 +22,11 @@ module Transpec
22
22
  end
23
23
 
24
24
  def any_number_of_times?
25
- !any_number_of_times_node.nil?
25
+ any_number_of_times_node
26
26
  end
27
27
 
28
28
  def at_least_zero?
29
- !at_least_zero_node.nil?
29
+ at_least_zero_node
30
30
  end
31
31
 
32
32
  private
@@ -27,11 +27,11 @@ module Transpec
27
27
 
28
28
  def and_return_with_block?
29
29
  block_node = Util.block_node_taken_by_method(and_return_node)
30
- !block_node.nil?
30
+ block_node
31
31
  end
32
32
 
33
33
  def and_return?
34
- !and_return_node.nil?
34
+ and_return_node
35
35
  end
36
36
 
37
37
  def and_return_node
@@ -13,7 +13,7 @@ module Transpec
13
13
 
14
14
  attr_reader :current_syntax_type
15
15
 
16
- def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
16
+ def initialize(*)
17
17
  super
18
18
  @current_syntax_type = :should
19
19
  end
@@ -22,34 +22,29 @@ module Transpec
22
22
  super && receiver_node.nil? && [:should, :should_not].include?(method_name)
23
23
  end
24
24
 
25
- def expectize!(negative_form = 'not_to', parenthesize_matcher_arg = true)
25
+ def expectize!(negative_form = 'not_to')
26
26
  replacement = 'is_expected.'
27
27
  replacement << (positive? ? 'to' : negative_form)
28
28
  replace(should_range, replacement)
29
29
 
30
30
  @current_syntax_type = :expect
31
- operator_matcher.convert_operator!(parenthesize_matcher_arg) if operator_matcher
32
31
 
33
32
  register_record(negative_form)
34
33
  end
35
34
 
36
35
  def convert_have_items_to_standard_should!
37
- return if have_matcher.project_requires_collection_matcher?
36
+ return unless have_matcher.conversion_target?
38
37
 
39
38
  insert_example_description!
40
39
 
41
40
  subject_source = have_matcher.replacement_subject_source('subject')
42
41
  insert_before(expression_range, "#{subject_source}.")
43
42
 
44
- have_matcher.convert_to_standard_expectation!
45
-
46
43
  report.records << OnelinerShouldHaveRecord.new(self, have_matcher)
47
44
  end
48
45
 
49
- # rubocop:disable LineLength
50
- def convert_have_items_to_standard_expect!(negative_form = 'not_to', parenthesize_matcher_arg = true)
51
- # rubocop:enable LineLength
52
- return if have_matcher.project_requires_collection_matcher?
46
+ def convert_have_items_to_standard_expect!(negative_form = 'not_to')
47
+ return unless have_matcher.conversion_target?
53
48
 
54
49
  insert_example_description!
55
50
 
@@ -59,14 +54,13 @@ module Transpec
59
54
  replace(should_range, expect_to_source)
60
55
 
61
56
  @current_syntax_type = :expect
62
- have_matcher.convert_to_standard_expectation!
63
57
 
64
58
  report.records << OnelinerShouldHaveRecord.new(self, have_matcher, negative_form)
65
59
  end
66
60
 
67
61
  def example_has_description?
68
62
  send_node = example_block_node.children.first
69
- !send_node.children[2].nil?
63
+ send_node.children[2]
70
64
  end
71
65
 
72
66
  def build_description(size)
@@ -91,7 +85,9 @@ module Transpec
91
85
  private
92
86
 
93
87
  def insert_example_description!
94
- fail 'This one-liner #should does not have #have matcher!' unless have_matcher
88
+ unless have_matcher.conversion_target?
89
+ fail 'This one-liner #should does not have #have matcher!'
90
+ end
95
91
 
96
92
  unless example_has_description?
97
93
  insert_before(example_block_node.loc.begin, "'#{generated_description}' ")
@@ -21,10 +21,6 @@ module Transpec
21
21
  end
22
22
  end
23
23
 
24
- def self.standalone?
25
- false
26
- end
27
-
28
24
  def initialize(node, expectation, source_rewriter = nil, runtime_data = nil, report = nil)
29
25
  operator_node = if node == BE_NODE
30
26
  node.parent_node
@@ -36,7 +32,7 @@ module Transpec
36
32
  end
37
33
 
38
34
  def dynamic_analysis_target?
39
- super && !receiver_node.nil? && OPERATORS.include?(method_name)
35
+ super && receiver_node && OPERATORS.include?(method_name)
40
36
  end
41
37
 
42
38
  def convert_operator!(parenthesize_arg = true)
@@ -88,7 +84,7 @@ module Transpec
88
84
 
89
85
  parenthesize!(parenthesize_arg)
90
86
 
91
- accurate = !enumerable_arg?.nil?
87
+ accurate = !enumerable_arg?.nil? # rubocop:disable NonNilCheck
92
88
 
93
89
  # Need to register record after all source rewrites are done
94
90
  # to avoid false record when failed with overlapped rewrite.
@@ -137,7 +133,7 @@ module Transpec
137
133
  end
138
134
 
139
135
  def prefixed_with_be?
140
- !be_node.nil?
136
+ be_node
141
137
  end
142
138
 
143
139
  def remove_be!
@@ -1,36 +1,20 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require 'transpec/syntax'
4
- require 'transpec/syntax/mixin/send'
4
+ require 'transpec/syntax/mixin/context_sensitive'
5
5
  require 'transpec/util'
6
6
 
7
7
  module Transpec
8
8
  class Syntax
9
9
  class Pending < Syntax
10
- include Mixin::Send, Util
11
-
12
- define_dynamic_analysis do |rewriter|
13
- code = 'is_a?(RSpec::Core::ExampleGroup)'
14
- rewriter.register_request(node, :example_context?, code, :context)
15
- end
10
+ include Mixin::ContextSensitive, Util
16
11
 
17
12
  def dynamic_analysis_target?
18
13
  super && receiver_node.nil? && method_name == :pending
19
14
  end
20
15
 
21
- def conversion_target?
22
- return false unless dynamic_analysis_target?
23
-
24
- # Check whether the context is example group to differenciate
25
- # RSpec::Core::ExampleGroup.pending (a relative of #it) and
26
- # RSpec::Core::ExampleGroup#pending (marks the example as pending in #it block).
27
- if runtime_data.run?(node)
28
- # If we have runtime data, check with it.
29
- runtime_data[node, :example_context?]
30
- else
31
- # Otherwise check statically.
32
- static_context_inspector.scopes.last == :example
33
- end
16
+ def should_be_in_example_group_context?
17
+ false
34
18
  end
35
19
 
36
20
  def convert_deprecated_syntax!
@@ -0,0 +1,86 @@
1
+ # coding: utf-8
2
+
3
+ require 'transpec/util'
4
+ require 'ast'
5
+
6
+ module Transpec
7
+ class Syntax
8
+ class RSpecConfigure
9
+ module ConfigurationModification
10
+ include Util, ::AST::Sexp
11
+
12
+ def block_node
13
+ fail NotImplementedError
14
+ end
15
+
16
+ private
17
+
18
+ def set_configuration!(config_name, value)
19
+ setter_node = find_configuration_node("#{config_name}=")
20
+
21
+ if setter_node
22
+ arg_node = setter_node.children[2]
23
+ source_rewriter.replace(arg_node.loc.expression, value.to_s)
24
+ else
25
+ add_configuration!(config_name, value)
26
+ end
27
+ end
28
+
29
+ def find_configuration_node(configuration_method_name)
30
+ return nil unless block_node
31
+
32
+ configuration_method_name = configuration_method_name.to_sym
33
+
34
+ block_node.each_descendent_node.find do |node|
35
+ next unless node.send_type?
36
+ receiver_node, method_name, = *node
37
+ next unless receiver_node == s(:lvar, block_arg_name)
38
+ method_name == configuration_method_name
39
+ end
40
+ end
41
+
42
+ def block_arg_name
43
+ return nil unless block_node
44
+ first_block_arg_name(block_node)
45
+ end
46
+
47
+ module ConfigurationAddition
48
+ def add_configuration!(config_name, value)
49
+ lines = generate_configuration_lines(config_name, value)
50
+ lines.unshift('') unless empty_block_body?
51
+ lines.map! { |line| line + "\n" }
52
+
53
+ insertion_position = beginning_of_line_range(block_node_to_insert_code.loc.end)
54
+ source_rewriter.insert_before(insertion_position, lines.join(''))
55
+
56
+ block_node_to_insert_code.metadata[:added_configuration] = true
57
+ end
58
+
59
+ def generate_configuration_lines(config_name, value)
60
+ [body_indentation + "#{config_variable_name}.#{config_name} = #{value}"]
61
+ end
62
+
63
+ def config_variable_name
64
+ block_arg_name
65
+ end
66
+
67
+ def body_indentation
68
+ indentation_of_line(block_node) + (' ' * 2)
69
+ end
70
+
71
+ def block_node_to_insert_code
72
+ block_node
73
+ end
74
+
75
+ def empty_block_body?
76
+ block_node = block_node_to_insert_code
77
+ (block_node.loc.end.line - block_node.loc.begin.line <= 1) &&
78
+ !block_node.metadata[:added_configuration]
79
+ end
80
+ end
81
+
82
+ include ConfigurationAddition
83
+ end
84
+ end
85
+ end
86
+ end
@@ -1,13 +1,12 @@
1
1
  # coding: utf-8
2
2
 
3
- require 'transpec/util'
4
- require 'ast'
3
+ require 'transpec/syntax/rspec_configure/configuration_modification'
5
4
 
6
5
  module Transpec
7
6
  class Syntax
8
7
  class RSpecConfigure
9
8
  class Framework
10
- include Util, ::AST::Sexp
9
+ include ConfigurationModification
11
10
 
12
11
  attr_reader :rspec_configure, :source_rewriter
13
12
 
@@ -16,45 +15,10 @@ module Transpec
16
15
  @source_rewriter = source_rewriter
17
16
  end
18
17
 
19
- private
20
-
21
- def block_method_name
22
- fail NotImplementedError
23
- end
24
-
25
- def set_configuration!(config_name, value)
26
- setter_node = find_configuration_node("#{config_name}=")
27
-
28
- if setter_node
29
- arg_node = setter_node.children[2]
30
- source_rewriter.replace(arg_node.loc.expression, value.to_s)
31
- else
32
- add_configuration!(config_name, value)
33
- end
34
- end
35
-
36
- def find_configuration_node(configuration_method_name)
37
- return nil unless block_node
38
-
39
- configuration_method_name = configuration_method_name.to_sym
40
-
41
- block_node.each_descendent_node.find do |node|
42
- next unless node.send_type?
43
- receiver_node, method_name, = *node
44
- next unless receiver_node == s(:lvar, block_arg_name)
45
- method_name == configuration_method_name
46
- end
47
- end
48
-
49
- def block_arg_name
50
- return nil unless block_node
51
- first_block_arg_name(block_node)
52
- end
53
-
54
18
  def block_node
55
19
  return @block_node if instance_variable_defined?(:@block_node)
56
20
 
57
- @block_node = rspec_configure.node.each_descendent_node.find do |node|
21
+ @block_node = rspec_configure.block_node.each_descendent_node.find do |node|
58
22
  next unless node.block_type?
59
23
  send_node = node.children.first
60
24
  receiver_node, method_name, *_ = *send_node
@@ -64,68 +28,63 @@ module Transpec
64
28
  end
65
29
  end
66
30
 
67
- module ConfigurationAddition
68
- def add_configuration!(config_name, value)
69
- lines = [body_indentation + "#{config_variable_name}.#{config_name} = #{value}"]
70
-
71
- unless block_node
72
- lines.unshift(framework_begin_code)
73
- lines << framework_end_code
74
- end
31
+ private
75
32
 
76
- lines.unshift('') unless empty_block_body?(block_node_to_insert_code)
77
- lines.map! { |line| line + "\n" }
33
+ def block_method_name
34
+ fail NotImplementedError
35
+ end
78
36
 
79
- insertion_position = beginning_of_line_range(block_node_to_insert_code.loc.end)
80
- source_rewriter.insert_before(insertion_position, lines.join(''))
81
- end
37
+ def generate_configuration_lines(config_name, value)
38
+ lines = super
82
39
 
83
- def config_variable_name
84
- block_arg_name || new_config_variable_name
40
+ unless block_node
41
+ lines.unshift(framework_begin_code)
42
+ lines << framework_end_code
85
43
  end
86
44
 
87
- def new_config_variable_name
88
- case rspec_configure.block_arg_name
89
- when :rspec then self.class.name.split('::').last.downcase
90
- when :c then 'config'
91
- else 'c'
92
- end
93
- end
45
+ lines
46
+ end
94
47
 
95
- def body_indentation
96
- if block_node
97
- indentation_of_line(block_node) + (' ' * 2)
98
- else
99
- indentation_of_line(rspec_configure.node) + (' ' * 4)
100
- end
101
- end
48
+ def config_variable_name
49
+ super || new_config_variable_name
50
+ end
102
51
 
103
- def framework_begin_code
104
- code = format(
105
- '%s.%s :rspec do |%s|',
106
- rspec_configure.block_arg_name, block_method_name, config_variable_name
107
- )
108
- rspec_configure_body_indentation + code
52
+ def new_config_variable_name
53
+ framework_name = self.class.name.split('::').last.downcase
54
+ if rspec_configure.block_arg_name.to_s == framework_name
55
+ 'config'
56
+ else
57
+ framework_name
109
58
  end
59
+ end
110
60
 
111
- def framework_end_code
112
- rspec_configure_body_indentation + 'end'
61
+ def body_indentation
62
+ if block_node
63
+ super
64
+ else
65
+ rspec_configure_body_indentation + (' ' * 2)
113
66
  end
67
+ end
114
68
 
115
- def rspec_configure_body_indentation
116
- indentation_of_line(rspec_configure.node) + (' ' * 2)
117
- end
69
+ def block_node_to_insert_code
70
+ super || rspec_configure.block_node
71
+ end
118
72
 
119
- def block_node_to_insert_code
120
- block_node || rspec_configure.node
121
- end
73
+ def framework_begin_code
74
+ code = format(
75
+ '%s.%s :rspec do |%s|',
76
+ rspec_configure.block_arg_name, block_method_name, config_variable_name
77
+ )
78
+ rspec_configure_body_indentation + code
79
+ end
122
80
 
123
- def empty_block_body?(block_node)
124
- (block_node.loc.end.line - block_node.loc.begin.line) <= 1
125
- end
81
+ def framework_end_code
82
+ rspec_configure_body_indentation + 'end'
126
83
  end
127
84
 
128
- include ConfigurationAddition
85
+ def rspec_configure_body_indentation
86
+ indentation_of_line(rspec_configure.node) + (' ' * 2)
87
+ end
129
88
 
130
89
  module SyntaxConfiguration
131
90
  def syntaxes