kosmas58-cucumber 0.1.16.6 → 0.1.99.21

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.
Files changed (248) hide show
  1. data/History.txt +126 -2
  2. data/License.txt +1 -1
  3. data/Manifest.txt +0 -270
  4. data/Rakefile +1 -1
  5. data/bin/cucumber +2 -2
  6. data/config/hoe.rb +7 -2
  7. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/README.textile +1 -1
  9. data/examples/i18n/Rakefile +3 -3
  10. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  11. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  12. data/examples/i18n/de/features/addition.feature +6 -6
  13. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  14. data/examples/i18n/en/features/addition.feature +6 -6
  15. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  16. data/examples/i18n/es/features/adicion.feature +11 -12
  17. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +7 -10
  18. data/examples/i18n/es/lib/calculador.rb +4 -1
  19. data/examples/i18n/et/features/liitmine.feature +7 -6
  20. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  21. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  22. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  23. data/examples/i18n/fr/features/addition.feature +2 -2
  24. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  25. data/examples/i18n/id/features/addition.feature +6 -6
  26. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  27. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  28. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  29. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  30. data/examples/i18n/lt/features/addition.feature +7 -6
  31. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  32. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  33. data/examples/i18n/no/features/summering.feature +1 -0
  34. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  35. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  36. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  37. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  38. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  39. data/examples/jbehave/README.textile +17 -0
  40. data/examples/jbehave/features/support/env.rb +7 -0
  41. data/examples/jbehave/features/trading.feature +24 -0
  42. data/examples/jbehave/pom.xml +48 -0
  43. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  44. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  45. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  46. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  47. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +65 -0
  48. data/examples/self_test/README.textile +4 -1
  49. data/examples/{calculator_ruby_features → self_test}/Rakefile +3 -3
  50. data/examples/self_test/features/background/failing_background.feature +10 -0
  51. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  52. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  53. data/examples/self_test/features/background/passing_background.feature +10 -0
  54. data/examples/self_test/features/background/pending_background.feature +10 -0
  55. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  56. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  57. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  58. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  59. data/examples/self_test/features/outline_sample.feature +11 -5
  60. data/examples/self_test/features/sample.feature +8 -3
  61. data/examples/self_test/features/step_definitions/sample_steps.rb +53 -4
  62. data/examples/self_test/features/support/env.rb +1 -0
  63. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  64. data/examples/tickets/features/172.feature +28 -0
  65. data/examples/tickets/features/177/1.feature +29 -0
  66. data/examples/tickets/features/177/2.feature +21 -0
  67. data/examples/tickets/features/177/3.feature +18 -0
  68. data/examples/tickets/features/180.feature +7 -0
  69. data/examples/tickets/features/scenario_outline.feature +6 -1
  70. data/examples/tickets/features/step_definitons/tickets_steps.rb +27 -3
  71. data/examples/tickets/features/tickets.feature +4 -0
  72. data/features/background.feature +223 -0
  73. data/features/cucumber_cli.feature +218 -98
  74. data/features/cucumber_cli_outlines.feature +54 -37
  75. data/features/custom_formatter.feature +11 -0
  76. data/features/report_called_undefined_steps.feature +32 -0
  77. data/features/step_definitions/cucumber_steps.rb +7 -3
  78. data/features/step_definitions/extra_steps.rb +1 -1
  79. data/features/support/env.rb +2 -1
  80. data/gem_tasks/flog.rake +1 -1
  81. data/gem_tasks/gemspec.rake +2 -2
  82. data/gem_tasks/jar.rake +67 -0
  83. data/lib/autotest/cucumber_mixin.rb +17 -23
  84. data/lib/cucumber.rb +63 -11
  85. data/lib/cucumber/ast.rb +29 -0
  86. data/lib/cucumber/ast/background.rb +88 -0
  87. data/lib/cucumber/ast/comment.rb +26 -0
  88. data/lib/cucumber/ast/examples.rb +26 -0
  89. data/lib/cucumber/ast/feature.rb +66 -0
  90. data/lib/cucumber/ast/features.rb +39 -0
  91. data/lib/cucumber/ast/filter.rb +22 -0
  92. data/lib/cucumber/ast/outline_table.rb +49 -0
  93. data/lib/cucumber/ast/py_string.rb +52 -0
  94. data/lib/cucumber/ast/scenario.rb +103 -0
  95. data/lib/cucumber/ast/scenario_outline.rb +92 -0
  96. data/lib/cucumber/ast/step.rb +161 -0
  97. data/lib/cucumber/ast/steps.rb +13 -0
  98. data/lib/cucumber/ast/table.rb +218 -0
  99. data/lib/cucumber/ast/tags.rb +40 -0
  100. data/lib/cucumber/ast/visitor.rb +109 -0
  101. data/lib/cucumber/broadcaster.rb +1 -6
  102. data/lib/cucumber/cli/configuration.rb +339 -0
  103. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  104. data/lib/cucumber/cli/main.rb +100 -0
  105. data/lib/cucumber/core_ext/exception.rb +41 -8
  106. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  107. data/lib/cucumber/core_ext/proc.rb +29 -65
  108. data/lib/cucumber/core_ext/string.rb +19 -0
  109. data/lib/cucumber/formatter.rb +1 -0
  110. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +14 -16
  111. data/lib/cucumber/formatter/color_io.rb +17 -0
  112. data/lib/cucumber/formatter/console.rb +119 -0
  113. data/lib/cucumber/formatter/cucumber.css +55 -0
  114. data/lib/cucumber/formatter/cucumber.sass +49 -0
  115. data/lib/cucumber/formatter/html.rb +121 -0
  116. data/lib/cucumber/formatter/pretty.rb +167 -0
  117. data/lib/cucumber/formatter/profile.rb +77 -0
  118. data/lib/cucumber/formatter/progress.rb +68 -0
  119. data/lib/cucumber/formatter/rerun.rb +35 -0
  120. data/lib/cucumber/formatter/unicode.rb +35 -0
  121. data/lib/cucumber/formatters/unicode.rb +2 -35
  122. data/lib/cucumber/jbehave.rb +102 -0
  123. data/lib/cucumber/languages.yml +128 -75
  124. data/lib/cucumber/parser.rb +43 -0
  125. data/lib/cucumber/parser/basic.rb +0 -0
  126. data/lib/cucumber/parser/feature.rb +1490 -0
  127. data/lib/cucumber/parser/feature.tt +188 -0
  128. data/lib/cucumber/parser/i18n.tt +31 -0
  129. data/lib/cucumber/parser/table.rb +402 -0
  130. data/lib/cucumber/parser/table.tt +59 -0
  131. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  132. data/lib/cucumber/platform.rb +3 -17
  133. data/lib/cucumber/rails/rspec.rb +5 -2
  134. data/lib/cucumber/step_definition.rb +87 -0
  135. data/lib/cucumber/step_mother.rb +151 -66
  136. data/lib/cucumber/version.rb +2 -2
  137. data/rails_generators/cucumber/USAGE +3 -2
  138. data/rails_generators/cucumber/cucumber_generator.rb +33 -23
  139. data/rails_generators/cucumber/templates/cucumber +2 -1
  140. data/rails_generators/cucumber/templates/cucumber.rake +6 -1
  141. data/rails_generators/cucumber/templates/env.rb +1 -1
  142. data/rails_generators/feature/USAGE +3 -0
  143. data/rails_generators/feature/feature_generator.rb +30 -6
  144. data/spec/cucumber/ast/background_spec.rb +58 -0
  145. data/spec/cucumber/ast/feature_factory.rb +54 -0
  146. data/spec/cucumber/ast/feature_spec.rb +60 -0
  147. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  148. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  149. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  150. data/spec/cucumber/ast/step_spec.rb +45 -0
  151. data/spec/cucumber/ast/table_spec.rb +81 -0
  152. data/spec/cucumber/ast/tags_spec.rb +23 -0
  153. data/spec/cucumber/broadcaster_spec.rb +4 -17
  154. data/spec/cucumber/cli/configuration_spec.rb +239 -0
  155. data/spec/cucumber/cli/main_spec.rb +164 -0
  156. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  157. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  158. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  159. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  160. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  161. data/spec/cucumber/formatter/html/index.html +45 -0
  162. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  163. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  164. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  165. data/spec/cucumber/parser/feature_parser_spec.rb +281 -0
  166. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  167. data/spec/cucumber/step_definition_spec.rb +62 -0
  168. data/spec/cucumber/step_mother_spec.rb +50 -51
  169. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  170. data/spec/cucumber/treetop_parser/scenario_outline.feature +1 -1
  171. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  172. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  173. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  174. data/spec/cucumber/world/pending_spec.rb +13 -12
  175. data/spec/spec_helper.rb +1 -1
  176. metadata +107 -79
  177. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  178. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  179. data/gem_tasks/treetop.rake +0 -41
  180. data/lib/cucumber/cli.rb +0 -355
  181. data/lib/cucumber/executor.rb +0 -205
  182. data/lib/cucumber/formatters.rb +0 -1
  183. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  184. data/lib/cucumber/formatters/cucumber.css +0 -132
  185. data/lib/cucumber/formatters/cucumber.js +0 -11
  186. data/lib/cucumber/formatters/html_formatter.rb +0 -152
  187. data/lib/cucumber/formatters/jquery.js +0 -32
  188. data/lib/cucumber/formatters/pretty_formatter.rb +0 -285
  189. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  190. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  191. data/lib/cucumber/model.rb +0 -1
  192. data/lib/cucumber/model/table.rb +0 -32
  193. data/lib/cucumber/step_methods.rb +0 -49
  194. data/lib/cucumber/tree.rb +0 -16
  195. data/lib/cucumber/tree/feature.rb +0 -105
  196. data/lib/cucumber/tree/features.rb +0 -21
  197. data/lib/cucumber/tree/given_scenario.rb +0 -13
  198. data/lib/cucumber/tree/scenario.rb +0 -240
  199. data/lib/cucumber/tree/step.rb +0 -173
  200. data/lib/cucumber/tree/table.rb +0 -26
  201. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  202. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  203. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  204. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  205. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  206. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  207. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  208. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  209. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  210. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  211. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  212. data/lib/cucumber/treetop_parser/feature_fi.rb +0 -1951
  213. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  214. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  215. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  216. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  217. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  218. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  219. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  220. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  221. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  222. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  223. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  224. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  225. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  226. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  227. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  228. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  229. data/lib/cucumber/world.rb +0 -1
  230. data/lib/cucumber/world/pending.rb +0 -22
  231. data/setup.rb +0 -1585
  232. data/spec/cucumber/cli_spec.rb +0 -521
  233. data/spec/cucumber/executor_spec.rb +0 -382
  234. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  235. data/spec/cucumber/formatters/features.html +0 -269
  236. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -110
  237. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  238. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  239. data/spec/cucumber/model/table_spec.rb +0 -32
  240. data/spec/cucumber/tree/feature_spec.rb +0 -122
  241. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  242. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  243. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  244. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  245. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  246. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  247. data/spec/cucumber/tree/step_spec.rb +0 -59
  248. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -0,0 +1,11 @@
1
+ Feature: Custom Formatter
2
+
3
+ Scenario: count tags
4
+ When I run cucumber --format Tag::Count features
5
+ Then it should fail with
6
+ """
7
+ | four | one | three | two |
8
+ | 1 | 1 | 2 | 1 |
9
+
10
+ """
11
+
@@ -0,0 +1,32 @@
1
+ Feature: Cucumber command line
2
+ In order to find out what step definitions need to be implemented
3
+ Developers should always see what step definition is missing
4
+
5
+ Scenario: Get info at arbitrary levels of nesting
6
+ When I run cucumber features/call_undefined_step_from_step_def.feature
7
+ Then it should pass with
8
+ """
9
+ Feature: Calling undefined step
10
+
11
+ Scenario: Call directly # features/call_undefined_step_from_step_def.feature:3
12
+ Given a step definition that calls an undefined step # features/step_definitions/sample_steps.rb:19
13
+ Undefined step: "this does not exist" (Cucumber::Undefined)
14
+ ./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
15
+
16
+ Scenario: Call via another # features/call_undefined_step_from_step_def.feature:6
17
+ Given call step "a step definition that calls an undefined step" # features/step_definitions/sample_steps.rb:23
18
+ Undefined step: "this does not exist" (Cucumber::Undefined)
19
+ ./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
20
+
21
+ 2 scenarios
22
+ 2 undefined steps
23
+
24
+ You can implement step definitions for missing steps with these snippets:
25
+
26
+ Given /^this does not exist$/ do
27
+ pending
28
+ end
29
+
30
+
31
+ """
32
+
@@ -6,16 +6,20 @@ When /^I run cucumber (.*)$/ do |cmd|
6
6
  @dir ||= 'self_test'
7
7
  full_dir ||= File.expand_path(File.dirname(__FILE__) + "/../../examples/#{@dir}")
8
8
  Dir.chdir(full_dir) do
9
- @full_cmd = "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{cmd}"
9
+ @full_cmd = "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cmd}"
10
10
  @out = `#{@full_cmd}`
11
11
  @status = $?.exitstatus
12
12
  end
13
13
  end
14
14
 
15
15
  Then /^it should (fail|pass) with$/ do |success, output|
16
+ #puts @out
16
17
  @out.should == output
17
- code = success == 'fail' ? 1 : 0
18
- @status.should == code
18
+ if success == 'fail'
19
+ @status.should_not == 0
20
+ else
21
+ @status.should == 0
22
+ end
19
23
  end
20
24
 
21
25
  Then /^(.*) should contain$/ do |file, text|
@@ -1,2 +1,2 @@
1
1
  Given /^missing$/ do
2
- end
2
+ end
@@ -1,7 +1,8 @@
1
+ require 'rubygems'
1
2
  require 'spec/expectations'
2
3
  require 'fileutils'
3
4
 
4
- Before do
5
+ After do
5
6
  FileUtils.rm_rf 'examples/self_test/tmp'
6
7
  FileUtils.mkdir 'examples/self_test/tmp'
7
8
  end
data/gem_tasks/flog.rake CHANGED
@@ -1,4 +1,4 @@
1
1
  desc "Run flog over significant files"
2
2
  task :flog do
3
- sh "find lib -name \\*.rb | grep -v feature_..\\.rb | xargs flog"
3
+ sh "find lib/cucumber -name \\*.rb | grep -v parser\/feature\\.rb | xargs flog"
4
4
  end
@@ -4,7 +4,7 @@ namespace :gemspec do
4
4
  File.open('cucumber.gemspec', 'w') {|io| io.write($hoe.spec.to_ruby)}
5
5
  puts "1) git commit -a -m \"Release #{Cucumber::VERSION::STRING}\""
6
6
  puts "2) git tag -a \"v#{Cucumber::VERSION::STRING}\" -m \"Release #{Cucumber::VERSION::STRING}\""
7
- puts "3) git push --tags"
8
- puts "4) Bounce the version in version.rb"
7
+ puts "3) git push"
8
+ puts "4) git push --tags"
9
9
  end
10
10
  end
@@ -0,0 +1,67 @@
1
+ # http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
2
+
3
+ USE_JRUBY_VERSION = '1.1.6'
4
+ USE_JBEHAVE_VERSION = '2.1'
5
+ USE_JUNIT_VERSION = '4.5'
6
+ USE_HAMCREST_VERSION = '1.1'
7
+ CUCUMBER_VERSIONED = "cucumber-#{Cucumber::VERSION::STRING}"
8
+
9
+ task :jar => [
10
+ :clean,
11
+ 'jar:download_jruby',
12
+ 'jar:install_gems',
13
+ 'jar:bundle_gems',
14
+ 'jar:download_jars_deps',
15
+ 'jar:unpack_jar_deps',
16
+ 'jar:bundle_jars',
17
+ 'jar:fix_gem_binaries',
18
+ 'jar:test_jar'
19
+ ]
20
+
21
+ namespace :jar do
22
+ task :download_jruby do
23
+ sh "wget http://dist.codehaus.org/jruby/#{USE_JRUBY_VERSION}/jruby-complete-#{USE_JRUBY_VERSION}.jar -O #{CUCUMBER_VERSIONED}.jar"
24
+ end
25
+
26
+ task :install_gems => :gem do
27
+ mkdir 'pkg/jar_gems'
28
+ sh "java -jar #{CUCUMBER_VERSIONED}.jar -S gem install -i ./pkg/jar_gems pkg/#{CUCUMBER_VERSIONED}.gem --no-ri --no-rdoc"
29
+ end
30
+
31
+ task :bundle_gems do
32
+ sh "jar uf #{CUCUMBER_VERSIONED}.jar -C pkg/jar_gems ."
33
+ end
34
+
35
+ task :download_jars_deps do
36
+ mkdir 'pkg/jar_deps'
37
+ sh "wget http://repository.codehaus.org/org/jbehave/jbehave-core/#{USE_JBEHAVE_VERSION}/jbehave-core-#{USE_JBEHAVE_VERSION}.jar -O pkg/jar_deps/jbehave-core-#{USE_JBEHAVE_VERSION}.jar"
38
+ sh "wget http://mirrors.ibiblio.org/pub/mirrors/maven2/junit/junit/#{USE_JUNIT_VERSION}/junit-#{USE_JUNIT_VERSION}.jar -O pkg/jar_deps/junit-#{USE_JUNIT_VERSION}.jar"
39
+ sh "wget http://hamcrest.googlecode.com/files/hamcrest-all-#{USE_HAMCREST_VERSION}.jar -O pkg/jar_deps/hamcrest-all-#{USE_HAMCREST_VERSION}.jar"
40
+ end
41
+
42
+ task :unpack_jar_deps do
43
+ Dir.chdir 'pkg/jar_deps' do
44
+ Dir['*.jar'].each do |jar|
45
+ sh "jar xvf #{jar}"
46
+ rm_rf jar
47
+ rm_rf 'META-INF'
48
+ end
49
+ end
50
+ end
51
+
52
+ task :bundle_jars do
53
+ sh "jar uf #{CUCUMBER_VERSIONED}.jar -C pkg/jar_deps ."
54
+ end
55
+
56
+ task :fix_gem_binaries do
57
+ mkdir_p 'pkg/gem_binaries/META-INF/jruby.home'
58
+ Dir.chdir 'pkg/gem_binaries/META-INF/jruby.home' do
59
+ sh "jar xvf ../../../../#{CUCUMBER_VERSIONED}.jar bin"
60
+ end
61
+ sh "jar uf #{CUCUMBER_VERSIONED}.jar -C pkg/gem_binaries ."
62
+ end
63
+
64
+ task :test_jar do
65
+ sh "java -cp examples/jbehave/target/classes -jar #{CUCUMBER_VERSIONED}.jar -S cucumber examples/jbehave/features"
66
+ end
67
+ end
@@ -1,13 +1,14 @@
1
1
  require 'autotest'
2
2
  require 'tempfile'
3
- require File.dirname(__FILE__) + '/../cucumber/platform'
3
+ require 'yaml'
4
+ require File.dirname(__FILE__) + '/../cucumber'
4
5
 
5
6
  module Autotest::CucumberMixin
6
7
  def self.included(receiver)
7
8
  receiver::ALL_HOOKS << [:run_features, :ran_features]
8
9
  end
9
10
 
10
- attr_accessor :scenarios_to_run
11
+ attr_accessor :features_to_run
11
12
 
12
13
  def initialize
13
14
  super
@@ -45,7 +46,7 @@ module Autotest::CucumberMixin
45
46
  end
46
47
 
47
48
  def all_features_good
48
- scenarios_to_run == []
49
+ features_to_run == ""
49
50
  end
50
51
 
51
52
  def get_to_green
@@ -62,13 +63,13 @@ module Autotest::CucumberMixin
62
63
  end
63
64
 
64
65
  def reset_features
65
- self.scenarios_to_run = :all
66
+ self.features_to_run = :all
66
67
  end
67
68
 
68
69
  def run_features
69
70
  hook :run_features
70
- Tempfile.open('autotest-cucumber') do |dirty_scenarios_file|
71
- cmd = self.make_cucumber_cmd self.scenarios_to_run, dirty_scenarios_file.path
71
+ Tempfile.open('autotest-cucumber') do |dirty_features_file|
72
+ cmd = self.make_cucumber_cmd(self.features_to_run, dirty_features_file.path)
72
73
  return if cmd.empty?
73
74
  puts cmd unless $q
74
75
  old_sync = $stdout.sync
@@ -94,37 +95,30 @@ module Autotest::CucumberMixin
94
95
  ensure
95
96
  $stdout.sync = old_sync
96
97
  end
97
- self.scenarios_to_run = dirty_scenarios_file.readlines.map { |l| l.chomp }
98
- self.tainted = true unless self.scenarios_to_run == []
98
+ self.features_to_run = dirty_features_file.read
99
+ self.tainted = true unless self.features_to_run == []
99
100
  end
100
101
  hook :ran_features
101
102
  end
102
103
 
103
- def make_cucumber_cmd(scenarios_to_run, dirty_scenarios_filename)
104
- return '' if scenarios_to_run == []
104
+ def make_cucumber_cmd(features_to_run, dirty_features_filename)
105
+ return '' if features_to_run == ''
105
106
 
106
107
  profiles = YAML.load_file("cucumber.yml").keys rescue []
107
108
 
108
- profile ||= "autotest-all" if profiles.include?("autotest-all") and scenarios_to_run == :all
109
+ profile ||= "autotest-all" if profiles.include?("autotest-all") and features_to_run == :all
109
110
  profile ||= "autotest" if profiles.include?("autotest")
110
111
  profile ||= nil
111
112
 
112
113
  if profile
113
114
  args = ["--profile", profile]
114
115
  else
115
- args = %w{features --format} << (scenarios_to_run == :all ? "progress" : "pretty")
116
+ args = %w{--format} << (features_to_run == :all ? "progress" : "pretty")
116
117
  end
117
- args += %w{--format autotest --color --out} << dirty_scenarios_filename
118
+ args += %w{--color --format rerun --out} << dirty_features_filename
119
+ args << (features_to_run == :all ? "features" : features_to_run)
118
120
  args = args.join(' ')
119
-
120
- if scenarios_to_run == :all
121
- scenario_args = nil
122
- else
123
- # We escape scenario names for the shell by wrapping them in $'...' and replacing
124
- # every single quote with an escaped version, "\'". We use a double backslash for
125
- # Ruby, and we put it in a block or gsub interpolates the sequence "\'" as $'.
126
- scenario_args = scenarios_to_run.map { |s| "-s $'#{s.gsub("'") {"\\'"} }'" }.join(' ')
127
- end
128
- return "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{args} #{scenario_args}"
121
+
122
+ return "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{args}"
129
123
  end
130
124
  end
data/lib/cucumber.rb CHANGED
@@ -1,19 +1,71 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
+ require 'yaml'
4
5
  require 'cucumber/platform'
5
- require 'rubygems'
6
- require 'treetop/runtime'
7
- require 'treetop/ruby_extensions'
6
+ require 'cucumber/parser'
8
7
  require 'cucumber/version'
9
- require 'cucumber/step_methods'
10
- require 'cucumber/tree'
11
- require 'cucumber/model'
12
- require 'cucumber/executor'
13
8
  require 'cucumber/step_mother'
14
- require 'cucumber/formatters'
15
- require 'cucumber/treetop_parser/feature_parser'
16
- require 'cucumber/cli'
9
+ require 'cucumber/cli/main'
17
10
  require 'cucumber/broadcaster'
18
- require 'cucumber/world'
19
11
  require 'cucumber/core_ext/exception'
12
+
13
+ module Cucumber
14
+ KEYWORD_KEYS = %w{name native encoding feature background scenario scenario_outline examples given when then but}
15
+
16
+ class << self
17
+ attr_reader :lang
18
+
19
+ def load_language(lang) #:nodoc:
20
+ return if @lang
21
+ @lang = lang
22
+ alias_step_definitions(lang)
23
+ Parser.load_parser(keyword_hash)
24
+ end
25
+
26
+ def language_incomplete?(lang=@lang)
27
+ KEYWORD_KEYS.detect{|key| keyword_hash(lang)[key].nil?}
28
+ end
29
+
30
+ # File mode that accounts for Ruby platform and current language
31
+ def file_mode(m)
32
+ Cucumber::RUBY_1_9 ? "#{m}:#{keyword_hash['encoding']}" : m
33
+ end
34
+
35
+ # Returns a Hash of the currently active
36
+ # language, or for a specific language if +lang+ is
37
+ # specified.
38
+ def keyword_hash(lang=@lang)
39
+ LANGUAGES[lang]
40
+ end
41
+
42
+ def alias_step_definitions(lang) #:nodoc:
43
+ keywords = %w{given when then and but}.map{|keyword| keyword_hash(lang)[keyword]}
44
+ alias_steps(keywords)
45
+ end
46
+
47
+ # Sets up additional aliases for Given, When and Then.
48
+ # Try adding the following to your <tt>support/env.rb</tt>:
49
+ #
50
+ # # Given When Then in Norwegian
51
+ # Cucumber.alias_steps %w{Gitt Naar Saa}
52
+ #
53
+ # You cannot use special characters here, because methods
54
+ # with special characters is not valid Ruby code
55
+ #
56
+ def alias_steps(keywords)
57
+ keywords.each do |adverb|
58
+ StepMother.class_eval do
59
+ alias_method adverb, :register_step_definition
60
+ end
61
+
62
+ StepMother::WorldMethods.class_eval do
63
+ alias_method adverb, :__cucumber_invoke
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ # Make sure we always have English aliases
70
+ alias_step_definitions('en')
71
+ end
@@ -0,0 +1,29 @@
1
+ require 'cucumber/ast/comment'
2
+ require 'cucumber/ast/tags'
3
+ require 'cucumber/ast/features'
4
+ require 'cucumber/ast/feature'
5
+ require 'cucumber/ast/scenario'
6
+ require 'cucumber/ast/scenario_outline'
7
+ require 'cucumber/ast/background'
8
+ require 'cucumber/ast/steps'
9
+ require 'cucumber/ast/step'
10
+ require 'cucumber/ast/table'
11
+ require 'cucumber/ast/py_string'
12
+ require 'cucumber/ast/outline_table'
13
+ require 'cucumber/ast/examples'
14
+ require 'cucumber/ast/visitor'
15
+ require 'cucumber/ast/filter'
16
+
17
+ module Cucumber
18
+ # Classes in this module represent the Abstract Syntax Tree (AST)
19
+ # that gets built when feature files are parsed.
20
+ #
21
+ # AST classes don't expose any internal data directly. This is
22
+ # in order to encourage a less coupled design in the classes
23
+ # that operate on the AST. The only public method is #accept.
24
+ #
25
+ # The AST can be traversed with a visitor. See Cucumber::Format::Pretty
26
+ # for an example.
27
+ module Ast
28
+ end
29
+ end
@@ -0,0 +1,88 @@
1
+ module Cucumber
2
+ module Ast
3
+ class Background < Scenario
4
+
5
+ attr_accessor :world
6
+ attr_reader :status
7
+
8
+ def initialize(comment, line, keyword, steps)
9
+ @record_executed_steps = true
10
+ super(comment, Tags.new(1, []), line, keyword, "", steps)
11
+ end
12
+
13
+ def accept(visitor)
14
+ @world = visitor.new_world
15
+ if already_visited_steps?
16
+ @status = execute_steps(visitor)
17
+ else
18
+ @status = visit_background_and_steps(visitor, @steps)
19
+ @steps_visited = true
20
+ end
21
+ end
22
+
23
+ def step_executed(step)
24
+ @feature.step_executed(step) if @feature && @record_executed_steps
25
+ end
26
+
27
+ def already_visited_steps?
28
+ @steps_visited
29
+ end
30
+
31
+ def to_sexp #:nodoc:
32
+ sexp = [:background, @line, @keyword]
33
+ comment = @comment.to_sexp
34
+ sexp += [comment] if comment
35
+ tags = @tags.to_sexp
36
+ sexp += tags if tags.any?
37
+ steps = @steps.map{|step| step.to_sexp}
38
+ sexp += steps if steps.any?
39
+ sexp
40
+ end
41
+
42
+ private
43
+
44
+ def visit_background_and_steps(visitor, steps)
45
+ visitor.visit_comment(@comment)
46
+ visitor.visit_scenario_name(@keyword, @name, file_line(@line), source_indent(text_length))
47
+
48
+ previous = :passed
49
+ steps.each do |step|
50
+ step.previous = previous
51
+ step.world = @world
52
+ visitor.visit_step(step)
53
+ previous = step.status
54
+ end
55
+ previous
56
+ end
57
+
58
+ def execute_steps(visitor)
59
+ previous = :passed
60
+ executed_steps = []
61
+ exception = nil
62
+ @steps.each do |step|
63
+ executed_step, previous, _ = step.execute_as_new(@world, previous, visitor, @line)
64
+ executed_steps << executed_step
65
+ exception ||= executed_step.exception
66
+ end
67
+ @steps = executed_steps
68
+
69
+ if exception && @status != :failed
70
+ without_recording_steps do
71
+ @steps_visited = false
72
+ #Since the steps have already been executed they will not be re-run, they will just be displayed
73
+ visitor.visit_background(self)
74
+ end
75
+ end
76
+
77
+ previous
78
+ end
79
+
80
+ def without_recording_steps
81
+ @record_executed_steps = false
82
+ yield
83
+ @record_executed_steps = true
84
+ end
85
+
86
+ end
87
+ end
88
+ end