stefl-cucumber 0.10.1

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 (538) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +24 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +7 -0
  5. data/History.txt +1613 -0
  6. data/LICENSE +22 -0
  7. data/README.rdoc +26 -0
  8. data/Rakefile +12 -0
  9. data/bin/cucumber +22 -0
  10. data/cucumber.gemspec +50 -0
  11. data/cucumber.yml +20 -0
  12. data/examples/i18n/README.textile +18 -0
  13. data/examples/i18n/Rakefile +33 -0
  14. data/examples/i18n/ar/Rakefile +6 -0
  15. data/examples/i18n/ar/features/addition.feature +17 -0
  16. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +24 -0
  17. data/examples/i18n/ar/lib/calculator.rb +11 -0
  18. data/examples/i18n/bg/Rakefile +6 -0
  19. data/examples/i18n/bg/features/addition.feature +12 -0
  20. data/examples/i18n/bg/features/consecutive_calculations.feature +19 -0
  21. data/examples/i18n/bg/features/division.feature +17 -0
  22. data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
  23. data/examples/i18n/bg/features/support/env.rb +5 -0
  24. data/examples/i18n/bg/features/support/world.rb +8 -0
  25. data/examples/i18n/bg/lib/calculator.rb +24 -0
  26. data/examples/i18n/ca/Rakefile +6 -0
  27. data/examples/i18n/ca/features/step_definitons/calculator_steps.rb +21 -0
  28. data/examples/i18n/ca/features/suma.feature +17 -0
  29. data/examples/i18n/ca/lib/calculadora.rb +16 -0
  30. data/examples/i18n/da/Rakefile +6 -0
  31. data/examples/i18n/da/features/sammenlaegning.feature +18 -0
  32. data/examples/i18n/da/features/step_definitons/lommeregner_steps.rb +24 -0
  33. data/examples/i18n/da/lib/lommeregner.rb +11 -0
  34. data/examples/i18n/de/.gitignore +1 -0
  35. data/examples/i18n/de/Rakefile +6 -0
  36. data/examples/i18n/de/features/addition.feature +17 -0
  37. data/examples/i18n/de/features/division.feature +10 -0
  38. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +24 -0
  39. data/examples/i18n/de/lib/calculator.rb +14 -0
  40. data/examples/i18n/en-lol/Rakefile +4 -0
  41. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  42. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  43. data/examples/i18n/en-lol/features/support/env.rb +7 -0
  44. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  45. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  46. data/examples/i18n/en/.gitignore +1 -0
  47. data/examples/i18n/en/Rakefile +6 -0
  48. data/examples/i18n/en/features/addition.feature +17 -0
  49. data/examples/i18n/en/features/division.feature +10 -0
  50. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +24 -0
  51. data/examples/i18n/en/lib/calculator.rb +14 -0
  52. data/examples/i18n/eo/.gitignore +1 -0
  53. data/examples/i18n/eo/Rakefile +6 -0
  54. data/examples/i18n/eo/features/adicio.feature +17 -0
  55. data/examples/i18n/eo/features/divido.feature +10 -0
  56. data/examples/i18n/eo/features/step_definitons/calculator_steps.rb +24 -0
  57. data/examples/i18n/eo/lib/calculator.rb +14 -0
  58. data/examples/i18n/es/Rakefile +6 -0
  59. data/examples/i18n/es/features/adicion.feature +17 -0
  60. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +21 -0
  61. data/examples/i18n/es/lib/calculador.rb +14 -0
  62. data/examples/i18n/et/Rakefile +6 -0
  63. data/examples/i18n/et/features/jagamine.feature +10 -0
  64. data/examples/i18n/et/features/liitmine.feature +17 -0
  65. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +24 -0
  66. data/examples/i18n/et/lib/kalkulaator.rb +14 -0
  67. data/examples/i18n/fi/.gitignore +1 -0
  68. data/examples/i18n/fi/Rakefile +6 -0
  69. data/examples/i18n/fi/features/jakolasku.feature +10 -0
  70. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +24 -0
  71. data/examples/i18n/fi/features/yhteenlasku.feature +17 -0
  72. data/examples/i18n/fi/lib/laskin.rb +14 -0
  73. data/examples/i18n/fr/Rakefile +6 -0
  74. data/examples/i18n/fr/features/addition.feature +18 -0
  75. data/examples/i18n/fr/features/addition2.feature +17 -0
  76. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +32 -0
  77. data/examples/i18n/fr/features/support/env.rb +5 -0
  78. data/examples/i18n/fr/lib/calculatrice.rb +10 -0
  79. data/examples/i18n/he/Rakefile +6 -0
  80. data/examples/i18n/he/features/addition.feature +17 -0
  81. data/examples/i18n/he/features/division.feature +10 -0
  82. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +24 -0
  83. data/examples/i18n/he/lib/calculator.rb +15 -0
  84. data/examples/i18n/hu/.gitignore +1 -0
  85. data/examples/i18n/hu/Rakefile +6 -0
  86. data/examples/i18n/hu/features/osszeadas.feature +17 -0
  87. data/examples/i18n/hu/features/osztas.feature +10 -0
  88. data/examples/i18n/hu/features/step_definitons/calculator_steps.rb +25 -0
  89. data/examples/i18n/hu/lib/calculator.rb +14 -0
  90. data/examples/i18n/id/.gitignore +1 -0
  91. data/examples/i18n/id/Rakefile +6 -0
  92. data/examples/i18n/id/features/addition.feature +17 -0
  93. data/examples/i18n/id/features/division.feature +10 -0
  94. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +24 -0
  95. data/examples/i18n/id/lib/calculator.rb +14 -0
  96. data/examples/i18n/it/Rakefile +6 -0
  97. data/examples/i18n/it/features/somma.feature +11 -0
  98. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +24 -0
  99. data/examples/i18n/it/lib/calcolatrice.rb +11 -0
  100. data/examples/i18n/ja/.gitignore +1 -0
  101. data/examples/i18n/ja/Rakefile +6 -0
  102. data/examples/i18n/ja/features/addition.feature +17 -0
  103. data/examples/i18n/ja/features/division.feature +10 -0
  104. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +19 -0
  105. data/examples/i18n/ja/features/support/env.rb +5 -0
  106. data/examples/i18n/ja/lib/calculator.rb +14 -0
  107. data/examples/i18n/ko/.gitignore +1 -0
  108. data/examples/i18n/ko/Rakefile +6 -0
  109. data/examples/i18n/ko/features/addition.feature +17 -0
  110. data/examples/i18n/ko/features/division.feature +11 -0
  111. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +24 -0
  112. data/examples/i18n/ko/lib/calculator.rb +14 -0
  113. data/examples/i18n/lt/.gitignore +1 -0
  114. data/examples/i18n/lt/Rakefile +6 -0
  115. data/examples/i18n/lt/features/addition.feature +17 -0
  116. data/examples/i18n/lt/features/division.feature +10 -0
  117. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +24 -0
  118. data/examples/i18n/lt/lib/calculator.rb +14 -0
  119. data/examples/i18n/lv/Rakefile +6 -0
  120. data/examples/i18n/lv/features/addition.feature +17 -0
  121. data/examples/i18n/lv/features/division.feature +10 -0
  122. data/examples/i18n/lv/features/step_definitons/calculator_steps.rb +24 -0
  123. data/examples/i18n/lv/lib/calculator.rb +14 -0
  124. data/examples/i18n/no/Rakefile +6 -0
  125. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +17 -0
  126. data/examples/i18n/no/features/summering.feature +19 -0
  127. data/examples/i18n/no/features/support/env.rb +6 -0
  128. data/examples/i18n/no/lib/kalkulator.rb +11 -0
  129. data/examples/i18n/pl/.gitignore +1 -0
  130. data/examples/i18n/pl/Rakefile +6 -0
  131. data/examples/i18n/pl/features/addition.feature +17 -0
  132. data/examples/i18n/pl/features/division.feature +10 -0
  133. data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
  134. data/examples/i18n/pl/features/support/env.rb +5 -0
  135. data/examples/i18n/pl/lib/calculator.rb +14 -0
  136. data/examples/i18n/pt/Rakefile +6 -0
  137. data/examples/i18n/pt/features/adicao.feature +11 -0
  138. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +20 -0
  139. data/examples/i18n/pt/features/support/env.rb +5 -0
  140. data/examples/i18n/pt/lib/calculadora.rb +10 -0
  141. data/examples/i18n/ro/Rakefile +6 -0
  142. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +24 -0
  143. data/examples/i18n/ro/features/suma.feature +11 -0
  144. data/examples/i18n/ro/lib/calculator.rb +11 -0
  145. data/examples/i18n/ru/Rakefile +6 -0
  146. data/examples/i18n/ru/features/addition.feature +11 -0
  147. data/examples/i18n/ru/features/consecutive_calculations.feature +17 -0
  148. data/examples/i18n/ru/features/division.feature +16 -0
  149. data/examples/i18n/ru/features/step_definitons/calculator_steps.rb +19 -0
  150. data/examples/i18n/ru/features/support/env.rb +5 -0
  151. data/examples/i18n/ru/features/support/world.rb +8 -0
  152. data/examples/i18n/ru/lib/calculator.rb +24 -0
  153. data/examples/i18n/sk/.gitignore +1 -0
  154. data/examples/i18n/sk/Rakefile +6 -0
  155. data/examples/i18n/sk/features/addition.feature +17 -0
  156. data/examples/i18n/sk/features/division.feature +10 -0
  157. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  158. data/examples/i18n/sk/lib/calculator.rb +14 -0
  159. data/examples/i18n/sr-Cyrl/Rakefile +6 -0
  160. data/examples/i18n/sr-Cyrl/features/sabiranje.feature +18 -0
  161. data/examples/i18n/sr-Cyrl/features/step_definitons/calculator_steps.rb +20 -0
  162. data/examples/i18n/sr-Cyrl/features/support/env.rb +5 -0
  163. data/examples/i18n/sr-Cyrl/lib/calculator.rb +12 -0
  164. data/examples/i18n/sr-Latn/Rakefile +6 -0
  165. data/examples/i18n/sr-Latn/features/sabiranje.feature +18 -0
  166. data/examples/i18n/sr-Latn/features/step_definitons/calculator_steps.rb +24 -0
  167. data/examples/i18n/sr-Latn/lib/calculator.rb +12 -0
  168. data/examples/i18n/sv/Rakefile +6 -0
  169. data/examples/i18n/sv/features/step_definitons/kalkulator_steps.rb +24 -0
  170. data/examples/i18n/sv/features/summering.feature +18 -0
  171. data/examples/i18n/sv/lib/kalkulator.rb +11 -0
  172. data/examples/i18n/tr/.gitignore +1 -0
  173. data/examples/i18n/tr/Rakefile +6 -0
  174. data/examples/i18n/tr/features/bolme.feature +10 -0
  175. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +24 -0
  176. data/examples/i18n/tr/features/toplama.feature +18 -0
  177. data/examples/i18n/tr/lib/hesap_makinesi.rb +15 -0
  178. data/examples/i18n/uk/Rakefile +6 -0
  179. data/examples/i18n/uk/features/addition.feature +11 -0
  180. data/examples/i18n/uk/features/consecutive_calculations.feature +17 -0
  181. data/examples/i18n/uk/features/division.feature +16 -0
  182. data/examples/i18n/uk/features/step_definitons/calculator_steps.rb +19 -0
  183. data/examples/i18n/uk/features/support/env.rb +5 -0
  184. data/examples/i18n/uk/features/support/world.rb +8 -0
  185. data/examples/i18n/uk/lib/calculator.rb +24 -0
  186. data/examples/i18n/uz/Rakefile +6 -0
  187. data/examples/i18n/uz/features/addition.feature +10 -0
  188. data/examples/i18n/uz/features/consecutive_calculations.feature +17 -0
  189. data/examples/i18n/uz/features/division.feature +17 -0
  190. data/examples/i18n/uz/features/step_definitons/calculator_steps.rb +19 -0
  191. data/examples/i18n/uz/features/support/env.rb +5 -0
  192. data/examples/i18n/uz/features/support/world.rb +8 -0
  193. data/examples/i18n/uz/lib/calculator.rb +24 -0
  194. data/examples/i18n/zh-CN/Rakefile +4 -0
  195. data/examples/i18n/zh-CN/features/addition.feature +18 -0
  196. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +26 -0
  197. data/examples/i18n/zh-CN/lib/calculator.rb +10 -0
  198. data/examples/i18n/zh-TW/.gitignore +1 -0
  199. data/examples/i18n/zh-TW/Rakefile +4 -0
  200. data/examples/i18n/zh-TW/features/addition.feature +17 -0
  201. data/examples/i18n/zh-TW/features/division.feature +11 -0
  202. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +24 -0
  203. data/examples/i18n/zh-TW/lib/calculator.rb +14 -0
  204. data/examples/python/README.textile +7 -0
  205. data/examples/python/Rakefile +4 -0
  206. data/examples/python/features/fibonacci.feature +19 -0
  207. data/examples/python/features/step_definitions/fib_steps.py +11 -0
  208. data/examples/python/lib/.gitignore +1 -0
  209. data/examples/python/lib/fib.py +7 -0
  210. data/examples/ramaze/README.textile +7 -0
  211. data/examples/ramaze/Rakefile +6 -0
  212. data/examples/ramaze/app.rb +21 -0
  213. data/examples/ramaze/features/add.feature +11 -0
  214. data/examples/ramaze/features/step_definitions/add_steps.rb +15 -0
  215. data/examples/ramaze/features/support/env.rb +32 -0
  216. data/examples/ramaze/layout/default.html.erb +8 -0
  217. data/examples/ramaze/view/index.html.erb +5 -0
  218. data/examples/rspec_doubles/Rakefile +4 -0
  219. data/examples/rspec_doubles/features/mocking.feature +9 -0
  220. data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +19 -0
  221. data/examples/rspec_doubles/features/support/env.rb +12 -0
  222. data/examples/ruby2python/README.textile +7 -0
  223. data/examples/ruby2python/Rakefile +4 -0
  224. data/examples/ruby2python/features/fibonacci.feature +19 -0
  225. data/examples/ruby2python/features/step_definitions/fib_steps.rb +7 -0
  226. data/examples/ruby2python/features/support/env.rb +21 -0
  227. data/examples/ruby2python/lib/.gitignore +1 -0
  228. data/examples/ruby2python/lib/fib.py +7 -0
  229. data/examples/sinatra/README.textile +13 -0
  230. data/examples/sinatra/Rakefile +6 -0
  231. data/examples/sinatra/app.rb +14 -0
  232. data/examples/sinatra/features/add.feature +11 -0
  233. data/examples/sinatra/features/step_definitions/add_steps.rb +15 -0
  234. data/examples/sinatra/features/support/env.rb +10 -0
  235. data/examples/sinatra/views/add.erb +7 -0
  236. data/examples/sinatra/views/layout.erb +8 -0
  237. data/examples/tcl/README.textile +11 -0
  238. data/examples/tcl/Rakefile +6 -0
  239. data/examples/tcl/features/fibonnacci.feature +17 -0
  240. data/examples/tcl/features/step_definitions/fib_steps.rb +7 -0
  241. data/examples/tcl/features/support/env.rb +6 -0
  242. data/examples/tcl/src/fib.tcl +3 -0
  243. data/examples/test_unit/Rakefile +6 -0
  244. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +23 -0
  245. data/examples/test_unit/features/test_unit.feature +9 -0
  246. data/examples/v8/Rakefile +6 -0
  247. data/examples/v8/features/fibonacci.feature +43 -0
  248. data/examples/v8/features/step_definitions/fib_steps.js +49 -0
  249. data/examples/v8/features/support/env.js +14 -0
  250. data/examples/v8/lib/fibonacci.js +19 -0
  251. data/examples/watir/.gitignore +2 -0
  252. data/examples/watir/README.textile +16 -0
  253. data/examples/watir/Rakefile +12 -0
  254. data/examples/watir/cucumber.yml +1 -0
  255. data/examples/watir/features/search.feature +12 -0
  256. data/examples/watir/features/step_definitions/search_steps.rb +26 -0
  257. data/examples/watir/features/support/env.rb +32 -0
  258. data/examples/watir/features/support/screenshots.rb +47 -0
  259. data/features/background.feature +498 -0
  260. data/features/custom_formatter.feature +41 -0
  261. data/features/execute_with_tag_filter.feature +63 -0
  262. data/features/hooks.feature +59 -0
  263. data/features/json_formatter.feature +249 -0
  264. data/features/stats_formatters.feature +70 -0
  265. data/features/step_definitions/cucumber_steps.rb +8 -0
  266. data/features/support/env.rb +31 -0
  267. data/features/tagged_hooks.feature +217 -0
  268. data/fixtures/json/features/background.feature +7 -0
  269. data/fixtures/json/features/embed.feature +4 -0
  270. data/fixtures/json/features/one_passing_one_failing.feature +11 -0
  271. data/fixtures/json/features/step_definitions/steps.rb +32 -0
  272. data/fixtures/json/features/tables.feature +13 -0
  273. data/fixtures/junit/features/one_passing_one_failing.feature +8 -0
  274. data/fixtures/junit/features/pending.feature +5 -0
  275. data/fixtures/junit/features/step_definitions/steps.rb +11 -0
  276. data/fixtures/self_test/.gitignore +1 -0
  277. data/fixtures/self_test/README.textile +6 -0
  278. data/fixtures/self_test/Rakefile +6 -0
  279. data/fixtures/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  280. data/fixtures/self_test/features/failing_expectation.feature +4 -0
  281. data/fixtures/self_test/features/lots_of_undefined.feature +8 -0
  282. data/fixtures/self_test/features/multiline_name.feature +27 -0
  283. data/fixtures/self_test/features/outline_sample.feature +15 -0
  284. data/fixtures/self_test/features/sample.feature +21 -0
  285. data/fixtures/self_test/features/search_sample.feature +32 -0
  286. data/fixtures/self_test/features/step_definitions/sample_steps.rb +84 -0
  287. data/fixtures/self_test/features/support/env.rb +18 -0
  288. data/fixtures/self_test/features/tags_sample.feature +17 -0
  289. data/fixtures/self_test/features/tons_of_cukes.feature +52 -0
  290. data/fixtures/self_test/features/undefined_multiline_args.feature +12 -0
  291. data/fixtures/self_test/list-of-features.txt +1 -0
  292. data/fixtures/steps_library/features/step_definitions/steps_lib1.rb +8 -0
  293. data/fixtures/steps_library/features/step_definitions/steps_lib2.rb +8 -0
  294. data/fixtures/tickets/Rakefile +20 -0
  295. data/fixtures/tickets/features.html +138 -0
  296. data/fixtures/tickets/features/172.feature +28 -0
  297. data/fixtures/tickets/features/177/1.feature +28 -0
  298. data/fixtures/tickets/features/177/2.feature +20 -0
  299. data/fixtures/tickets/features/177/3.feature +18 -0
  300. data/fixtures/tickets/features/180.feature +7 -0
  301. data/fixtures/tickets/features/229/tagged_hooks.feature +8 -0
  302. data/fixtures/tickets/features/229/tagged_hooks.rb +14 -0
  303. data/fixtures/tickets/features/236.feature +13 -0
  304. data/fixtures/tickets/features/241.feature +12 -0
  305. data/fixtures/tickets/features/246.feature +4 -0
  306. data/fixtures/tickets/features/248.feature +11 -0
  307. data/fixtures/tickets/features/270/back.feature +14 -0
  308. data/fixtures/tickets/features/270/back.steps.rb +14 -0
  309. data/fixtures/tickets/features/272/hooks.feature +26 -0
  310. data/fixtures/tickets/features/272/hooks_steps.rb +53 -0
  311. data/fixtures/tickets/features/279/py_string_indent.feature +25 -0
  312. data/fixtures/tickets/features/279/py_string_indent.steps.rb +12 -0
  313. data/fixtures/tickets/features/279/wrong.feature_ +11 -0
  314. data/fixtures/tickets/features/301/filter_background_tagged_hooks.feature +6 -0
  315. data/fixtures/tickets/features/301/filter_background_tagged_hooks_steps.rb +12 -0
  316. data/fixtures/tickets/features/306/only_background.feature +4 -0
  317. data/fixtures/tickets/features/around_timeout.feature +6 -0
  318. data/fixtures/tickets/features/gherkin_67.feature +12 -0
  319. data/fixtures/tickets/features/gherkin_68.feature +4 -0
  320. data/fixtures/tickets/features/half_manual.feature +11 -0
  321. data/fixtures/tickets/features/lib/eatting_machine.rb +18 -0
  322. data/fixtures/tickets/features/lib/pantry.rb +20 -0
  323. data/fixtures/tickets/features/scenario_outline.feature +95 -0
  324. data/fixtures/tickets/features/step_definitons/246_steps.rb +3 -0
  325. data/fixtures/tickets/features/step_definitons/248_steps.rb +15 -0
  326. data/fixtures/tickets/features/step_definitons/around_timeout_steps.rb +9 -0
  327. data/fixtures/tickets/features/step_definitons/half_manual_steps.rb +11 -0
  328. data/fixtures/tickets/features/step_definitons/scenario_outline_steps.rb +42 -0
  329. data/fixtures/tickets/features/step_definitons/tickets_steps.rb +88 -0
  330. data/fixtures/tickets/features/table_diffing.feature +13 -0
  331. data/fixtures/tickets/features/tickets.feature +28 -0
  332. data/gem_tasks/contributors.rake +15 -0
  333. data/gem_tasks/cucumber.rake +19 -0
  334. data/gem_tasks/environment.rake +7 -0
  335. data/gem_tasks/examples.rake +11 -0
  336. data/gem_tasks/fix_cr_lf.rake +10 -0
  337. data/gem_tasks/flog.rake +4 -0
  338. data/gem_tasks/rspec.rake +8 -0
  339. data/gem_tasks/sass.rake +4 -0
  340. data/gem_tasks/sdoc.rake +12 -0
  341. data/legacy_features/announce.feature +164 -0
  342. data/legacy_features/api/list_step_defs_as_json.feature +50 -0
  343. data/legacy_features/api/run_cli_main_with_existing_runtime.feature +34 -0
  344. data/legacy_features/around_hooks.feature +232 -0
  345. data/legacy_features/bug_371.feature +32 -0
  346. data/legacy_features/bug_464.feature +16 -0
  347. data/legacy_features/bug_475.feature +42 -0
  348. data/legacy_features/bug_585_tab_indentation.feature +22 -0
  349. data/legacy_features/bug_600.feature +67 -0
  350. data/legacy_features/call_steps_from_stepdefs.feature +154 -0
  351. data/legacy_features/cucumber_cli.feature +591 -0
  352. data/legacy_features/cucumber_cli_outlines.feature +117 -0
  353. data/legacy_features/default_snippets.feature +42 -0
  354. data/legacy_features/diffing.feature +25 -0
  355. data/legacy_features/drb_server_integration.feature +174 -0
  356. data/legacy_features/exception_in_after_block.feature +127 -0
  357. data/legacy_features/exception_in_after_step_block.feature +104 -0
  358. data/legacy_features/exception_in_before_block.feature +98 -0
  359. data/legacy_features/exclude_files.feature +20 -0
  360. data/legacy_features/expand.feature +60 -0
  361. data/legacy_features/html_formatter.feature +8 -0
  362. data/legacy_features/html_formatter/a.html +550 -0
  363. data/legacy_features/junit_formatter.feature +92 -0
  364. data/legacy_features/language_from_header.feature +30 -0
  365. data/legacy_features/language_help.feature +78 -0
  366. data/legacy_features/listener_debugger_formatter.feature +42 -0
  367. data/legacy_features/multiline_names.feature +44 -0
  368. data/legacy_features/post_configuration_hook.feature +50 -0
  369. data/legacy_features/profiles.feature +126 -0
  370. data/legacy_features/rake_task.feature +152 -0
  371. data/legacy_features/report_called_undefined_steps.feature +34 -0
  372. data/legacy_features/rerun_formatter.feature +45 -0
  373. data/legacy_features/simplest.feature +11 -0
  374. data/legacy_features/snippet.feature +23 -0
  375. data/legacy_features/snippets_when_using_star_keyword.feature +36 -0
  376. data/legacy_features/step_definitions/cucumber_steps.rb +168 -0
  377. data/legacy_features/step_definitions/extra_steps.rb +2 -0
  378. data/legacy_features/step_definitions/simplest_steps.rb +3 -0
  379. data/legacy_features/step_definitions/wire_steps.rb +34 -0
  380. data/legacy_features/support/env.rb +157 -0
  381. data/legacy_features/support/env.rb.simplest +7 -0
  382. data/legacy_features/support/fake_wire_server.rb +77 -0
  383. data/legacy_features/table_diffing.feature +45 -0
  384. data/legacy_features/table_mapping.feature +34 -0
  385. data/legacy_features/transform.feature +245 -0
  386. data/legacy_features/unicode_table.feature +35 -0
  387. data/legacy_features/wire_protocol.feature +332 -0
  388. data/legacy_features/wire_protocol_table_diffing.feature +119 -0
  389. data/legacy_features/wire_protocol_tags.feature +87 -0
  390. data/legacy_features/wire_protocol_timeouts.feature +63 -0
  391. data/legacy_features/work_in_progress.feature +156 -0
  392. data/lib/README.rdoc +12 -0
  393. data/lib/autotest/cucumber.rb +6 -0
  394. data/lib/autotest/cucumber_mixin.rb +135 -0
  395. data/lib/autotest/cucumber_rails.rb +6 -0
  396. data/lib/autotest/cucumber_rails_rspec.rb +6 -0
  397. data/lib/autotest/cucumber_rails_rspec2.rb +6 -0
  398. data/lib/autotest/cucumber_rspec.rb +6 -0
  399. data/lib/autotest/cucumber_rspec2.rb +6 -0
  400. data/lib/autotest/discover.rb +9 -0
  401. data/lib/cucumber.rb +27 -0
  402. data/lib/cucumber/ast.rb +30 -0
  403. data/lib/cucumber/ast/background.rb +99 -0
  404. data/lib/cucumber/ast/comment.rb +31 -0
  405. data/lib/cucumber/ast/examples.rb +43 -0
  406. data/lib/cucumber/ast/feature.rb +103 -0
  407. data/lib/cucumber/ast/feature_element.rb +78 -0
  408. data/lib/cucumber/ast/features.rb +35 -0
  409. data/lib/cucumber/ast/outline_table.rb +187 -0
  410. data/lib/cucumber/ast/py_string.rb +80 -0
  411. data/lib/cucumber/ast/scenario.rb +117 -0
  412. data/lib/cucumber/ast/scenario_outline.rb +122 -0
  413. data/lib/cucumber/ast/step.rb +126 -0
  414. data/lib/cucumber/ast/step_collection.rb +76 -0
  415. data/lib/cucumber/ast/step_invocation.rb +199 -0
  416. data/lib/cucumber/ast/table.rb +689 -0
  417. data/lib/cucumber/ast/tags.rb +28 -0
  418. data/lib/cucumber/ast/tree_walker.rb +184 -0
  419. data/lib/cucumber/ast/visitor.rb +11 -0
  420. data/lib/cucumber/broadcaster.rb +13 -0
  421. data/lib/cucumber/cli/configuration.rb +209 -0
  422. data/lib/cucumber/cli/drb_client.rb +43 -0
  423. data/lib/cucumber/cli/main.rb +78 -0
  424. data/lib/cucumber/cli/options.rb +406 -0
  425. data/lib/cucumber/cli/profile_loader.rb +91 -0
  426. data/lib/cucumber/configuration.rb +49 -0
  427. data/lib/cucumber/constantize.rb +34 -0
  428. data/lib/cucumber/core_ext/disable_mini_unit_autorun.rb +14 -0
  429. data/lib/cucumber/core_ext/instance_exec.rb +98 -0
  430. data/lib/cucumber/core_ext/proc.rb +34 -0
  431. data/lib/cucumber/core_ext/string.rb +9 -0
  432. data/lib/cucumber/errors.rb +40 -0
  433. data/lib/cucumber/feature_file.rb +62 -0
  434. data/lib/cucumber/formatter/ansicolor.rb +160 -0
  435. data/lib/cucumber/formatter/console.rb +177 -0
  436. data/lib/cucumber/formatter/cucumber.css +275 -0
  437. data/lib/cucumber/formatter/cucumber.sass +271 -0
  438. data/lib/cucumber/formatter/debug.rb +33 -0
  439. data/lib/cucumber/formatter/duration.rb +13 -0
  440. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +84 -0
  441. data/lib/cucumber/formatter/gpretty.rb +24 -0
  442. data/lib/cucumber/formatter/html.rb +644 -0
  443. data/lib/cucumber/formatter/io.rb +31 -0
  444. data/lib/cucumber/formatter/jquery-min.js +154 -0
  445. data/lib/cucumber/formatter/json.rb +29 -0
  446. data/lib/cucumber/formatter/json_pretty.rb +13 -0
  447. data/lib/cucumber/formatter/junit.rb +150 -0
  448. data/lib/cucumber/formatter/ordered_xml_markup.rb +24 -0
  449. data/lib/cucumber/formatter/pdf.rb +244 -0
  450. data/lib/cucumber/formatter/pretty.rb +237 -0
  451. data/lib/cucumber/formatter/progress.rb +92 -0
  452. data/lib/cucumber/formatter/rerun.rb +55 -0
  453. data/lib/cucumber/formatter/stepdefs.rb +14 -0
  454. data/lib/cucumber/formatter/steps.rb +49 -0
  455. data/lib/cucumber/formatter/summary.rb +35 -0
  456. data/lib/cucumber/formatter/unicode.rb +79 -0
  457. data/lib/cucumber/formatter/usage.rb +127 -0
  458. data/lib/cucumber/js_support/js_dsl.js +57 -0
  459. data/lib/cucumber/js_support/js_language.rb +185 -0
  460. data/lib/cucumber/js_support/js_snippets.rb +27 -0
  461. data/lib/cucumber/language_support.rb +30 -0
  462. data/lib/cucumber/language_support/language_methods.rb +129 -0
  463. data/lib/cucumber/parser.rb +2 -0
  464. data/lib/cucumber/parser/gherkin_builder.rb +130 -0
  465. data/lib/cucumber/platform.rb +29 -0
  466. data/lib/cucumber/py_support/py_dsl.py +10 -0
  467. data/lib/cucumber/py_support/py_language.py +10 -0
  468. data/lib/cucumber/py_support/py_language.rb +84 -0
  469. data/lib/cucumber/rake/task.rb +170 -0
  470. data/lib/cucumber/rb_support/rb_dsl.rb +112 -0
  471. data/lib/cucumber/rb_support/rb_hook.rb +18 -0
  472. data/lib/cucumber/rb_support/rb_language.rb +195 -0
  473. data/lib/cucumber/rb_support/rb_step_definition.rb +82 -0
  474. data/lib/cucumber/rb_support/rb_transform.rb +37 -0
  475. data/lib/cucumber/rb_support/rb_world.rb +95 -0
  476. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +21 -0
  477. data/lib/cucumber/rspec/disable_option_parser.rb +23 -0
  478. data/lib/cucumber/rspec/doubles.rb +16 -0
  479. data/lib/cucumber/runtime.rb +145 -0
  480. data/lib/cucumber/runtime/features_loader.rb +62 -0
  481. data/lib/cucumber/runtime/for_programming_languages.rb +65 -0
  482. data/lib/cucumber/runtime/results.rb +64 -0
  483. data/lib/cucumber/runtime/support_code.rb +203 -0
  484. data/lib/cucumber/runtime/user_interface.rb +80 -0
  485. data/lib/cucumber/step_argument.rb +9 -0
  486. data/lib/cucumber/step_definition_light.rb +20 -0
  487. data/lib/cucumber/step_definitions.rb +14 -0
  488. data/lib/cucumber/step_match.rb +115 -0
  489. data/lib/cucumber/step_mother.rb +10 -0
  490. data/lib/cucumber/wire_support/configuration.rb +30 -0
  491. data/lib/cucumber/wire_support/connection.rb +55 -0
  492. data/lib/cucumber/wire_support/request_handler.rb +32 -0
  493. data/lib/cucumber/wire_support/wire_exception.rb +32 -0
  494. data/lib/cucumber/wire_support/wire_language.rb +54 -0
  495. data/lib/cucumber/wire_support/wire_packet.rb +32 -0
  496. data/lib/cucumber/wire_support/wire_protocol.rb +44 -0
  497. data/lib/cucumber/wire_support/wire_protocol/requests.rb +123 -0
  498. data/lib/cucumber/wire_support/wire_step_definition.rb +26 -0
  499. data/spec/cucumber/ast/background_spec.rb +110 -0
  500. data/spec/cucumber/ast/feature_factory.rb +60 -0
  501. data/spec/cucumber/ast/feature_spec.rb +63 -0
  502. data/spec/cucumber/ast/outline_table_spec.rb +21 -0
  503. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  504. data/spec/cucumber/ast/scenario_outline_spec.rb +68 -0
  505. data/spec/cucumber/ast/scenario_spec.rb +43 -0
  506. data/spec/cucumber/ast/step_spec.rb +66 -0
  507. data/spec/cucumber/ast/table_spec.rb +474 -0
  508. data/spec/cucumber/ast/tree_walker_spec.rb +11 -0
  509. data/spec/cucumber/broadcaster_spec.rb +15 -0
  510. data/spec/cucumber/cli/configuration_spec.rb +431 -0
  511. data/spec/cucumber/cli/drb_client_spec.rb +77 -0
  512. data/spec/cucumber/cli/main_spec.rb +137 -0
  513. data/spec/cucumber/cli/options_spec.rb +351 -0
  514. data/spec/cucumber/cli/profile_loader_spec.rb +35 -0
  515. data/spec/cucumber/configuration_spec.rb +23 -0
  516. data/spec/cucumber/core_ext/proc_spec.rb +68 -0
  517. data/spec/cucumber/formatter/ansicolor_spec.rb +31 -0
  518. data/spec/cucumber/formatter/duration_spec.rb +22 -0
  519. data/spec/cucumber/formatter/html_spec.rb +258 -0
  520. data/spec/cucumber/formatter/junit_spec.rb +111 -0
  521. data/spec/cucumber/formatter/progress_spec.rb +38 -0
  522. data/spec/cucumber/formatter/spec_helper.rb +51 -0
  523. data/spec/cucumber/rb_support/rb_language_spec.rb +283 -0
  524. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +99 -0
  525. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +18 -0
  526. data/spec/cucumber/runtime/support_code_spec.rb +112 -0
  527. data/spec/cucumber/runtime_spec.rb +41 -0
  528. data/spec/cucumber/sell_cucumbers.feature +19 -0
  529. data/spec/cucumber/step_match_spec.rb +69 -0
  530. data/spec/cucumber/wire_support/configuration_spec.rb +51 -0
  531. data/spec/cucumber/wire_support/connection_spec.rb +46 -0
  532. data/spec/cucumber/wire_support/wire_exception_spec.rb +44 -0
  533. data/spec/cucumber/wire_support/wire_language_spec.rb +47 -0
  534. data/spec/cucumber/wire_support/wire_packet_spec.rb +40 -0
  535. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +20 -0
  536. data/spec/cucumber/world/pending_spec.rb +46 -0
  537. data/spec/spec_helper.rb +10 -0
  538. metadata +884 -0
@@ -0,0 +1,91 @@
1
+ require 'yaml'
2
+
3
+ module Cucumber
4
+ module Cli
5
+
6
+ class ProfileLoader
7
+
8
+ def initialize
9
+ @cucumber_yml = nil
10
+ end
11
+
12
+ def args_from(profile)
13
+ unless cucumber_yml.has_key?(profile)
14
+ raise(ProfileNotFound, <<-END_OF_ERROR)
15
+ Could not find profile: '#{profile}'
16
+
17
+ Defined profiles in cucumber.yml:
18
+ * #{cucumber_yml.keys.join("\n * ")}
19
+ END_OF_ERROR
20
+ end
21
+
22
+ args_from_yml = cucumber_yml[profile] || ''
23
+
24
+ case(args_from_yml)
25
+ when String
26
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
27
+ if(Cucumber::WINDOWS)
28
+ #Shellwords treats backslash as an escape character so here's a rudimentary approximation of the same code
29
+ args_from_yml = args_from_yml.split
30
+ args_from_yml = args_from_yml.collect {|x| x.gsub(/^\"(.*)\"/,'\1') }
31
+ else
32
+ require 'shellwords'
33
+ args_from_yml = Shellwords.shellwords(args_from_yml)
34
+ end
35
+ when Array
36
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
37
+ else
38
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
39
+ end
40
+ args_from_yml
41
+ end
42
+
43
+ def has_profile?(profile)
44
+ cucumber_yml.has_key?(profile)
45
+ end
46
+
47
+ def cucumber_yml_defined?
48
+ cucumber_file && File.exist?(cucumber_file)
49
+ end
50
+
51
+ private
52
+
53
+ # Loads the profile, processing it through ERB and YAML, and returns it as a hash.
54
+ def cucumber_yml
55
+ return @cucumber_yml if @cucumber_yml
56
+ unless cucumber_yml_defined?
57
+ raise(ProfilesNotDefinedError,"cucumber.yml was not found. Current directory is #{Dir.pwd}. Please refer to cucumber's documentation on defining profiles in cucumber.yml. You must define a 'default' profile to use the cucumber command without any arguments.\nType 'cucumber --help' for usage.\n")
58
+ end
59
+
60
+ require 'erb'
61
+ require 'yaml'
62
+ begin
63
+ @cucumber_erb = ERB.new(IO.read(cucumber_file)).result(binding)
64
+ rescue Exception => e
65
+ raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
66
+ end
67
+
68
+ begin
69
+ @cucumber_yml = YAML::load(@cucumber_erb)
70
+ rescue StandardError => e
71
+ raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
72
+ end
73
+
74
+ if @cucumber_yml.nil? || !@cucumber_yml.is_a?(Hash)
75
+ raise(YmlLoadError,"cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage.\n")
76
+ end
77
+
78
+ return @cucumber_yml
79
+ end
80
+
81
+ # Locates cucumber.yml file. The file can end in .yml or .yaml,
82
+ # and be located in the current directory (eg. project root) or
83
+ # in a .config/ or config/ subdirectory of the current directory.
84
+ def cucumber_file
85
+ @cucumber_file ||= Dir.glob('{,.config/,config/}cucumber{.yml,.yaml}').first
86
+ end
87
+
88
+ end
89
+ end
90
+ end
91
+
@@ -0,0 +1,49 @@
1
+ module Cucumber
2
+ # The base class for configuring settings for a Cucumber run.
3
+ class Configuration
4
+ def self.default
5
+ new
6
+ end
7
+
8
+ def self.parse(argument)
9
+ return new(argument) if argument.is_a?(Hash)
10
+ argument
11
+ end
12
+
13
+ def initialize(user_options = {})
14
+ @options = default_options.merge(user_options)
15
+ end
16
+
17
+ def dry_run?
18
+ @options[:dry_run]
19
+ end
20
+
21
+ def guess?
22
+ @options[:guess]
23
+ end
24
+
25
+ def strict?
26
+ @options[:strict]
27
+ end
28
+
29
+ def expand?
30
+ @options[:expand]
31
+ end
32
+
33
+ def paths
34
+ @options[:paths]
35
+ end
36
+
37
+ def autoload_code_paths
38
+ @options[:autoload_code_paths]
39
+ end
40
+
41
+ private
42
+
43
+ def default_options
44
+ {
45
+ :autoload_code_paths => ['features/support', 'features/step_definitions']
46
+ }
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,34 @@
1
+ module Cucumber
2
+ module Constantize #:nodoc:
3
+ def constantize(camel_cased_word)
4
+ try = 0
5
+ begin
6
+ try += 1
7
+ names = camel_cased_word.split('::')
8
+ names.shift if names.empty? || names.first.empty?
9
+
10
+ constant = Object
11
+ names.each do |name|
12
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
13
+ end
14
+ constant
15
+ rescue NameError => e
16
+ require underscore(camel_cased_word)
17
+ if try < 2
18
+ retry
19
+ else
20
+ raise e
21
+ end
22
+ end
23
+ end
24
+
25
+ # Snagged from active_support
26
+ def underscore(camel_cased_word)
27
+ camel_cased_word.to_s.gsub(/::/, '/').
28
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
29
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
30
+ tr("-", "_").
31
+ downcase
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ # Why: http://groups.google.com/group/cukes/browse_thread/thread/5682d41436e235d7
2
+ begin
3
+ require 'minitest/unit'
4
+ class MiniTest::Unit
5
+ class << self
6
+ @@installed_at_exit = true
7
+ end
8
+
9
+ def run(*)
10
+ 0
11
+ end
12
+ end
13
+ rescue LoadError => ignore
14
+ end
@@ -0,0 +1,98 @@
1
+ require 'cucumber/platform'
2
+
3
+ module Cucumber
4
+ # Raised if the number of a StepDefinition's Regexp match groups
5
+ # is different from the number of Proc arguments.
6
+ class ArityMismatchError < StandardError
7
+ end
8
+ end
9
+
10
+ class Object #:nodoc:
11
+ unless defined? instance_exec # 1.9
12
+ # http://eigenclass.org/hiki/bounded+space+instance_exec
13
+ module InstanceExecHelper #:nodoc:
14
+ end
15
+ include InstanceExecHelper
16
+ def instance_exec(*args, &block)
17
+ begin
18
+ old_critical, Thread.critical = Thread.critical, true
19
+ n = 0
20
+ n += 1 while respond_to?(mname="__instance_exec#{n}")
21
+ InstanceExecHelper.module_eval{ define_method(mname, &block) }
22
+ ensure
23
+ Thread.critical = old_critical
24
+ end
25
+ begin
26
+ ret = send(mname, *args)
27
+ ensure
28
+ InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
29
+ end
30
+ ret
31
+ end
32
+ end
33
+
34
+ # TODO: Move most of this stuff out to an InstanceExecutor class.
35
+ def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
36
+ cucumber_run_with_backtrace_filtering(pseudo_method) do
37
+ if check_arity && !cucumber_compatible_arity?(args, block)
38
+ instance_exec do
39
+ ari = cucumber_arity(block)
40
+ ari = ari < 0 ? (ari.abs-1).to_s+"+" : ari
41
+ s1 = ari == 1 ? "" : "s"
42
+ s2 = args.length == 1 ? "" : "s"
43
+ raise Cucumber::ArityMismatchError.new(
44
+ "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
45
+ )
46
+ end
47
+ else
48
+ instance_exec(*args, &block)
49
+ end
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def cucumber_arity(block)
56
+ a = block.arity
57
+ Cucumber::RUBY_1_9 ? a : (a == -1 ? 0 : a)
58
+ end
59
+
60
+ def cucumber_compatible_arity?(args, block)
61
+ ari = cucumber_arity(block)
62
+ len = args.length
63
+ return true if ari == len or ari < 0 && len >= ari.abs-1
64
+ false
65
+ end
66
+
67
+ def cucumber_run_with_backtrace_filtering(pseudo_method)
68
+ begin
69
+ yield
70
+ rescue Exception => e
71
+ instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
72
+ replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
73
+ raise e
74
+ end
75
+ end
76
+
77
+ INSTANCE_EXEC_OFFSET = (Cucumber::RUBY_1_9 || Cucumber::RUBY_1_8_7 || Cucumber::JRUBY) ? -3 : -4
78
+
79
+ def replace_instance_exec_invocation_line!(backtrace, instance_exec_invocation_line, pseudo_method)
80
+ return if Cucumber.use_full_backtrace
81
+
82
+ instance_exec_pos = backtrace.index(instance_exec_invocation_line)
83
+ if instance_exec_pos
84
+ replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
85
+ if Cucumber::RUBY_1_8_7
86
+ backtrace[replacement_line] += ":in `#{pseudo_method}'" if pseudo_method
87
+ else
88
+ backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
89
+ end
90
+ backtrace[replacement_line+1..-1] = nil
91
+
92
+ backtrace.compact!
93
+ else
94
+ # This happens with rails, because they screw up the backtrace
95
+ # before we get here (injecting erb stacktrace and such)
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,34 @@
1
+ # Proc extension to get more location info out of a proc
2
+ class Proc #:nodoc:
3
+ PROC_PATTERN = /[\d\w]+@(.+):(\d+).*>/
4
+ PWD = Dir.pwd
5
+
6
+ def to_comment_line
7
+ "# #{file_colon_line}"
8
+ end
9
+
10
+ def backtrace_line(name)
11
+ "#{file_colon_line}:in `#{name}'"
12
+ end
13
+
14
+ if Proc.new{}.to_s =~ PROC_PATTERN
15
+ def file_colon_line
16
+ path, line = *to_s.match(PROC_PATTERN)[1..2]
17
+ path = File.expand_path(path)
18
+ pwd = File.expand_path(PWD)
19
+ if path.index(pwd)
20
+ path = path[pwd.length+1..-1]
21
+ elsif path =~ /.*\/gems\/(.*\.rb)$/
22
+ path = $1
23
+ end
24
+ "#{path}:#{line}"
25
+ end
26
+ else
27
+ # This Ruby implementation doesn't implement Proc#to_s correctly
28
+ STDERR.puts "*** THIS RUBY IMPLEMENTATION DOESN'T REPORT FILE AND LINE FOR PROCS ***"
29
+
30
+ def file_colon_line
31
+ "UNKNOWN:-1"
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ class String #:nodoc:
2
+ def indent(n)
3
+ if n >= 0
4
+ gsub(/^/, ' ' * n)
5
+ else
6
+ gsub(/^ {0,#{-n}}/, "")
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ module Cucumber
2
+ # Raised when there is no matching StepDefinition for a step.
3
+ class Undefined < StandardError
4
+ attr_reader :step_name
5
+
6
+ def initialize(step_name)
7
+ super %{Undefined step: "#{step_name}"}
8
+ @step_name = step_name
9
+ end
10
+
11
+ def nested!
12
+ @nested = true
13
+ end
14
+
15
+ def nested?
16
+ @nested
17
+ end
18
+ end
19
+
20
+ # Raised when a StepDefinition's block invokes World#pending
21
+ class Pending < StandardError
22
+ end
23
+
24
+ # Raised when a step matches 2 or more StepDefinitions
25
+ class Ambiguous < StandardError
26
+ def initialize(step_name, step_definitions, used_guess)
27
+ message = "Ambiguous match of \"#{step_name}\":\n\n"
28
+ message << step_definitions.map{|sd| sd.backtrace_line}.join("\n")
29
+ message << "\n\n"
30
+ message << "You can run again with --guess to make Cucumber be more smart about it\n" unless used_guess
31
+ super(message)
32
+ end
33
+ end
34
+
35
+ class TagExcess < StandardError
36
+ def initialize(messages)
37
+ super(messages.join("\n"))
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,62 @@
1
+ require 'cucumber/parser/gherkin_builder'
2
+ require 'gherkin/formatter/filter_formatter'
3
+ require 'gherkin/formatter/tag_count_formatter'
4
+ require 'gherkin/parser/parser'
5
+
6
+ module Cucumber
7
+ class FeatureFile
8
+ FILE_COLON_LINE_PATTERN = /^([\w\W]*?):([\d:]+)$/ #:nodoc:
9
+ LANGUAGE_PATTERN = /language:\s*(.*)/ #:nodoc:
10
+
11
+ # The +uri+ argument is the location of the source. It can be a path
12
+ # or a path:line1:line2 etc. If +source+ is passed, +uri+ is ignored.
13
+ def initialize(uri, source=nil)
14
+ @source = source
15
+ _, @path, @lines = *FILE_COLON_LINE_PATTERN.match(uri)
16
+ if @path
17
+ @lines = @lines.split(':').map { |line| line.to_i }
18
+ else
19
+ @path = uri
20
+ end
21
+ end
22
+
23
+ # Parses a file and returns a Cucumber::Ast
24
+ # If +configuration_filters+ contains any filters, the result will
25
+ # be filtered.
26
+ def parse(configuration_filters, tag_counts)
27
+ filters = @lines || configuration_filters
28
+
29
+ builder = Cucumber::Parser::GherkinBuilder.new
30
+ filter_formatter = filters.empty? ? builder : Gherkin::Formatter::FilterFormatter.new(builder, filters)
31
+ tag_count_formatter = Gherkin::Formatter::TagCountFormatter.new(filter_formatter, tag_counts)
32
+ parser = Gherkin::Parser::Parser.new(tag_count_formatter, true, "root", false)
33
+
34
+ begin
35
+ parser.parse(source, @path, 0)
36
+ ast = builder.ast
37
+ return nil if ast.nil? # Filter caused nothing to match
38
+ ast.language = parser.i18n_language
39
+ ast.file = @path
40
+ ast
41
+ rescue Gherkin::Lexer::LexingError, Gherkin::Parser::ParseError => e
42
+ e.message.insert(0, "#{@path}: ")
43
+ raise e
44
+ end
45
+ end
46
+
47
+ def source
48
+ @source ||= if @path =~ /^http/
49
+ require 'open-uri'
50
+ open(@path).read
51
+ else
52
+ begin
53
+ File.open(@path, Cucumber.file_mode('r')).read
54
+ rescue Errno::EACCES => e
55
+ p = File.expand_path(@path)
56
+ e.message << "\nCouldn't open #{p}"
57
+ raise e
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,160 @@
1
+ begin
2
+ require 'term/ansicolor'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'term/ansicolor'
6
+ end
7
+ require 'cucumber/platform'
8
+
9
+ if Cucumber::IRONRUBY
10
+ begin
11
+ require 'iron-term-ansicolor'
12
+ rescue LoadError
13
+ STDERR.puts %{*** WARNING: You must "igem install iron-term-ansicolor" to get coloured ouput in on IronRuby}
14
+ end
15
+ end
16
+
17
+ if Cucumber::WINDOWS_MRI
18
+ unless ENV['ANSICON']
19
+ STDERR.puts %{*** WARNING: You must use ANSICON 1.31 or higher (http://adoxa.110mb.com/ansicon) to get coloured output on Windows}
20
+ Term::ANSIColor.coloring = false
21
+ end
22
+ end
23
+
24
+ Term::ANSIColor.coloring = false if !STDOUT.tty? && !ENV.has_key?("AUTOTEST")
25
+
26
+ module Cucumber
27
+ module Formatter
28
+ # Defines aliases for coloured output. You don't invoke any methods from this
29
+ # module directly, but you can change the output colours by defining
30
+ # a <tt>CUCUMBER_COLORS</tt> variable in your shell, very much like how you can
31
+ # tweak the familiar POSIX command <tt>ls</tt> with
32
+ # <a href="http://mipsisrisc.com/rambling/2008/06/27/lscolorsls_colors-now-with-linux-support/">$LSCOLORS/$LS_COLORS</a>
33
+ #
34
+ # The colours that you can change are:
35
+ #
36
+ # * <tt>undefined</tt> - defaults to <tt>yellow</tt>
37
+ # * <tt>pending</tt> - defaults to <tt>yellow</tt>
38
+ # * <tt>pending_param</tt> - defaults to <tt>yellow,bold</tt>
39
+ # * <tt>failed</tt> - defaults to <tt>red</tt>
40
+ # * <tt>failed_param</tt> - defaults to <tt>red,bold</tt>
41
+ # * <tt>passed</tt> - defaults to <tt>green</tt>
42
+ # * <tt>passed_param</tt> - defaults to <tt>green,bold</tt>
43
+ # * <tt>outline</tt> - defaults to <tt>cyan</tt>
44
+ # * <tt>outline_param</tt> - defaults to <tt>cyan,bold</tt>
45
+ # * <tt>skipped</tt> - defaults to <tt>cyan</tt>
46
+ # * <tt>skipped_param</tt> - defaults to <tt>cyan,bold</tt>
47
+ # * <tt>comment</tt> - defaults to <tt>grey</tt>
48
+ # * <tt>tag</tt> - defaults to <tt>cyan</tt>
49
+ #
50
+ # For instance, if your shell has a black background and a green font (like the
51
+ # "Homebrew" settings for OS X' Terminal.app), you may want to override passed
52
+ # steps to be white instead of green. Examples:
53
+ #
54
+ # export CUCUMBER_COLORS="passed=white"
55
+ # export CUCUMBER_COLORS="passed=white,bold:passed_param=white,bold,underline"
56
+ #
57
+ # (If you're on Windows, use SET instead of export).
58
+ # To see what colours and effects are available, just run this in your shell:
59
+ #
60
+ # ruby -e "require 'rubygems'; require 'term/ansicolor'; puts Term::ANSIColor.attributes"
61
+ #
62
+ # Although not listed, you can also use <tt>grey</tt>
63
+ module ANSIColor
64
+ include Term::ANSIColor
65
+
66
+ ALIASES = Hash.new do |h,k|
67
+ if k.to_s =~ /(.*)_param/
68
+ h[$1] + ',bold'
69
+ end
70
+ end.merge({
71
+ 'undefined' => 'yellow',
72
+ 'pending' => 'yellow',
73
+ 'failed' => 'red',
74
+ 'passed' => 'green',
75
+ 'outline' => 'cyan',
76
+ 'skipped' => 'cyan',
77
+ 'comment' => 'grey',
78
+ 'tag' => 'cyan'
79
+ })
80
+
81
+ if ENV['CUCUMBER_COLORS'] # Example: export CUCUMBER_COLORS="passed=red:failed=yellow"
82
+ ENV['CUCUMBER_COLORS'].split(':').each do |pair|
83
+ a = pair.split('=')
84
+ ALIASES[a[0]] = a[1]
85
+ end
86
+ end
87
+
88
+ ALIASES.each do |method, color|
89
+ unless method =~ /.*_param/
90
+ code = <<-EOF
91
+ def #{method}(string=nil, &proc)
92
+ #{ALIASES[method].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method].split(",").length}
93
+ end
94
+ # This resets the colour to the non-param colour
95
+ def #{method}_param(string=nil, &proc)
96
+ #{ALIASES[method+'_param'].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method+'_param'].split(",").length} + #{ALIASES[method].split(",").join(' + ')}
97
+ end
98
+ EOF
99
+ eval(code)
100
+ end
101
+ end
102
+
103
+ def self.define_grey #:nodoc:
104
+ begin
105
+ gem 'genki-ruby-terminfo'
106
+ require 'terminfo'
107
+ case TermInfo.default_object.tigetnum("colors")
108
+ when 0
109
+ raise "Your terminal doesn't support colours"
110
+ when 1
111
+ ::Term::ANSIColor.coloring = false
112
+ alias grey white
113
+ when 2..8
114
+ alias grey white
115
+ else
116
+ define_real_grey
117
+ end
118
+ rescue Exception => e
119
+ if e.class.name == 'TermInfo::TermInfoError'
120
+ STDERR.puts "*** WARNING ***"
121
+ STDERR.puts "You have the genki-ruby-terminfo gem installed, but you haven't set your TERM variable."
122
+ STDERR.puts "Try setting it to TERM=xterm-256color to get grey colour in output"
123
+ STDERR.puts "\n"
124
+ alias grey white
125
+ else
126
+ define_real_grey
127
+ end
128
+ end
129
+ end
130
+
131
+ def self.define_real_grey #:nodoc:
132
+ def grey(m) #:nodoc:
133
+ if ::Term::ANSIColor.coloring?
134
+ "\e[90m#{m}\e[0m"
135
+ else
136
+ m
137
+ end
138
+ end
139
+ end
140
+
141
+ define_grey
142
+
143
+ def cukes(n)
144
+ ("(::) " * n).strip
145
+ end
146
+
147
+ def green_cukes(n)
148
+ blink(green(cukes(n)))
149
+ end
150
+
151
+ def red_cukes(n)
152
+ blink(red(cukes(n)))
153
+ end
154
+
155
+ def yellow_cukes(n)
156
+ blink(yellow(cukes(n)))
157
+ end
158
+ end
159
+ end
160
+ end