transpec 1.10.3 → 1.10.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -0
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile +2 -0
  5. data/README.md +11 -5
  6. data/README.md.erb +11 -5
  7. data/lib/transpec.rb +1 -19
  8. data/lib/transpec/base_rewriter.rb +1 -1
  9. data/lib/transpec/converter.rb +2 -3
  10. data/lib/transpec/dynamic_analyzer/rewriter.rb +2 -2
  11. data/lib/transpec/option_parser.rb +2 -2
  12. data/lib/transpec/parser.rb +9 -0
  13. data/lib/transpec/record.rb +45 -7
  14. data/lib/transpec/syntax.rb +15 -21
  15. data/lib/transpec/syntax/allow.rb +2 -2
  16. data/lib/transpec/syntax/be_boolean.rb +2 -2
  17. data/lib/transpec/syntax/be_close.rb +2 -2
  18. data/lib/transpec/syntax/current_example.rb +5 -6
  19. data/lib/transpec/syntax/double.rb +2 -2
  20. data/lib/transpec/syntax/example.rb +13 -14
  21. data/lib/transpec/syntax/expect.rb +2 -2
  22. data/lib/transpec/syntax/have.rb +5 -8
  23. data/lib/transpec/syntax/have/{dynamic_inspector.rb → dynamic_analysis.rb} +25 -47
  24. data/lib/transpec/syntax/have/have_record.rb +12 -16
  25. data/lib/transpec/syntax/its.rb +5 -5
  26. data/lib/transpec/syntax/matcher_definition.rb +2 -2
  27. data/lib/transpec/syntax/method_stub.rb +29 -28
  28. data/lib/transpec/syntax/mixin/any_instance_block.rb +2 -2
  29. data/lib/transpec/syntax/mixin/matcher_owner.rb +16 -13
  30. data/lib/transpec/syntax/mixin/monkey_patch.rb +2 -2
  31. data/lib/transpec/syntax/mixin/monkey_patch_any_instance.rb +1 -1
  32. data/lib/transpec/syntax/mixin/send.rb +42 -30
  33. data/lib/transpec/syntax/mixin/useless_and_return.rb +2 -4
  34. data/lib/transpec/syntax/oneliner_should.rb +17 -19
  35. data/lib/transpec/syntax/operator.rb +9 -14
  36. data/lib/transpec/syntax/pending.rb +27 -18
  37. data/lib/transpec/syntax/raise_error.rb +2 -2
  38. data/lib/transpec/syntax/receive.rb +2 -2
  39. data/lib/transpec/syntax/rspec_configure.rb +2 -2
  40. data/lib/transpec/syntax/should.rb +9 -9
  41. data/lib/transpec/syntax/should_receive.rb +18 -16
  42. data/lib/transpec/version.rb +1 -1
  43. data/spec/spec_helper.rb +7 -0
  44. data/spec/support/shared_context.rb +4 -4
  45. data/spec/transpec/cli_spec.rb +1 -1
  46. data/spec/transpec/converter_spec.rb +1 -1
  47. data/spec/transpec/dynamic_analyzer/rewriter_spec.rb +8 -8
  48. data/spec/transpec/syntax/current_example_spec.rb +75 -19
  49. data/spec/transpec/syntax/double_spec.rb +11 -11
  50. data/spec/transpec/syntax/example_spec.rb +8 -4
  51. data/spec/transpec/syntax/have_spec.rb +1 -1
  52. data/spec/transpec/syntax/method_stub_spec.rb +14 -20
  53. data/spec/transpec/syntax/oneliner_should_spec.rb +51 -0
  54. data/spec/transpec/syntax/pending_spec.rb +8 -4
  55. data/spec/transpec_spec.rb +4 -6
  56. data/tasks/demo.rake +2 -2
  57. data/tasks/lib/transpec_demo.rb +1 -1
  58. data/tasks/lib/transpec_test.rb +1 -1
  59. data/tasks/test.rake +2 -2
  60. metadata +4 -3
@@ -48,21 +48,19 @@ module Transpec
48
48
  @host = host
49
49
  end
50
50
 
51
- def original_syntax
51
+ def build_original_syntax
52
52
  syntax = base_syntax
53
53
  syntax << '.and_return'
54
54
  syntax << ' { value }' if @host.and_return_with_block?
55
55
  syntax
56
56
  end
57
57
 
58
- def converted_syntax
58
+ def build_converted_syntax
59
59
  syntax = base_syntax
60
60
  syntax << ' { value }' if @host.and_return_with_block?
61
61
  syntax
62
62
  end
63
63
 
64
- private
65
-
66
64
  def base_syntax
67
65
  fail NotImplementedError
68
66
  end
@@ -13,15 +13,15 @@ module Transpec
13
13
 
14
14
  attr_reader :current_syntax_type
15
15
 
16
- def self.target_method?(receiver_node, method_name)
17
- receiver_node.nil? && [:should, :should_not].include?(method_name)
18
- end
19
-
20
16
  def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
21
17
  super
22
18
  @current_syntax_type = :should
23
19
  end
24
20
 
21
+ def dynamic_analysis_target?
22
+ super && receiver_node.nil? && [:should, :should_not].include?(method_name)
23
+ end
24
+
25
25
  def expectize!(negative_form = 'not_to', parenthesize_matcher_arg = true)
26
26
  replacement = 'is_expected.'
27
27
  replacement << (positive? ? 'to' : negative_form)
@@ -169,23 +169,21 @@ module Transpec
169
169
  @negative_form_of_to = negative_form_of_to
170
170
  end
171
171
 
172
- def original_syntax
173
- @original_syntax ||= begin
174
- syntax = should.example_has_description? ? "it '...' do" : 'it {'
175
- syntax << " #{should.method_name} #{have.method_name}(n).#{original_items} "
176
- syntax << (should.example_has_description? ? 'end' : '}')
177
- end
172
+ private
173
+
174
+ def build_original_syntax
175
+ syntax = should.example_has_description? ? "it '...' do" : 'it {'
176
+ syntax << " #{should.method_name} #{have.method_name}(n).#{original_items} "
177
+ syntax << (should.example_has_description? ? 'end' : '}')
178
178
  end
179
179
 
180
- def converted_syntax
181
- @converted_syntax ||= begin
182
- syntax = converted_description
183
- syntax << ' '
184
- syntax << converted_expectation
185
- syntax << ' '
186
- syntax << source_builder.replacement_matcher_source
187
- syntax << ' end'
188
- end
180
+ def build_converted_syntax
181
+ syntax = converted_description
182
+ syntax << ' '
183
+ syntax << converted_expectation
184
+ syntax << ' '
185
+ syntax << source_builder.replacement_matcher_source
186
+ syntax << ' end'
189
187
  end
190
188
 
191
189
  def converted_description
@@ -15,25 +15,16 @@ module Transpec
15
15
  OPERATORS = [:==, :===, :<, :<=, :>, :>=, :=~].freeze
16
16
  BE_NODE = s(:send, nil, :be)
17
17
 
18
- def self.standalone?
19
- false
20
- end
21
-
22
- def self.check_target_node_statically(node)
23
- node = node.parent_node if node == BE_NODE
24
- super(node)
25
- end
26
-
27
- def self.target_method?(receiver_node, method_name)
28
- !receiver_node.nil? && OPERATORS.include?(method_name)
29
- end
30
-
31
- define_dynamic_analysis_request do |rewriter|
18
+ define_dynamic_analysis do |rewriter|
32
19
  if method_name == :=~
33
20
  rewriter.register_request(arg_node, :enumerable_arg?, 'is_a?(Enumerable)')
34
21
  end
35
22
  end
36
23
 
24
+ def self.standalone?
25
+ false
26
+ end
27
+
37
28
  def initialize(node, expectation, source_rewriter = nil, runtime_data = nil, report = nil)
38
29
  operator_node = if node == BE_NODE
39
30
  node.parent_node
@@ -44,6 +35,10 @@ module Transpec
44
35
  super(operator_node, expectation, source_rewriter, runtime_data, report)
45
36
  end
46
37
 
38
+ def dynamic_analysis_target?
39
+ super && !receiver_node.nil? && OPERATORS.include?(method_name)
40
+ end
41
+
47
42
  def convert_operator!(parenthesize_arg = true)
48
43
  case method_name
49
44
  when :==
@@ -9,31 +9,30 @@ module Transpec
9
9
  class Pending < Syntax
10
10
  include Mixin::Send, Util
11
11
 
12
- def self.conversion_target_node?(node, runtime_data = nil)
13
- return false unless target_node?(node, runtime_data)
12
+ define_dynamic_analysis do |rewriter|
13
+ code = 'is_a?(RSpec::Core::ExampleGroup)'
14
+ rewriter.register_request(node, :example_context?, code, :context)
15
+ end
16
+
17
+ def dynamic_analysis_target?
18
+ super && receiver_node.nil? && method_name == :pending
19
+ end
20
+
21
+ def conversion_target?
22
+ return false unless dynamic_analysis_target?
14
23
 
15
24
  # Check whether the context is example group to differenciate
16
25
  # RSpec::Core::ExampleGroup.pending (a relative of #it) and
17
26
  # RSpec::Core::ExampleGroup#pending (marks the example as pending in #it block).
18
- if runtime_data && runtime_data.run?(node)
27
+ if runtime_data.run?(node)
19
28
  # If we have runtime data, check with it.
20
29
  runtime_data[node, :example_context?]
21
30
  else
22
31
  # Otherwise check statically.
23
- inspector = StaticContextInspector.new(node)
24
- inspector.scopes.last == :example
32
+ static_context_inspector.scopes.last == :example
25
33
  end
26
34
  end
27
35
 
28
- def self.target_method?(receiver_node, method_name)
29
- receiver_node.nil? && method_name == :pending
30
- end
31
-
32
- define_dynamic_analysis_request do |rewriter|
33
- code = 'is_a?(RSpec::Core::ExampleGroup)'
34
- rewriter.register_request(node, :example_context?, code, :context)
35
- end
36
-
37
36
  def convert_deprecated_syntax!
38
37
  if block_node
39
38
  unblock!
@@ -51,16 +50,14 @@ module Transpec
51
50
 
52
51
  def unblock!
53
52
  if block_beginning_line == block_body_line
54
- range_between_pending_and_body =
55
- expression_range.end.join(block_body_node.loc.expression.begin)
56
53
  replace(range_between_pending_and_body, "\n" + indentation_of_line(node))
57
54
  else
58
- remove(expression_range.end.join(block_node.loc.begin))
55
+ remove(range_from_pending_end_to_block_open)
59
56
  outdent!(block_body_node, node)
60
57
  end
61
58
 
62
59
  if block_body_line == block_end_line
63
- remove(block_body_node.loc.expression.end.join(block_node.loc.end))
60
+ remove(range_from_body_end_to_block_close)
64
61
  else
65
62
  remove(line_range(block_node.loc.end))
66
63
  end
@@ -102,6 +99,18 @@ module Transpec
102
99
  block_node.loc.end.line
103
100
  end
104
101
 
102
+ def range_between_pending_and_body
103
+ expression_range.end.join(block_body_node.loc.expression.begin)
104
+ end
105
+
106
+ def range_from_pending_end_to_block_open
107
+ expression_range.end.join(block_node.loc.begin)
108
+ end
109
+
110
+ def range_from_body_end_to_block_close
111
+ block_body_node.loc.expression.end.join(block_node.loc.end)
112
+ end
113
+
105
114
  def register_record(original_syntax, converted_syntax)
106
115
  report.records << Record.new(original_syntax, converted_syntax)
107
116
  end
@@ -9,8 +9,8 @@ module Transpec
9
9
  class RaiseError < Syntax
10
10
  include Mixin::Send, Mixin::OwnedMatcher
11
11
 
12
- def self.target_method?(receiver_node, method_name)
13
- receiver_node.nil? && method_name == :raise_error
12
+ def dynamic_analysis_target?
13
+ super && receiver_node.nil? && method_name == :raise_error
14
14
  end
15
15
 
16
16
  def remove_error_specification_with_negative_expectation!
@@ -10,8 +10,8 @@ module Transpec
10
10
  class Receive < Syntax
11
11
  include Mixin::Send, Mixin::OwnedMatcher, Mixin::MessagingHost
12
12
 
13
- def self.target_method?(receiver_node, method_name)
14
- receiver_node.nil? && method_name == :receive
13
+ def dynamic_analysis_target?
14
+ super && receiver_node.nil? && method_name == :receive
15
15
  end
16
16
 
17
17
  def remove_useless_and_return!
@@ -11,11 +11,11 @@ module Transpec
11
11
 
12
12
  include Util
13
13
 
14
- def self.target_node?(node, runtime_data = nil)
14
+ def dynamic_analysis_target?
15
15
  return false unless node && node.block_type?
16
16
  send_node = node.children.first
17
17
  receiver_node, method_name, *_ = *send_node
18
- Util.const_name(receiver_node) == 'RSpec' && method_name == :configure
18
+ const_name(receiver_node) == 'RSpec' && method_name == :configure
19
19
  end
20
20
 
21
21
  def expectations
@@ -13,8 +13,12 @@ module Transpec
13
13
 
14
14
  attr_reader :current_syntax_type
15
15
 
16
- def self.target_method?(receiver_node, method_name)
17
- !receiver_node.nil? && [:should, :should_not].include?(method_name)
16
+ define_dynamic_analysis do |rewriter|
17
+ register_syntax_availability_analysis_request(
18
+ rewriter,
19
+ :expect_available?,
20
+ [:expect]
21
+ )
18
22
  end
19
23
 
20
24
  def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
@@ -22,16 +26,12 @@ module Transpec
22
26
  @current_syntax_type = :should
23
27
  end
24
28
 
25
- define_dynamic_analysis_request do |rewriter|
26
- register_request_of_syntax_availability_inspection(
27
- rewriter,
28
- :expect_available?,
29
- [:expect]
30
- )
29
+ def dynamic_analysis_target?
30
+ super && !receiver_node.nil? && [:should, :should_not].include?(method_name)
31
31
  end
32
32
 
33
33
  def expect_available?
34
- check_syntax_availability(__method__)
34
+ syntax_available?(__method__)
35
35
  end
36
36
 
37
37
  def expectize!(negative_form = 'not_to', parenthesize_matcher_arg = true)
@@ -11,32 +11,34 @@ module Transpec
11
11
  class ShouldReceive < Syntax
12
12
  include Mixin::Expectizable, Mixin::MonkeyPatchAnyInstance, Mixin::MessagingHost, Util
13
13
 
14
- alias_method :useless_expectation?, :allow_no_message?
15
-
16
- def self.target_method?(receiver_node, method_name)
17
- !receiver_node.nil? && [:should_receive, :should_not_receive].include?(method_name)
18
- end
19
-
20
- define_dynamic_analysis_request do |rewriter|
21
- register_request_of_syntax_availability_inspection(
14
+ define_dynamic_analysis do |rewriter|
15
+ register_syntax_availability_analysis_request(
22
16
  rewriter,
23
17
  :expect_to_receive_available?,
24
18
  [:expect, :receive]
25
19
  )
26
20
 
27
- register_request_of_syntax_availability_inspection(
21
+ register_syntax_availability_analysis_request(
28
22
  rewriter,
29
23
  :allow_to_receive_available?,
30
24
  [:allow, :receive]
31
25
  )
32
26
  end
33
27
 
28
+ alias_method :useless_expectation?, :allow_no_message?
29
+
30
+ def dynamic_analysis_target?
31
+ super &&
32
+ !receiver_node.nil? &&
33
+ [:should_receive, :should_not_receive].include?(method_name)
34
+ end
35
+
34
36
  def expect_to_receive_available?
35
- check_syntax_availability(__method__)
37
+ syntax_available?(__method__)
36
38
  end
37
39
 
38
40
  def allow_to_receive_available?
39
- check_syntax_availability(__method__)
41
+ syntax_available?(__method__)
40
42
  end
41
43
 
42
44
  def positive?
@@ -170,7 +172,7 @@ module Transpec
170
172
  fail NotImplementedError
171
173
  end
172
174
 
173
- def original_syntax
175
+ def build_original_syntax
174
176
  syntax = if @should_receive.any_instance?
175
177
  'Klass.any_instance.'
176
178
  else
@@ -179,7 +181,7 @@ module Transpec
179
181
  syntax << "#{@should_receive.method_name}(:message)"
180
182
  end
181
183
 
182
- def converted_syntax
184
+ def build_converted_syntax
183
185
  syntax = if @should_receive.any_instance?
184
186
  "#{syntax_name}_any_instance_of(Klass)."
185
187
  else
@@ -201,7 +203,7 @@ module Transpec
201
203
  'allow'
202
204
  end
203
205
 
204
- def original_syntax
206
+ def build_original_syntax
205
207
  syntax = super
206
208
  syntax << '.any_number_of_times' if @should_receive.any_number_of_times?
207
209
  syntax << '.at_least(0)' if @should_receive.at_least_zero?
@@ -214,14 +216,14 @@ module Transpec
214
216
  @should_receive = should_receive
215
217
  end
216
218
 
217
- def original_syntax
219
+ def build_original_syntax
218
220
  syntax = "obj.#{@should_receive.method_name}(:message)"
219
221
  syntax << '.any_number_of_times' if @should_receive.any_number_of_times?
220
222
  syntax << '.at_least(0)' if @should_receive.at_least_zero?
221
223
  syntax
222
224
  end
223
225
 
224
- def converted_syntax
226
+ def build_converted_syntax
225
227
  'obj.stub(:message)'
226
228
  end
227
229
  end
@@ -5,7 +5,7 @@ module Transpec
5
5
  module Version
6
6
  MAJOR = 1
7
7
  MINOR = 10
8
- PATCH = 3
8
+ PATCH = 4
9
9
 
10
10
  def self.to_s
11
11
  [MAJOR, MINOR, PATCH].join('.')
data/spec/spec_helper.rb CHANGED
@@ -15,6 +15,13 @@ RSpec.configure do |config|
15
15
  config.color_enabled = true
16
16
  config.treat_symbols_as_metadata_keys_with_true_values = true
17
17
 
18
+ # These two settings work together to allow you to limit a spec run
19
+ # to individual examples or groups you care about by tagging them with
20
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
21
+ # get run.
22
+ config.filter_run :focus
23
+ config.run_all_when_everything_filtered = true
24
+
18
25
  config.before(:suite) do
19
26
  require 'rainbow'
20
27
  Rainbow.enabled = false
@@ -13,7 +13,7 @@ shared_context 'parsed objects' do
13
13
 
14
14
  let(:ast) do
15
15
  require 'transpec/ast/builder'
16
- require 'parser/current'
16
+ require 'transpec/parser'
17
17
  builder = Transpec::AST::Builder.new
18
18
  parser = Parser::CurrentRuby.new(builder)
19
19
  parser.parse(source_buffer)
@@ -55,11 +55,11 @@ end
55
55
  shared_context 'syntax object' do |syntax_class, name|
56
56
  let(name) do
57
57
  ast.each_node do |node|
58
- next unless syntax_class.conversion_target_node?(node)
59
- return syntax_class.new(node, source_rewriter, runtime_data)
58
+ syntax = syntax_class.new(node, source_rewriter, runtime_data)
59
+ return syntax if syntax.conversion_target?
60
60
  end
61
61
 
62
- fail "No #{syntax_class.name} node is found!"
62
+ fail "No #{syntax_class.name} conversion target is found!"
63
63
  end
64
64
  end
65
65
 
@@ -10,7 +10,7 @@ module Transpec
10
10
  subject(:cli) { CLI.new }
11
11
 
12
12
  before do
13
- cli.project.stub(:rspec_version).and_return(Transpec.current_rspec_version)
13
+ cli.project.stub(:rspec_version).and_return(Transpec.required_rspec_version)
14
14
  end
15
15
 
16
16
  describe '.run' do
@@ -6,7 +6,7 @@ require 'transpec/converter'
6
6
  module Transpec
7
7
  describe Converter do
8
8
  subject(:converter) { Converter.new(configuration, rspec_version) }
9
- let(:rspec_version) { Transpec.current_rspec_version }
9
+ let(:rspec_version) { Transpec.required_rspec_version }
10
10
  let(:configuration) { Configuration.new }
11
11
 
12
12
  describe '#convert_file!' do
@@ -21,8 +21,8 @@ module Transpec
21
21
 
22
22
  # rubocop:disable LineLength
23
23
  let(:expected_source) do
24
- <<-END
25
- transpec_analyze((transpec_analyze((subject), self, "(string)_12_19", { :should_source_location => [:object, "method(:should).source_location"] }).should be(foo)), self, "(string)_12_34", { :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"] })
24
+ <<-'END'
25
+ transpec_analyze((transpec_analyze((subject), self, "(string)_12_19", { :should_source_location => [:object, "method(:should).source_location"], :should_example_method_defined_by_user? => [:object, "owner = method(:should).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).should be(foo)), self, "(string)_12_34", { :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"] })
26
26
  END
27
27
  end
28
28
  # rubocop:enable LineLength
@@ -42,8 +42,8 @@ module Transpec
42
42
 
43
43
  # rubocop:disable LineLength
44
44
  let(:expected_source) do
45
- <<-END
46
- transpec_analyze((transpec_analyze((subject), self, "(string)_14_21", { :should_source_location => [:object, "method(:should).source_location"] }).should), self, "(string)_14_28", { :"=~_source_location" => [:object, "method(:=~).source_location"], :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"] }) =~ transpec_analyze((<<-HEREDOC.gsub('foo', 'bar')), self, "(string)_32_61", { :enumerable_arg? => [:object, "is_a?(Enumerable)"] })
45
+ <<-'END'
46
+ transpec_analyze((transpec_analyze((subject), self, "(string)_14_21", { :should_source_location => [:object, "method(:should).source_location"], :should_example_method_defined_by_user? => [:object, "owner = method(:should).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).should), self, "(string)_14_28", { :"=~_source_location" => [:object, "method(:=~).source_location"], :"=~_example_method_defined_by_user?" => [:object, "owner = method(:=~).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"], :expect_available? => [:context, "self.class.ancestors.any? { |a| a.name.start_with?('RSpec::') } && respond_to?(:expect)"] }) =~ transpec_analyze((<<-HEREDOC.gsub('foo', 'bar')), self, "(string)_32_61", { :enumerable_arg? => [:object, "is_a?(Enumerable)"] })
47
47
  foo
48
48
  HEREDOC
49
49
  END
@@ -64,8 +64,8 @@ module Transpec
64
64
 
65
65
  # rubocop:disable LineLength
66
66
  let(:expected_source) do
67
- <<-END
68
- transpec_analyze((expect { do_something }), self, "(string)_14_20", { :expect_source_location => [:context, "method(:expect).source_location"] }).to throw_symbol
67
+ <<-'END'
68
+ transpec_analyze((expect { do_something }), self, "(string)_14_20", { :expect_source_location => [:context, "method(:expect).source_location"], :expect_example_method_defined_by_user? => [:context, "owner = method(:expect).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] }).to throw_symbol
69
69
  END
70
70
  end
71
71
  # rubocop:enable LineLength
@@ -84,8 +84,8 @@ module Transpec
84
84
 
85
85
  # rubocop:disable LineLength
86
86
  let(:expected_source) do
87
- <<-END
88
- transpec_analyze((double 'something'), self, "(string)_14_32", { :double_source_location => [:context, "method(:double).source_location"] })
87
+ <<-'END'
88
+ transpec_analyze((double 'something'), self, "(string)_14_32", { :double_source_location => [:context, "method(:double).source_location"], :double_example_method_defined_by_user? => [:context, "owner = method(:double).owner\nowner != RSpec::Core::ExampleGroup &&\n owner.ancestors.include?(RSpec::Core::ExampleGroup)"] })
89
89
  END
90
90
  end
91
91
  # rubocop:enable LineLength