cucumber 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. data/History.txt +56 -1
  2. data/Manifest.txt +70 -49
  3. data/config/hoe.rb +1 -1
  4. data/cucumber.yml +1 -1
  5. data/examples/i18n/bg/Rakefile +6 -0
  6. data/examples/i18n/bg/features/addition.feature +11 -0
  7. data/examples/i18n/bg/features/consecutive_calculations.feature +18 -0
  8. data/examples/i18n/bg/features/division.feature +16 -0
  9. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  10. data/examples/i18n/bg/features/support/env.rb +6 -0
  11. data/examples/i18n/bg/features/support/world.rb +8 -0
  12. data/examples/i18n/bg/lib/calculator.rb +24 -0
  13. data/examples/i18n/ru/features/support/world.rb +4 -3
  14. data/examples/i18n/sk/Rakefile +6 -0
  15. data/examples/i18n/sk/features/addition.feature +16 -0
  16. data/examples/i18n/sk/features/division.feature +9 -0
  17. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  18. data/examples/i18n/sk/lib/calculator.rb +14 -0
  19. data/examples/self_test/features/background/background_with_name.feature +7 -0
  20. data/examples/self_test/features/background/passing_background.feature +2 -2
  21. data/examples/self_test/features/step_definitions/sample_steps.rb +18 -2
  22. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  23. data/examples/sinatra/features/support/env.rb +2 -6
  24. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
  25. data/examples/tickets/Rakefile +1 -1
  26. data/examples/tickets/features/229/tagged_hooks.feature +8 -0
  27. data/examples/tickets/features/229/tagged_hooks.rb +14 -0
  28. data/examples/tickets/features/270/back.feature +14 -0
  29. data/examples/tickets/features/270/back.steps.rb +14 -0
  30. data/examples/tickets/features/279/py_string_indent.feature +25 -0
  31. data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
  32. data/examples/tickets/features/279/wrong.feature_ +11 -0
  33. data/examples/tickets/features/step_definitons/tickets_steps.rb +0 -7
  34. data/features/background.feature +21 -3
  35. data/features/cucumber_cli.feature +18 -5
  36. data/features/cucumber_cli_outlines.feature +4 -1
  37. data/features/rake_task.feature +132 -0
  38. data/features/snippet.feature +23 -0
  39. data/features/step_definitions/cucumber_steps.rb +46 -15
  40. data/features/support/env.rb +61 -4
  41. data/features/usage.feature +5 -0
  42. data/gem_tasks/deployment.rake +1 -1
  43. data/lib/cucumber/ast/background.rb +14 -4
  44. data/lib/cucumber/ast/examples.rb +0 -12
  45. data/lib/cucumber/ast/feature.rb +2 -12
  46. data/lib/cucumber/ast/feature_element.rb +4 -8
  47. data/lib/cucumber/ast/features.rb +1 -1
  48. data/lib/cucumber/ast/outline_table.rb +20 -20
  49. data/lib/cucumber/ast/py_string.rb +6 -11
  50. data/lib/cucumber/ast/scenario.rb +1 -8
  51. data/lib/cucumber/ast/scenario_outline.rb +1 -11
  52. data/lib/cucumber/ast/step.rb +3 -9
  53. data/lib/cucumber/ast/step_collection.rb +0 -4
  54. data/lib/cucumber/ast/step_invocation.rb +5 -6
  55. data/lib/cucumber/ast/table.rb +5 -22
  56. data/lib/cucumber/ast/tags.rb +9 -9
  57. data/lib/cucumber/ast/visitor.rb +12 -25
  58. data/lib/cucumber/cli/configuration.rb +4 -4
  59. data/lib/cucumber/cli/main.rb +10 -3
  60. data/lib/cucumber/core_ext/instance_exec.rb +17 -4
  61. data/lib/cucumber/formatter/ansicolor.rb +1 -1
  62. data/lib/cucumber/formatter/console.rb +2 -1
  63. data/lib/cucumber/formatter/html.rb +21 -7
  64. data/lib/cucumber/formatter/pretty.rb +27 -20
  65. data/lib/cucumber/formatter/usage.rb +16 -0
  66. data/lib/cucumber/languages.yml +23 -5
  67. data/lib/cucumber/parser/feature.rb +231 -114
  68. data/lib/cucumber/parser/feature.tt +120 -25
  69. data/lib/cucumber/parser/table.rb +37 -25
  70. data/lib/cucumber/parser/table.tt +15 -3
  71. data/lib/cucumber/parser/treetop_ext.rb +48 -9
  72. data/lib/cucumber/rake/task.rb +29 -6
  73. data/lib/cucumber/step_definition.rb +4 -2
  74. data/lib/cucumber/step_mother.rb +143 -26
  75. data/lib/cucumber/version.rb +2 -2
  76. data/rails_generators/cucumber/templates/paths.rb +13 -4
  77. data/rails_generators/cucumber/templates/webrat_steps.rb +16 -0
  78. data/{specs → spec}/cucumber/ast/background_spec.rb +1 -0
  79. data/{specs → spec}/cucumber/ast/feature_factory.rb +1 -1
  80. data/{specs → spec}/cucumber/ast/feature_spec.rb +2 -2
  81. data/{specs → spec}/cucumber/ast/py_string_spec.rb +0 -0
  82. data/{specs → spec}/cucumber/ast/scenario_outline_spec.rb +0 -0
  83. data/{specs → spec}/cucumber/ast/scenario_spec.rb +0 -27
  84. data/{specs → spec}/cucumber/ast/step_collection_spec.rb +0 -0
  85. data/{specs → spec}/cucumber/ast/step_spec.rb +0 -0
  86. data/{specs → spec}/cucumber/ast/table_spec.rb +2 -2
  87. data/{specs → spec}/cucumber/broadcaster_spec.rb +0 -0
  88. data/{specs → spec}/cucumber/cli/configuration_spec.rb +0 -0
  89. data/{specs → spec}/cucumber/cli/main_spec.rb +5 -1
  90. data/spec/cucumber/core_ext/proc_spec.rb +54 -0
  91. data/{specs → spec}/cucumber/core_ext/string_spec.rb +0 -0
  92. data/{specs → spec}/cucumber/formatter/ansicolor_spec.rb +0 -0
  93. data/{specs → spec}/cucumber/formatter/color_io_spec.rb +0 -0
  94. data/{specs → spec}/cucumber/formatter/html/cucumber.css +0 -0
  95. data/{specs → spec}/cucumber/formatter/html/cucumber.js +0 -0
  96. data/{specs → spec}/cucumber/formatter/html/index.html +0 -0
  97. data/{specs → spec}/cucumber/formatter/html/jquery-1.3.min.js +0 -0
  98. data/{specs → spec}/cucumber/formatter/html/jquery.uitableedit.js +0 -0
  99. data/{specs → spec}/cucumber/formatters/profile_formatter_spec.rb +0 -0
  100. data/{specs → spec}/cucumber/parser/feature_parser_spec.rb +43 -41
  101. data/{specs → spec}/cucumber/parser/table_parser_spec.rb +0 -0
  102. data/{specs → spec}/cucumber/rails/stubs/mini_rails.rb +0 -0
  103. data/{specs → spec}/cucumber/rails/stubs/test_help.rb +0 -0
  104. data/{specs → spec}/cucumber/rails/world_spec.rb +0 -0
  105. data/{specs → spec}/cucumber/sell_cucumbers.feature +0 -0
  106. data/{specs → spec}/cucumber/step_definition_spec.rb +0 -0
  107. data/{specs → spec}/cucumber/step_mother_spec.rb +63 -4
  108. data/{specs → spec}/cucumber/treetop_parser/empty_feature.feature +0 -0
  109. data/{specs → spec}/cucumber/treetop_parser/empty_scenario.feature +0 -0
  110. data/{specs → spec}/cucumber/treetop_parser/empty_scenario_outline.feature +0 -0
  111. data/{specs → spec}/cucumber/treetop_parser/fit_scenario.feature +0 -0
  112. data/{specs → spec}/cucumber/treetop_parser/given_scenario.feature +0 -0
  113. data/{specs → spec}/cucumber/treetop_parser/invalid_scenario_outlines.feature +0 -0
  114. data/{specs → spec}/cucumber/treetop_parser/multiline_steps.feature +0 -0
  115. data/{specs → spec}/cucumber/treetop_parser/multiple_tables.feature +0 -0
  116. data/{specs → spec}/cucumber/treetop_parser/scenario_outline.feature +0 -0
  117. data/{specs → spec}/cucumber/treetop_parser/spaces.feature +0 -0
  118. data/{specs → spec}/cucumber/treetop_parser/test_dos.feature +0 -0
  119. data/{specs → spec}/cucumber/treetop_parser/with_comments.feature +0 -0
  120. data/{specs → spec}/cucumber/treetop_parser/with_tags.feature +0 -0
  121. data/{specs → spec}/cucumber/world/pending_spec.rb +0 -0
  122. data/{specs → spec}/spec.opts +0 -0
  123. data/{specs → spec}/spec_helper.rb +2 -11
  124. metadata +72 -51
  125. data/examples/tickets/cucumber.yml +0 -3
  126. data/lib/cucumber/parser/basic.rb +0 -0
  127. data/specs/cucumber/ast/tags_spec.rb +0 -19
  128. data/specs/cucumber/core_ext/proc_spec.rb +0 -37
@@ -0,0 +1,23 @@
1
+ Feature: Snippets
2
+ In order to help speed up writing step definitions
3
+ As a feature editor
4
+ I want snippet suggestions for undefined step definitions
5
+
6
+ Scenario: Snippet for undefined step with a pystring
7
+ When I run cucumber features/undefined_multiline_args.feature:3 -n
8
+ Then the output should contain
9
+ """
10
+ Given /^a pystring$/ do |string|
11
+ # string is a Cucumber::Ast::PyString
12
+ pending
13
+ end
14
+ """
15
+ Scenario: Snippet for undefined step with a step table
16
+ When I run cucumber features/undefined_multiline_args.feature:9 -n
17
+ Then the output should contain
18
+ """
19
+ Given /^a table$/ do |table|
20
+ # table is a Cucumber::Ast::Table
21
+ pending
22
+ end
23
+ """
@@ -1,30 +1,61 @@
1
- Given /^I am in (.*)$/ do |dir|
2
- @dir = dir
1
+ Given /^I am in (.*)$/ do |example_dir_relative_path|
2
+ @current_dir = examples_dir(example_dir_relative_path)
3
3
  end
4
4
 
5
- When /^I run cucumber (.*)$/ do |cmd|
6
- @dir ||= 'self_test'
7
- full_dir ||= File.expand_path(File.dirname(__FILE__) + "/../../examples/#{@dir}")
8
- Dir.chdir(full_dir) do
9
- @full_cmd = "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cmd}"
10
- @out = `#{@full_cmd}`
11
- @status = $?.exitstatus
5
+ Given /^a standard Cucumber project directory structure$/ do
6
+ @current_dir = working_dir
7
+ in_current_dir do
8
+ FileUtils.mkdir_p 'features/support'
9
+ FileUtils.mkdir 'features/step_definitions'
12
10
  end
13
11
  end
14
12
 
15
- Then /^it should (fail|pass) with$/ do |success, output|
16
- @out.should == output
13
+ Given /^a file named "([^\"]*)" with:$/ do |file_name, file_content|
14
+ create_file(file_name, file_content)
15
+ end
16
+
17
+ Given /^the following profiles? (?:are|is) defined:$/ do |profiles|
18
+ create_file('cucumber.yml', profiles)
19
+ end
20
+
21
+ When /^I run cucumber (.*)$/ do |cucumber_opts|
22
+ run "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cucumber_opts}"
23
+ end
24
+
25
+ When /^I run rake (.*)$/ do |rake_opts|
26
+ run "rake #{rake_opts}"
27
+ end
28
+
29
+ Then /^it should (fail|pass)$/ do |success|
17
30
  if success == 'fail'
18
- @status.should_not == 0
31
+ last_exit_status.should_not == 0
19
32
  else
20
- @status.should == 0
33
+ last_exit_status.should == 0
21
34
  end
22
35
  end
23
36
 
24
- Then /^(.*) should contain$/ do |file, text|
37
+ Then /^it should (fail|pass) with$/ do |success, output|
38
+ last_stdout.should == output
39
+ Then("it should #{success}")
40
+ end
41
+
42
+ Then /^the output should contain$/ do |text|
43
+ last_stdout.should include(text)
44
+ end
45
+
46
+ Then /^"(.*)" should contain$/ do |file, text|
25
47
  IO.read(file).should == text
26
48
  end
27
49
 
28
- Then /^(.*) should match$/ do |file, text|
50
+ Then /^"(.*)" should match$/ do |file, text|
29
51
  IO.read(file).should =~ Regexp.new(text)
30
52
  end
53
+
54
+ Then /^STDERR should match$/ do |text|
55
+ last_stderr.should =~ /#{text}/
56
+ end
57
+
58
+ Then /^"(.*)" should exist$/ do |file|
59
+ File.exists?(file).should be_true
60
+ FileUtils.rm(file)
61
+ end
@@ -1,8 +1,65 @@
1
1
  require 'rubygems'
2
+ require 'tempfile'
2
3
  require 'spec/expectations'
3
4
  require 'fileutils'
5
+ require 'forwardable'
4
6
 
5
- After do
6
- FileUtils.rm_rf 'examples/self_test/tmp'
7
- FileUtils.mkdir 'examples/self_test/tmp'
8
- end
7
+ class CucumberWorld
8
+ extend Forwardable
9
+ def_delegators CucumberWorld, :examples_dir, :self_test_dir, :working_dir, :cucumber_lib_dir
10
+
11
+ def self.examples_dir(subdir=nil)
12
+ @examples_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '../../examples'))
13
+ subdir ? File.join(@examples_dir, subdir) : @examples_dir
14
+ end
15
+
16
+ def self.self_test_dir
17
+ @self_test_dir ||= examples_dir('self_test')
18
+ end
19
+
20
+ def self.working_dir
21
+ @working_dir ||= examples_dir('self_test/tmp')
22
+ end
23
+
24
+ def cucumber_lib_dir
25
+ @cucumber_lib_dir ||= File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
26
+ end
27
+
28
+ def initialize
29
+ @current_dir = self_test_dir
30
+ end
31
+
32
+ private
33
+ attr_reader :last_exit_status, :last_stdout, :last_stderr
34
+
35
+ def create_file(file_name, file_content)
36
+ file_content.gsub!("CUCUMBER_LIB", "'#{cucumber_lib_dir}'") # Some files, such as Rakefiles need to use the lib dir
37
+ in_current_dir do
38
+ File.open(file_name, 'w') { |f| f << file_content }
39
+ end
40
+ end
41
+
42
+ def in_current_dir(&block)
43
+ Dir.chdir(@current_dir, &block)
44
+ end
45
+
46
+ def run(command)
47
+ stderr_file = Tempfile.new('cucumber')
48
+ stderr_file.close
49
+ in_current_dir do
50
+ @last_stdout = `#{command} 2> #{stderr_file.path}`
51
+ @last_exit_status = $?.exitstatus
52
+ end
53
+ @last_stderr = IO.read(stderr_file.path)
54
+ end
55
+
56
+ end
57
+
58
+ World do
59
+ CucumberWorld.new
60
+ end
61
+
62
+ Before do
63
+ FileUtils.rm_rf CucumberWorld.working_dir
64
+ FileUtils.mkdir CucumberWorld.working_dir
65
+ end
@@ -19,6 +19,7 @@ Feature: Cucumber command line
19
19
  /^call step "(.*)"$/ # features/step_definitions/sample_steps.rb:23
20
20
  Given call step "a step definition that calls an undefined step" # features/call_undefined_step_from_step_def.feature:7
21
21
  /^'(.+)' cukes$/ # features/step_definitions/sample_steps.rb:27
22
+ Given '10' cukes # features/background/background_with_name.feature:4
22
23
  And '10' cukes # features/background/failing_background.feature:5
23
24
  Given '10' cukes # features/background/passing_background.feature:4
24
25
  Given '10' cukes # features/background/scenario_outline_passing_background.feature:4
@@ -72,6 +73,7 @@ Feature: Cucumber command line
72
73
  Given '2' cukes # features/tons_of_cukes.feature:51
73
74
  Given '2' cukes # features/tons_of_cukes.feature:52
74
75
  /^I should have '(.+)' cukes$/ # features/step_definitions/sample_steps.rb:31
76
+ Then I should have '10' cukes # features/background/background_with_name.feature:7
75
77
  Then I should have '10' cukes # features/background/failing_background.feature:8
76
78
  Then I should have '10' cukes # features/background/failing_background.feature:11
77
79
  Then I should have '10' cukes # features/background/passing_background.feature:7
@@ -103,6 +105,9 @@ Feature: Cucumber command line
103
105
  Given failing expectation # features/failing_expectation.feature:4
104
106
  /^failing$/ # features/step_definitions/sample_steps.rb:8
105
107
  Given failing # features/sample.feature:16
108
+ (::) UNUSED (::)
109
+ /^unused$/ # features/step_definitions/sample_steps.rb:66
110
+ /^another unused$/ # features/step_definitions/sample_steps.rb:69
106
111
 
107
112
  """
108
113
 
@@ -5,7 +5,7 @@ end
5
5
 
6
6
  namespace :manifest do
7
7
  desc 'Recreate Manifest.txt to include ALL files'
8
- task :refresh do
8
+ task :refresh => :clobber do
9
9
  `rake check_manifest | patch -p0 > Manifest.txt`
10
10
  end
11
11
  end
@@ -6,8 +6,8 @@ module Cucumber
6
6
  include FeatureElement
7
7
  attr_writer :feature
8
8
 
9
- def initialize(comment, line, keyword, steps)
10
- @comment, @line, @keyword, @steps = comment, line, keyword, StepCollection.new(steps)
9
+ def initialize(comment, line, keyword, name, steps)
10
+ @comment, @line, @keyword, @name, @steps = comment, line, keyword, name, StepCollection.new(steps)
11
11
  attach_steps(steps)
12
12
  @step_invocations = @steps.step_invocations(true)
13
13
  end
@@ -23,10 +23,20 @@ module Cucumber
23
23
 
24
24
  def accept(visitor)
25
25
  visitor.visit_comment(@comment)
26
- visitor.visit_background_name(@keyword, "", file_colon_line(@line), source_indent(text_length))
27
- visitor.step_mother.before_and_after(self)
26
+ visitor.visit_background_name(@keyword, @name, file_colon_line(@line), source_indent(text_length))
27
+ visitor.step_mother.before(self)
28
28
  visitor.visit_steps(@step_invocations)
29
29
  @failed = @step_invocations.detect{|step_invocation| step_invocation.exception}
30
+ visitor.step_mother.after(self) if @failed
31
+ end
32
+
33
+ def accept_hook?(hook)
34
+ # TODO: When background is involved - no tag based hook filtering is occurring with
35
+ # the current implementation. All hooks will be executed. This is because of the line
36
+ # visitor.step_mother.before(self)
37
+ # in the #accept method above. Instead, we should really be passing the first scenario
38
+ # here. We currently don't have access to that, so a refactoring is in order to make that happen.
39
+ true
30
40
  end
31
41
 
32
42
  def failed?
@@ -10,26 +10,14 @@ module Cucumber
10
10
  visitor.visit_outline_table(@outline_table)
11
11
  end
12
12
 
13
- def descend?(visitor)
14
- @outline_table.descend?(visitor)
15
- end
16
-
17
13
  def skip_invoke!
18
14
  @outline_table.skip_invoke!
19
15
  end
20
16
 
21
- def matches_scenario_names?(scenario_names)
22
- scenario_names.detect{|name| name == @name}
23
- end
24
-
25
17
  def each_example_row(&proc)
26
18
  @outline_table.cells_rows[1..-1].each(&proc)
27
19
  end
28
20
 
29
- def matches_lines?(lines)
30
- lines.index(@line) || @outline_table.matches_lines?(lines)
31
- end
32
-
33
21
  def to_sexp
34
22
  [:examples, @keyword, @name, @outline_table.to_sexp]
35
23
  end
@@ -3,11 +3,10 @@ module Cucumber
3
3
  # Represents the root node of a parsed feature.
4
4
  class Feature
5
5
  attr_accessor :file
6
- attr_writer :features, :lines
6
+ attr_writer :features
7
7
 
8
8
  def initialize(background, comment, tags, name, feature_elements)
9
9
  @background, @comment, @tags, @name, @feature_elements = background, comment, tags, name, feature_elements
10
- @lines = []
11
10
 
12
11
  @feature_elements.each do |feature_element|
13
12
  feature_element.feature = self
@@ -15,24 +14,15 @@ module Cucumber
15
14
  end
16
15
 
17
16
  def accept(visitor)
18
- visitor.current_feature_lines = @lines
19
17
  visitor.visit_comment(@comment)
20
18
  visitor.visit_tags(@tags)
21
19
  visitor.visit_feature_name(@name)
22
20
  visitor.visit_background(@background) if @background
23
21
  @feature_elements.each do |feature_element|
24
- visitor.visit_feature_element(feature_element) if feature_element.descend?(visitor)
22
+ visitor.visit_feature_element(feature_element)
25
23
  end
26
24
  end
27
25
 
28
- def descend?(visitor)
29
- @feature_elements.detect{ |feature_element| feature_element.descend?(visitor) }
30
- end
31
-
32
- def has_tags?(tags)
33
- @tags.has_tags?(tags)
34
- end
35
-
36
26
  def next_feature_element(feature_element, &proc)
37
27
  index = @feature_elements.index(feature_element)
38
28
  next_one = @feature_elements[index+1]
@@ -12,14 +12,6 @@ module Cucumber
12
12
  @keyword.jlength + @name.jlength
13
13
  end
14
14
 
15
- def matches_lines?(lines)
16
- lines.index(@line) || @steps.matches_lines?(lines) || @tags.matches_lines?(lines)
17
- end
18
-
19
- def has_tags?(tags)
20
- @tags.has_tags?(tags) || @feature.has_tags?(tags)
21
- end
22
-
23
15
  def matches_scenario_names?(scenario_names)
24
16
  scenario_names.detect{|name| name == @name}
25
17
  end
@@ -36,6 +28,10 @@ module Cucumber
36
28
  @steps.max_line_length(self)
37
29
  end
38
30
 
31
+ def accept_hook?(hook)
32
+ @tags.accept_hook?(hook)
33
+ end
34
+
39
35
  # TODO: Remove when we use StepCollection everywhere
40
36
  def previous_step(step)
41
37
  i = @steps.index(step) || -1
@@ -18,7 +18,7 @@ module Cucumber
18
18
 
19
19
  def accept(visitor)
20
20
  @features.each do |feature|
21
- visitor.visit_feature(feature) if feature.descend?(visitor)
21
+ visitor.visit_feature(feature)
22
22
  end
23
23
  end
24
24
  end
@@ -5,45 +5,41 @@ module Cucumber
5
5
  super(raw)
6
6
  @scenario_outline = scenario_outline
7
7
  @cells_class = ExampleCells
8
-
9
- cells_rows.each do |cells|
10
- cells.create_step_invocations!(scenario_outline)
11
- end
8
+ create_step_invocations_for_example_rows!(scenario_outline)
12
9
  end
13
10
 
14
11
  def accept(visitor)
15
12
  cells_rows.each_with_index do |row, n|
16
- if n == 0 || matches?(visitor, row)
17
- visitor.visit_table_row(row)
18
- end
13
+ visitor.visit_table_row(row)
19
14
  end
20
15
  nil
21
16
  end
22
17
 
23
- def descend?(visitor)
24
- cells_rows.detect{|cells_row| cells_row.descend?(visitor)}
18
+ def accept_hook?(hook)
19
+ @scenario_outline.accept_hook?(hook)
25
20
  end
26
-
27
- def matches?(visitor, cells)
28
- @scenario_outline.matches_tags_and_name?(visitor) &&
29
- (visitor.matches_lines?(cells) || visitor.matches_lines?(@scenario_outline))
30
- end
31
-
21
+
32
22
  def skip_invoke!
33
- cells_rows.each do |cells|
23
+ example_rows.each do |cells|
34
24
  cells.skip_invoke!
35
25
  end
36
26
  end
37
27
 
28
+ def create_step_invocations_for_example_rows!(scenario_outline)
29
+ example_rows.each do |cells|
30
+ cells.create_step_invocations!(scenario_outline)
31
+ end
32
+ end
33
+
34
+ def example_rows
35
+ cells_rows[1..-1]
36
+ end
37
+
38
38
  class ExampleCells < Cells
39
39
  def create_step_invocations!(scenario_outline)
40
40
  @step_invocations = scenario_outline.step_invocations(self)
41
41
  end
42
42
 
43
- def descend?(visitor)
44
- @table.matches?(visitor, self)
45
- end
46
-
47
43
  def skip_invoke!
48
44
  @step_invocations.each do |step_invocation|
49
45
  step_invocation.skip_invoke!
@@ -70,6 +66,10 @@ module Cucumber
70
66
  end
71
67
  end
72
68
 
69
+ def accept_hook?(hook)
70
+ @table.accept_hook?(hook)
71
+ end
72
+
73
73
  private
74
74
 
75
75
  def header?
@@ -17,26 +17,22 @@ module Cucumber
17
17
  # Note how the indentation from the source is stripped away.
18
18
  #
19
19
  class PyString
20
+
21
+ def self.default_arg_name
22
+ "string"
23
+ end
24
+
20
25
  def initialize(start_line, end_line, string, quotes_indent)
21
26
  @start_line, @end_line = start_line, end_line
22
27
  @string, @quotes_indent = string.gsub(/\\"/, '"'), quotes_indent
23
- @status = :passed
24
- end
25
-
26
- def status=(status)
27
- @status = status
28
28
  end
29
29
 
30
30
  def to_s
31
31
  @string.indent(-@quotes_indent)
32
32
  end
33
33
 
34
- def matches_lines?(lines)
35
- lines.detect{|l| l >= @start_line && l <= @end_line}
36
- end
37
-
38
34
  def accept(visitor)
39
- visitor.visit_py_string(to_s, @status)
35
+ visitor.visit_py_string(to_s)
40
36
  end
41
37
 
42
38
  def arguments_replaced(arguments) #:nodoc:
@@ -52,7 +48,6 @@ module Cucumber
52
48
  def to_sexp #:nodoc:
53
49
  [:py_string, to_s]
54
50
  end
55
-
56
51
  end
57
52
  end
58
53
  end