cucumber 0.3.96 → 0.3.97
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 +22 -3
- data/License.txt +2 -0
- data/Manifest.txt +9 -5
- data/config/hoe.rb +1 -0
- data/examples/i18n/Rakefile +5 -3
- data/examples/i18n/fi/features/yhteenlasku.feature +5 -4
- data/examples/python/features/step_definitions/fib_steps.py +3 -0
- data/examples/python/features/support/env.rb +21 -21
- data/gem_tasks/contributors.rake +8 -0
- data/gem_tasks/features.rake +1 -0
- data/gem_tasks/sdoc.rake +7 -0
- data/lib/README.rdoc +12 -0
- data/lib/cucumber/ast/background.rb +1 -1
- data/lib/cucumber/ast/comment.rb +1 -1
- data/lib/cucumber/ast/examples.rb +9 -4
- data/lib/cucumber/ast/feature.rb +1 -1
- data/lib/cucumber/ast/feature_element.rb +1 -1
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +2 -2
- data/lib/cucumber/ast/py_string.rb +1 -1
- data/lib/cucumber/ast/scenario.rb +1 -1
- data/lib/cucumber/ast/scenario_outline.rb +8 -7
- data/lib/cucumber/ast/step.rb +1 -1
- data/lib/cucumber/ast/step_collection.rb +1 -1
- data/lib/cucumber/ast/step_invocation.rb +1 -1
- data/lib/cucumber/ast/table.rb +65 -45
- data/lib/cucumber/ast/tags.rb +2 -2
- data/lib/cucumber/ast/visitor.rb +6 -8
- data/lib/cucumber/broadcaster.rb +1 -1
- data/lib/cucumber/cli/language_help_formatter.rb +1 -1
- data/lib/cucumber/cli/main.rb +15 -52
- data/lib/cucumber/constantize.rb +1 -1
- data/lib/cucumber/core_ext/exception.rb +1 -1
- data/lib/cucumber/core_ext/instance_exec.rb +8 -3
- data/lib/cucumber/core_ext/proc.rb +1 -1
- data/lib/cucumber/core_ext/string.rb +1 -1
- data/lib/cucumber/feature_file.rb +4 -3
- data/lib/cucumber/filter.rb +2 -1
- data/lib/cucumber/formatter/ansicolor.rb +6 -5
- data/lib/cucumber/formatter/color_io.rb +2 -2
- data/lib/cucumber/formatter/console.rb +2 -0
- data/lib/cucumber/formatter/duration.rb +3 -0
- data/lib/cucumber/formatter/html.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +1 -0
- data/lib/cucumber/formatter/ordered_xml_markup.rb +1 -1
- data/lib/cucumber/formatter/pretty.rb +18 -4
- data/lib/cucumber/formatter/profile.rb +1 -0
- data/lib/cucumber/formatter/progress.rb +1 -0
- data/lib/cucumber/formatter/rerun.rb +2 -0
- data/lib/cucumber/formatter/steps.rb +1 -0
- data/lib/cucumber/formatter/tag_cloud.rb +2 -1
- data/lib/cucumber/formatter/unicode.rb +1 -1
- data/lib/cucumber/formatter/usage.rb +1 -0
- data/lib/cucumber/language_support.rb +30 -0
- data/lib/cucumber/language_support/language_methods.rb +34 -12
- data/lib/cucumber/parser/feature.rb +81 -57
- data/lib/cucumber/parser/feature.tt +3 -3
- data/lib/cucumber/parser/natural_language.rb +1 -1
- data/lib/cucumber/parser/table.rb +3 -0
- data/lib/cucumber/parser/treetop_ext.rb +6 -5
- data/lib/cucumber/platform.rb +1 -2
- data/lib/cucumber/py_support/py_dsl.py +8 -0
- data/lib/cucumber/py_support/py_language.py +2 -0
- data/lib/cucumber/py_support/py_language.rb +68 -0
- data/lib/cucumber/rails/world.rb +2 -1
- data/lib/cucumber/rake/task.rb +13 -11
- data/lib/cucumber/rb_support/rb_dsl.rb +27 -15
- data/lib/cucumber/rb_support/rb_hook.rb +1 -2
- data/lib/cucumber/rb_support/rb_language.rb +57 -33
- data/lib/cucumber/rb_support/rb_step_definition.rb +42 -38
- data/lib/cucumber/rb_support/rb_world.rb +93 -0
- data/lib/cucumber/rspec_neuter.rb +3 -3
- data/lib/cucumber/step_match.rb +2 -2
- data/lib/cucumber/step_mother.rb +91 -65
- data/lib/cucumber/version.rb +1 -1
- data/lib/cucumber/webrat/element_locator.rb +3 -3
- data/rails_generators/cucumber/templates/cucumber.rake +2 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +4 -0
- data/spec/cucumber/ast/background_spec.rb +8 -1
- data/spec/cucumber/ast/scenario_outline_spec.rb +1 -0
- data/spec/cucumber/ast/table_spec.rb +10 -0
- data/spec/cucumber/cli/options_spec.rb +1 -1
- data/spec/cucumber/parser/feature_parser_spec.rb +4 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +114 -0
- data/spec/cucumber/step_mother_spec.rb +29 -10
- data/spec/cucumber/treetop_parser/with_comments.feature +14 -1
- data/spec/cucumber/world/pending_spec.rb +1 -1
- metadata +21 -7
- data/gem_tasks/yard.rake +0 -8
- data/lib/cucumber/language_support/hook_methods.rb +0 -9
- data/lib/cucumber/world.rb +0 -89
- data/spec/cucumber/ast/visitor_spec.rb +0 -27
- data/spec/cucumber/step_definition_spec.rb +0 -102
data/History.txt
CHANGED
@@ -1,6 +1,25 @@
|
|
1
|
+
== 0.3.97 2009-08-23
|
2
|
+
|
3
|
+
The AA-FTT release. Creating a release for the AA-FTT meeting in Chicago so that we can play
|
4
|
+
with the new language API and maybe knock out some better .NET support.
|
5
|
+
|
6
|
+
=== Bugfixes
|
7
|
+
* Allow comments on examples sections underneath scenario outlines (#420 Mike Sassak)
|
8
|
+
* Table.map_headers! will fail with a decent error message when 0 or 2+ headers are matched. (Aslak Hellesøy)
|
9
|
+
* Fixed an issue with comments with preceding spaces after a background causing a parse error (#401 Joseph Wilk)
|
10
|
+
|
11
|
+
=== New Features
|
12
|
+
* The public API is documented and there is a new :sdoc task to generate nice searchable API docs.
|
13
|
+
* Add :default => :cucumber when setting up Rake tasks for Cucumber in Rails (Aslak Hellesøy)
|
14
|
+
* New When /^I fill in "([^\"]*)" for "([^\"]*)"$/ Webrat step for Rails (Aslak Hellesøy)
|
15
|
+
|
16
|
+
=== Changed Features
|
17
|
+
* Changed the Programming Language API to support languages without "bleed through" (e.g. rubypython can't invoke ruby objs) (Aslak Hellesøy)
|
18
|
+
* The Programming Language API manages hooks on the language level instead of on the step mother level (Aslak Hellesøy)
|
19
|
+
|
1
20
|
== 0.3.96 2009-08-15
|
2
21
|
|
3
|
-
This release doesn't have any
|
22
|
+
This release doesn't have any significant new features or bug fixes, but there are big
|
4
23
|
internal changes. This release has a new API for plugging in other programming languages.
|
5
24
|
You can read more about that here: http://groups.google.com/group/cukes/browse_thread/thread/b9db8bf1f3ec9708
|
6
25
|
|
@@ -870,8 +889,8 @@ spaces removed too.
|
|
870
889
|
== 0.1.8 2008-10-18
|
871
890
|
|
872
891
|
This release extends the support for tables. PLEASE NOTE THAT TABLES ARE STILL EXPERIMENTAL.
|
873
|
-
In previous releases it has been possible to use tables to define "more examples" of a scenario
|
874
|
-
|
892
|
+
In previous releases it has been possible to use tables to define "more examples" of a scenario in
|
893
|
+
a FIT-style column fixture kind of way. Now you can also use tables as arguments to steps.
|
875
894
|
|
876
895
|
Tables used to define more examples after a scenario must now be prefixed. In English it looks like this:
|
877
896
|
|
data/License.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -168,6 +168,7 @@ examples/junit/features/pending.feature
|
|
168
168
|
examples/junit/features/step_definitions/steps.rb
|
169
169
|
examples/pure_java/README.textile
|
170
170
|
examples/python/features/fibonacci.feature
|
171
|
+
examples/python/features/step_definitions/fib_steps.py
|
171
172
|
examples/python/features/step_definitions/fib_steps.rb
|
172
173
|
examples/python/features/support/env.rb
|
173
174
|
examples/python/lib/fib.py
|
@@ -289,7 +290,8 @@ gem_tasks/flog.rake
|
|
289
290
|
gem_tasks/gemspec.rake
|
290
291
|
gem_tasks/rspec.rake
|
291
292
|
gem_tasks/sass.rake
|
292
|
-
gem_tasks/
|
293
|
+
gem_tasks/sdoc.rake
|
294
|
+
lib/README.rdoc
|
293
295
|
lib/autotest/cucumber.rb
|
294
296
|
lib/autotest/cucumber_mixin.rb
|
295
297
|
lib/autotest/cucumber_rails.rb
|
@@ -346,7 +348,7 @@ lib/cucumber/formatter/tag_cloud.rb
|
|
346
348
|
lib/cucumber/formatter/unicode.rb
|
347
349
|
lib/cucumber/formatter/usage.rb
|
348
350
|
lib/cucumber/formatters/unicode.rb
|
349
|
-
lib/cucumber/language_support
|
351
|
+
lib/cucumber/language_support.rb
|
350
352
|
lib/cucumber/language_support/language_methods.rb
|
351
353
|
lib/cucumber/language_support/step_definition_methods.rb
|
352
354
|
lib/cucumber/languages.yml
|
@@ -359,6 +361,9 @@ lib/cucumber/parser/table.rb
|
|
359
361
|
lib/cucumber/parser/table.tt
|
360
362
|
lib/cucumber/parser/treetop_ext.rb
|
361
363
|
lib/cucumber/platform.rb
|
364
|
+
lib/cucumber/py_support/py_dsl.py
|
365
|
+
lib/cucumber/py_support/py_language.py
|
366
|
+
lib/cucumber/py_support/py_language.rb
|
362
367
|
lib/cucumber/rails/rspec.rb
|
363
368
|
lib/cucumber/rails/world.rb
|
364
369
|
lib/cucumber/rake/task.rb
|
@@ -366,13 +371,13 @@ lib/cucumber/rb_support/rb_dsl.rb
|
|
366
371
|
lib/cucumber/rb_support/rb_hook.rb
|
367
372
|
lib/cucumber/rb_support/rb_language.rb
|
368
373
|
lib/cucumber/rb_support/rb_step_definition.rb
|
374
|
+
lib/cucumber/rb_support/rb_world.rb
|
369
375
|
lib/cucumber/rspec_neuter.rb
|
370
376
|
lib/cucumber/step_match.rb
|
371
377
|
lib/cucumber/step_mother.rb
|
372
378
|
lib/cucumber/version.rb
|
373
379
|
lib/cucumber/webrat/element_locator.rb
|
374
380
|
lib/cucumber/webrat/table_locator.rb
|
375
|
-
lib/cucumber/world.rb
|
376
381
|
rails_generators/cucumber/USAGE
|
377
382
|
rails_generators/cucumber/cucumber_generator.rb
|
378
383
|
rails_generators/cucumber/templates/cucumber
|
@@ -396,7 +401,6 @@ spec/cucumber/ast/scenario_spec.rb
|
|
396
401
|
spec/cucumber/ast/step_collection_spec.rb
|
397
402
|
spec/cucumber/ast/step_spec.rb
|
398
403
|
spec/cucumber/ast/table_spec.rb
|
399
|
-
spec/cucumber/ast/visitor_spec.rb
|
400
404
|
spec/cucumber/broadcaster_spec.rb
|
401
405
|
spec/cucumber/cli/configuration_spec.rb
|
402
406
|
spec/cucumber/cli/drb_client_spec.rb
|
@@ -415,8 +419,8 @@ spec/cucumber/parser/table_parser_spec.rb
|
|
415
419
|
spec/cucumber/rails/stubs/mini_rails.rb
|
416
420
|
spec/cucumber/rails/stubs/test_help.rb
|
417
421
|
spec/cucumber/rails/world_spec.rb
|
422
|
+
spec/cucumber/rb_support/rb_step_definition_spec.rb
|
418
423
|
spec/cucumber/sell_cucumbers.feature
|
419
|
-
spec/cucumber/step_definition_spec.rb
|
420
424
|
spec/cucumber/step_mother_spec.rb
|
421
425
|
spec/cucumber/treetop_parser/empty_feature.feature
|
422
426
|
spec/cucumber/treetop_parser/empty_scenario.feature
|
data/config/hoe.rb
CHANGED
@@ -63,6 +63,7 @@ $hoe = Hoe.spec(GEM_NAME) do |p|
|
|
63
63
|
p.extra_deps = [
|
64
64
|
['term-ansicolor', '>= 1.0.3'],
|
65
65
|
['treetop', '>= 1.3.0'],
|
66
|
+
['polyglot', '>= 0.2.8'], # Don't really want polyglot, but it keeps breaking so we'll make people use something that works ok'ish
|
66
67
|
['diff-lcs', '>= 1.1.2'],
|
67
68
|
['builder', '>= 2.1.2']
|
68
69
|
]
|
data/examples/i18n/Rakefile
CHANGED
@@ -6,7 +6,7 @@ task :i18n do
|
|
6
6
|
lang = f[dir.length+1..-1]
|
7
7
|
if examples_working?(lang)
|
8
8
|
Dir.chdir(f) do
|
9
|
-
rake("
|
9
|
+
rake("cucumber")
|
10
10
|
end
|
11
11
|
else
|
12
12
|
STDERR.puts %{
|
@@ -21,10 +21,12 @@ task :i18n do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
task :default => :i18n
|
25
|
+
|
24
26
|
def examples_working?(lang)
|
25
|
-
!%w{ro
|
27
|
+
!%w{ro}.index(lang)
|
26
28
|
end
|
27
29
|
|
28
30
|
def rake(args)
|
29
|
-
ruby($0, args)
|
31
|
+
ruby($0, args)
|
30
32
|
end
|
@@ -1,13 +1,14 @@
|
|
1
|
+
# language: fi
|
1
2
|
Ominaisuus: Yhteenlasku
|
2
3
|
Välttyäkseni hölmöiltä virheiltä
|
3
4
|
Koska olen laskutaidoton
|
4
5
|
Haluan että yhteenlaskut lasketaan puolestani
|
5
6
|
|
6
7
|
Tapausaihio: Kahden luvun summa
|
7
|
-
Oletetaan että olen syöttänyt laskimeen luvun
|
8
|
-
Ja että olen syöttänyt laskimeen luvun
|
9
|
-
Kun painan "
|
10
|
-
Niin laskimen ruudulla pitäisi näkyä tulos
|
8
|
+
Oletetaan että olen syöttänyt laskimeen luvun <luku_1>
|
9
|
+
Ja että olen syöttänyt laskimeen luvun <luku_2>
|
10
|
+
Kun painan "<nappi>"
|
11
|
+
Niin laskimen ruudulla pitäisi näkyä tulos <tulos>
|
11
12
|
|
12
13
|
Tapaukset:
|
13
14
|
| luku_1 | luku_2 | nappi | tulos |
|
@@ -1,21 +1,21 @@
|
|
1
|
-
require 'rubypython'
|
2
|
-
|
3
|
-
ENV['PYTHONPATH'] = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
4
|
-
|
5
|
-
Before do
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
After do
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
# RubyPython seems to expect this to exist (?)
|
15
|
-
class String
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
1
|
+
# require 'rubypython'
|
2
|
+
#
|
3
|
+
# ENV['PYTHONPATH'] = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
4
|
+
#
|
5
|
+
# Before do
|
6
|
+
# RubyPython.start
|
7
|
+
# @fib = RubyPython.import('fib')
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# After do
|
11
|
+
# RubyPython.stop
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # RubyPython seems to expect this to exist (?)
|
15
|
+
# class String
|
16
|
+
# def end_with?(str)
|
17
|
+
# str = str.to_str
|
18
|
+
# tail = self[-str.length, str.length]
|
19
|
+
# tail == str
|
20
|
+
# end
|
21
|
+
# end
|
data/gem_tasks/contributors.rake
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
task :contributors do
|
2
2
|
contributors = `git log --pretty=short --no-merges | git shortlog -ne | egrep -ve '^ +' | egrep -ve '^$'`
|
3
3
|
puts contributors.split("\n").length
|
4
|
+
end
|
5
|
+
|
6
|
+
task :codeswarm do
|
7
|
+
sh "code_swarm --reload" rescue nil # Fails because of encoding - which we'll fix
|
8
|
+
sh "iconv -f latin1 -t utf-8 .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
|
9
|
+
sh "sed -e 's/Aslak\ Hellesøy@.BEKK.no/aslak.hellesoy@gmail.com/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
|
10
|
+
sh "sed -e 's/josephwilk@joesniff.co.uk/joe@josephwilk.net/g' .git/.code_swarm/log.xml > tmp.xml && mv tmp.xml .git/.code_swarm/log.xml"
|
11
|
+
sh "code_swarm"
|
4
12
|
end
|
data/gem_tasks/features.rake
CHANGED
data/gem_tasks/sdoc.rake
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'sdoc' # and use your RDoc task the same way you used it before
|
2
|
+
|
3
|
+
Rake::RDocTask.new(:sdoc) do |rdoc|
|
4
|
+
rdoc.rdoc_dir = 'doc/sdoc'
|
5
|
+
rdoc.options += %w{--fmt shtml -N --webcvs=http://github.com/aslakhellesoy/cucumber/blob/v0.3.96/%s --title "Cucumber API" --threads 4 --main README --exclude cucumber/parser lib}
|
6
|
+
rdoc.template = 'direct' # lighter template used on railsapi.com
|
7
|
+
end
|
data/lib/README.rdoc
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
= Cucumber API
|
2
|
+
|
3
|
+
This is the public API of Cucumber. The public API includes the classes, modules
|
4
|
+
and methods you can use if you are a user of Cucumber. It also applies to you if
|
5
|
+
you're developing a 3rd party tool that integrates with Cucumber.
|
6
|
+
|
7
|
+
== Internal API
|
8
|
+
|
9
|
+
Cucumber has more classes, modules and methods than what you can see in the public
|
10
|
+
API. If you decide to dive into the source code and make use of an API that isn't
|
11
|
+
part of this documentation - beware that this API might change at any time. If you
|
12
|
+
want a particular internal API to be promoted to the public API - let us know.
|
data/lib/cucumber/ast/comment.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Ast
|
3
|
-
class Examples
|
4
|
-
def initialize(line, keyword, name, outline_table)
|
5
|
-
@keyword, @name, @outline_table = keyword, name, outline_table
|
3
|
+
class Examples #:nodoc:
|
4
|
+
def initialize(comment, line, keyword, name, outline_table)
|
5
|
+
@comment, @keyword, @name, @outline_table = comment, keyword, name, outline_table
|
6
6
|
end
|
7
7
|
|
8
8
|
def accept(visitor)
|
9
9
|
return if $cucumber_interrupted
|
10
|
+
visitor.visit_comment(@comment) unless @comment.empty?
|
10
11
|
visitor.visit_examples_name(@keyword, @name)
|
11
12
|
visitor.visit_outline_table(@outline_table)
|
12
13
|
end
|
@@ -20,7 +21,11 @@ module Cucumber
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def to_sexp
|
23
|
-
[:examples, @keyword, @name
|
24
|
+
sexp = [:examples, @keyword, @name]
|
25
|
+
comment = @comment.to_sexp
|
26
|
+
sexp += [comment] if comment
|
27
|
+
sexp += [@outline_table.to_sexp]
|
28
|
+
sexp
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
data/lib/cucumber/ast/feature.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Ast
|
3
|
-
class OutlineTable < Table
|
3
|
+
class OutlineTable < Table #:nodoc:
|
4
4
|
def initialize(raw, scenario_outline)
|
5
5
|
super(raw)
|
6
6
|
@scenario_outline = scenario_outline
|
@@ -44,7 +44,7 @@ module Cucumber
|
|
44
44
|
@scenario_outline.visit_scenario_name(visitor, row)
|
45
45
|
end
|
46
46
|
|
47
|
-
class ExampleRow < Cells
|
47
|
+
class ExampleRow < Cells #:nodoc:
|
48
48
|
attr_reader :scenario_outline # https://rspec.lighthouseapp.com/projects/16211/tickets/342
|
49
49
|
|
50
50
|
def create_step_invocations!(scenario_outline)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Ast
|
3
|
-
class ScenarioOutline
|
3
|
+
class ScenarioOutline #:nodoc:
|
4
4
|
include FeatureElement
|
5
5
|
|
6
|
-
module ExamplesArray
|
6
|
+
module ExamplesArray #:nodoc:
|
7
7
|
def accept(visitor)
|
8
8
|
return if $cucumber_interrupted
|
9
9
|
each do |examples|
|
@@ -24,13 +24,14 @@ module Cucumber
|
|
24
24
|
@steps = StepCollection.new(steps)
|
25
25
|
|
26
26
|
@examples_array = example_sections.map do |example_section|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
examples_comment = example_section[0]
|
28
|
+
examples_line = example_section[1]
|
29
|
+
examples_keyword = example_section[2]
|
30
|
+
examples_name = example_section[3]
|
31
|
+
examples_matrix = example_section[4]
|
31
32
|
|
32
33
|
examples_table = OutlineTable.new(examples_matrix, self)
|
33
|
-
Examples.new(examples_line, examples_keyword, examples_name, examples_table)
|
34
|
+
Examples.new(examples_comment, examples_line, examples_keyword, examples_name, examples_table)
|
34
35
|
end
|
35
36
|
@examples_array.extend(ExamplesArray)
|
36
37
|
|
data/lib/cucumber/ast/step.rb
CHANGED
data/lib/cucumber/ast/table.rb
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
module Cucumber
|
2
2
|
module Ast
|
3
|
-
#
|
3
|
+
# Step Definitions that match a plain text Step with a multiline argument table
|
4
|
+
# will receive it as an instance of Table. A Table object holds the data of a
|
5
|
+
# table parsed from a feature file and lets you access and manipulate the data
|
6
|
+
# in different ways.
|
4
7
|
#
|
5
|
-
#
|
6
|
-
# | c | d |
|
8
|
+
# For example:
|
7
9
|
#
|
8
|
-
#
|
10
|
+
# Given I have:
|
11
|
+
# | a | b |
|
12
|
+
# | c | d |
|
13
|
+
#
|
14
|
+
# And a matching StepDefinition:
|
15
|
+
#
|
16
|
+
# Given /I have:/ do |table|
|
17
|
+
# data = table.raw
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
|
9
21
|
#
|
10
22
|
class Table
|
11
23
|
include Enumerable
|
@@ -14,10 +26,14 @@ module Cucumber
|
|
14
26
|
|
15
27
|
attr_accessor :file
|
16
28
|
|
17
|
-
def self.default_arg_name
|
29
|
+
def self.default_arg_name #:nodoc:
|
18
30
|
"table"
|
19
31
|
end
|
20
32
|
|
33
|
+
# Creates a new instance. +raw+ should be an Array of Array of String.
|
34
|
+
# You don't typically create your own Table objects - Cucumber will do
|
35
|
+
# it internally and pass them to your Step Definitions.
|
36
|
+
#
|
21
37
|
def initialize(raw, conversion_procs = NULL_CONVERSIONS.dup)
|
22
38
|
@cells_class = Cells
|
23
39
|
@cell_class = Cell
|
@@ -28,21 +44,23 @@ module Cucumber
|
|
28
44
|
@conversion_procs = conversion_procs
|
29
45
|
end
|
30
46
|
|
31
|
-
# Creates a copy of this table, inheriting
|
47
|
+
# Creates a copy of this table, inheriting any column mappings.
|
48
|
+
# registered with #map_headers!
|
49
|
+
#
|
32
50
|
def dup
|
33
51
|
self.class.new(raw.dup, @conversion_procs.dup)
|
34
52
|
end
|
35
53
|
|
36
54
|
# Returns a new, transposed table. Example:
|
37
55
|
#
|
38
|
-
#
|
39
|
-
#
|
56
|
+
# | a | 7 | 4 |
|
57
|
+
# | b | 9 | 2 |
|
40
58
|
#
|
41
59
|
# Gets converted into the following:
|
42
60
|
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
61
|
+
# | a | b |
|
62
|
+
# | 7 | 9 |
|
63
|
+
# | 4 | 2 |
|
46
64
|
#
|
47
65
|
def transpose
|
48
66
|
self.class.new(raw.transpose, @conversion_procs.dup)
|
@@ -109,11 +127,11 @@ module Cucumber
|
|
109
127
|
raw[1..-1]
|
110
128
|
end
|
111
129
|
|
112
|
-
def each_cells_row(&proc)
|
130
|
+
def each_cells_row(&proc) #:nodoc:
|
113
131
|
cells_rows.each(&proc)
|
114
132
|
end
|
115
133
|
|
116
|
-
def accept(visitor)
|
134
|
+
def accept(visitor) #:nodoc:
|
117
135
|
return if $cucumber_interrupted
|
118
136
|
cells_rows.each do |row|
|
119
137
|
visitor.visit_table_row(row)
|
@@ -149,8 +167,10 @@ module Cucumber
|
|
149
167
|
def map_headers!(mappings)
|
150
168
|
header_cells = cell_matrix[0]
|
151
169
|
mappings.each_pair do |pre, post|
|
152
|
-
|
153
|
-
|
170
|
+
mapped_cells = header_cells.select{|cell| pre === cell.value}
|
171
|
+
raise "No headers matched #{pre.inspect}" if mapped_cells.empty?
|
172
|
+
raise "#{mapped_cells.length} headers matched #{pre.inspect}: #{mapped_cells.map{|c| c.value}.inspect}" if mapped_cells.length > 1
|
173
|
+
mapped_cells[0].value = post
|
154
174
|
if @conversion_procs.has_key?(pre)
|
155
175
|
@conversion_procs[post] = @conversion_procs.delete(pre)
|
156
176
|
end
|
@@ -204,10 +224,10 @@ module Cucumber
|
|
204
224
|
# Whether to raise or not raise can be changed by setting values in
|
205
225
|
# +options+ to true or false:
|
206
226
|
#
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
#
|
227
|
+
# * <tt>missing_row</tt> : Raise on missing rows (defaults to true)
|
228
|
+
# * <tt>surplus_row</tt> : Raise on surplus rows (defaults to true)
|
229
|
+
# * <tt>missing_col</tt> : Raise on missing columns (defaults to true)
|
230
|
+
# * <tt>surplus_col</tt> : Raise on surplus columns (defaults to false)
|
211
231
|
#
|
212
232
|
# The +other_table+ argument can be another Table, an Array of Array or
|
213
233
|
# an Array of Hash (similar to the structure returned by #hashes).
|
@@ -296,11 +316,11 @@ module Cucumber
|
|
296
316
|
cells_rows.index(cells)
|
297
317
|
end
|
298
318
|
|
299
|
-
def verify_column(column_name)
|
319
|
+
def verify_column(column_name) #:nodoc:
|
300
320
|
raise %{The column named "#{column_name}" does not exist} unless raw[0].include?(column_name)
|
301
321
|
end
|
302
322
|
|
303
|
-
def verify_table_width(width)
|
323
|
+
def verify_table_width(width) #:nodoc:
|
304
324
|
raise %{The table must have exactly #{width} columns} unless raw[0].size == width
|
305
325
|
end
|
306
326
|
|
@@ -319,33 +339,33 @@ module Cucumber
|
|
319
339
|
Table.new(raw_with_replaced_args)
|
320
340
|
end
|
321
341
|
|
322
|
-
def has_text?(text)
|
342
|
+
def has_text?(text) #:nodoc:
|
323
343
|
raw.flatten.compact.detect{|cell_value| cell_value.index(text)}
|
324
344
|
end
|
325
345
|
|
326
|
-
def cells_rows
|
346
|
+
def cells_rows #:nodoc:
|
327
347
|
@rows ||= cell_matrix.map do |cell_row|
|
328
348
|
@cells_class.new(self, cell_row)
|
329
349
|
end
|
330
350
|
end
|
331
351
|
|
332
|
-
def headers
|
352
|
+
def headers #:nodoc:
|
333
353
|
raw.first
|
334
354
|
end
|
335
355
|
|
336
|
-
def header_cell(col)
|
356
|
+
def header_cell(col) #:nodoc:
|
337
357
|
cells_rows[0][col]
|
338
358
|
end
|
339
359
|
|
340
|
-
def cell_matrix
|
360
|
+
def cell_matrix #:nodoc:
|
341
361
|
@cell_matrix
|
342
362
|
end
|
343
363
|
|
344
|
-
def col_width(col)
|
364
|
+
def col_width(col) #:nodoc:
|
345
365
|
columns[col].__send__(:width)
|
346
366
|
end
|
347
367
|
|
348
|
-
def to_s(options = {})
|
368
|
+
def to_s(options = {}) #:nodoc:
|
349
369
|
options = {:color => true, :indent => 2, :prefixes => TO_S_PREFIXES}.merge(options)
|
350
370
|
io = StringIO.new
|
351
371
|
|
@@ -369,7 +389,7 @@ module Cucumber
|
|
369
389
|
|
370
390
|
protected
|
371
391
|
|
372
|
-
def inspect_rows(missing_row, inserted_row)
|
392
|
+
def inspect_rows(missing_row, inserted_row) #:nodoc:
|
373
393
|
missing_row.each_with_index do |missing_cell, col|
|
374
394
|
inserted_cell = inserted_row[col]
|
375
395
|
if(missing_cell.value != inserted_cell.value && (missing_cell.value.to_s == inserted_cell.value.to_s))
|
@@ -379,7 +399,7 @@ module Cucumber
|
|
379
399
|
end
|
380
400
|
end
|
381
401
|
|
382
|
-
def create_cell_matrix(raw)
|
402
|
+
def create_cell_matrix(raw) #:nodoc:
|
383
403
|
@cell_matrix = raw.map do |raw_row|
|
384
404
|
line = raw_row.line rescue -1
|
385
405
|
raw_row.map do |raw_cell|
|
@@ -388,7 +408,7 @@ module Cucumber
|
|
388
408
|
end
|
389
409
|
end
|
390
410
|
|
391
|
-
def convert_columns!
|
411
|
+
def convert_columns! #:nodoc:
|
392
412
|
cell_matrix.transpose.each do |col|
|
393
413
|
conversion_proc = @conversion_procs[col[0].value]
|
394
414
|
col[1..-1].each do |cell|
|
@@ -397,7 +417,7 @@ module Cucumber
|
|
397
417
|
end
|
398
418
|
end
|
399
419
|
|
400
|
-
def require_diff_lcs
|
420
|
+
def require_diff_lcs #:nodoc:
|
401
421
|
begin
|
402
422
|
require 'diff/lcs'
|
403
423
|
rescue LoadError => e
|
@@ -406,23 +426,23 @@ module Cucumber
|
|
406
426
|
end
|
407
427
|
end
|
408
428
|
|
409
|
-
def clear_cache!
|
429
|
+
def clear_cache! #:nodoc:
|
410
430
|
@hashes = @rows_hash = @rows = @columns = nil
|
411
431
|
end
|
412
432
|
|
413
|
-
def columns
|
433
|
+
def columns #:nodoc:
|
414
434
|
@columns ||= cell_matrix.transpose.map do |cell_row|
|
415
435
|
@cells_class.new(self, cell_row)
|
416
436
|
end.freeze
|
417
437
|
end
|
418
438
|
|
419
|
-
def new_cell(raw_cell, line)
|
439
|
+
def new_cell(raw_cell, line) #:nodoc:
|
420
440
|
@cell_class.new(raw_cell, self, line)
|
421
441
|
end
|
422
442
|
|
423
443
|
# Pads our own cell_matrix and returns a cell matrix of same
|
424
444
|
# column width that can be used for diffing
|
425
|
-
def pad!(other_cell_matrix)
|
445
|
+
def pad!(other_cell_matrix) #:nodoc:
|
426
446
|
clear_cache!
|
427
447
|
cols = cell_matrix.transpose
|
428
448
|
unmapped_cols = other_cell_matrix.transpose
|
@@ -460,38 +480,38 @@ module Cucumber
|
|
460
480
|
(mapped_cols + unmapped_cols).transpose
|
461
481
|
end
|
462
482
|
|
463
|
-
def ensure_table(table_or_array)
|
483
|
+
def ensure_table(table_or_array) #:nodoc:
|
464
484
|
return table_or_array if Table === table_or_array
|
465
485
|
table_or_array = hashes_to_array(table_or_array) if Hash === table_or_array[0]
|
466
486
|
table_or_array = enumerable_to_array(table_or_array) unless Array == table_or_array[0]
|
467
487
|
Table.new(table_or_array)
|
468
488
|
end
|
469
489
|
|
470
|
-
def hashes_to_array(hashes)
|
490
|
+
def hashes_to_array(hashes) #:nodoc:
|
471
491
|
header = hashes[0].keys
|
472
492
|
[header] + hashes.map{|hash| header.map{|key| hash[key]}}
|
473
493
|
end
|
474
494
|
|
475
|
-
def enumerable_to_array(rows)
|
495
|
+
def enumerable_to_array(rows) #:nodoc:
|
476
496
|
rows.map{|row| row.map{|cell| cell}}
|
477
497
|
end
|
478
498
|
|
479
|
-
def ensure_green!
|
499
|
+
def ensure_green! #:nodoc:
|
480
500
|
each_cell{|cell| cell.status = :passed}
|
481
501
|
end
|
482
502
|
|
483
|
-
def each_cell(&proc)
|
503
|
+
def each_cell(&proc) #:nodoc:
|
484
504
|
cell_matrix.each{|row| row.each(&proc)}
|
485
505
|
end
|
486
506
|
|
487
|
-
def mark_as_missing(col)
|
507
|
+
def mark_as_missing(col) #:nodoc:
|
488
508
|
col.each do |cell|
|
489
509
|
cell.status = :undefined
|
490
510
|
end
|
491
511
|
end
|
492
512
|
|
493
513
|
# Represents a row of cells or columns of cells
|
494
|
-
class Cells
|
514
|
+
class Cells #:nodoc:
|
495
515
|
include Enumerable
|
496
516
|
attr_reader :exception
|
497
517
|
|
@@ -547,7 +567,7 @@ module Cucumber
|
|
547
567
|
end
|
548
568
|
end
|
549
569
|
|
550
|
-
class Cell
|
570
|
+
class Cell #:nodoc:
|
551
571
|
attr_reader :line, :table
|
552
572
|
attr_accessor :status, :value
|
553
573
|
|
@@ -574,7 +594,7 @@ module Cucumber
|
|
574
594
|
end
|
575
595
|
end
|
576
596
|
|
577
|
-
class SurplusCell < Cell
|
597
|
+
class SurplusCell < Cell #:nodoc:
|
578
598
|
def status
|
579
599
|
:comment
|
580
600
|
end
|