cucumber 3.0.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +216 -17
  3. data/CONTRIBUTING.md +4 -21
  4. data/README.md +8 -10
  5. data/bin/cucumber +1 -1
  6. data/lib/autotest/cucumber.rb +1 -0
  7. data/lib/autotest/cucumber_mixin.rb +35 -39
  8. data/lib/autotest/cucumber_rails.rb +1 -0
  9. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  10. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  11. data/lib/autotest/cucumber_rspec.rb +1 -0
  12. data/lib/autotest/cucumber_rspec2.rb +1 -0
  13. data/lib/autotest/discover.rb +1 -0
  14. data/lib/cucumber.rb +2 -1
  15. data/lib/cucumber/cli/configuration.rb +6 -5
  16. data/lib/cucumber/cli/main.rb +14 -14
  17. data/lib/cucumber/cli/options.rb +113 -116
  18. data/lib/cucumber/cli/profile_loader.rb +50 -29
  19. data/lib/cucumber/cli/rerun_file.rb +1 -0
  20. data/lib/cucumber/configuration.rb +38 -29
  21. data/lib/cucumber/constantize.rb +8 -10
  22. data/lib/cucumber/core_ext/string.rb +1 -0
  23. data/lib/cucumber/deprecate.rb +32 -8
  24. data/lib/cucumber/encoding.rb +2 -1
  25. data/lib/cucumber/errors.rb +6 -7
  26. data/lib/cucumber/events.rb +14 -7
  27. data/lib/cucumber/events/envelope.rb +9 -0
  28. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  29. data/lib/cucumber/events/gherkin_source_read.rb +1 -4
  30. data/lib/cucumber/events/hook_test_step_created.rb +13 -0
  31. data/lib/cucumber/events/step_activated.rb +6 -6
  32. data/lib/cucumber/events/step_definition_registered.rb +4 -8
  33. data/lib/cucumber/events/test_case_created.rb +13 -0
  34. data/lib/cucumber/events/test_case_finished.rb +0 -4
  35. data/lib/cucumber/events/test_case_ready.rb +12 -0
  36. data/lib/cucumber/events/test_case_started.rb +0 -4
  37. data/lib/cucumber/events/test_run_finished.rb +2 -3
  38. data/lib/cucumber/events/test_run_started.rb +2 -4
  39. data/lib/cucumber/events/test_step_created.rb +13 -0
  40. data/lib/cucumber/events/test_step_finished.rb +0 -4
  41. data/lib/cucumber/events/test_step_started.rb +1 -5
  42. data/lib/cucumber/events/undefined_parameter_type.rb +10 -0
  43. data/lib/cucumber/file_specs.rb +7 -6
  44. data/lib/cucumber/filters.rb +2 -0
  45. data/lib/cucumber/filters/activate_steps.rb +6 -4
  46. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  47. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  48. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  49. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  50. data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
  51. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +2 -1
  52. data/lib/cucumber/filters/gated_receiver.rb +1 -2
  53. data/lib/cucumber/filters/prepare_world.rb +6 -13
  54. data/lib/cucumber/filters/quit.rb +3 -6
  55. data/lib/cucumber/filters/randomizer.rb +6 -7
  56. data/lib/cucumber/filters/retry.rb +2 -2
  57. data/lib/cucumber/filters/tag_limits.rb +2 -2
  58. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
  59. data/lib/cucumber/filters/tag_limits/verifier.rb +3 -6
  60. data/lib/cucumber/formatter/ansicolor.rb +33 -37
  61. data/lib/cucumber/formatter/ast_lookup.rb +165 -0
  62. data/lib/cucumber/formatter/backtrace_filter.rb +10 -10
  63. data/lib/cucumber/formatter/console.rb +65 -74
  64. data/lib/cucumber/formatter/console_counts.rb +4 -9
  65. data/lib/cucumber/formatter/console_issues.rb +9 -6
  66. data/lib/cucumber/formatter/duration.rb +2 -1
  67. data/lib/cucumber/formatter/duration_extractor.rb +4 -2
  68. data/lib/cucumber/formatter/errors.rb +6 -0
  69. data/lib/cucumber/formatter/fail_fast.rb +9 -6
  70. data/lib/cucumber/formatter/fanout.rb +3 -3
  71. data/lib/cucumber/formatter/html.rb +11 -602
  72. data/lib/cucumber/formatter/http_io.rb +146 -0
  73. data/lib/cucumber/formatter/ignore_missing_messages.rb +2 -3
  74. data/lib/cucumber/formatter/interceptor.rb +11 -18
  75. data/lib/cucumber/formatter/io.rb +18 -11
  76. data/lib/cucumber/formatter/json.rb +102 -109
  77. data/lib/cucumber/formatter/junit.rb +73 -68
  78. data/lib/cucumber/formatter/message.rb +22 -0
  79. data/lib/cucumber/formatter/message_builder.rb +255 -0
  80. data/lib/cucumber/formatter/pretty.rb +360 -153
  81. data/lib/cucumber/formatter/progress.rb +31 -32
  82. data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
  83. data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
  84. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
  85. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
  86. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
  87. data/lib/cucumber/formatter/rerun.rb +23 -4
  88. data/lib/cucumber/formatter/stepdefs.rb +2 -2
  89. data/lib/cucumber/formatter/steps.rb +4 -5
  90. data/lib/cucumber/formatter/summary.rb +17 -9
  91. data/lib/cucumber/formatter/unicode.rb +16 -18
  92. data/lib/cucumber/formatter/usage.rb +30 -26
  93. data/lib/cucumber/gherkin/data_table_parser.rb +18 -6
  94. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +83 -86
  95. data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
  96. data/lib/cucumber/gherkin/i18n.rb +1 -0
  97. data/lib/cucumber/gherkin/steps_parser.rb +18 -8
  98. data/lib/cucumber/glue/dsl.rb +2 -1
  99. data/lib/cucumber/glue/hook.rb +35 -11
  100. data/lib/cucumber/glue/invoke_in_world.rb +15 -20
  101. data/lib/cucumber/glue/proto_world.rb +47 -39
  102. data/lib/cucumber/glue/registry_and_more.rb +54 -23
  103. data/lib/cucumber/glue/snippet.rb +24 -27
  104. data/lib/cucumber/glue/step_definition.rb +51 -28
  105. data/lib/cucumber/glue/world_factory.rb +1 -3
  106. data/lib/cucumber/hooks.rb +24 -14
  107. data/lib/cucumber/load_path.rb +1 -0
  108. data/lib/cucumber/multiline_argument.rb +6 -8
  109. data/lib/cucumber/multiline_argument/data_table.rb +106 -73
  110. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +8 -11
  111. data/lib/cucumber/multiline_argument/doc_string.rb +2 -1
  112. data/lib/cucumber/platform.rb +4 -3
  113. data/lib/cucumber/project_initializer.rb +1 -1
  114. data/lib/cucumber/rake/task.rb +21 -18
  115. data/lib/cucumber/rspec/disable_option_parser.rb +10 -8
  116. data/lib/cucumber/rspec/doubles.rb +1 -0
  117. data/lib/cucumber/running_test_case.rb +4 -54
  118. data/lib/cucumber/runtime.rb +57 -61
  119. data/lib/cucumber/runtime/after_hooks.rb +9 -4
  120. data/lib/cucumber/runtime/before_hooks.rb +9 -4
  121. data/lib/cucumber/runtime/for_programming_languages.rb +12 -9
  122. data/lib/cucumber/runtime/step_hooks.rb +5 -2
  123. data/lib/cucumber/runtime/support_code.rb +16 -22
  124. data/lib/cucumber/runtime/user_interface.rb +8 -19
  125. data/lib/cucumber/step_definition_light.rb +6 -4
  126. data/lib/cucumber/step_definitions.rb +3 -2
  127. data/lib/cucumber/step_match.rb +20 -18
  128. data/lib/cucumber/step_match_search.rb +9 -9
  129. data/lib/cucumber/term/ansicolor.rb +39 -39
  130. data/lib/cucumber/unit.rb +1 -0
  131. data/lib/cucumber/version +1 -1
  132. data/lib/simplecov_setup.rb +1 -0
  133. metadata +214 -127
  134. data/lib/cucumber/formatter/cucumber.css +0 -286
  135. data/lib/cucumber/formatter/cucumber.sass +0 -247
  136. data/lib/cucumber/formatter/hook_query_visitor.rb +0 -41
  137. data/lib/cucumber/formatter/html_builder.rb +0 -120
  138. data/lib/cucumber/formatter/inline-js.js +0 -30
  139. data/lib/cucumber/formatter/jquery-min.js +0 -154
  140. data/lib/cucumber/formatter/json_pretty.rb +0 -10
  141. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1028
  142. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -394
  143. data/lib/cucumber/formatter/legacy_api/results.rb +0 -50
  144. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
  145. data/lib/cucumber/step_argument.rb +0 -24
@@ -1,24 +1,29 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  class Runtime
4
5
  class AfterHooks
5
- def initialize(hooks, scenario)
6
+ def initialize(id_generator, hooks, scenario, event_bus)
6
7
  @hooks = hooks
7
8
  @scenario = scenario
9
+ @id_generator = id_generator
10
+ @event_bus = event_bus
8
11
  end
9
12
 
10
13
  def apply_to(test_case)
11
14
  test_case.with_steps(
12
- test_case.test_steps + after_hooks(test_case.source).reverse
15
+ test_case.test_steps + after_hooks.reverse
13
16
  )
14
17
  end
15
18
 
16
19
  private
17
20
 
18
- def after_hooks(source)
21
+ def after_hooks
19
22
  @hooks.map do |hook|
20
23
  action = ->(result) { hook.invoke('After', @scenario.with_result(result)) }
21
- Hooks.after_hook(source, hook.location, &action)
24
+ hook_step = Hooks.after_hook(@id_generator.new_id, hook.location, &action)
25
+ @event_bus.hook_test_step_created(hook_step, hook)
26
+ hook_step
22
27
  end
23
28
  end
24
29
  end
@@ -1,26 +1,31 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/hooks'
3
4
 
4
5
  module Cucumber
5
6
  class Runtime
6
7
  class BeforeHooks
7
- def initialize(hooks, scenario)
8
+ def initialize(id_generator, hooks, scenario, event_bus)
8
9
  @hooks = hooks
9
10
  @scenario = scenario
11
+ @id_generator = id_generator
12
+ @event_bus = event_bus
10
13
  end
11
14
 
12
15
  def apply_to(test_case)
13
16
  test_case.with_steps(
14
- before_hooks(test_case.source) + test_case.test_steps
17
+ before_hooks + test_case.test_steps
15
18
  )
16
19
  end
17
20
 
18
21
  private
19
22
 
20
- def before_hooks(source)
23
+ def before_hooks
21
24
  @hooks.map do |hook|
22
25
  action_block = ->(result) { hook.invoke('Before', @scenario.with_result(result)) }
23
- Hooks.before_hook(source, hook.location, &action_block)
26
+ hook_step = Hooks.before_hook(@id_generator.new_id, hook.location, &action_block)
27
+ @event_bus.hook_test_step_created(hook_step, hook)
28
+ hook_step
24
29
  end
25
30
  end
26
31
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'forwardable'
3
- require 'cucumber/core/ast/doc_string'
4
+ require 'cucumber/core/test/doc_string'
4
5
 
5
6
  module Cucumber
6
7
  class Runtime
@@ -14,19 +15,21 @@ module Cucumber
14
15
  attr_reader :support_code
15
16
 
16
17
  def initialize(support_code, user_interface)
17
- @support_code, @user_interface = support_code, user_interface
18
+ @support_code = support_code
19
+ @user_interface = user_interface
18
20
  end
19
21
 
20
22
  def_delegators :@user_interface,
21
- :embed,
22
- :ask,
23
- :puts,
24
- :features_paths,
25
- :step_match
23
+ :embed,
24
+ :attach,
25
+ :ask,
26
+ :puts,
27
+ :features_paths,
28
+ :step_match
26
29
 
27
30
  def_delegators :@support_code,
28
- :invoke_dynamic_steps,
29
- :invoke_dynamic_step
31
+ :invoke_dynamic_steps,
32
+ :invoke_dynamic_step
30
33
  end
31
34
  end
32
35
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  class Runtime
4
5
  class StepHooks
5
- def initialize(hooks)
6
+ def initialize(id_generator, hooks)
6
7
  @hooks = hooks
8
+ @id_generator = id_generator
7
9
  end
8
10
 
9
11
  def apply(test_steps)
@@ -13,10 +15,11 @@ module Cucumber
13
15
  end
14
16
 
15
17
  private
18
+
16
19
  def after_step_hooks(test_step)
17
20
  @hooks.map do |hook|
18
21
  action = ->(*args) { hook.invoke('AfterStep', [args, test_step]) }
19
- Hooks.after_step_hook(test_step.source, hook.location, &action)
22
+ Hooks.after_step_hook(@id_generator.new_id, test_step, hook.location, &action)
20
23
  end
21
24
  end
22
25
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/constantize'
3
4
  require 'cucumber/runtime/for_programming_languages'
4
5
  require 'cucumber/runtime/step_hooks'
@@ -8,14 +9,10 @@ require 'cucumber/gherkin/steps_parser'
8
9
  require 'cucumber/step_match_search'
9
10
 
10
11
  module Cucumber
11
-
12
12
  class Runtime
13
-
14
13
  class SupportCode
15
-
16
14
  require 'forwardable'
17
15
  class StepInvoker
18
-
19
16
  def initialize(support_code)
20
17
  @support_code = support_code
21
18
  end
@@ -25,19 +22,15 @@ module Cucumber
25
22
  end
26
23
 
27
24
  def step(step)
28
- location = Core::Ast::Location.of_caller
25
+ location = Core::Test::Location.of_caller
29
26
  @support_code.invoke_dynamic_step(step[:text], multiline_arg(step, location))
30
27
  end
31
28
 
32
29
  def multiline_arg(step, location)
33
- argument = step[:argument]
34
-
35
- if argument
36
- if argument[:type] == :DocString
37
- MultilineArgument.from(argument[:content], location, argument[:content_type])
38
- else
39
- MultilineArgument::DataTable.from(argument[:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
40
- end
30
+ if !step[:doc_string].nil?
31
+ MultilineArgument.from(step[:doc_string][:content], location, step[:doc_string][:content_type])
32
+ elsif !step[:data_table].nil?
33
+ MultilineArgument::DataTable.from(step[:data_table][:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
41
34
  else
42
35
  MultilineArgument.from(nil)
43
36
  end
@@ -48,7 +41,7 @@ module Cucumber
48
41
 
49
42
  attr_reader :registry
50
43
 
51
- def initialize(user_interface, configuration=Configuration.default)
44
+ def initialize(user_interface, configuration = Configuration.default)
52
45
  @configuration = configuration
53
46
  # TODO: needs a better name, or inlining its methods
54
47
  @runtime_facade = Runtime::ForProgrammingLanguages.new(self, user_interface)
@@ -65,8 +58,8 @@ module Cucumber
65
58
  # Given I have 8 cukes in my belly
66
59
  # Then I should not be thirsty
67
60
  # })
68
- def invoke_dynamic_steps(steps_text, i18n, _location)
69
- parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), i18n.iso_code)
61
+ def invoke_dynamic_steps(steps_text, iso_code, _location)
62
+ parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), iso_code)
70
63
  parser.parse(steps_text)
71
64
  end
72
65
 
@@ -76,7 +69,7 @@ module Cucumber
76
69
  # steps which are compiled into test steps before execution.
77
70
  #
78
71
  # These are commonly called nested steps.
79
- def invoke_dynamic_step(step_name, multiline_argument, _location=nil)
72
+ def invoke_dynamic_step(step_name, multiline_argument, _location = nil)
80
73
  matches = step_matches(step_name)
81
74
  raise UndefinedDynamicStep, step_name if matches.empty?
82
75
  matches.first.invoke(multiline_argument)
@@ -111,26 +104,28 @@ module Cucumber
111
104
  def find_after_step_hooks(test_case)
112
105
  scenario = RunningTestCase.new(test_case)
113
106
  hooks = registry.hooks_for(:after_step, scenario)
114
- StepHooks.new hooks
107
+ StepHooks.new(@configuration.id_generator, hooks)
115
108
  end
116
109
 
117
110
  def apply_before_hooks(test_case)
111
+ return test_case if test_case.test_steps.empty?
118
112
  scenario = RunningTestCase.new(test_case)
119
113
  hooks = registry.hooks_for(:before, scenario)
120
- BeforeHooks.new(hooks, scenario).apply_to(test_case)
114
+ BeforeHooks.new(@configuration.id_generator, hooks, scenario, @configuration.event_bus).apply_to(test_case)
121
115
  end
122
116
 
123
117
  def apply_after_hooks(test_case)
118
+ return test_case if test_case.test_steps.empty?
124
119
  scenario = RunningTestCase.new(test_case)
125
120
  hooks = registry.hooks_for(:after, scenario)
126
- AfterHooks.new(hooks, scenario).apply_to(test_case)
121
+ AfterHooks.new(@configuration.id_generator, hooks, scenario, @configuration.event_bus).apply_to(test_case)
127
122
  end
128
123
 
129
124
  def find_around_hooks(test_case)
130
125
  scenario = RunningTestCase.new(test_case)
131
126
 
132
127
  registry.hooks_for(:around, scenario).map do |hook|
133
- Hooks.around_hook(test_case.source) do |run_scenario|
128
+ Hooks.around_hook do |run_scenario|
134
129
  hook.invoke('Around', scenario, &run_scenario)
135
130
  end
136
131
  end
@@ -150,7 +145,6 @@ module Cucumber
150
145
  def log
151
146
  Cucumber.logger
152
147
  end
153
-
154
148
  end
155
149
  end
156
150
  end
@@ -1,20 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'timeout'
3
4
 
4
5
  module Cucumber
5
6
  class Runtime
6
-
7
7
  module UserInterface
8
8
  attr_writer :visitor
9
9
 
10
- # Output +messages+ alongside the formatted output.
11
- # This is an alternative to using Kernel#puts - it will display
12
- # nicer, and in all outputs (in case you use several formatters)
13
- #
14
- def puts(*messages)
15
- @visitor.puts(*messages)
16
- end
17
-
18
10
  # Suspends execution and prompts +question+ to the console (STDOUT).
19
11
  # An operator (manual tester) can then enter a line of text and hit
20
12
  # <ENTER>. The entered text is returned, and both +question+ and
@@ -33,7 +25,7 @@ module Cucumber
33
25
  STDOUT.flush
34
26
  puts(question)
35
27
 
36
- answer = if(Cucumber::JRUBY)
28
+ answer = if Cucumber::JRUBY
37
29
  jruby_gets(timeout_seconds)
38
30
  else
39
31
  mri_gets(timeout_seconds)
@@ -48,20 +40,18 @@ module Cucumber
48
40
  # be a path to a file, or if it's an image it may also be a Base64 encoded image.
49
41
  # The embedded data may or may not be ignored, depending on what kind of formatter(s) are active.
50
42
  #
51
- def embed(src, mime_type, label)
52
- @visitor.embed(src, mime_type, label)
43
+ def attach(src, media_type)
44
+ @visitor.attach(src, media_type)
53
45
  end
54
46
 
55
47
  private
56
48
 
57
49
  def mri_gets(timeout_seconds)
58
- begin
59
- Timeout.timeout(timeout_seconds) do
60
- STDIN.gets
61
- end
62
- rescue Timeout::Error
63
- nil
50
+ Timeout.timeout(timeout_seconds) do
51
+ STDIN.gets
64
52
  end
53
+ rescue Timeout::Error
54
+ nil
65
55
  end
66
56
 
67
57
  def jruby_gets(timeout_seconds)
@@ -74,6 +64,5 @@ module Cucumber
74
64
  answer
75
65
  end
76
66
  end
77
-
78
67
  end
79
68
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  # TODO: pointless, ancient, kill with fire.
4
5
  # Only used for keeping track of available and invoked step definitions
@@ -8,15 +9,16 @@ module Cucumber
8
9
  attr_reader :regexp_source, :location
9
10
 
10
11
  def initialize(regexp_source, location)
11
- @regexp_source, @location = regexp_source, location
12
+ @regexp_source = regexp_source
13
+ @location = location
12
14
  end
13
15
 
14
- def eql?(o)
15
- regexp_source == o.regexp_source && location == o.location
16
+ def eql?(other)
17
+ regexp_source == other.regexp_source && location == other.location
16
18
  end
17
19
 
18
20
  def hash
19
- regexp_source.hash + 31*location.to_s.hash
21
+ regexp_source.hash + 31 * location.to_s.hash
20
22
  end
21
23
  end
22
24
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  class StepDefinitions
4
5
  def initialize(configuration = Configuration.default)
@@ -7,8 +8,8 @@ module Cucumber
7
8
  @support_code.load_files_from_paths(configuration.autoload_code_paths)
8
9
  end
9
10
 
10
- def to_json
11
- @support_code.step_definitions.map(&:to_hash).to_json
11
+ def to_json(obj = nil)
12
+ @support_code.step_definitions.map(&:to_hash).to_json(obj)
12
13
  end
13
14
  end
14
15
  end
@@ -1,24 +1,29 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/multiline_argument'
3
4
 
4
5
  module Cucumber
5
-
6
6
  # Represents the match found between a Test Step and its activation
7
7
  class StepMatch #:nodoc:
8
8
  attr_reader :step_definition, :step_arguments
9
9
 
10
10
  def initialize(step_definition, step_name, step_arguments)
11
11
  raise "step_arguments can't be nil (but it can be an empty array)" if step_arguments.nil?
12
- @step_definition, @name_to_match, @step_arguments = step_definition, step_name, step_arguments
12
+ @step_definition = step_definition
13
+ @name_to_match = step_name
14
+ @step_arguments = step_arguments
13
15
  end
14
16
 
15
17
  def args
16
- @step_arguments.map(&:value)
18
+ current_world = @step_definition.registry.current_world
19
+ @step_arguments.map do |arg|
20
+ arg.value(current_world)
21
+ end
17
22
  end
18
23
 
19
24
  def activate(test_step)
20
25
  test_step.with_action(@step_definition.location) do
21
- invoke(MultilineArgument.from_core(test_step.source.last.multiline_arg))
26
+ invoke(MultilineArgument.from_core(test_step.multiline_arg))
22
27
  end
23
28
  end
24
29
 
@@ -43,7 +48,7 @@ module Cucumber
43
48
  #
44
49
  # lambda { |param| "[#{param}]" }
45
50
  #
46
- def format_args(format = lambda{|a| a}, &proc)
51
+ def format_args(format = ->(a) { a }, &proc)
47
52
  replace_arguments(@name_to_match, @step_arguments, format, &proc)
48
53
  end
49
54
 
@@ -63,7 +68,7 @@ module Cucumber
63
68
  @step_definition.expression.source.to_s.unpack('U*').length
64
69
  end
65
70
 
66
- def replace_arguments(string, step_arguments, format, &proc)
71
+ def replace_arguments(string, step_arguments, format)
67
72
  s = string.dup
68
73
  offset = past_offset = 0
69
74
  step_arguments.each do |step_argument|
@@ -71,8 +76,8 @@ module Cucumber
71
76
  next if group.value.nil? || group.start < past_offset
72
77
 
73
78
  replacement = if block_given?
74
- proc.call(group.value)
75
- elsif Proc === format
79
+ yield(group.value)
80
+ elsif Proc == format.class
76
81
  format.call(group.value)
77
82
  else
78
83
  format % group.value
@@ -90,14 +95,15 @@ module Cucumber
90
95
  end
91
96
 
92
97
  private
98
+
93
99
  def deep_clone_args
94
- Marshal.load( Marshal.dump( args ) )
100
+ Marshal.load(Marshal.dump(args))
95
101
  end
96
102
  end
97
103
 
98
104
  class SkippingStepMatch
99
105
  def activate(test_step)
100
- return test_step.with_action { raise Core::Test::Result::Skipped.new }
106
+ test_step.with_action { raise Core::Test::Result::Skipped }
101
107
  end
102
108
  end
103
109
 
@@ -119,8 +125,7 @@ module Cucumber
119
125
  end
120
126
 
121
127
  def file_colon_line
122
- raise "No file:line for #{@step}" unless @step.file_colon_line
123
- @step.file_colon_line
128
+ location.to_s
124
129
  end
125
130
 
126
131
  def backtrace_line
@@ -128,7 +133,7 @@ module Cucumber
128
133
  end
129
134
 
130
135
  def text_length
131
- @step.text_length
136
+ @step.text.length
132
137
  end
133
138
 
134
139
  def step_arguments
@@ -137,20 +142,17 @@ module Cucumber
137
142
 
138
143
  def activate(test_step)
139
144
  # noop
140
- return test_step
145
+ test_step
141
146
  end
142
147
  end
143
148
 
144
149
  class AmbiguousStepMatch
145
-
146
150
  def initialize(error)
147
151
  @error = error
148
152
  end
149
153
 
150
154
  def activate(test_step)
151
- return test_step.with_action { raise @error }
155
+ test_step.with_action { raise @error }
152
156
  end
153
-
154
157
  end
155
-
156
158
  end