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.
Files changed (348) hide show
  1. data/History.txt +223 -5
  2. data/License.txt +1 -1
  3. data/Manifest.txt +174 -85
  4. data/README.txt +2 -39
  5. data/Rakefile +1 -2
  6. data/bin/cucumber +2 -2
  7. data/config/hoe.rb +9 -3
  8. data/examples/cs/README.textile +1 -22
  9. data/examples/cs/Rakefile +1 -1
  10. data/examples/cs/compile.bat +1 -0
  11. data/examples/cs/features/addition.feature +16 -0
  12. data/examples/cs/features/step_definitons/calculator_steps.rb +19 -0
  13. data/examples/cs/src/demo/Calculator.cs +20 -0
  14. data/examples/i18n/README.textile +1 -1
  15. data/examples/i18n/Rakefile +20 -4
  16. data/examples/i18n/ar/features/addition.feature +10 -11
  17. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +4 -12
  18. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +4 -2
  19. data/examples/i18n/de/features/addition.feature +10 -11
  20. data/examples/i18n/de/features/division.feature +0 -1
  21. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +5 -11
  22. data/examples/i18n/en/features/addition.feature +10 -11
  23. data/examples/i18n/en/features/division.feature +0 -1
  24. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +5 -12
  25. data/examples/i18n/en-lol/Rakefile +6 -0
  26. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  27. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  28. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  29. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  30. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  31. data/examples/i18n/es/features/adicion.feature +11 -12
  32. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +10 -11
  33. data/examples/i18n/es/lib/calculador.rb +4 -1
  34. data/examples/i18n/et/features/jagamine.feature +9 -0
  35. data/examples/i18n/et/features/liitmine.feature +10 -11
  36. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +7 -9
  37. data/examples/i18n/et/lib/kalkulaator.rb +5 -1
  38. data/examples/i18n/fi/Rakefile +6 -0
  39. data/examples/i18n/fi/features/jakolasku.feature +9 -0
  40. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  41. data/examples/i18n/fi/features/yhteenlasku.feature +16 -0
  42. data/examples/i18n/fi/lib/laskin.rb +14 -0
  43. data/examples/i18n/fr/features/addition.feature +16 -12
  44. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +14 -11
  45. data/examples/i18n/fr/lib/calculatrice.rb +1 -1
  46. data/examples/i18n/id/features/addition.feature +10 -11
  47. data/examples/i18n/id/features/division.feature +0 -1
  48. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +5 -12
  49. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +4 -2
  50. data/examples/i18n/ja/features/addition.feature +10 -11
  51. data/examples/i18n/ja/features/division.feature +2 -3
  52. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +6 -12
  53. data/examples/i18n/ko/Rakefile +6 -0
  54. data/examples/i18n/ko/features/addition.feature +16 -0
  55. data/examples/i18n/ko/features/division.feature +10 -0
  56. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  57. data/examples/i18n/ko/lib/calculator.rb +14 -0
  58. data/examples/i18n/lt/features/addition.feature +11 -11
  59. data/examples/i18n/lt/features/division.feature +0 -1
  60. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +5 -12
  61. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +4 -9
  62. data/examples/i18n/no/features/summering.feature +1 -0
  63. data/examples/i18n/no/features/support/env.rb +6 -0
  64. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +4 -2
  65. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +4 -2
  66. data/examples/i18n/ru/Rakefile +6 -0
  67. data/examples/i18n/ru/features/addition.feature +10 -0
  68. data/examples/i18n/ru/features/consecutive_calculations.feature +16 -0
  69. data/examples/i18n/ru/features/division.feature +15 -0
  70. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  71. data/examples/i18n/ru/features/support/env.rb +6 -0
  72. data/examples/i18n/ru/features/support/world.rb +7 -0
  73. data/examples/i18n/ru/lib/calculator.rb +24 -0
  74. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +4 -2
  75. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +5 -3
  76. data/examples/i18n/zh-TW/Rakefile +6 -0
  77. data/examples/i18n/zh-TW/features/addition.feature +16 -0
  78. data/examples/i18n/zh-TW/features/division.feature +10 -0
  79. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  80. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  81. data/examples/java/features/step_definitons/hello_steps.rb +1 -1
  82. data/examples/java/features/step_definitons/tree_steps.rb +1 -1
  83. data/examples/jbehave/README.textile +20 -0
  84. data/examples/jbehave/features/support/env.rb +7 -0
  85. data/examples/jbehave/features/trading.feature +28 -0
  86. data/examples/jbehave/pom.xml +53 -0
  87. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  88. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  89. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  90. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  91. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +70 -0
  92. data/examples/selenium/features/search.feature +1 -1
  93. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  94. data/examples/selenium/features/support/env.rb +19 -0
  95. data/examples/selenium_webrat/features/search.feature +9 -0
  96. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  97. data/examples/selenium_webrat/features/support/env.rb +41 -0
  98. data/examples/self_test/README.textile +6 -0
  99. data/examples/self_test/Rakefile +6 -0
  100. data/examples/self_test/features/background/failing_background.feature +11 -0
  101. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  102. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  103. data/examples/self_test/features/background/passing_background.feature +10 -0
  104. data/examples/self_test/features/background/pending_background.feature +10 -0
  105. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  106. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  107. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  108. data/examples/self_test/features/failing_expectation.feature +4 -0
  109. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  110. data/examples/self_test/features/outline_sample.feature +15 -0
  111. data/examples/self_test/features/sample.feature +19 -0
  112. data/examples/self_test/features/step_definitions/sample_steps.rb +64 -0
  113. data/examples/self_test/features/support/env.rb +1 -0
  114. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  115. data/examples/sinatra/Rakefile +6 -0
  116. data/examples/sinatra/app.rb +14 -0
  117. data/examples/sinatra/features/add.feature +11 -0
  118. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  119. data/examples/sinatra/features/support/env.rb +20 -0
  120. data/examples/sinatra/views/add.erb +5 -0
  121. data/examples/sinatra/views/layout.erb +8 -0
  122. data/examples/tickets/Rakefile +13 -8
  123. data/examples/tickets/cucumber.yml +2 -1
  124. data/examples/tickets/features/172.feature +28 -0
  125. data/examples/tickets/features/177/1.feature +29 -0
  126. data/examples/tickets/features/177/2.feature +21 -0
  127. data/examples/tickets/features/177/3.feature +18 -0
  128. data/examples/tickets/features/180.feature +7 -0
  129. data/examples/tickets/features/236.feature +13 -0
  130. data/examples/tickets/features/241.feature +13 -0
  131. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  132. data/examples/tickets/features/lib/pantry.rb +20 -0
  133. data/examples/tickets/features/scenario_outline.feature +95 -0
  134. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  135. data/examples/tickets/features/step_definitons/tickets_steps.rb +46 -5
  136. data/examples/tickets/features/tickets.feature +5 -1
  137. data/examples/watir/README.textile +16 -0
  138. data/examples/watir/features/step_definitons/search_steps.rb +24 -0
  139. data/examples/watir/features/support/env.rb +32 -0
  140. data/features/background.feature +221 -0
  141. data/features/cucumber_cli.feature +389 -0
  142. data/features/cucumber_cli_diff_disabled.feature +45 -0
  143. data/features/cucumber_cli_outlines.feature +81 -0
  144. data/features/custom_formatter.feature +11 -0
  145. data/features/report_called_undefined_steps.feature +34 -0
  146. data/features/step_definitions/cucumber_steps.rb +30 -0
  147. data/features/step_definitions/extra_steps.rb +2 -0
  148. data/features/support/env.rb +8 -0
  149. data/gem_tasks/deployment.rake +0 -23
  150. data/gem_tasks/features.rake +1 -1
  151. data/gem_tasks/fix_cr_lf.rake +1 -1
  152. data/gem_tasks/flog.rake +1 -1
  153. data/gem_tasks/gemspec.rake +4 -0
  154. data/gem_tasks/jar.rake +67 -0
  155. data/gem_tasks/rspec.rake +31 -15
  156. data/gem_tasks/yard.rake +8 -0
  157. data/lib/autotest/cucumber_mixin.rb +41 -25
  158. data/lib/cucumber/ast/background.rb +50 -0
  159. data/lib/cucumber/ast/comment.rb +26 -0
  160. data/lib/cucumber/ast/examples.rb +38 -0
  161. data/lib/cucumber/ast/feature.rb +62 -0
  162. data/lib/cucumber/ast/feature_element.rb +46 -0
  163. data/lib/cucumber/ast/features.rb +20 -0
  164. data/lib/cucumber/ast/outline_table.rb +81 -0
  165. data/lib/cucumber/ast/py_string.rb +58 -0
  166. data/lib/cucumber/ast/scenario.rb +64 -0
  167. data/lib/cucumber/ast/scenario_outline.rb +90 -0
  168. data/lib/cucumber/ast/step.rb +122 -0
  169. data/lib/cucumber/ast/step_collection.rb +66 -0
  170. data/lib/cucumber/ast/step_invocation.rb +110 -0
  171. data/lib/cucumber/ast/table.rb +318 -0
  172. data/lib/cucumber/ast/tags.rb +33 -0
  173. data/lib/cucumber/ast/visitor.rb +125 -0
  174. data/lib/cucumber/ast.rb +29 -0
  175. data/lib/cucumber/broadcaster.rb +2 -9
  176. data/lib/cucumber/cli/configuration.rb +364 -0
  177. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  178. data/lib/cucumber/cli/main.rb +109 -0
  179. data/lib/cucumber/core_ext/exception.rb +53 -0
  180. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  181. data/lib/cucumber/core_ext/proc.rb +29 -65
  182. data/lib/cucumber/core_ext/string.rb +26 -0
  183. data/lib/cucumber/formatter/ansicolor.rb +102 -0
  184. data/lib/cucumber/formatter/color_io.rb +23 -0
  185. data/lib/cucumber/formatter/console.rb +109 -0
  186. data/lib/cucumber/formatter/cucumber.css +55 -0
  187. data/lib/cucumber/formatter/cucumber.sass +49 -0
  188. data/lib/cucumber/formatter/html.rb +133 -0
  189. data/lib/cucumber/formatter/pretty.rb +179 -0
  190. data/lib/cucumber/formatter/profile.rb +77 -0
  191. data/lib/cucumber/formatter/progress.rb +60 -0
  192. data/lib/cucumber/formatter/rerun.rb +35 -0
  193. data/lib/cucumber/formatter/unicode.rb +35 -0
  194. data/lib/cucumber/formatter.rb +1 -0
  195. data/lib/cucumber/formatters/unicode.rb +2 -0
  196. data/lib/cucumber/jbehave.rb +97 -0
  197. data/lib/cucumber/languages.yml +214 -72
  198. data/lib/cucumber/parser/basic.rb +0 -0
  199. data/lib/cucumber/parser/feature.rb +1487 -0
  200. data/lib/cucumber/parser/feature.tt +193 -0
  201. data/lib/cucumber/parser/i18n.tt +31 -0
  202. data/lib/cucumber/parser/table.rb +402 -0
  203. data/lib/cucumber/parser/table.tt +59 -0
  204. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  205. data/lib/cucumber/parser.rb +43 -0
  206. data/lib/cucumber/platform.rb +13 -8
  207. data/lib/cucumber/rails/rspec.rb +6 -10
  208. data/lib/cucumber/rails/world.rb +8 -8
  209. data/lib/cucumber/rake/task.rb +46 -9
  210. data/lib/cucumber/step_definition.rb +103 -0
  211. data/lib/cucumber/step_match.rb +49 -0
  212. data/lib/cucumber/step_mother.rb +184 -65
  213. data/lib/cucumber/version.rb +4 -3
  214. data/lib/cucumber/world.rb +53 -0
  215. data/lib/cucumber.rb +45 -21
  216. data/rails_generators/cucumber/cucumber_generator.rb +23 -3
  217. data/rails_generators/cucumber/templates/cucumber +2 -1
  218. data/rails_generators/cucumber/templates/cucumber.rake +13 -5
  219. data/rails_generators/cucumber/templates/env.rb +11 -2
  220. data/rails_generators/cucumber/templates/paths.rb +19 -0
  221. data/rails_generators/cucumber/templates/webrat_steps.rb +60 -40
  222. data/rails_generators/feature/feature_generator.rb +26 -2
  223. data/rails_generators/feature/templates/feature.erb +15 -12
  224. data/rails_generators/feature/templates/steps.erb +14 -16
  225. data/spec/cucumber/ast/background_spec.rb +49 -0
  226. data/spec/cucumber/ast/feature_factory.rb +63 -0
  227. data/spec/cucumber/ast/feature_spec.rb +37 -0
  228. data/spec/cucumber/ast/py_string_spec.rb +47 -0
  229. data/spec/cucumber/ast/scenario_outline_spec.rb +67 -0
  230. data/spec/cucumber/ast/scenario_spec.rb +65 -0
  231. data/spec/cucumber/ast/step_collection_spec.rb +8 -0
  232. data/spec/cucumber/ast/step_spec.rb +66 -0
  233. data/spec/cucumber/ast/table_spec.rb +149 -0
  234. data/spec/cucumber/ast/tags_spec.rb +19 -0
  235. data/spec/cucumber/broadcaster_spec.rb +6 -18
  236. data/spec/cucumber/cli/configuration_spec.rb +275 -0
  237. data/spec/cucumber/cli/main_spec.rb +203 -0
  238. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  239. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  240. data/spec/cucumber/formatter/ansicolor_spec.rb +35 -0
  241. data/spec/cucumber/formatter/color_io_spec.rb +26 -0
  242. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  243. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  244. data/spec/cucumber/formatter/html/index.html +45 -0
  245. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  246. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  247. data/spec/cucumber/formatters/profile_formatter_spec.rb +22 -16
  248. data/spec/cucumber/parser/feature_parser_spec.rb +282 -0
  249. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  250. data/spec/cucumber/rails/stubs/mini_rails.rb +4 -3
  251. data/spec/cucumber/step_definition_spec.rb +81 -0
  252. data/spec/cucumber/step_mother_spec.rb +50 -51
  253. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  254. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  255. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  256. data/spec/cucumber/treetop_parser/multiple_tables.feature +6 -8
  257. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  258. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  259. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  260. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  261. data/spec/cucumber/world/pending_spec.rb +47 -0
  262. data/spec/spec_helper.rb +4 -3
  263. metadata +192 -95
  264. data/TODO.txt +0 -26
  265. data/examples/calculator_ruby_features/features/addition.rb +0 -23
  266. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  267. data/examples/cs/features/hello.feature +0 -11
  268. data/examples/cs/features/step_definitons/hello_steps.rb +0 -25
  269. data/examples/cs/features/step_definitons/tree_steps.rb +0 -14
  270. data/examples/cs/features/tree.feature +0 -9
  271. data/examples/cs/src/Hello.cs +0 -18
  272. data/examples/i18n/ja/README.txt +0 -5
  273. data/examples/selenium/features/step_definitons/stories_steps.rb +0 -41
  274. data/examples/watir/features/step_definitons/stories_steps.rb +0 -51
  275. data/features/see_features.feature +0 -8
  276. data/features/steps/features_steps.rb +0 -9
  277. data/gem_tasks/treetop.rake +0 -41
  278. data/lib/cucumber/cli.rb +0 -279
  279. data/lib/cucumber/executor.rb +0 -190
  280. data/lib/cucumber/formatters/ansicolor.rb +0 -109
  281. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  282. data/lib/cucumber/formatters/cucumber.css +0 -132
  283. data/lib/cucumber/formatters/cucumber.js +0 -11
  284. data/lib/cucumber/formatters/html_formatter.rb +0 -128
  285. data/lib/cucumber/formatters/jquery.js +0 -32
  286. data/lib/cucumber/formatters/pretty_formatter.rb +0 -234
  287. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  288. data/lib/cucumber/formatters/progress_formatter.rb +0 -58
  289. data/lib/cucumber/formatters.rb +0 -1
  290. data/lib/cucumber/model/table.rb +0 -28
  291. data/lib/cucumber/model.rb +0 -1
  292. data/lib/cucumber/step_methods.rb +0 -49
  293. data/lib/cucumber/tree/feature.rb +0 -63
  294. data/lib/cucumber/tree/features.rb +0 -21
  295. data/lib/cucumber/tree/given_scenario.rb +0 -13
  296. data/lib/cucumber/tree/scenario.rb +0 -174
  297. data/lib/cucumber/tree/step.rb +0 -134
  298. data/lib/cucumber/tree/table.rb +0 -26
  299. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  300. data/lib/cucumber/tree.rb +0 -18
  301. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -206
  302. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1591
  303. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1591
  304. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1591
  305. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1591
  306. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1591
  307. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1591
  308. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1591
  309. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1591
  310. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1591
  311. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1591
  312. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1591
  313. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1591
  314. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1591
  315. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1591
  316. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1591
  317. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -34
  318. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1591
  319. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1591
  320. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1591
  321. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1591
  322. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1591
  323. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1591
  324. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1591
  325. data/script/console +0 -10
  326. data/script/console.cmd +0 -1
  327. data/script/destroy +0 -14
  328. data/script/destroy.cmd +0 -1
  329. data/script/generate +0 -14
  330. data/script/generate.cmd +0 -1
  331. data/script/txt2html +0 -74
  332. data/script/txt2html.cmd +0 -1
  333. data/setup.rb +0 -1585
  334. data/spec/cucumber/cli_spec.rb +0 -274
  335. data/spec/cucumber/executor_spec.rb +0 -298
  336. data/spec/cucumber/formatters/ansicolor_spec.rb +0 -35
  337. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  338. data/spec/cucumber/formatters/features.html +0 -269
  339. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -74
  340. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -204
  341. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -65
  342. data/spec/cucumber/model/table_spec.rb +0 -20
  343. data/spec/cucumber/tree/feature_spec.rb +0 -43
  344. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  345. data/spec/cucumber/tree/scenario_spec.rb +0 -76
  346. data/spec/cucumber/tree/step_spec.rb +0 -50
  347. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -98
  348. /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
@@ -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
- $CUCUMBER_JRUBY = defined?(JRUBY_VERSION)
6
- $CUCUMBER_IRONRUBY = Config::CONFIG['sitedir'] =~ /IronRuby/
7
- $CUCUMBER_WINDOWS = Config::CONFIG['host_os'] =~ /mswin|mingw/
8
- $CUCUMBER_WINDOWS_MRI = $CUCUMBER_WINDOWS && !$CUCUMBER_JRUBY && !$CUCUMBER_IRONRUBY
9
-
10
- if $CUCUMBER_IRONRUBY
11
- ENV['GEM_PATH'] ||= "C:/ruby/lib/ruby/gems/1.8"
12
- end
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
@@ -1,12 +1,8 @@
1
- require 'spec'
2
- require 'spec/rails'
1
+ require 'cucumber/rails/world'
2
+ require 'spec/expectations'
3
+ require 'spec/rails/matchers'
3
4
 
4
- # Hack to stop RSpec from dumping the summary
5
- Spec::Runner::Options.class_eval do
6
- def examples_should_be_run?
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)
@@ -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 perform_action
15
- perform_action_without_rescue
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
- $main = self
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
- $main.Before do
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.send :increment_open_transactions
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
- $main.After do
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.send :decrement_open_transactions
62
+ ActiveRecord::Base.__send__(:decrement_open_transactions)
63
63
  end
64
64
  end
65
65
  end
@@ -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 task
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
- @binary ||= File.expand_path(File.dirname(__FILE__) + '/../../../bin/cucumber')
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"' % ([LIB] + libs).join(File::PATH_SEPARATOR)]
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