cucumber 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. data/.rspec +1 -1
  2. data/LICENSE +1 -1
  3. data/Rakefile +5 -51
  4. data/bin/cucumber +7 -1
  5. data/cucumber.gemspec +463 -679
  6. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -1
  7. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +4 -7
  9. data/examples/i18n/ru/features/division.feature +2 -2
  10. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +3 -3
  11. data/examples/sinatra/features/support/env.rb +2 -5
  12. data/examples/v8/features/fibonacci.feature +1 -1
  13. data/examples/watir/features/step_definitions/search_steps.rb +1 -1
  14. data/features/background.feature +284 -95
  15. data/features/custom_formatter.feature +3 -73
  16. data/features/json_formatter.feature +160 -245
  17. data/features/step_definitions/cucumber_steps.rb +7 -153
  18. data/features/support/env.rb +18 -140
  19. data/fixtures/junit/features/pending.feature +3 -1
  20. data/fixtures/self_test/features/support/env.rb +8 -0
  21. data/fixtures/tickets/features.html +1 -1
  22. data/gem_tasks/examples.rake +1 -1
  23. data/lib/cucumber.rb +12 -0
  24. data/lib/cucumber/ast.rb +1 -1
  25. data/lib/cucumber/ast/background.rb +21 -5
  26. data/lib/cucumber/ast/examples.rb +12 -4
  27. data/lib/cucumber/ast/feature.rb +13 -5
  28. data/lib/cucumber/ast/feature_element.rb +9 -4
  29. data/lib/cucumber/ast/outline_table.rb +4 -4
  30. data/lib/cucumber/ast/scenario.rb +7 -5
  31. data/lib/cucumber/ast/scenario_outline.rb +23 -15
  32. data/lib/cucumber/ast/step.rb +5 -0
  33. data/lib/cucumber/ast/step_invocation.rb +21 -15
  34. data/lib/cucumber/ast/table.rb +14 -8
  35. data/lib/cucumber/ast/tree_walker.rb +10 -48
  36. data/lib/cucumber/cli/configuration.rb +33 -8
  37. data/lib/cucumber/cli/main.rb +20 -35
  38. data/lib/cucumber/cli/options.rb +8 -7
  39. data/lib/cucumber/cli/profile_loader.rb +2 -0
  40. data/lib/cucumber/core_ext/proc.rb +2 -1
  41. data/lib/cucumber/feature_file.rb +47 -15
  42. data/lib/cucumber/formatter/ansicolor.rb +3 -5
  43. data/lib/cucumber/formatter/console.rb +27 -23
  44. data/lib/cucumber/formatter/cucumber.css +34 -17
  45. data/lib/cucumber/formatter/cucumber.sass +173 -182
  46. data/lib/cucumber/formatter/html.rb +46 -11
  47. data/lib/cucumber/formatter/io.rb +2 -4
  48. data/lib/cucumber/formatter/json.rb +15 -152
  49. data/lib/cucumber/formatter/json_pretty.rb +5 -6
  50. data/lib/cucumber/formatter/junit.rb +28 -22
  51. data/lib/cucumber/formatter/pdf.rb +6 -6
  52. data/lib/cucumber/formatter/pretty.rb +5 -5
  53. data/lib/cucumber/formatter/rerun.rb +22 -11
  54. data/lib/cucumber/formatter/unicode.rb +41 -20
  55. data/lib/cucumber/js_support/js_dsl.js +4 -4
  56. data/lib/cucumber/js_support/js_language.rb +9 -5
  57. data/lib/cucumber/js_support/js_snippets.rb +2 -2
  58. data/lib/cucumber/language_support.rb +2 -2
  59. data/lib/cucumber/parser/gherkin_builder.rb +35 -30
  60. data/lib/cucumber/platform.rb +8 -8
  61. data/lib/cucumber/py_support/py_language.rb +2 -2
  62. data/lib/cucumber/rake/task.rb +80 -31
  63. data/lib/cucumber/rb_support/rb_dsl.rb +1 -0
  64. data/lib/cucumber/rb_support/rb_language.rb +10 -8
  65. data/lib/cucumber/rb_support/rb_step_definition.rb +8 -0
  66. data/lib/cucumber/rb_support/rb_transform.rb +17 -0
  67. data/lib/cucumber/rb_support/rb_world.rb +26 -18
  68. data/lib/cucumber/rspec/doubles.rb +3 -3
  69. data/lib/cucumber/step_match.rb +6 -2
  70. data/lib/cucumber/step_mother.rb +6 -427
  71. data/lib/cucumber/wire_support/configuration.rb +4 -1
  72. data/lib/cucumber/wire_support/wire_language.rb +3 -10
  73. data/spec/cucumber/ast/background_spec.rb +68 -6
  74. data/spec/cucumber/ast/feature_factory.rb +5 -4
  75. data/spec/cucumber/ast/feature_spec.rb +4 -4
  76. data/spec/cucumber/ast/outline_table_spec.rb +1 -1
  77. data/spec/cucumber/ast/scenario_outline_spec.rb +15 -11
  78. data/spec/cucumber/ast/scenario_spec.rb +4 -4
  79. data/spec/cucumber/ast/step_spec.rb +3 -3
  80. data/spec/cucumber/ast/table_spec.rb +38 -2
  81. data/spec/cucumber/ast/tree_walker_spec.rb +2 -2
  82. data/spec/cucumber/broadcaster_spec.rb +1 -1
  83. data/spec/cucumber/cli/configuration_spec.rb +32 -6
  84. data/spec/cucumber/cli/drb_client_spec.rb +2 -3
  85. data/spec/cucumber/cli/main_spec.rb +43 -43
  86. data/spec/cucumber/cli/options_spec.rb +28 -1
  87. data/spec/cucumber/cli/profile_loader_spec.rb +1 -1
  88. data/spec/cucumber/core_ext/proc_spec.rb +1 -1
  89. data/spec/cucumber/formatter/ansicolor_spec.rb +1 -1
  90. data/spec/cucumber/formatter/duration_spec.rb +1 -1
  91. data/spec/cucumber/formatter/html_spec.rb +3 -5
  92. data/spec/cucumber/formatter/junit_spec.rb +16 -2
  93. data/spec/cucumber/formatter/progress_spec.rb +1 -1
  94. data/spec/cucumber/formatter/spec_helper.rb +11 -12
  95. data/spec/cucumber/rb_support/rb_language_spec.rb +241 -28
  96. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +33 -28
  97. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +1 -1
  98. data/spec/cucumber/step_match_spec.rb +11 -9
  99. data/spec/cucumber/wire_support/configuration_spec.rb +1 -1
  100. data/spec/cucumber/wire_support/connection_spec.rb +1 -1
  101. data/spec/cucumber/wire_support/wire_exception_spec.rb +1 -1
  102. data/spec/cucumber/wire_support/wire_language_spec.rb +1 -1
  103. data/spec/cucumber/wire_support/wire_packet_spec.rb +1 -1
  104. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +1 -1
  105. data/spec/cucumber/world/pending_spec.rb +2 -2
  106. data/spec/spec_helper.rb +13 -20
  107. metadata +11 -222
  108. data/.gitignore +0 -20
  109. data/Caliper.yml +0 -4
  110. data/History.txt +0 -1552
  111. data/README.rdoc +0 -26
  112. data/VERSION.yml +0 -5
  113. data/examples/i18n/ro/features/suma.feature +0 -11
  114. data/features/announce.feature +0 -164
  115. data/features/around_hooks.feature +0 -232
  116. data/features/bug_371.feature +0 -32
  117. data/features/bug_464.feature +0 -16
  118. data/features/bug_475.feature +0 -42
  119. data/features/bug_585_tab_indentation.feature +0 -22
  120. data/features/bug_600.feature +0 -67
  121. data/features/call_steps_from_stepdefs.feature +0 -154
  122. data/features/cucumber_cli.feature +0 -591
  123. data/features/cucumber_cli_outlines.feature +0 -117
  124. data/features/default_snippets.feature +0 -42
  125. data/features/diffing.feature +0 -25
  126. data/features/drb_server_integration.feature +0 -174
  127. data/features/exception_in_after_block.feature +0 -127
  128. data/features/exception_in_after_step_block.feature +0 -104
  129. data/features/exception_in_before_block.feature +0 -98
  130. data/features/exclude_files.feature +0 -20
  131. data/features/expand.feature +0 -60
  132. data/features/html_formatter.feature +0 -8
  133. data/features/html_formatter/a.html +0 -582
  134. data/features/junit_formatter.feature +0 -88
  135. data/features/language_from_header.feature +0 -30
  136. data/features/language_help.feature +0 -78
  137. data/features/listener_debugger_formatter.feature +0 -42
  138. data/features/multiline_names.feature +0 -44
  139. data/features/negative_tagged_hooks.feature +0 -60
  140. data/features/post_configuration_hook.feature +0 -37
  141. data/features/profiles.feature +0 -126
  142. data/features/rake_task.feature +0 -152
  143. data/features/report_called_undefined_steps.feature +0 -34
  144. data/features/rerun_formatter.feature +0 -45
  145. data/features/simplest.feature +0 -11
  146. data/features/snippet.feature +0 -23
  147. data/features/snippets_when_using_star_keyword.feature +0 -36
  148. data/features/step_definitions/extra_steps.rb +0 -2
  149. data/features/step_definitions/simplest_steps.rb +0 -3
  150. data/features/step_definitions/wire_steps.rb +0 -32
  151. data/features/support/env.rb.simplest +0 -7
  152. data/features/support/fake_wire_server.rb +0 -77
  153. data/features/table_diffing.feature +0 -45
  154. data/features/table_mapping.feature +0 -34
  155. data/features/tag_logic.feature +0 -258
  156. data/features/transform.feature +0 -245
  157. data/features/unicode_table.feature +0 -35
  158. data/features/usage_and_stepdefs_formatter.feature +0 -169
  159. data/features/wire_protocol.feature +0 -332
  160. data/features/wire_protocol_table_diffing.feature +0 -119
  161. data/features/wire_protocol_tags.feature +0 -87
  162. data/features/wire_protocol_timeouts.feature +0 -63
  163. data/features/work_in_progress.feature +0 -156
  164. data/fixtures/json/features/pystring.feature +0 -8
  165. data/fixtures/self_test/features/background/background_tagged_before_on_outline.feature +0 -12
  166. data/fixtures/self_test/features/background/background_with_name.feature +0 -7
  167. data/fixtures/self_test/features/background/failing_background.feature +0 -12
  168. data/fixtures/self_test/features/background/failing_background_after_success.feature +0 -11
  169. data/fixtures/self_test/features/background/multiline_args_background.feature +0 -32
  170. data/fixtures/self_test/features/background/passing_background.feature +0 -10
  171. data/fixtures/self_test/features/background/pending_background.feature +0 -10
  172. data/fixtures/self_test/features/background/scenario_outline_failing_background.feature +0 -16
  173. data/fixtures/self_test/features/background/scenario_outline_passing_background.feature +0 -16
  174. data/gem_tasks/features.rake +0 -14
  175. data/gem_tasks/sdoc.rake +0 -12
  176. data/lib/cucumber/ast/py_string.rb +0 -80
  177. data/lib/cucumber/formatter/color_io.rb +0 -23
  178. data/lib/cucumber/formatter/tag_cloud.rb +0 -35
  179. data/spec/cucumber/ast/py_string_spec.rb +0 -40
  180. data/spec/cucumber/formatter/color_io_spec.rb +0 -29
  181. data/spec/cucumber/step_mother_spec.rb +0 -302
@@ -1,16 +1,24 @@
1
+ require 'cucumber/ast/names'
2
+
1
3
  module Cucumber
2
4
  module Ast
3
5
  class Examples #:nodoc:
6
+ include Names
4
7
  attr_writer :outline_table
5
8
 
6
- def initialize(comment, line, keyword, name, outline_table)
7
- @comment, @keyword, @name, @outline_table = comment, keyword, name, outline_table
9
+ def initialize(comment, line, keyword, title, description, outline_table)
10
+ @comment, @keyword, @title, @description, @outline_table = comment, keyword, title, description, outline_table
11
+ end
12
+
13
+ attr_reader :gherkin_statement
14
+ def gherkin_statement(statement=nil)
15
+ @gherkin_statement ||= statement
8
16
  end
9
17
 
10
18
  def accept(visitor)
11
19
  return if Cucumber.wants_to_quit
12
20
  visitor.visit_comment(@comment) unless @comment.empty?
13
- visitor.visit_examples_name(@keyword, @name)
21
+ visitor.visit_examples_name(@keyword, name)
14
22
  visitor.visit_outline_table(@outline_table)
15
23
  end
16
24
 
@@ -27,7 +35,7 @@ module Cucumber
27
35
  end
28
36
 
29
37
  def to_sexp
30
- sexp = [:examples, @keyword, @name]
38
+ sexp = [:examples, @keyword, name]
31
39
  comment = @comment.to_sexp
32
40
  sexp += [comment] if comment
33
41
  sexp += [@outline_table.to_sexp]
@@ -1,14 +1,22 @@
1
+ require 'cucumber/ast/names'
2
+
1
3
  module Cucumber
2
4
  module Ast
3
5
  # Represents the root node of a parsed feature.
4
6
  class Feature #:nodoc:
7
+ include Names
8
+
5
9
  attr_accessor :language
6
10
  attr_writer :features, :background
7
11
  attr_reader :file
8
- attr_reader :name
9
12
 
10
- def initialize(background, comment, tags, keyword, name, feature_elements)
11
- @background, @comment, @tags, @keyword, @name, @feature_elements = background, comment, tags, keyword, name.strip, feature_elements
13
+ def initialize(background, comment, tags, keyword, title, description, feature_elements)
14
+ @background, @comment, @tags, @keyword, @title, @description, @feature_elements = background, comment, tags, keyword, title, description, feature_elements
15
+ end
16
+
17
+ attr_reader :gherkin_statement
18
+ def gherkin_statement(statement=nil)
19
+ @gherkin_statement ||= statement
12
20
  end
13
21
 
14
22
  def init
@@ -38,7 +46,7 @@ module Cucumber
38
46
 
39
47
  def indented_name
40
48
  indent = ""
41
- @name.split("\n").map do |l|
49
+ name.split("\n").map do |l|
42
50
  s = "#{indent}#{l}"
43
51
  indent = " "
44
52
  s
@@ -84,7 +92,7 @@ module Cucumber
84
92
 
85
93
  def to_sexp
86
94
  init
87
- sexp = [:feature, @file, @name]
95
+ sexp = [:feature, @file, name]
88
96
  comment = @comment.to_sexp
89
97
  sexp += [comment] if comment
90
98
  tags = @tags.to_sexp
@@ -6,6 +6,11 @@ module Cucumber
6
6
  module FeatureElement #:nodoc:
7
7
  attr_accessor :feature
8
8
 
9
+ attr_reader :gherkin_statement, :raw_steps, :title, :description
10
+ def gherkin_statement(statement=nil)
11
+ @gherkin_statement ||= statement
12
+ end
13
+
9
14
  def add_step(step)
10
15
  @raw_steps << step
11
16
  end
@@ -27,10 +32,10 @@ module Cucumber
27
32
  end
28
33
 
29
34
  def name_line_lengths
30
- if @name.strip.empty?
35
+ if name.strip.empty?
31
36
  [Ast::Step::INDENT + @keyword.unpack('U*').length + ': '.length]
32
37
  else
33
- @name.split("\n").enum_for(:each_with_index).map do |line, line_number|
38
+ name.split("\n").enum_for(:each_with_index).map do |line, line_number|
34
39
  if line_number == 0
35
40
  Ast::Step::INDENT + @keyword.unpack('U*').length + ': '.length + line.unpack('U*').length
36
41
  else
@@ -41,10 +46,10 @@ module Cucumber
41
46
  end
42
47
 
43
48
  def matches_scenario_names?(scenario_name_regexps)
44
- scenario_name_regexps.detect{|name| name =~ @name}
49
+ scenario_name_regexps.detect{|n| n =~ name}
45
50
  end
46
51
 
47
- def backtrace_line(name = "#{@keyword}: #{@name}", line = @line)
52
+ def backtrace_line(name = "#{@keyword}: #{name}", line = @line)
48
53
  @feature.backtrace_line(name, line) if @feature
49
54
  end
50
55
 
@@ -21,7 +21,7 @@ module Cucumber
21
21
  return if Cucumber.wants_to_quit
22
22
  init
23
23
  cells_rows.each_with_index do |row, n|
24
- if(visitor.options[:expand])
24
+ if(visitor.configuration.expand?)
25
25
  row.accept(visitor)
26
26
  else
27
27
  visitor.visit_table_row(row)
@@ -96,7 +96,7 @@ module Cucumber
96
96
 
97
97
  def accept(visitor)
98
98
  return if Cucumber.wants_to_quit
99
- visitor.options[:expand] ? accept_expand(visitor) : accept_plain(visitor)
99
+ visitor.configuration.expand? ? accept_expand(visitor) : accept_plain(visitor)
100
100
  end
101
101
 
102
102
  def accept_plain(visitor)
@@ -108,7 +108,7 @@ module Cucumber
108
108
  else
109
109
  visitor.step_mother.with_hooks(self) do
110
110
  @step_invocations.each do |step_invocation|
111
- step_invocation.invoke(visitor.step_mother, visitor.options)
111
+ step_invocation.invoke(visitor.step_mother, visitor.configuration)
112
112
  @exception ||= step_invocation.reported_exception
113
113
  end
114
114
 
@@ -127,7 +127,7 @@ module Cucumber
127
127
  visitor.step_mother.with_hooks(self) do
128
128
  @table.visit_scenario_name(visitor, self)
129
129
  @step_invocations.each do |step_invocation|
130
- step_invocation.invoke(visitor.step_mother, visitor.options)
130
+ step_invocation.invoke(visitor.step_mother, visitor.configuration)
131
131
  @exception ||= step_invocation.reported_exception
132
132
  step_invocation.visit_step_result(visitor)
133
133
  end
@@ -1,11 +1,13 @@
1
1
  require 'cucumber/ast/feature_element'
2
+ require 'cucumber/ast/names'
2
3
 
3
4
  module Cucumber
4
5
  module Ast
5
6
  class Scenario #:nodoc:
6
7
  include FeatureElement
8
+ include Names
7
9
 
8
- attr_reader :name, :line
10
+ attr_reader :line
9
11
 
10
12
  class EmptyBackground
11
13
  def failed?
@@ -24,9 +26,9 @@ module Cucumber
24
26
  end
25
27
  end
26
28
 
27
- def initialize(background, comment, tags, line, keyword, name, raw_steps)
29
+ def initialize(background, comment, tags, line, keyword, title, description, raw_steps)
28
30
  @background = background || EmptyBackground.new
29
- @comment, @tags, @line, @keyword, @name, @raw_steps = comment, tags, line, keyword, name, raw_steps
31
+ @comment, @tags, @line, @keyword, @title, @description, @raw_steps = comment, tags, line, keyword, title, description, raw_steps
30
32
  @exception = @executed = nil
31
33
  end
32
34
 
@@ -45,7 +47,7 @@ module Cucumber
45
47
  with_visitor(visitor) do
46
48
  visitor.visit_comment(@comment) unless @comment.empty?
47
49
  visitor.visit_tags(@tags)
48
- visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
50
+ visitor.visit_scenario_name(@keyword, name, file_colon_line(@line), source_indent(first_line_length))
49
51
 
50
52
  skip_invoke! if @background.failed?
51
53
  visitor.step_mother.with_hooks(self, skip_hooks?) do
@@ -90,7 +92,7 @@ module Cucumber
90
92
  end
91
93
 
92
94
  def to_sexp
93
- sexp = [:scenario, @line, @keyword, @name]
95
+ sexp = [:scenario, @line, @keyword, name]
94
96
  comment = @comment.to_sexp
95
97
  sexp += [comment] if comment
96
98
  tags = @tags.to_sexp
@@ -1,10 +1,12 @@
1
+ require 'cucumber/ast/feature_element'
2
+ require 'cucumber/ast/names'
3
+
1
4
  module Cucumber
2
5
  module Ast
3
6
  class ScenarioOutline #:nodoc:
4
7
  include FeatureElement
8
+ include Names
5
9
 
6
- attr_reader :name
7
-
8
10
  module ExamplesArray #:nodoc:
9
11
  def accept(visitor)
10
12
  return if Cucumber.wants_to_quit
@@ -20,12 +22,12 @@ module Cucumber
20
22
  # * Examples keyword
21
23
  # * Examples section name
22
24
  # * Raw matrix
23
- def initialize(background, comment, tags, line, keyword, name, raw_steps, example_sections)
24
- @background, @comment, @tags, @line, @keyword, @name, @raw_steps, @example_sections = background, comment, tags, line, keyword, name, raw_steps, example_sections
25
+ def initialize(background, comment, tags, line, keyword, title, description, raw_steps, example_sections)
26
+ @background, @comment, @tags, @line, @keyword, @title, @description, @raw_steps, @example_sections = background, comment, tags, line, keyword, title, description, raw_steps, example_sections
25
27
  end
26
28
 
27
- def add_examples(example_section)
28
- @example_sections << example_section
29
+ def add_examples(example_section, gherkin_examples)
30
+ @example_sections << [example_section, gherkin_examples]
29
31
  end
30
32
 
31
33
  def init
@@ -33,15 +35,21 @@ module Cucumber
33
35
  attach_steps(@raw_steps)
34
36
  @steps = StepCollection.new(@raw_steps)
35
37
 
36
- @examples_array = @example_sections.map do |example_section|
37
- examples_comment = example_section[0]
38
- examples_line = example_section[1]
39
- examples_keyword = example_section[2]
40
- examples_name = example_section[3]
41
- examples_matrix = example_section[4]
38
+ @examples_array = @example_sections.map do |example_section_and_gherkin_examples|
39
+ example_section = example_section_and_gherkin_examples[0]
40
+ gherkin_examples = example_section_and_gherkin_examples[1]
41
+
42
+ examples_comment = example_section[0]
43
+ examples_line = example_section[1]
44
+ examples_keyword = example_section[2]
45
+ examples_title = example_section[3]
46
+ examples_description = example_section[4]
47
+ examples_matrix = example_section[5]
42
48
 
43
49
  examples_table = OutlineTable.new(examples_matrix, self)
44
- Examples.new(examples_comment, examples_line, examples_keyword, examples_name, examples_table)
50
+ ex = Examples.new(examples_comment, examples_line, examples_keyword, examples_title, examples_description, examples_table)
51
+ ex.gherkin_statement(gherkin_examples)
52
+ ex
45
53
  end
46
54
 
47
55
  @examples_array.extend(ExamplesArray)
@@ -53,7 +61,7 @@ module Cucumber
53
61
  return if Cucumber.wants_to_quit
54
62
  visitor.visit_comment(@comment) unless @comment.empty?
55
63
  visitor.visit_tags(@tags)
56
- visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
64
+ visitor.visit_scenario_name(@keyword, name, file_colon_line(@line), source_indent(first_line_length))
57
65
  visitor.visit_steps(@steps)
58
66
 
59
67
  skip_invoke! if @background && @background.failed?
@@ -102,7 +110,7 @@ module Cucumber
102
110
 
103
111
  def to_sexp
104
112
  init
105
- sexp = [:scenario_outline, @keyword, @name]
113
+ sexp = [:scenario_outline, @keyword, name]
106
114
  comment = @comment.to_sexp
107
115
  sexp += [comment] if comment
108
116
  tags = @tags.to_sexp
@@ -14,6 +14,11 @@ module Cucumber
14
14
  @line, @keyword, @name, @multiline_arg = line, keyword, name, multiline_arg
15
15
  end
16
16
 
17
+ attr_reader :gherkin_statement
18
+ def gherkin_statement(statement=nil)
19
+ @gherkin_statement ||= statement
20
+ end
21
+
17
22
  def background?
18
23
  false
19
24
  end
@@ -1,3 +1,4 @@
1
+ require 'cucumber/errors'
1
2
  require 'cucumber/step_match'
2
3
  require 'cucumber/ast/table'
3
4
  require 'gherkin/rubify'
@@ -38,7 +39,7 @@ module Cucumber
38
39
 
39
40
  def accept(visitor)
40
41
  return if Cucumber.wants_to_quit
41
- invoke(visitor.step_mother, visitor.options)
42
+ invoke(visitor.step_mother, visitor.configuration)
42
43
  visit_step_result(visitor)
43
44
  end
44
45
 
@@ -54,63 +55,64 @@ module Cucumber
54
55
  )
55
56
  end
56
57
 
57
- def invoke(step_mother, options)
58
- find_step_match!(step_mother)
59
- unless @skip_invoke || options[:dry_run] || @exception || @step_collection.exception
58
+ def invoke(step_mother, configuration)
59
+ find_step_match!(step_mother, configuration)
60
+ unless @skip_invoke || configuration.dry_run? || @exception || @step_collection.exception
60
61
  @skip_invoke = true
61
62
  begin
62
63
  @step_match.invoke(@multiline_arg)
63
64
  step_mother.after_step
64
65
  status!(:passed)
65
66
  rescue Pending => e
66
- failed(options, e, false)
67
+ failed(configuration, e, false)
67
68
  status!(:pending)
68
69
  rescue Undefined => e
69
- failed(options, e, false)
70
+ failed(configuration, e, false)
70
71
  status!(:undefined)
71
72
  rescue Cucumber::Ast::Table::Different => e
72
73
  @different_table = e.table
73
- failed(options, e, false)
74
+ failed(configuration, e, false)
74
75
  status!(:failed)
75
76
  rescue Exception => e
76
- failed(options, e, false)
77
+ failed(configuration, e, false)
77
78
  status!(:failed)
78
79
  end
79
80
  end
80
81
  end
81
82
 
82
- def find_step_match!(step_mother)
83
+ def find_step_match!(step_mother, configuration)
83
84
  return if @step_match
84
85
  begin
85
86
  @step_match = step_mother.step_match(@name)
86
87
  rescue Undefined => e
87
- failed(step_mother.options, e, true)
88
+ failed(configuration, e, true)
88
89
  status!(:undefined)
89
90
  @step_match = NoStepMatch.new(@step, @name)
90
91
  rescue Ambiguous => e
91
- failed(step_mother.options, e, false)
92
+ failed(configuration, e, false)
92
93
  status!(:failed)
93
94
  @step_match = NoStepMatch.new(@step, @name)
94
95
  end
95
96
  step_mother.step_visited(self)
96
97
  end
97
98
 
98
- def failed(options, e, clear_backtrace)
99
+ def failed(configuration, e, clear_backtrace)
99
100
  e = filter_backtrace(e)
100
101
  e.set_backtrace([]) if clear_backtrace
101
102
  e.backtrace << @step.backtrace_line unless @step.backtrace_line.nil?
102
103
  @exception = e
103
- if(options[:strict] || !(Undefined === e) || e.nested?)
104
+ if(configuration.strict? || !(Undefined === e) || e.nested?)
104
105
  @reported_exception = e
105
106
  else
106
107
  @reported_exception = nil
107
108
  end
108
109
  end
109
110
 
111
+ PWD_PATTERN = /#{Regexp.escape(Dir.pwd)}\//m
112
+
110
113
  def filter_backtrace(e)
111
114
  return e if Cucumber.use_full_backtrace
112
- pwd = /#{Regexp.escape(Dir.pwd)}\//m
113
- (e.backtrace || []).each{|line| line.gsub!(pwd, "./")}
115
+ (e.backtrace || []).each{|line| line.gsub!(PWD_PATTERN, "./")}
114
116
 
115
117
  filtered = (e.backtrace || []).reject do |line|
116
118
  BACKTRACE_FILTER_PATTERNS.detect { |p| line =~ p }
@@ -185,6 +187,10 @@ module Cucumber
185
187
  @step.language
186
188
  end
187
189
 
190
+ def gherkin_statement
191
+ @step.gherkin_statement
192
+ end
193
+
188
194
  def to_sexp
189
195
  [:step_invocation, @step.line, @step.keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
190
196
  end
@@ -1,4 +1,5 @@
1
1
  require 'gherkin/rubify'
2
+ require 'gherkin/lexer/i18n_lexer'
2
3
  require 'gherkin/formatter/escaping'
3
4
 
4
5
  module Cucumber
@@ -60,7 +61,7 @@ module Cucumber
60
61
 
61
62
  def self.parse(text, uri, offset)
62
63
  builder = Builder.new
63
- lexer = Gherkin::I18nLexer.new(builder)
64
+ lexer = Gherkin::Lexer::I18nLexer.new(builder)
64
65
  lexer.scan(text)
65
66
  new(builder.rows)
66
67
  end
@@ -73,7 +74,6 @@ module Cucumber
73
74
  def initialize(raw, conversion_procs = NULL_CONVERSIONS.dup)
74
75
  @cells_class = Cells
75
76
  @cell_class = Cell
76
-
77
77
  raw = ensure_array_of_array(rubify(raw))
78
78
  # Verify that it's square
79
79
  transposed = raw.transpose
@@ -153,7 +153,7 @@ module Cucumber
153
153
  #
154
154
  # gets converted into the following:
155
155
  #
156
- # [['a', 'b], ['c', 'd']]
156
+ # [['a', 'b'], ['c', 'd']]
157
157
  #
158
158
  def raw
159
159
  cell_matrix.map do |row|
@@ -163,9 +163,14 @@ module Cucumber
163
163
  end
164
164
  end
165
165
 
166
- # Same as #raw, but skips the first (header) row
166
+ def column_names #:nodoc:
167
+ @col_names ||= cell_matrix[0].map { |cell| cell.value }
168
+ end
169
+
167
170
  def rows
168
- raw[1..-1]
171
+ hashes.map do |hash|
172
+ hash.values_at *headers
173
+ end
169
174
  end
170
175
 
171
176
  def each_cells_row(&proc) #:nodoc:
@@ -271,8 +276,9 @@ module Cucumber
271
276
  # end
272
277
  #
273
278
  def map_column!(column_name, strict=true, &conversion_proc)
274
- verify_column(column_name) if strict
275
- @conversion_procs[column_name] = conversion_proc
279
+ verify_column(column_name.to_s) if strict
280
+ @conversion_procs[column_name.to_s] = conversion_proc
281
+ self
276
282
  end
277
283
 
278
284
  # Compares +other_table+ to self. If +other_table+ contains columns
@@ -379,7 +385,7 @@ module Cucumber
379
385
  hash = Hash.new do |hash, key|
380
386
  hash[key.to_s] if key.is_a?(Symbol)
381
387
  end
382
- raw[0].each_with_index do |column_name, column_index|
388
+ column_names.each_with_index do |column_name, column_index|
383
389
  value = @conversion_procs[column_name].call(cells.value(column_index))
384
390
  hash[column_name] = value
385
391
  end