cucumber 3.0.2 → 4.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 (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