cucumber 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +223 -5
- data/License.txt +1 -1
- data/Manifest.txt +174 -85
- data/README.txt +2 -39
- data/Rakefile +1 -2
- data/bin/cucumber +2 -2
- data/config/hoe.rb +9 -3
- data/examples/cs/README.textile +1 -22
- data/examples/cs/Rakefile +1 -1
- data/examples/cs/compile.bat +1 -0
- data/examples/cs/features/addition.feature +16 -0
- data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
- data/examples/cs/src/demo/Calculator.cs +20 -0
- data/examples/i18n/README.textile +1 -1
- data/examples/i18n/Rakefile +20 -4
- data/examples/i18n/ar/features/addition.feature +10 -11
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +4 -12
- data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +4 -2
- data/examples/i18n/de/features/addition.feature +10 -11
- data/examples/i18n/de/features/division.feature +0 -1
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +5 -11
- data/examples/i18n/en/features/addition.feature +10 -11
- data/examples/i18n/en/features/division.feature +0 -1
- data/examples/i18n/en/features/step_definitons/calculator_steps.rb +5 -12
- data/examples/i18n/en-lol/Rakefile +6 -0
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
- data/examples/i18n/en-lol/features/stuffing.feature +8 -0
- data/examples/i18n/en-lol/features/support/env.rb +8 -0
- data/examples/i18n/en-lol/lib/basket.rb +12 -0
- data/examples/i18n/en-lol/lib/belly.rb +11 -0
- data/examples/i18n/es/features/adicion.feature +11 -12
- data/examples/i18n/es/features/step_definitons/calculador_steps.rb +10 -11
- data/examples/i18n/es/lib/calculador.rb +4 -1
- data/examples/i18n/et/features/jagamine.feature +9 -0
- data/examples/i18n/et/features/liitmine.feature +10 -11
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +7 -9
- data/examples/i18n/et/lib/kalkulaator.rb +5 -1
- data/examples/i18n/fi/Rakefile +6 -0
- data/examples/i18n/fi/features/jakolasku.feature +9 -0
- data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
- data/examples/i18n/fi/features/yhteenlasku.feature +16 -0
- data/examples/i18n/fi/lib/laskin.rb +14 -0
- data/examples/i18n/fr/features/addition.feature +16 -12
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +14 -11
- data/examples/i18n/fr/lib/calculatrice.rb +1 -1
- data/examples/i18n/id/features/addition.feature +10 -11
- data/examples/i18n/id/features/division.feature +0 -1
- data/examples/i18n/id/features/step_definitons/calculator_steps.rb +5 -12
- data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +4 -2
- data/examples/i18n/ja/features/addition.feature +10 -11
- data/examples/i18n/ja/features/division.feature +2 -3
- data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +6 -12
- data/examples/i18n/ko/Rakefile +6 -0
- data/examples/i18n/ko/features/addition.feature +16 -0
- data/examples/i18n/ko/features/division.feature +10 -0
- data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/ko/lib/calculator.rb +14 -0
- data/examples/i18n/lt/features/addition.feature +11 -11
- data/examples/i18n/lt/features/division.feature +0 -1
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +5 -12
- data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +4 -9
- data/examples/i18n/no/features/summering.feature +1 -0
- data/examples/i18n/no/features/support/env.rb +6 -0
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +4 -2
- data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +4 -2
- data/examples/i18n/ru/Rakefile +6 -0
- data/examples/i18n/ru/features/addition.feature +10 -0
- data/examples/i18n/ru/features/consecutive_calculations.feature +16 -0
- data/examples/i18n/ru/features/division.feature +15 -0
- data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
- data/examples/i18n/ru/features/support/env.rb +6 -0
- data/examples/i18n/ru/features/support/world.rb +7 -0
- data/examples/i18n/ru/lib/calculator.rb +24 -0
- data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +4 -2
- data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +5 -3
- data/examples/i18n/zh-TW/Rakefile +6 -0
- data/examples/i18n/zh-TW/features/addition.feature +16 -0
- data/examples/i18n/zh-TW/features/division.feature +10 -0
- data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
- data/examples/java/features/step_definitons/hello_steps.rb +1 -1
- data/examples/java/features/step_definitons/tree_steps.rb +1 -1
- data/examples/jbehave/README.textile +20 -0
- data/examples/jbehave/features/support/env.rb +7 -0
- data/examples/jbehave/features/trading.feature +28 -0
- data/examples/jbehave/pom.xml +53 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
- data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +70 -0
- data/examples/selenium/features/search.feature +1 -1
- data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium/features/support/env.rb +19 -0
- data/examples/selenium_webrat/features/search.feature +9 -0
- data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
- data/examples/selenium_webrat/features/support/env.rb +41 -0
- data/examples/self_test/README.textile +6 -0
- data/examples/self_test/Rakefile +6 -0
- data/examples/self_test/features/background/failing_background.feature +11 -0
- data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
- data/examples/self_test/features/background/multiline_args_background.feature +32 -0
- data/examples/self_test/features/background/passing_background.feature +10 -0
- data/examples/self_test/features/background/pending_background.feature +10 -0
- data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
- data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
- data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
- data/examples/self_test/features/failing_expectation.feature +4 -0
- data/examples/self_test/features/lots_of_undefined.feature +8 -0
- data/examples/self_test/features/outline_sample.feature +15 -0
- data/examples/self_test/features/sample.feature +19 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +64 -0
- data/examples/self_test/features/support/env.rb +1 -0
- data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
- data/examples/sinatra/Rakefile +6 -0
- data/examples/sinatra/app.rb +14 -0
- data/examples/sinatra/features/add.feature +11 -0
- data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
- data/examples/sinatra/features/support/env.rb +20 -0
- data/examples/sinatra/views/add.erb +5 -0
- data/examples/sinatra/views/layout.erb +8 -0
- data/examples/tickets/Rakefile +13 -8
- data/examples/tickets/cucumber.yml +2 -1
- data/examples/tickets/features/172.feature +28 -0
- data/examples/tickets/features/177/1.feature +29 -0
- data/examples/tickets/features/177/2.feature +21 -0
- data/examples/tickets/features/177/3.feature +18 -0
- data/examples/tickets/features/180.feature +7 -0
- data/examples/tickets/features/236.feature +13 -0
- data/examples/tickets/features/241.feature +13 -0
- data/examples/tickets/features/lib/eatting_machine.rb +18 -0
- data/examples/tickets/features/lib/pantry.rb +20 -0
- data/examples/tickets/features/scenario_outline.feature +95 -0
- data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +46 -5
- data/examples/tickets/features/tickets.feature +5 -1
- data/examples/watir/README.textile +16 -0
- data/examples/watir/features/step_definitons/search_steps.rb +24 -0
- data/examples/watir/features/support/env.rb +32 -0
- data/features/background.feature +221 -0
- data/features/cucumber_cli.feature +389 -0
- data/features/cucumber_cli_diff_disabled.feature +45 -0
- data/features/cucumber_cli_outlines.feature +81 -0
- data/features/custom_formatter.feature +11 -0
- data/features/report_called_undefined_steps.feature +34 -0
- data/features/step_definitions/cucumber_steps.rb +30 -0
- data/features/step_definitions/extra_steps.rb +2 -0
- data/features/support/env.rb +8 -0
- data/gem_tasks/deployment.rake +0 -23
- data/gem_tasks/features.rake +1 -1
- data/gem_tasks/fix_cr_lf.rake +1 -1
- data/gem_tasks/flog.rake +1 -1
- data/gem_tasks/gemspec.rake +4 -0
- data/gem_tasks/jar.rake +67 -0
- data/gem_tasks/rspec.rake +31 -15
- data/gem_tasks/yard.rake +8 -0
- data/lib/autotest/cucumber_mixin.rb +41 -25
- data/lib/cucumber/ast/background.rb +50 -0
- data/lib/cucumber/ast/comment.rb +26 -0
- data/lib/cucumber/ast/examples.rb +38 -0
- data/lib/cucumber/ast/feature.rb +62 -0
- data/lib/cucumber/ast/feature_element.rb +46 -0
- data/lib/cucumber/ast/features.rb +20 -0
- data/lib/cucumber/ast/outline_table.rb +81 -0
- data/lib/cucumber/ast/py_string.rb +58 -0
- data/lib/cucumber/ast/scenario.rb +64 -0
- data/lib/cucumber/ast/scenario_outline.rb +90 -0
- data/lib/cucumber/ast/step.rb +122 -0
- data/lib/cucumber/ast/step_collection.rb +66 -0
- data/lib/cucumber/ast/step_invocation.rb +110 -0
- data/lib/cucumber/ast/table.rb +318 -0
- data/lib/cucumber/ast/tags.rb +33 -0
- data/lib/cucumber/ast/visitor.rb +125 -0
- data/lib/cucumber/ast.rb +29 -0
- data/lib/cucumber/broadcaster.rb +2 -9
- data/lib/cucumber/cli/configuration.rb +364 -0
- data/lib/cucumber/cli/language_help_formatter.rb +59 -0
- data/lib/cucumber/cli/main.rb +109 -0
- data/lib/cucumber/core_ext/exception.rb +53 -0
- data/lib/cucumber/core_ext/instance_exec.rb +54 -0
- data/lib/cucumber/core_ext/proc.rb +29 -65
- data/lib/cucumber/core_ext/string.rb +26 -0
- data/lib/cucumber/formatter/ansicolor.rb +102 -0
- data/lib/cucumber/formatter/color_io.rb +23 -0
- data/lib/cucumber/formatter/console.rb +109 -0
- data/lib/cucumber/formatter/cucumber.css +55 -0
- data/lib/cucumber/formatter/cucumber.sass +49 -0
- data/lib/cucumber/formatter/html.rb +133 -0
- data/lib/cucumber/formatter/pretty.rb +179 -0
- data/lib/cucumber/formatter/profile.rb +77 -0
- data/lib/cucumber/formatter/progress.rb +60 -0
- data/lib/cucumber/formatter/rerun.rb +35 -0
- data/lib/cucumber/formatter/unicode.rb +35 -0
- data/lib/cucumber/formatter.rb +1 -0
- data/lib/cucumber/formatters/unicode.rb +2 -0
- data/lib/cucumber/jbehave.rb +97 -0
- data/lib/cucumber/languages.yml +214 -72
- data/lib/cucumber/parser/basic.rb +0 -0
- data/lib/cucumber/parser/feature.rb +1487 -0
- data/lib/cucumber/parser/feature.tt +193 -0
- data/lib/cucumber/parser/i18n.tt +31 -0
- data/lib/cucumber/parser/table.rb +402 -0
- data/lib/cucumber/parser/table.tt +59 -0
- data/lib/cucumber/parser/treetop_ext.rb +75 -0
- data/lib/cucumber/parser.rb +43 -0
- data/lib/cucumber/platform.rb +13 -8
- data/lib/cucumber/rails/rspec.rb +6 -10
- data/lib/cucumber/rails/world.rb +8 -8
- data/lib/cucumber/rake/task.rb +46 -9
- data/lib/cucumber/step_definition.rb +103 -0
- data/lib/cucumber/step_match.rb +49 -0
- data/lib/cucumber/step_mother.rb +184 -65
- data/lib/cucumber/version.rb +4 -3
- data/lib/cucumber/world.rb +53 -0
- data/lib/cucumber.rb +45 -21
- data/rails_generators/cucumber/cucumber_generator.rb +23 -3
- data/rails_generators/cucumber/templates/cucumber +2 -1
- data/rails_generators/cucumber/templates/cucumber.rake +13 -5
- data/rails_generators/cucumber/templates/env.rb +11 -2
- data/rails_generators/cucumber/templates/paths.rb +19 -0
- data/rails_generators/cucumber/templates/webrat_steps.rb +60 -40
- data/rails_generators/feature/feature_generator.rb +26 -2
- data/rails_generators/feature/templates/feature.erb +15 -12
- data/rails_generators/feature/templates/steps.erb +14 -16
- data/spec/cucumber/ast/background_spec.rb +49 -0
- data/spec/cucumber/ast/feature_factory.rb +63 -0
- data/spec/cucumber/ast/feature_spec.rb +37 -0
- data/spec/cucumber/ast/py_string_spec.rb +47 -0
- data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
- data/spec/cucumber/ast/scenario_spec.rb +65 -0
- data/spec/cucumber/ast/step_collection_spec.rb +8 -0
- data/spec/cucumber/ast/step_spec.rb +66 -0
- data/spec/cucumber/ast/table_spec.rb +149 -0
- data/spec/cucumber/ast/tags_spec.rb +19 -0
- data/spec/cucumber/broadcaster_spec.rb +6 -18
- data/spec/cucumber/cli/configuration_spec.rb +275 -0
- data/spec/cucumber/cli/main_spec.rb +203 -0
- data/spec/cucumber/core_ext/proc_spec.rb +27 -35
- data/spec/cucumber/core_ext/string_spec.rb +8 -0
- data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
- data/spec/cucumber/formatter/color_io_spec.rb +26 -0
- data/spec/cucumber/formatter/html/cucumber.css +37 -0
- data/spec/cucumber/formatter/html/cucumber.js +13 -0
- data/spec/cucumber/formatter/html/index.html +45 -0
- data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
- data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
- data/spec/cucumber/formatters/profile_formatter_spec.rb +22 -16
- data/spec/cucumber/parser/feature_parser_spec.rb +282 -0
- data/spec/cucumber/parser/table_parser_spec.rb +48 -0
- data/spec/cucumber/rails/stubs/mini_rails.rb +4 -3
- data/spec/cucumber/step_definition_spec.rb +81 -0
- data/spec/cucumber/step_mother_spec.rb +50 -51
- data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
- data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
- data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
- data/spec/cucumber/treetop_parser/multiple_tables.feature +6 -8
- data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
- data/spec/cucumber/treetop_parser/spaces.feature +3 -1
- data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
- data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
- data/spec/cucumber/world/pending_spec.rb +47 -0
- data/spec/spec_helper.rb +4 -3
- metadata +192 -95
- data/TODO.txt +0 -26
- data/examples/calculator_ruby_features/features/addition.rb +0 -23
- data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
- data/examples/cs/features/hello.feature +0 -11
- data/examples/cs/features/step_definitons/hello_steps.rb +0 -25
- data/examples/cs/features/step_definitons/tree_steps.rb +0 -14
- data/examples/cs/features/tree.feature +0 -9
- data/examples/cs/src/Hello.cs +0 -18
- data/examples/i18n/ja/README.txt +0 -5
- data/examples/selenium/features/step_definitons/stories_steps.rb +0 -41
- data/examples/watir/features/step_definitons/stories_steps.rb +0 -51
- data/features/see_features.feature +0 -8
- data/features/steps/features_steps.rb +0 -9
- data/gem_tasks/treetop.rake +0 -41
- data/lib/cucumber/cli.rb +0 -279
- data/lib/cucumber/executor.rb +0 -190
- data/lib/cucumber/formatters/ansicolor.rb +0 -109
- data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
- data/lib/cucumber/formatters/cucumber.css +0 -132
- data/lib/cucumber/formatters/cucumber.js +0 -11
- data/lib/cucumber/formatters/html_formatter.rb +0 -128
- data/lib/cucumber/formatters/jquery.js +0 -32
- data/lib/cucumber/formatters/pretty_formatter.rb +0 -234
- data/lib/cucumber/formatters/profile_formatter.rb +0 -92
- data/lib/cucumber/formatters/progress_formatter.rb +0 -58
- data/lib/cucumber/formatters.rb +0 -1
- data/lib/cucumber/model/table.rb +0 -28
- data/lib/cucumber/model.rb +0 -1
- data/lib/cucumber/step_methods.rb +0 -49
- data/lib/cucumber/tree/feature.rb +0 -63
- data/lib/cucumber/tree/features.rb +0 -21
- data/lib/cucumber/tree/given_scenario.rb +0 -13
- data/lib/cucumber/tree/scenario.rb +0 -174
- data/lib/cucumber/tree/step.rb +0 -134
- data/lib/cucumber/tree/table.rb +0 -26
- data/lib/cucumber/tree/top_down_visitor.rb +0 -23
- data/lib/cucumber/tree.rb +0 -18
- data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -206
- data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_da.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_de.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_en.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_es.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_et.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_id.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_it.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_no.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_parser.rb +0 -34
- data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_se.rb +0 -1591
- data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1591
- data/script/console +0 -10
- data/script/console.cmd +0 -1
- data/script/destroy +0 -14
- data/script/destroy.cmd +0 -1
- data/script/generate +0 -14
- data/script/generate.cmd +0 -1
- data/script/txt2html +0 -74
- data/script/txt2html.cmd +0 -1
- data/setup.rb +0 -1585
- data/spec/cucumber/cli_spec.rb +0 -274
- data/spec/cucumber/executor_spec.rb +0 -298
- data/spec/cucumber/formatters/ansicolor_spec.rb +0 -35
- data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
- data/spec/cucumber/formatters/features.html +0 -269
- data/spec/cucumber/formatters/html_formatter_spec.rb +0 -74
- data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -204
- data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -65
- data/spec/cucumber/model/table_spec.rb +0 -20
- data/spec/cucumber/tree/feature_spec.rb +0 -43
- data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
- data/spec/cucumber/tree/scenario_spec.rb +0 -76
- data/spec/cucumber/tree/step_spec.rb +0 -50
- data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -98
- /data/examples/{calculator_ruby_features → selenium_webrat}/Rakefile +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'treetop'
|
|
3
|
+
require 'treetop/runtime'
|
|
4
|
+
require 'treetop/ruby_extensions'
|
|
5
|
+
rescue LoadError
|
|
6
|
+
require "rubygems"
|
|
7
|
+
gem "treetop"
|
|
8
|
+
require 'treetop'
|
|
9
|
+
require 'treetop/runtime'
|
|
10
|
+
require 'treetop/ruby_extensions'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Cucumber
|
|
14
|
+
module Parser
|
|
15
|
+
module TreetopExt
|
|
16
|
+
FILE_COLON_LINE_PATTERN = /^([\w\W]*?):([\d:]+)$/
|
|
17
|
+
|
|
18
|
+
# Parses a file and returns a Cucumber::Ast
|
|
19
|
+
def parse_file(file)
|
|
20
|
+
_, path, lines = *FILE_COLON_LINE_PATTERN.match(file)
|
|
21
|
+
if path
|
|
22
|
+
lines = lines.split(':').map { |line| line.to_i }
|
|
23
|
+
else
|
|
24
|
+
path = file
|
|
25
|
+
lines = []
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
loader = lambda { |io| parse_or_fail(io.read, path) }
|
|
29
|
+
feature = if path =~ /^http/
|
|
30
|
+
require 'open-uri'
|
|
31
|
+
open(path, &loader)
|
|
32
|
+
else
|
|
33
|
+
File.open(path, Cucumber.file_mode('r'), &loader)
|
|
34
|
+
end
|
|
35
|
+
feature.lines = lines
|
|
36
|
+
feature
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def parse_or_fail(s, file=nil, line_offset=0)
|
|
40
|
+
parse_tree = parse(s)
|
|
41
|
+
if parse_tree.nil?
|
|
42
|
+
raise Cucumber::Parser::SyntaxError.new(self, file, line_offset)
|
|
43
|
+
else
|
|
44
|
+
ast = parse_tree.build
|
|
45
|
+
ast.file = file
|
|
46
|
+
ast
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class SyntaxError < StandardError
|
|
52
|
+
def initialize(parser, file, line_offset)
|
|
53
|
+
tf = parser.terminal_failures
|
|
54
|
+
expected = tf.size == 1 ? tf[0].expected_string.inspect : "one of #{tf.map{|f| f.expected_string.inspect}.uniq*', '}"
|
|
55
|
+
line = parser.failure_line + line_offset
|
|
56
|
+
message = "#{file}:#{line}:#{parser.failure_column}: Parse error, expected #{expected}."
|
|
57
|
+
super(message)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
module Treetop
|
|
64
|
+
module Runtime
|
|
65
|
+
class SyntaxNode
|
|
66
|
+
def line
|
|
67
|
+
input.line_of(interval.first)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class CompiledParser
|
|
72
|
+
include Cucumber::Parser::TreetopExt
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
require 'cucumber/platform'
|
|
3
|
+
require 'cucumber/ast'
|
|
4
|
+
require 'cucumber/parser/treetop_ext'
|
|
5
|
+
require 'cucumber/parser/table'
|
|
6
|
+
|
|
7
|
+
module Cucumber
|
|
8
|
+
# Classes in this module parse feature files and translate the parse tree
|
|
9
|
+
# (concrete syntax tree) into an abstract syntax tree (AST) using
|
|
10
|
+
# <a href="http://martinfowler.com/dslwip/EmbeddedTranslation.html">Embedded translation</a>.
|
|
11
|
+
#
|
|
12
|
+
# The AST is built by the various <tt>#build</tt> methods in the parse tree.
|
|
13
|
+
#
|
|
14
|
+
# The AST classes are defined in the Cucumber::Ast module.
|
|
15
|
+
module Parser
|
|
16
|
+
translator = Module.new do
|
|
17
|
+
def keywordz(key)
|
|
18
|
+
'Scenario'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.load_parser(keywords)
|
|
23
|
+
Loader.new(keywords)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class Loader
|
|
27
|
+
def initialize(keywords)
|
|
28
|
+
@keywords = keywords
|
|
29
|
+
i18n_tt = File.expand_path(File.dirname(__FILE__) + '/parser/i18n.tt')
|
|
30
|
+
template = File.open(i18n_tt, Cucumber.file_mode('r')).read
|
|
31
|
+
erb = ERB.new(template)
|
|
32
|
+
grammar = erb.result(binding)
|
|
33
|
+
Treetop.load_from_string(grammar)
|
|
34
|
+
require 'cucumber/parser/feature'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def keywords(key)
|
|
38
|
+
values = @keywords[key].split('|')
|
|
39
|
+
values.map{|value| "'#{value}'"}.join(" / ")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/lib/cucumber/platform.rb
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
# Detect the platform we're running on so we can tweak behaviour
|
|
2
2
|
# in various places.
|
|
3
3
|
require 'rbconfig'
|
|
4
|
+
require 'yaml'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
module Cucumber
|
|
7
|
+
LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/languages.yml')
|
|
8
|
+
LANGUAGES = YAML.load_file(LANGUAGE_FILE)
|
|
9
|
+
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
|
|
10
|
+
JRUBY = defined?(JRUBY_VERSION)
|
|
11
|
+
IRONRUBY = Config::CONFIG['sitedir'] =~ /IronRuby/
|
|
12
|
+
WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
|
|
13
|
+
WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
|
|
14
|
+
RAILS = defined?(Rails)
|
|
15
|
+
RUBY_BINARY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
|
16
|
+
RUBY_1_9 = RUBY_VERSION =~ /^1\.9/
|
|
17
|
+
end
|
data/lib/cucumber/rails/rspec.rb
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require 'spec/
|
|
1
|
+
require 'cucumber/rails/world'
|
|
2
|
+
require 'spec/expectations'
|
|
3
|
+
require 'spec/rails/matchers'
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
Spec::
|
|
6
|
-
|
|
7
|
-
false
|
|
8
|
-
end
|
|
5
|
+
Cucumber::Rails::World.class_eval do
|
|
6
|
+
include Spec::Matchers
|
|
7
|
+
include Spec::Rails::Matchers
|
|
9
8
|
end
|
|
10
|
-
|
|
11
|
-
ActionController::Integration::Session.send(:include, Spec::Matchers)
|
|
12
|
-
ActionController::Integration::Session.send(:include, Spec::Rails::Matchers)
|
data/lib/cucumber/rails/world.rb
CHANGED
|
@@ -11,11 +11,11 @@ require 'test/unit/testresult'
|
|
|
11
11
|
|
|
12
12
|
# These allow exceptions to come through as opposed to being caught and having non-helpful responses returned.
|
|
13
13
|
ActionController::Base.class_eval do
|
|
14
|
-
def
|
|
15
|
-
|
|
14
|
+
def rescue_action(exception)
|
|
15
|
+
raise exception
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
|
-
Dispatcher.class_eval do
|
|
18
|
+
ActionController::Dispatcher.class_eval do
|
|
19
19
|
def self.failsafe_response(output, status, exception = nil)
|
|
20
20
|
raise exception
|
|
21
21
|
end
|
|
@@ -24,7 +24,7 @@ end
|
|
|
24
24
|
# So that Test::Unit doesn't launch at the end - makes it think it has already been run.
|
|
25
25
|
Test::Unit.run = true if Test::Unit.respond_to?(:run=)
|
|
26
26
|
|
|
27
|
-
$
|
|
27
|
+
$cucumber_toplevel = self
|
|
28
28
|
|
|
29
29
|
module Cucumber #:nodoc:
|
|
30
30
|
module Rails
|
|
@@ -44,22 +44,22 @@ module Cucumber #:nodoc:
|
|
|
44
44
|
def self.use_transactional_fixtures
|
|
45
45
|
World.use_transactional_fixtures = true
|
|
46
46
|
if defined?(ActiveRecord::Base)
|
|
47
|
-
$
|
|
47
|
+
$cucumber_toplevel.Before do
|
|
48
48
|
if ActiveRecord::Base.connection.respond_to?(:increment_open_transactions)
|
|
49
49
|
ActiveRecord::Base.connection.increment_open_transactions
|
|
50
50
|
else
|
|
51
|
-
ActiveRecord::Base.
|
|
51
|
+
ActiveRecord::Base.__send__(:increment_open_transactions)
|
|
52
52
|
end
|
|
53
53
|
ActiveRecord::Base.connection.begin_db_transaction
|
|
54
54
|
ActionMailer::Base.deliveries = [] if defined?(ActionMailer::Base)
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
$
|
|
57
|
+
$cucumber_toplevel.After do
|
|
58
58
|
ActiveRecord::Base.connection.rollback_db_transaction
|
|
59
59
|
if ActiveRecord::Base.connection.respond_to?(:decrement_open_transactions)
|
|
60
60
|
ActiveRecord::Base.connection.decrement_open_transactions
|
|
61
61
|
else
|
|
62
|
-
ActiveRecord::Base.
|
|
62
|
+
ActiveRecord::Base.__send__(:decrement_open_transactions)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
end
|
data/lib/cucumber/rake/task.rb
CHANGED
|
@@ -1,42 +1,79 @@
|
|
|
1
|
+
require 'cucumber/platform'
|
|
2
|
+
|
|
1
3
|
module Cucumber
|
|
2
4
|
module Rake
|
|
3
|
-
# Defines a task for running features.
|
|
5
|
+
# Defines a Rake task for running features.
|
|
6
|
+
#
|
|
7
|
+
# The simplest use of it goes something like:
|
|
8
|
+
#
|
|
9
|
+
# Cucumber::Rake::Task.new
|
|
10
|
+
#
|
|
11
|
+
# This will create a task named 'features' described as 'Run Features with
|
|
12
|
+
# Cucumber'. It will use steps from 'features/**/*.rb' and features in 'features/**/*.feature'.
|
|
13
|
+
#
|
|
14
|
+
# To further configure the task, you can pass a block:
|
|
15
|
+
#
|
|
16
|
+
# Cucumber::Rake::Task.new do |t|
|
|
17
|
+
# t.cucumber_opts = "--format progress"
|
|
18
|
+
# end
|
|
19
|
+
#
|
|
20
|
+
# This task can also be configured to be run with RCov:
|
|
21
|
+
#
|
|
22
|
+
# Cucumber::Rake::Task.new do |t|
|
|
23
|
+
# t.rcov = true
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
# See the attributes for additional configuration possibilities.
|
|
4
27
|
class Task
|
|
5
|
-
LIB = File.expand_path(File.dirname(__FILE__) + '/../..')
|
|
28
|
+
LIB = File.expand_path(File.dirname(__FILE__) + '/../..') # :nodoc:
|
|
6
29
|
|
|
30
|
+
# Directories to add to the Ruby $LOAD_PATH
|
|
7
31
|
attr_accessor :libs
|
|
32
|
+
# Name of the cucumber binary to use for running features. Defaults to Cucumber::BINARY
|
|
8
33
|
attr_accessor :binary
|
|
34
|
+
# Array of paths to specific step definition files to use
|
|
9
35
|
attr_accessor :step_list
|
|
36
|
+
# File pattern for finding step definitions. Defaults to
|
|
37
|
+
# 'features/**/*.rb'.
|
|
10
38
|
attr_accessor :step_pattern
|
|
39
|
+
# Array of paths to specific features to run.
|
|
11
40
|
attr_accessor :feature_list
|
|
41
|
+
# File pattern for finding features to run. Defaults to
|
|
42
|
+
# 'features/**/*.feature'. Can be overriden by the FEATURE environment variable.
|
|
12
43
|
attr_accessor :feature_pattern
|
|
44
|
+
# Extra options to pass to the cucumber binary. Can be overridden by the CUCUMBER_OPTS environment variable.
|
|
13
45
|
attr_accessor :cucumber_opts
|
|
46
|
+
# Run cucumber with RCov?
|
|
14
47
|
attr_accessor :rcov
|
|
48
|
+
# Extra options to pass to rcov
|
|
15
49
|
attr_accessor :rcov_opts
|
|
16
50
|
|
|
17
|
-
# Define a
|
|
51
|
+
# Define a Rake
|
|
18
52
|
def initialize(task_name = "features", desc = "Run Features with Cucumber")
|
|
19
53
|
@task_name, @desc = task_name, desc
|
|
20
|
-
@libs = []
|
|
54
|
+
@libs = ['lib']
|
|
21
55
|
@rcov_opts = %w{--rails --exclude osx\/objc,gems\/}
|
|
22
56
|
|
|
23
57
|
yield self if block_given?
|
|
24
58
|
|
|
25
59
|
@feature_pattern = "features/**/*.feature" if feature_pattern.nil? && feature_list.nil?
|
|
26
60
|
@step_pattern = "features/**/*.rb" if step_pattern.nil? && step_list.nil?
|
|
27
|
-
|
|
61
|
+
|
|
62
|
+
@binary = binary.nil? ? Cucumber::BINARY : File.expand_path(binary)
|
|
63
|
+
@libs.insert(0, LIB) if binary == Cucumber::BINARY
|
|
64
|
+
|
|
28
65
|
define_task
|
|
29
66
|
end
|
|
30
67
|
|
|
31
|
-
def define_task
|
|
68
|
+
def define_task # :nodoc:
|
|
32
69
|
desc @desc
|
|
33
70
|
task @task_name do
|
|
34
71
|
ruby(arguments_for_ruby_execution.join(" ")) # ruby(*args) is broken on Windows
|
|
35
72
|
end
|
|
36
73
|
end
|
|
37
74
|
|
|
38
|
-
def arguments_for_ruby_execution(task_args = nil)
|
|
39
|
-
lib_args = ['"%s"' %
|
|
75
|
+
def arguments_for_ruby_execution(task_args = nil) # :nodoc:
|
|
76
|
+
lib_args = ['"%s"' % libs.join(File::PATH_SEPARATOR)]
|
|
40
77
|
cucumber_bin = ['"%s"' % binary]
|
|
41
78
|
cuc_opts = [(ENV['CUCUMBER_OPTS'] || cucumber_opts)]
|
|
42
79
|
|
|
@@ -84,7 +121,7 @@ module Cucumber
|
|
|
84
121
|
super(task_name, desc)
|
|
85
122
|
end
|
|
86
123
|
|
|
87
|
-
def define_task
|
|
124
|
+
def define_task # :nodoc:
|
|
88
125
|
desc @desc
|
|
89
126
|
task @task_name, :feature_name do |t, args|
|
|
90
127
|
ruby(arguments_for_ruby_execution(args).join(" ")) # ruby(*args) is broken on Windows
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require 'cucumber/step_match'
|
|
2
|
+
require 'cucumber/core_ext/string'
|
|
3
|
+
require 'cucumber/core_ext/proc'
|
|
4
|
+
|
|
5
|
+
module Cucumber
|
|
6
|
+
# A Step Definition holds a Regexp and a Proc, and is created
|
|
7
|
+
# by calling <tt>Given</tt>, <tt>When</tt> or <tt>Then</tt>
|
|
8
|
+
# in the <tt>step_definitions</tt> ruby files - for example:
|
|
9
|
+
#
|
|
10
|
+
# Given /I have (\d+) cucumbers in my belly/ do
|
|
11
|
+
# # some code here
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
class StepDefinition
|
|
15
|
+
def self.snippet_text(step_keyword, step_name)
|
|
16
|
+
escaped = Regexp.escape(step_name).gsub('\ ', ' ').gsub('/', '\/')
|
|
17
|
+
"#{step_keyword} /^#{escaped}$/ do\n pending\nend"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class MissingProc < StandardError
|
|
21
|
+
def message
|
|
22
|
+
"Step definitions must always have a proc"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_reader :regexp
|
|
27
|
+
|
|
28
|
+
def initialize(pattern, &proc)
|
|
29
|
+
raise MissingProc if proc.nil?
|
|
30
|
+
if String === pattern
|
|
31
|
+
p = pattern.gsub(/\$\w+/, '(.*)') # Replace $var with (.*)
|
|
32
|
+
pattern = Regexp.new("^#{p}$")
|
|
33
|
+
end
|
|
34
|
+
@regexp, @proc = pattern, proc
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def step_match(name_to_match, name_to_report)
|
|
38
|
+
if(match = name_to_match.match(@regexp))
|
|
39
|
+
StepMatch.new(self, name_to_match, name_to_report, match.captures)
|
|
40
|
+
else
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def invoke(world, args, step_name)
|
|
46
|
+
args = args.map{|arg| Ast::PyString === arg ? arg.to_s : arg}
|
|
47
|
+
begin
|
|
48
|
+
world.cucumber_instance_exec(true, @regexp.inspect, *args, &@proc)
|
|
49
|
+
rescue Cucumber::ArityMismatchError => e
|
|
50
|
+
e.backtrace.unshift(self.backtrace_line)
|
|
51
|
+
raise e
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
#:stopdoc:
|
|
56
|
+
|
|
57
|
+
def match(step_name)
|
|
58
|
+
case step_name
|
|
59
|
+
when String then @regexp.match(step_name)
|
|
60
|
+
when Regexp then @regexp == step_name
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Formats the matched arguments of the associated Step. This method
|
|
65
|
+
# is usually called from visitors, which render output.
|
|
66
|
+
#
|
|
67
|
+
# The +format+ either be a String or a Proc.
|
|
68
|
+
#
|
|
69
|
+
# If it is a String it should be a format string according to
|
|
70
|
+
# <tt>Kernel#sprinf</tt>, for example:
|
|
71
|
+
#
|
|
72
|
+
# '<span class="param">%s</span></tt>'
|
|
73
|
+
#
|
|
74
|
+
# If it is a Proc, it should take one argument and return the formatted
|
|
75
|
+
# argument, for example:
|
|
76
|
+
#
|
|
77
|
+
# lambda { |param| "[#{param}]" }
|
|
78
|
+
#
|
|
79
|
+
def format_args(step_name, format)
|
|
80
|
+
step_name.gzub(@regexp, format)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def matched_args(step_name)
|
|
84
|
+
step_name.match(@regexp).captures
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def backtrace_line
|
|
88
|
+
"#{file_colon_line}:in `#{@regexp.inspect}'"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def file_colon_line
|
|
92
|
+
@proc.file_colon_line
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def text_length
|
|
96
|
+
@regexp.inspect.jlength
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def to_s(indent = 0)
|
|
100
|
+
@regexp.inspect + (' # ').indent(indent) + file_colon_line
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Cucumber
|
|
2
|
+
class StepMatch
|
|
3
|
+
attr_reader :step_definition
|
|
4
|
+
attr_reader :args
|
|
5
|
+
|
|
6
|
+
def initialize(step_definition, step_name, formatted_step_name, args)
|
|
7
|
+
@step_definition, @step_name, @formatted_step_name, @args = step_definition, step_name, formatted_step_name, args
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def invoke(world, multiline_arg)
|
|
11
|
+
all_args = @args.dup
|
|
12
|
+
all_args << multiline_arg if multiline_arg
|
|
13
|
+
@step_definition.invoke(world, all_args, @step_name)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def format_args(format)
|
|
17
|
+
@formatted_step_name || @step_definition.format_args(@step_name, format)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def file_colon_line
|
|
21
|
+
@step_definition.file_colon_line
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def backtrace_line
|
|
25
|
+
@step_definition.backtrace_line
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class NoStepMatch
|
|
30
|
+
attr_reader :step_definition
|
|
31
|
+
|
|
32
|
+
def initialize(step)
|
|
33
|
+
@step = step
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def format_args(format)
|
|
37
|
+
@step.name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def file_colon_line
|
|
41
|
+
raise "No file:line for #{@step}" unless @step.file_colon_line
|
|
42
|
+
@step.file_colon_line
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def backtrace_line
|
|
46
|
+
@step.backtrace_line
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|