cucumber 0.1.7 → 0.1.8
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.
- data/History.txt +81 -0
- data/Manifest.txt +30 -9
- data/README.txt +1 -2
- data/bin/cucumber +1 -1
- data/examples/calculator/README.txt +5 -0
- data/examples/calculator/Rakefile +1 -2
- data/examples/calculator/features/addition.feature +1 -0
- data/examples/chinese_simplified_calculator/Rakefile +6 -0
- data/examples/chinese_simplified_calculator/features/addition.feature +17 -0
- data/examples/chinese_simplified_calculator/features/steps/calculator_steps.rb +24 -0
- data/examples/chinese_simplified_calculator/lib/calculator.rb +10 -0
- data/examples/java/features/steps/hello_steps.rb +1 -1
- data/examples/swedish_calculator/Rakefile +5 -0
- data/examples/swedish_calculator/features/steps/kalkulator_steps.rb +22 -0
- data/examples/swedish_calculator/features/summering.feature +17 -0
- data/examples/swedish_calculator/lib/kalkulator.rb +11 -0
- data/examples/tickets/Rakefile +8 -1
- data/examples/tickets/cucumber.yml +2 -0
- data/examples/tickets/features/steps/tickets_steps.rb +15 -0
- data/examples/tickets/features/tickets.feature +12 -1
- data/gem_tasks/treetop.rake +35 -23
- data/lib/cucumber.rb +1 -0
- data/lib/cucumber/cli.rb +19 -5
- data/lib/cucumber/core_ext/proc.rb +8 -5
- data/lib/cucumber/executor.rb +7 -1
- data/lib/cucumber/formatters.rb +1 -1
- data/lib/cucumber/formatters/html_formatter.rb +6 -3
- data/lib/cucumber/formatters/pretty_formatter.rb +29 -7
- data/lib/cucumber/formatters/profile_formatter.rb +92 -0
- data/lib/cucumber/languages.yml +39 -12
- data/lib/cucumber/model.rb +1 -0
- data/lib/cucumber/model/table.rb +28 -0
- data/lib/cucumber/rails/world.rb +1 -3
- data/lib/cucumber/rake/task.rb +1 -1
- data/lib/cucumber/tree/feature.rb +8 -2
- data/lib/cucumber/tree/scenario.rb +23 -6
- data/lib/cucumber/tree/step.rb +5 -4
- data/lib/cucumber/treetop_parser/feature.treetop.erb +54 -12
- data/lib/cucumber/treetop_parser/feature_da.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_de.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_en.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_es.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_et.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_fr.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_nl.rb +1593 -0
- data/lib/cucumber/treetop_parser/feature_no.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_pt.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_ru.rb +415 -74
- data/lib/cucumber/treetop_parser/feature_se.rb +419 -78
- data/lib/cucumber/treetop_parser/feature_zh-CN.rb +1593 -0
- data/lib/cucumber/version.rb +1 -1
- data/{generators → rails_generators}/cucumber/cucumber_generator.rb +0 -0
- data/{generators → rails_generators}/cucumber/templates/common_webrat.rb +1 -10
- data/{generators → rails_generators}/cucumber/templates/cucumber +0 -0
- data/{generators → rails_generators}/cucumber/templates/cucumber.rake +0 -0
- data/{generators → rails_generators}/cucumber/templates/env.rb +0 -0
- data/{generators → rails_generators}/feature/feature_generator.rb +0 -0
- data/{generators → rails_generators}/feature/templates/feature.erb +1 -0
- data/{generators → rails_generators}/feature/templates/steps.erb +0 -0
- data/spec/cucumber/cli_spec.rb +11 -3
- data/spec/cucumber/core_ext/proc_spec.rb +6 -0
- data/spec/cucumber/formatters/html_formatter_spec.rb +16 -1
- data/spec/cucumber/formatters/pretty_formatter_spec.rb +54 -25
- data/spec/cucumber/formatters/profile_formatter_spec.rb +193 -0
- data/spec/cucumber/model/table_spec.rb +20 -0
- data/spec/cucumber/rails/stubs/mini_rails.rb +17 -0
- data/spec/cucumber/rails/stubs/test_help.rb +1 -0
- data/spec/cucumber/rails/world_spec.rb +11 -0
- data/spec/cucumber/tree/feature_spec.rb +12 -0
- data/spec/cucumber/tree/scenario_spec.rb +22 -0
- data/spec/cucumber/tree/step_spec.rb +12 -2
- data/spec/cucumber/treetop_parser/empty_scenario.feature +1 -1
- data/spec/cucumber/treetop_parser/feature_parser_spec.rb +18 -0
- data/spec/cucumber/treetop_parser/fit_scenario.feature +1 -0
- data/spec/cucumber/treetop_parser/multiline_steps.feature +13 -0
- data/spec/cucumber/treetop_parser/multiple_tables.feature +2 -0
- data/spec/cucumber/treetop_parser/test_dos.feature +1 -0
- data/spec/cucumber/treetop_parser/with_comments.feature +6 -2
- metadata +34 -12
- data/examples/calculator/cucumber.yml +0 -1
data/lib/cucumber.rb
CHANGED
data/lib/cucumber/cli.rb
CHANGED
@@ -23,7 +23,7 @@ module Cucumber
|
|
23
23
|
end
|
24
24
|
|
25
25
|
attr_reader :options
|
26
|
-
FORMATS = %w{pretty progress html}
|
26
|
+
FORMATS = %w{pretty profile progress html}
|
27
27
|
|
28
28
|
def initialize
|
29
29
|
@paths = []
|
@@ -33,7 +33,14 @@ module Cucumber
|
|
33
33
|
return parse_args_from_profile('default') if args.empty?
|
34
34
|
args.extend(OptionParser::Arguable)
|
35
35
|
|
36
|
-
@options ||= {
|
36
|
+
@options ||= {
|
37
|
+
:require => nil,
|
38
|
+
:lang => 'en',
|
39
|
+
:format => 'pretty',
|
40
|
+
:dry_run => false,
|
41
|
+
:source => true,
|
42
|
+
:out => STDOUT
|
43
|
+
}
|
37
44
|
args.options do |opts|
|
38
45
|
opts.banner = "Usage: cucumber [options] FILES|DIRS"
|
39
46
|
opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR", "Require files before executing the features.",
|
@@ -68,6 +75,9 @@ module Cucumber
|
|
68
75
|
opts.on("-n", "--no-source", "Don't show the file and line of the step definition with the steps.") do
|
69
76
|
@options[:source] = false
|
70
77
|
end
|
78
|
+
opts.on("-o", "--out=FILE", "Write output to a file instead of STDOUT.") do |v|
|
79
|
+
@options[:out] = File.open(v, 'w')
|
80
|
+
end
|
71
81
|
opts.on_tail("--version", "Show version") do
|
72
82
|
puts VERSION::STRING
|
73
83
|
exit
|
@@ -145,11 +155,15 @@ module Cucumber
|
|
145
155
|
def formatter(step_mother)
|
146
156
|
case @options[:format]
|
147
157
|
when 'pretty'
|
148
|
-
Formatters::PrettyFormatter.new(
|
158
|
+
Formatters::PrettyFormatter.new(@options[:out], step_mother, @options)
|
149
159
|
when 'progress'
|
150
|
-
Formatters::ProgressFormatter.new(
|
160
|
+
Formatters::ProgressFormatter.new(@options[:out])
|
161
|
+
when 'profile'
|
162
|
+
Formatters::ProfileFormatter.new(@options[:out], step_mother)
|
151
163
|
when 'html'
|
152
|
-
Formatters::HtmlFormatter.new(
|
164
|
+
Formatters::HtmlFormatter.new(@options[:out], step_mother)
|
165
|
+
else
|
166
|
+
raise "Unknown formatter: #{@options[:format]}"
|
153
167
|
end
|
154
168
|
end
|
155
169
|
|
@@ -24,16 +24,19 @@ module Cucumber
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def to_backtrace_line
|
27
|
-
"#{
|
27
|
+
"#{file_colon_line}:in `#{name}'"
|
28
28
|
end
|
29
29
|
|
30
30
|
def to_comment_line
|
31
|
-
"# #{
|
31
|
+
"# #{file_colon_line}"
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
34
|
+
def file_colon_line
|
35
|
+
path, line = *to_s.match(/[\d\w]+@(.*):(.*)>/)[1..2]
|
36
|
+
path = File.expand_path(path)
|
37
|
+
pwd = Dir.pwd
|
38
|
+
path = path[pwd.length+1..-1]
|
39
|
+
"#{path}:#{line}"
|
37
40
|
end
|
38
41
|
|
39
42
|
def meth
|
data/lib/cucumber/executor.rb
CHANGED
@@ -46,6 +46,7 @@ module Cucumber
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def visit_feature(feature)
|
49
|
+
formatter.visit_feature(feature) if formatter.respond_to?(:visit_feature)
|
49
50
|
feature.accept(self)
|
50
51
|
end
|
51
52
|
|
@@ -62,7 +63,7 @@ module Cucumber
|
|
62
63
|
end
|
63
64
|
|
64
65
|
def visit_scenario(scenario)
|
65
|
-
if
|
66
|
+
if accept?(scenario)
|
66
67
|
@error = nil
|
67
68
|
@pending = nil
|
68
69
|
|
@@ -77,6 +78,10 @@ module Cucumber
|
|
77
78
|
formatter.scenario_executed(scenario) if formatter.respond_to?(:scenario_executed)
|
78
79
|
end
|
79
80
|
end
|
81
|
+
|
82
|
+
def accept?(scenario)
|
83
|
+
@line.nil? || scenario.at_line?(@line)
|
84
|
+
end
|
80
85
|
|
81
86
|
def visit_row_step(step)
|
82
87
|
visit_step(step)
|
@@ -90,6 +95,7 @@ module Cucumber
|
|
90
95
|
unless @pending || @error
|
91
96
|
begin
|
92
97
|
regexp, args, proc = step.regexp_args_proc(@step_mother)
|
98
|
+
formatter.step_executing(step, regexp, args) if formatter.respond_to?(:step_executing)
|
93
99
|
step.execute_in(@world, regexp, args, proc)
|
94
100
|
@after_step_procs.each{|p| p.call_in(@world, *[])}
|
95
101
|
formatter.step_passed(step, regexp, args)
|
data/lib/cucumber/formatters.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
%w{html pretty progress}.each{|n| require "cucumber/formatters/#{n}_formatter"}
|
1
|
+
%w{html pretty progress profile}.each{|n| require "cucumber/formatters/#{n}_formatter"}
|
@@ -5,6 +5,7 @@ module Cucumber
|
|
5
5
|
@io = io
|
6
6
|
@step_mother = step_mother
|
7
7
|
@errors = []
|
8
|
+
@scenario_table_header = []
|
8
9
|
end
|
9
10
|
|
10
11
|
def visit_features(features)
|
@@ -52,6 +53,7 @@ HTML
|
|
52
53
|
end
|
53
54
|
|
54
55
|
def visit_regular_scenario(scenario)
|
56
|
+
@scenario_table_header = scenario.table_header
|
55
57
|
@io.puts %{ <dl class="new">}
|
56
58
|
@io.puts %{ <dt>#{Cucumber.language['scenario']}: #{scenario.name}</dt>}
|
57
59
|
@io.puts %{ <dd>}
|
@@ -66,11 +68,12 @@ HTML
|
|
66
68
|
@io.puts %{ <dl class="new">}
|
67
69
|
@io.puts %{ <dt>#{Cucumber.language['scenario']}: #{scenario.name}</dt>}
|
68
70
|
@io.puts %{ <dd>}
|
69
|
-
@io.puts %{ <table>}
|
71
|
+
@io.puts %{ <table cellpadding="3">}
|
70
72
|
@io.puts %{ <thead>}
|
71
73
|
@io.puts %{ <tr>}
|
72
|
-
@
|
73
|
-
|
74
|
+
@scenario_table_header.each do |column_header|
|
75
|
+
@io.puts %{ <th>#{column_header}</th>}
|
76
|
+
end
|
74
77
|
@io.puts %{ </tr>}
|
75
78
|
@io.puts %{ </thead>}
|
76
79
|
@io.puts %{ <tbody>}
|
@@ -17,12 +17,24 @@ module Cucumber
|
|
17
17
|
@pending = []
|
18
18
|
@skipped = []
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
|
+
def visit_feature(feature)
|
22
|
+
@feature = feature
|
23
|
+
end
|
24
|
+
|
21
25
|
def header_executing(header)
|
22
26
|
@io.puts if @feature_newline
|
23
27
|
@feature_newline = true
|
24
|
-
|
25
|
-
|
28
|
+
|
29
|
+
header_lines = header.split("\n")
|
30
|
+
header_lines.each_with_index do |line, index|
|
31
|
+
@io.print line
|
32
|
+
if @options[:source] && index==0
|
33
|
+
@io.print padding_spaces(@feature)
|
34
|
+
@io.print comment("# #{@feature.file}")
|
35
|
+
end
|
36
|
+
@io.puts
|
37
|
+
end
|
26
38
|
end
|
27
39
|
|
28
40
|
def scenario_executing(scenario)
|
@@ -30,7 +42,12 @@ module Cucumber
|
|
30
42
|
if scenario.row?
|
31
43
|
@io.print " |"
|
32
44
|
else
|
33
|
-
@io.
|
45
|
+
@io.print passed(" #{Cucumber.language['scenario']}: #{scenario.name}")
|
46
|
+
if @options[:source]
|
47
|
+
@io.print padding_spaces(scenario)
|
48
|
+
@io.print comment("# #{scenario.file}:#{scenario.line}")
|
49
|
+
end
|
50
|
+
@io.puts
|
34
51
|
end
|
35
52
|
end
|
36
53
|
|
@@ -99,7 +116,12 @@ module Cucumber
|
|
99
116
|
args.each{|arg| @io.print pending(arg) ; @io.print "|"}
|
100
117
|
else
|
101
118
|
@pending << step
|
102
|
-
@io.
|
119
|
+
@io.print pending(" #{step.keyword} #{step.name}")
|
120
|
+
if @options[:source]
|
121
|
+
@io.print padding_spaces(step)
|
122
|
+
@io.print comment("# #{step.file}:#{step.line}")
|
123
|
+
end
|
124
|
+
@io.puts
|
103
125
|
end
|
104
126
|
end
|
105
127
|
|
@@ -147,8 +169,8 @@ module Cucumber
|
|
147
169
|
comment(proc.to_comment_line)
|
148
170
|
end
|
149
171
|
|
150
|
-
def padding_spaces(
|
151
|
-
" " *
|
172
|
+
def padding_spaces(tree_item)
|
173
|
+
" " * tree_item.padding_length
|
152
174
|
end
|
153
175
|
end
|
154
176
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module Formatters
|
3
|
+
class ProfileFormatter < ProgressFormatter
|
4
|
+
NUMBER_OF_STEP_DEFINITONS_TO_SHOW = 10
|
5
|
+
NUMBER_OF_STEP_INVOCATIONS_TO_SHOW = 5
|
6
|
+
|
7
|
+
def initialize(io, step_mother)
|
8
|
+
super(io)
|
9
|
+
@step_mother = step_mother
|
10
|
+
@step_times = Hash.new { |k,v| k[v] = [] }
|
11
|
+
@step_keywords = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def visit_features(features)
|
15
|
+
@io.puts "Profiling enabled.\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def step_executing(step, regexp, args)
|
19
|
+
@step_time = Time.now
|
20
|
+
end
|
21
|
+
|
22
|
+
def step_passed(step, regexp, args)
|
23
|
+
execution_time = Time.now - @step_time
|
24
|
+
super
|
25
|
+
@step_keywords[regexp] ||= step.actual_keyword unless step.row?
|
26
|
+
invocation_comment = ''
|
27
|
+
definition_comment = ''
|
28
|
+
|
29
|
+
if step.row?
|
30
|
+
description = ''
|
31
|
+
args.each do |arg|
|
32
|
+
description += %{|#{arg}|}
|
33
|
+
end
|
34
|
+
else
|
35
|
+
description = "#{step.keyword} #{step.format(regexp){|param| underline(param)}}"
|
36
|
+
definition_comment = source(step)
|
37
|
+
end
|
38
|
+
invocation_comment = "# #{step.file}:#{step.line}"
|
39
|
+
@step_times["#{@step_keywords[regexp]} #{regexp.inspect}"] << [description, invocation_comment, definition_comment, execution_time]
|
40
|
+
end
|
41
|
+
|
42
|
+
def dump
|
43
|
+
super
|
44
|
+
@io.puts "\n\nTop #{NUMBER_OF_STEP_DEFINITONS_TO_SHOW} average slowest steps with #{NUMBER_OF_STEP_INVOCATIONS_TO_SHOW} slowest matches:\n"
|
45
|
+
|
46
|
+
mean_times = map_to_mean_times(@step_times)
|
47
|
+
mean_times = mean_times.sort_by { |step_profiles, keyword_regexp, mean_execution_time| mean_execution_time }.reverse
|
48
|
+
|
49
|
+
mean_times[0...NUMBER_OF_STEP_DEFINITONS_TO_SHOW].each do |step_profiles, keyword_regexp, mean_execution_time|
|
50
|
+
print_step_definition(step_profiles, keyword_regexp, mean_execution_time)
|
51
|
+
step_profiles = step_profiles.sort_by { |description, invocation_comment, definition_comment, execution_time| execution_time }.reverse
|
52
|
+
print_step_invocations(step_profiles, keyword_regexp)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def map_to_mean_times(step_times)
|
58
|
+
mean_times = []
|
59
|
+
step_times.each do |regexp, step_profiles|
|
60
|
+
mean_execution_time = (step_profiles.inject(0) { |sum, step_details| step_details[3] + sum } / step_profiles.length)
|
61
|
+
mean_times << [step_profiles, regexp, mean_execution_time]
|
62
|
+
end
|
63
|
+
mean_times
|
64
|
+
end
|
65
|
+
|
66
|
+
def print_step_definition(step_profiles, keyword_regexp, mean_execution_time)
|
67
|
+
unless step_profiles.empty?
|
68
|
+
_, _, definition_comment, _ = step_profiles.first
|
69
|
+
@io.print red(sprintf("%.7f", mean_execution_time))
|
70
|
+
@io.print " #{keyword_regexp}"
|
71
|
+
@io.print " #{comment(definition_comment)}"
|
72
|
+
@io.puts
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def print_step_invocations(step_profiles, keyword_regexp)
|
77
|
+
step_profiles[0...NUMBER_OF_STEP_INVOCATIONS_TO_SHOW].each do |description, invocation_comment, definition_comment, execution_time|
|
78
|
+
@io.print " #{yellow(sprintf("%.7f", execution_time))}"
|
79
|
+
@io.print " #{description}"
|
80
|
+
@io.print " #{comment(invocation_comment)}"
|
81
|
+
@io.puts
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def source(step)
|
86
|
+
_, _, proc = step.regexp_args_proc(@step_mother)
|
87
|
+
proc.to_comment_line
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/cucumber/languages.yml
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
# http://en.wikipedia.org/wiki/IETF_language_tag
|
2
2
|
# http://www.iana.org/assignments/language-subtag-registry
|
3
3
|
# http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt (Use this I think)
|
4
|
+
"en":
|
5
|
+
feature: Feature
|
6
|
+
scenario: Scenario
|
7
|
+
more_examples: More Examples
|
8
|
+
given_scenario: GivenScenario
|
9
|
+
given: Given
|
10
|
+
when: When
|
11
|
+
then: Then
|
12
|
+
and: And
|
13
|
+
but: But
|
14
|
+
# Please help us keeping the languages below uptodate. The parsers for a language
|
15
|
+
# that is missing a keyword will expect the English word until the missing word(s)
|
16
|
+
# are added.
|
17
|
+
#
|
18
|
+
# Please keep the grammars in alphabetical order from here and down.
|
4
19
|
"da":
|
5
20
|
feature: Egenskab
|
6
21
|
scenario: Scenarie
|
@@ -19,18 +34,10 @@
|
|
19
34
|
then: Dann
|
20
35
|
and: Und
|
21
36
|
but: Aber
|
22
|
-
"en":
|
23
|
-
feature: Feature
|
24
|
-
scenario: Scenario
|
25
|
-
given_scenario: GivenScenario
|
26
|
-
given: Given
|
27
|
-
when: When
|
28
|
-
then: Then
|
29
|
-
and: And
|
30
|
-
but: But
|
31
37
|
"es":
|
32
38
|
feature: Característica
|
33
39
|
scenario: Escenario
|
40
|
+
more_examples: Más ejemplos
|
34
41
|
given_scenario: DadoElEscenario
|
35
42
|
given: Dado
|
36
43
|
when: Cuando
|
@@ -40,15 +47,27 @@
|
|
40
47
|
"fr":
|
41
48
|
feature: Fonction
|
42
49
|
scenario: Scenario
|
50
|
+
more_examples: Plus d'exemples
|
43
51
|
given_scenario: SoitScenario
|
44
52
|
given: Soit
|
45
53
|
when: Lorsque
|
46
54
|
then: Alors
|
47
55
|
and: Et
|
48
56
|
but: Mais
|
57
|
+
"nl":
|
58
|
+
feature: Functionaliteit
|
59
|
+
scenario: Scenario
|
60
|
+
more_examples: Meer voorbeelden
|
61
|
+
given_scenario: GegevenScenario
|
62
|
+
given: Gegeven
|
63
|
+
when: Als
|
64
|
+
then: Dan
|
65
|
+
and: En
|
66
|
+
but: Maar
|
49
67
|
"no":
|
50
68
|
feature: Egenskap
|
51
69
|
scenario: Scenario
|
70
|
+
more_examples: Flere eksempler
|
52
71
|
given_scenario: GittScenario
|
53
72
|
given: Gitt
|
54
73
|
when: Når
|
@@ -76,9 +95,9 @@
|
|
76
95
|
"se":
|
77
96
|
feature: Egenskap
|
78
97
|
scenario: Scenario
|
79
|
-
given_scenario:
|
80
|
-
given:
|
81
|
-
when:
|
98
|
+
given_scenario: GivetScenario
|
99
|
+
given: Givet
|
100
|
+
when: När
|
82
101
|
then: Så
|
83
102
|
and: Och
|
84
103
|
but: Men
|
@@ -91,3 +110,11 @@
|
|
91
110
|
then: Siis
|
92
111
|
and: Ja
|
93
112
|
but: Kuid
|
113
|
+
"zh-CN":
|
114
|
+
scenario: 场景
|
115
|
+
given_scenario: 引用场景
|
116
|
+
given: 假如
|
117
|
+
when: 当
|
118
|
+
then: 那么
|
119
|
+
and: 而且
|
120
|
+
but: 但是
|
@@ -0,0 +1 @@
|
|
1
|
+
%w{table}.each{|f| require "cucumber/model/#{f}"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Cucumber
|
2
|
+
module Model
|
3
|
+
class Table
|
4
|
+
attr_accessor :raw
|
5
|
+
|
6
|
+
# Creates a new table. The +raw+ argument should be an array
|
7
|
+
# of arrays
|
8
|
+
def initialize(raw)
|
9
|
+
@raw = raw
|
10
|
+
end
|
11
|
+
|
12
|
+
# Turn the table into an array of Hash where each Hash
|
13
|
+
# has keys corresponding to the table header (first line)
|
14
|
+
# and the values are the individual row cells.
|
15
|
+
def hashes
|
16
|
+
header = @raw[0]
|
17
|
+
@raw[1..-1].map do |row|
|
18
|
+
h = {}
|
19
|
+
row.each_with_index do |v,n|
|
20
|
+
key = header[n]
|
21
|
+
h[key] = v
|
22
|
+
end
|
23
|
+
h
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/cucumber/rails/world.rb
CHANGED
@@ -22,7 +22,7 @@ Dispatcher.class_eval do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# So that Test::Unit doesn't launch at the end - makes it think it has already been run.
|
25
|
-
Test::Unit.run = true
|
25
|
+
Test::Unit.run = true if Test::Unit.respond_to?(:run=)
|
26
26
|
|
27
27
|
$main = self
|
28
28
|
|
@@ -71,5 +71,3 @@ end
|
|
71
71
|
World do
|
72
72
|
Cucumber::Rails::World.new
|
73
73
|
end
|
74
|
-
|
75
|
-
ActionMailer::Base.delivery_method = :test if defined?(ActionMailer::Base)
|