cucumber 2.0.2 → 2.1.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -6
  3. data/CONTRIBUTING.md +3 -1
  4. data/Gemfile +1 -1
  5. data/History.md +17 -0
  6. data/README.md +3 -3
  7. data/bin/cucumber +1 -2
  8. data/cucumber.gemspec +2 -2
  9. data/examples/i18n/ht/features/adisyon.feature +7 -7
  10. data/features/docs/api/listen_for_events.feature +58 -0
  11. data/features/docs/cli/fail_fast.feature +46 -0
  12. data/features/docs/defining_steps/nested_steps_with_second_arg.feature +3 -22
  13. data/features/docs/extending_cucumber/custom_formatter.feature +40 -4
  14. data/features/docs/gherkin/doc_strings.feature +5 -5
  15. data/features/docs/gherkin/language_help.feature +15 -15
  16. data/features/docs/gherkin/using_descriptions.feature +0 -5
  17. data/lib/cucumber/cli/configuration.rb +10 -92
  18. data/lib/cucumber/cli/main.rb +1 -7
  19. data/lib/cucumber/cli/options.rb +47 -12
  20. data/lib/cucumber/configuration.rb +195 -7
  21. data/lib/cucumber/events.rb +20 -0
  22. data/lib/cucumber/events/after_test_case.rb +25 -0
  23. data/lib/cucumber/events/after_test_step.rb +30 -0
  24. data/lib/cucumber/events/before_test_case.rb +18 -0
  25. data/lib/cucumber/events/before_test_step.rb +23 -0
  26. data/lib/cucumber/events/bus.rb +86 -0
  27. data/lib/cucumber/events/step_match.rb +23 -0
  28. data/lib/cucumber/filters/prepare_world.rb +2 -2
  29. data/lib/cucumber/formatter/backtrace_filter.rb +9 -8
  30. data/lib/cucumber/formatter/console.rb +1 -1
  31. data/lib/cucumber/formatter/event_bus_report.rb +37 -0
  32. data/lib/cucumber/formatter/fail_fast.rb +18 -0
  33. data/lib/cucumber/formatter/html.rb +1 -1
  34. data/lib/cucumber/formatter/io.rb +3 -1
  35. data/lib/cucumber/formatter/json.rb +19 -1
  36. data/lib/cucumber/formatter/legacy_api/adapter.rb +5 -13
  37. data/lib/cucumber/formatter/legacy_api/ast.rb +2 -2
  38. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +3 -1
  39. data/lib/cucumber/formatter/pretty.rb +5 -7
  40. data/lib/cucumber/formatter/progress.rb +1 -1
  41. data/lib/cucumber/formatter/rerun.rb +1 -1
  42. data/lib/cucumber/formatter/steps.rb +1 -1
  43. data/lib/cucumber/formatter/usage.rb +12 -8
  44. data/lib/cucumber/gherkin/data_table_parser.rb +23 -0
  45. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +99 -0
  46. data/lib/cucumber/gherkin/formatter/argument.rb +17 -0
  47. data/lib/cucumber/gherkin/formatter/escaping.rb +17 -0
  48. data/lib/cucumber/gherkin/formatter/hashable.rb +27 -0
  49. data/lib/cucumber/gherkin/i18n.rb +15 -0
  50. data/lib/cucumber/gherkin/steps_parser.rb +41 -0
  51. data/lib/cucumber/language_support/language_methods.rb +6 -5
  52. data/lib/cucumber/multiline_argument.rb +0 -3
  53. data/lib/cucumber/multiline_argument/data_table.rb +6 -5
  54. data/lib/cucumber/multiline_argument/doc_string.rb +1 -2
  55. data/lib/cucumber/platform.rb +1 -1
  56. data/lib/cucumber/rake/task.rb +2 -2
  57. data/lib/cucumber/rb_support/rb_hook.rb +1 -6
  58. data/lib/cucumber/rb_support/rb_language.rb +15 -5
  59. data/lib/cucumber/rb_support/rb_step_definition.rb +11 -17
  60. data/lib/cucumber/rb_support/rb_world.rb +6 -4
  61. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +2 -2
  62. data/lib/cucumber/runtime.rb +36 -16
  63. data/lib/cucumber/runtime/support_code.rb +19 -15
  64. data/lib/cucumber/step_definition_light.rb +5 -5
  65. data/lib/cucumber/step_definitions.rb +2 -2
  66. data/lib/cucumber/step_match.rb +11 -2
  67. data/lib/cucumber/wire_support/wire_protocol/requests.rb +2 -2
  68. data/lib/cucumber/wire_support/wire_step_definition.rb +4 -2
  69. data/{spec → lib}/simplecov_setup.rb +0 -0
  70. data/spec/cucumber/cli/configuration_spec.rb +2 -104
  71. data/spec/cucumber/cli/main_spec.rb +0 -22
  72. data/spec/cucumber/cli/options_spec.rb +3 -1
  73. data/spec/cucumber/configuration_spec.rb +123 -0
  74. data/spec/cucumber/events/bus_spec.rb +94 -0
  75. data/spec/cucumber/formatter/event_bus_report_spec.rb +79 -0
  76. data/spec/cucumber/formatter/fail_fast_spec.rb +88 -0
  77. data/spec/cucumber/formatter/json_spec.rb +43 -1
  78. data/spec/cucumber/formatter/rerun_spec.rb +4 -20
  79. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +29 -0
  80. data/spec/cucumber/runtime_spec.rb +2 -28
  81. data/spec/spec_helper.rb +1 -1
  82. data/spec/support/standard_step_actions.rb +18 -0
  83. metadata +37 -13
  84. data/lib/cucumber/core_ext/proc.rb +0 -36
  85. data/spec/cucumber/core_ext/proc_spec.rb +0 -69
@@ -1,5 +1,6 @@
1
1
  require 'forwardable'
2
- require 'gherkin/formatter/escaping'
2
+ require 'cucumber/gherkin/data_table_parser'
3
+ require 'cucumber/gherkin/formatter/escaping'
3
4
  require 'cucumber/core/ast/describes_itself'
4
5
 
5
6
  module Cucumber
@@ -37,7 +38,7 @@ module Cucumber
37
38
  @rows = []
38
39
  end
39
40
 
40
- def row(row, line_number)
41
+ def row(row)
41
42
  @rows << row
42
43
  end
43
44
 
@@ -73,8 +74,8 @@ module Cucumber
73
74
  private
74
75
  def parse(text, location = Core::Ast::Location.of_caller)
75
76
  builder = Builder.new
76
- lexer = Gherkin::Lexer::I18nLexer.new(builder)
77
- lexer.scan(text)
77
+ parser = Cucumber::Gherkin::DataTableParser.new(builder)
78
+ parser.parse(text)
78
79
  from_array(builder.rows, location)
79
80
  end
80
81
 
@@ -639,7 +640,7 @@ module Cucumber
639
640
  # Represents a row of cells or columns of cells
640
641
  class Cells #:nodoc:
641
642
  include Enumerable
642
- include Gherkin::Formatter::Escaping
643
+ include Cucumber::Gherkin::Formatter::Escaping
643
644
 
644
645
  attr_reader :exception
645
646
 
@@ -2,9 +2,8 @@ module Cucumber
2
2
  module MultilineArgument
3
3
  class DocString < SimpleDelegator
4
4
  def append_to(array)
5
- array << self
5
+ array << self.to_s
6
6
  end
7
7
  end
8
8
  end
9
9
  end
10
-
@@ -4,7 +4,7 @@ require 'rbconfig'
4
4
 
5
5
  module Cucumber
6
6
  unless defined?(Cucumber::VERSION)
7
- VERSION = '2.0.2'
7
+ VERSION = '2.1.0'
8
8
  BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
9
9
  LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
10
10
  JRUBY = defined?(JRUBY_VERSION)
@@ -1,5 +1,5 @@
1
1
  require 'cucumber/platform'
2
- require 'gherkin/formatter/ansi_escapes'
2
+ require 'cucumber/gherkin/formatter/ansi_escapes'
3
3
  begin
4
4
  # Support Rake > 0.8.7
5
5
  require 'rake/dsl_definition'
@@ -25,7 +25,7 @@ module Cucumber
25
25
  #
26
26
  # See the attributes for additional configuration possibilities.
27
27
  class Task
28
- include Gherkin::Formatter::AnsiEscapes
28
+ include Cucumber::Gherkin::Formatter::AnsiEscapes
29
29
  include ::Rake::DSL if defined?(::Rake::DSL)
30
30
 
31
31
  class InProcessCucumberRunner #:nodoc:
@@ -8,12 +8,7 @@ module Cucumber
8
8
  @rb_language = rb_language
9
9
  @tag_expressions = tag_expressions
10
10
  @proc = proc
11
- file, line = @proc.file_colon_line.match(/(.*):(\d+)/)[1..2]
12
- @location = Core::Ast::Location.new(file, line)
13
- end
14
-
15
- def source_location
16
- @proc.source_location
11
+ @location = Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
17
12
  end
18
13
 
19
14
  def invoke(pseudo_method, arguments, &block)
@@ -5,6 +5,7 @@ require 'cucumber/rb_support/rb_step_definition'
5
5
  require 'cucumber/rb_support/rb_hook'
6
6
  require 'cucumber/rb_support/rb_transform'
7
7
  require 'cucumber/rb_support/snippet'
8
+ require 'cucumber/gherkin/i18n'
8
9
  require 'multi_test'
9
10
 
10
11
  module Cucumber
@@ -21,8 +22,8 @@ module Cucumber
21
22
  def initialize(first_proc, second_proc)
22
23
  message = "You can only pass a proc to #World once, but it's happening\n"
23
24
  message << "in 2 places:\n\n"
24
- message << first_proc.backtrace_line('World') << "\n"
25
- message << second_proc.backtrace_line('World') << "\n\n"
25
+ message << RbSupport.backtrace_line(first_proc, 'World') << "\n"
26
+ message << RbSupport.backtrace_line(second_proc, 'World') << "\n\n"
26
27
  message << "Use Ruby modules instead to extend your worlds. See the Cucumber::RbSupport::RbDsl#World RDoc\n"
27
28
  message << "or http://wiki.github.com/cucumber/cucumber/a-whole-new-world.\n\n"
28
29
  super(message)
@@ -35,8 +36,12 @@ module Cucumber
35
36
  attr_reader :current_world,
36
37
  :step_definitions
37
38
 
38
- Gherkin::I18n.code_keywords.each do |adverb|
39
- RbDsl.alias_adverb(adverb)
39
+ all_keywords = ::Gherkin3::DIALECTS.keys.map do |dialect_name|
40
+ dialect = ::Gherkin3::Dialect.for(dialect_name)
41
+ dialect.given_keywords + dialect.when_keywords + dialect.then_keywords + dialect.and_keywords + dialect.but_keywords
42
+ end
43
+ Cucumber::Gherkin::I18n.code_keywords_for(all_keywords.flatten.uniq.sort).each do |adverb|
44
+ RbDsl.alias_adverb(adverb.strip)
40
45
  end
41
46
 
42
47
  def initialize(runtime)
@@ -132,7 +137,7 @@ module Cucumber
132
137
  raise NilWorld.new
133
138
  rescue NilWorld => e
134
139
  e.backtrace.clear
135
- e.backtrace.push(proc.backtrace_line("World"))
140
+ e.backtrace.push(RbSupport.backtrace_line(proc, "World"))
136
141
  raise e
137
142
  end
138
143
  else
@@ -156,5 +161,10 @@ module Cucumber
156
161
  end
157
162
  end
158
163
  end
164
+
165
+ def self.backtrace_line(proc, name)
166
+ location = Cucumber::Core::Ast::Location.from_source_location(*proc.source_location)
167
+ "#{location.to_s}:in `#{name}'"
168
+ end
159
169
  end
160
170
  end
@@ -1,6 +1,5 @@
1
1
  require 'cucumber/step_match'
2
2
  require 'cucumber/core_ext/string'
3
- require 'cucumber/core_ext/proc'
4
3
  require 'cucumber/rb_support/regexp_argument_matcher'
5
4
 
6
5
  module Cucumber
@@ -51,17 +50,8 @@ module Cucumber
51
50
  end
52
51
 
53
52
  def patch_location_onto(block)
54
- file, line = caller[5].match(/(.*):(\d+)/)[1..2]
55
- file = File.expand_path(file)
56
- pwd = File.expand_path(Dir.pwd)
57
- pwd.force_encoding(file.encoding)
58
- if file.index(pwd)
59
- file = file[pwd.length+1..-1]
60
- elsif file =~ /.*\/gems\/(.*\.rb)$/
61
- file = $1
62
- end
63
- location = Core::Ast::Location.new(file, line)
64
- block.define_singleton_method(:file_colon_line) { location.to_s }
53
+ location = Core::Ast::Location.of_caller(5)
54
+ block.define_singleton_method(:source_location) { [location.file, location.line] }
65
55
  block
66
56
  end
67
57
 
@@ -81,7 +71,7 @@ module Cucumber
81
71
 
82
72
  def initialize(rb_language, regexp, proc)
83
73
  @rb_language, @regexp, @proc = rb_language, regexp, proc
84
- @rb_language.available_step_definition(regexp_source, file_colon_line)
74
+ @rb_language.available_step_definition(regexp_source, location)
85
75
  end
86
76
 
87
77
  def regexp_source
@@ -102,7 +92,7 @@ module Cucumber
102
92
 
103
93
  def arguments_from(step_name)
104
94
  args = RegexpArgumentMatcher.arguments_from(@regexp, step_name)
105
- @rb_language.invoked_step_definition(regexp_source, file_colon_line) if args
95
+ @rb_language.invoked_step_definition(regexp_source, location) if args
106
96
  args
107
97
  end
108
98
 
@@ -117,20 +107,24 @@ module Cucumber
117
107
  end
118
108
 
119
109
  def backtrace_line
120
- @proc.backtrace_line(regexp_source)
110
+ "#{location.to_s}:in `#{regexp_source}'"
121
111
  end
122
112
 
123
113
  def file_colon_line
124
114
  case @proc
125
115
  when Proc
126
- @proc.file_colon_line
116
+ location.to_s
127
117
  when Symbol
128
118
  ":#{@proc}"
129
119
  end
130
120
  end
131
121
 
122
+ def location
123
+ @location ||= Cucumber::Core::Ast::Location.from_source_location(*@proc.source_location)
124
+ end
125
+
132
126
  def file
133
- @file ||= file_colon_line.split(':')[0]
127
+ @file ||= location.file
134
128
  end
135
129
  end
136
130
  end
@@ -1,4 +1,4 @@
1
- require 'gherkin/formatter/ansi_escapes'
1
+ require 'cucumber/gherkin/formatter/ansi_escapes'
2
2
 
3
3
  module Cucumber
4
4
  module RbSupport
@@ -9,7 +9,7 @@ module Cucumber
9
9
  module RbWorld
10
10
 
11
11
  # @private
12
- AnsiEscapes = Gherkin::Formatter::AnsiEscapes
12
+ AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
13
13
 
14
14
  # Call a Transform with a string from another Transform definition
15
15
  def Transform(arg)
@@ -48,7 +48,8 @@ module Cucumber
48
48
  # }
49
49
  # @param [String] steps_text The Gherkin snippet to run
50
50
  def steps(steps_text)
51
- @__cucumber_runtime.invoke_dynamic_steps(steps_text, @__natural_language, caller[0])
51
+ location = Core::Ast::Location.of_caller
52
+ @__cucumber_runtime.invoke_dynamic_steps(steps_text, @__natural_language, location)
52
53
  end
53
54
 
54
55
  # Parse Gherkin into a {Cucumber::Ast::Table} object.
@@ -74,6 +75,7 @@ module Cucumber
74
75
  # puts "this is ruby code"
75
76
  # %}, 'ruby')
76
77
  def doc_string(string_without_triple_quotes, content_type='', line_offset=0)
78
+ STDERR.puts AnsiEscapes.failed + "WARNING: #doc_string is deprecated. Just pass a regular String instead:" + caller[0] + AnsiEscapes.reset
77
79
  # TODO: rename this method to multiline_string
78
80
  @__cucumber_runtime.doc_string(string_without_triple_quotes, content_type, line_offset)
79
81
  end
@@ -89,7 +91,7 @@ module Cucumber
89
91
  # @note Cucumber might surprise you with the behaviour of this method. Instead
90
92
  # of sending the output directly to STDOUT, Cucumber will intercept and cache
91
93
  # the message until the current step has finished, and then display it.
92
- #
94
+ #
93
95
  # If you'd prefer to see the message immediately, call {Kernel.puts} instead.
94
96
  def puts(*messages)
95
97
  @__cucumber_runtime.puts(*messages)
@@ -1,4 +1,4 @@
1
- require 'gherkin/formatter/argument'
1
+ require 'cucumber/gherkin/formatter/argument'
2
2
 
3
3
  module Cucumber
4
4
  module RbSupport
@@ -10,7 +10,7 @@ module Cucumber
10
10
  match.captures.map do |val|
11
11
  n += 1
12
12
  offset = match.offset(n)[0]
13
- Gherkin::Formatter::Argument.new(offset, val)
13
+ Cucumber::Gherkin::Formatter::Argument.new(offset, val)
14
14
  end
15
15
  else
16
16
  nil
@@ -2,8 +2,6 @@
2
2
  require 'fileutils'
3
3
  require 'multi_json'
4
4
  require 'multi_test'
5
- require 'gherkin/rubify'
6
- require 'gherkin/i18n'
7
5
  require 'cucumber/configuration'
8
6
  require 'cucumber/load_path'
9
7
  require 'cucumber/language_support/language_methods'
@@ -11,6 +9,8 @@ require 'cucumber/formatter/duration'
11
9
  require 'cucumber/file_specs'
12
10
  require 'cucumber/filters'
13
11
  require 'cucumber/formatter/fanout'
12
+ require 'cucumber/formatter/event_bus_report'
13
+ require 'cucumber/gherkin/i18n'
14
14
 
15
15
  module Cucumber
16
16
  module FixRuby21Bug9285
@@ -46,14 +46,14 @@ module Cucumber
46
46
  include Runtime::UserInterface
47
47
 
48
48
  def initialize(configuration = Configuration.default)
49
- @configuration = Configuration.parse(configuration)
49
+ @configuration = Configuration.new(configuration)
50
50
  @support_code = SupportCode.new(self, @configuration)
51
51
  @results = Formatter::LegacyApi::Results.new
52
52
  end
53
53
 
54
54
  # Allows you to take an existing runtime and change its configuration
55
55
  def configure(new_configuration)
56
- @configuration = Configuration.parse(new_configuration)
56
+ @configuration = Configuration.new(new_configuration)
57
57
  @support_code.configure(@configuration)
58
58
  end
59
59
 
@@ -86,16 +86,12 @@ module Cucumber
86
86
  @results.steps(status)
87
87
  end
88
88
 
89
- def step_match(step_name, name_to_report=nil) #:nodoc:
90
- @support_code.step_match(step_name, name_to_report)
91
- end
92
-
93
89
  def unmatched_step_definitions
94
90
  @support_code.unmatched_step_definitions
95
91
  end
96
92
 
97
93
  def snippet_text(step_keyword, step_name, multiline_arg) #:nodoc:
98
- @support_code.snippet_text(::Gherkin::I18n.code_keyword_for(step_keyword), step_name, multiline_arg)
94
+ @support_code.snippet_text(Cucumber::Gherkin::I18n.code_keyword_for(step_keyword).strip, step_name, multiline_arg)
99
95
  end
100
96
 
101
97
  def begin_scenario(scenario)
@@ -180,26 +176,50 @@ module Cucumber
180
176
  require 'cucumber/formatter/legacy_api/runtime_facade'
181
177
  require 'cucumber/formatter/legacy_api/results'
182
178
  require 'cucumber/formatter/ignore_missing_messages'
179
+ require 'cucumber/formatter/fail_fast'
183
180
  require 'cucumber/core/report/summary'
184
181
  def report
185
- @report ||= Formatter::Fanout.new([summary_report] + formatters)
182
+ return @report if @report
183
+ reports = [summary_report, event_bus_report] + formatters
184
+ reports << fail_fast_report if @configuration.fail_fast?
185
+ @report ||= Formatter::Fanout.new(reports)
186
186
  end
187
187
 
188
188
  def summary_report
189
189
  @summary_report ||= Core::Report::Summary.new
190
190
  end
191
191
 
192
+ def event_bus_report
193
+ @event_bus_report ||= Formatter::EventBusReport.new(@configuration)
194
+ end
195
+
196
+ def fail_fast_report
197
+ @fail_fast_report ||= Formatter::FailFast.new(@configuration)
198
+ end
199
+
192
200
  def formatters
193
201
  @formatters ||= @configuration.formatter_factories { |factory, path_or_io, options|
194
- results = Formatter::LegacyApi::Results.new
195
- runtime_facade = Formatter::LegacyApi::RuntimeFacade.new(results, @support_code, @configuration)
196
- formatter = factory.new(runtime_facade, path_or_io, options)
197
- Formatter::LegacyApi::Adapter.new(
198
- Formatter::IgnoreMissingMessages.new(formatter),
199
- results, @support_code, @configuration)
202
+ create_formatter(factory, path_or_io, options)
200
203
  }
201
204
  end
202
205
 
206
+ def create_formatter(factory, path_or_io, options)
207
+ if !legacy_formatter?(factory)
208
+ out_stream = Cucumber::Formatter::Io.ensure_io(path_or_io)
209
+ return factory.new(@configuration.with_options(out_stream: out_stream))
210
+ end
211
+ results = Formatter::LegacyApi::Results.new
212
+ runtime_facade = Formatter::LegacyApi::RuntimeFacade.new(results, @support_code, @configuration)
213
+ formatter = factory.new(runtime_facade, path_or_io, options)
214
+ Formatter::LegacyApi::Adapter.new(
215
+ Formatter::IgnoreMissingMessages.new(formatter),
216
+ results, @support_code, @configuration)
217
+ end
218
+
219
+ def legacy_formatter?(factory)
220
+ factory.instance_method(:initialize).arity > 1
221
+ end
222
+
203
223
  def failure?
204
224
  if @configuration.wip?
205
225
  summary_report.test_cases.total_passed > 0
@@ -3,6 +3,8 @@ require 'cucumber/runtime/for_programming_languages'
3
3
  require 'cucumber/runtime/step_hooks'
4
4
  require 'cucumber/runtime/before_hooks'
5
5
  require 'cucumber/runtime/after_hooks'
6
+ require 'cucumber/events/step_match'
7
+ require 'cucumber/gherkin/steps_parser'
6
8
 
7
9
  module Cucumber
8
10
 
@@ -12,28 +14,29 @@ module Cucumber
12
14
 
13
15
  require 'forwardable'
14
16
  class StepInvoker
15
- include Gherkin::Rubify
16
17
 
17
18
  def initialize(support_code)
18
19
  @support_code = support_code
19
20
  end
20
21
 
21
- def uri(uri)
22
+ def steps(steps)
23
+ steps.each { |step| step(step) }
22
24
  end
23
25
 
24
26
  def step(step)
25
27
  location = Core::Ast::Location.of_caller
26
- @support_code.invoke_dynamic_step(step.name, multiline_arg(step, location))
27
- end
28
-
29
- def eof
28
+ @support_code.invoke_dynamic_step(step[:text], multiline_arg(step, location))
30
29
  end
31
30
 
32
31
  def multiline_arg(step, location)
33
- if argument = step.doc_string
34
- MultilineArgument.doc_string(argument.value, argument.content_type, location.on_line(argument.line_range))
32
+ if argument = step[:argument]
33
+ if argument[:type] == :DocString
34
+ MultilineArgument.doc_string(argument[:content], argument[:content_type], location)
35
+ else
36
+ MultilineArgument::DataTable.from(argument[:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
37
+ end
35
38
  else
36
- MultilineArgument.from(step.rows, location)
39
+ MultilineArgument.from(nil)
37
40
  end
38
41
  end
39
42
  end
@@ -41,7 +44,7 @@ module Cucumber
41
44
  include Constantize
42
45
 
43
46
  def initialize(user_interface, configuration={})
44
- @configuration = Configuration.parse(configuration)
47
+ @configuration = Configuration.new(configuration)
45
48
  @runtime_facade = Runtime::ForProgrammingLanguages.new(self, user_interface)
46
49
  @unsupported_programming_languages = []
47
50
  @programming_languages = []
@@ -49,7 +52,7 @@ module Cucumber
49
52
  end
50
53
 
51
54
  def configure(new_configuration)
52
- @configuration = Configuration.parse(new_configuration)
55
+ @configuration = Configuration.new(new_configuration)
53
56
  end
54
57
 
55
58
  # Invokes a series of steps +steps_text+. Example:
@@ -58,10 +61,9 @@ module Cucumber
58
61
  # Given I have 8 cukes in my belly
59
62
  # Then I should not be thirsty
60
63
  # })
61
- def invoke_dynamic_steps(steps_text, i18n, file_colon_line)
62
- file, line = file_colon_line.split(':')
63
- parser = Gherkin::Parser::Parser.new(StepInvoker.new(self), true, 'steps', false, i18n.iso_code)
64
- parser.parse(steps_text, file, line.to_i)
64
+ def invoke_dynamic_steps(steps_text, i18n, location)
65
+ parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), i18n.iso_code)
66
+ parser.parse(steps_text)
65
67
  end
66
68
 
67
69
  # @api private
@@ -139,6 +141,8 @@ module Cucumber
139
141
  rescue Cucumber::Undefined
140
142
  return NoStepMatch.new(test_step.source.last, test_step.name)
141
143
  end
144
+ # TODO: move this onto Filters::ActivateSteps
145
+ @configuration.notify Events::StepMatch.new(test_step, match)
142
146
  if @configuration.dry_run?
143
147
  return SkippingStepMatch.new
144
148
  end