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,364 @@
1
+ module Cucumber
2
+ module Cli
3
+ class YmlLoadError < StandardError; end
4
+
5
+ class Configuration
6
+ FORMATS = %w{pretty profile progress rerun}
7
+ DEFAULT_FORMAT = 'pretty'
8
+
9
+ attr_reader :paths
10
+ attr_reader :options
11
+
12
+ def initialize(out_stream = STDOUT, error_stream = STDERR)
13
+ @out_stream = out_stream
14
+ @error_stream = error_stream
15
+
16
+ @paths = []
17
+ @options = default_options
18
+ @active_format = DEFAULT_FORMAT
19
+ end
20
+
21
+ def parse!(args)
22
+ @args = args
23
+ return parse_args_from_profile('default') if @args.empty?
24
+ @args.extend(::OptionParser::Arguable)
25
+
26
+ @args.options do |opts|
27
+ opts.banner = ["Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+", "",
28
+ "Examples:",
29
+ "cucumber examples/i18n/en/features",
30
+ "cucumber --language it examples/i18n/it/features/somma.feature:6:98:113",
31
+ "cucumber -n -i http://rubyurl.com/eeCl", "", "",
32
+ ].join("\n")
33
+ opts.on("-r LIBRARY|DIR", "--require LIBRARY|DIR",
34
+ "Require files before executing the features. If this",
35
+ "option is not specified, all *.rb files that are",
36
+ "siblings or below the features will be loaded auto-",
37
+ "matically. Automatic loading is disabled when this",
38
+ "option is specified, and all loading becomes explicit.",
39
+ "Files under directories named \"support\" are always",
40
+ "loaded first.",
41
+ "This option can be specified multiple times.") do |v|
42
+ @options[:require] ||= []
43
+ @options[:require] << v
44
+ end
45
+ opts.on("-l LANG", "--language LANG",
46
+ "Specify language for features (Default: #{@options[:lang]})",
47
+ %{Run with "--language help" to see all languages},
48
+ %{Run with "--language LANG help" to list keywords for LANG}) do |v|
49
+ if v == 'help'
50
+ list_languages
51
+ elsif args==['help']
52
+ list_keywords_and_exit(v)
53
+ else
54
+ @options[:lang] = v
55
+ end
56
+ end
57
+ opts.on("-f FORMAT", "--format FORMAT",
58
+ "How to format features (Default: #{DEFAULT_FORMAT})",
59
+ "Available formats: #{FORMATS.join(", ")}",
60
+ "You can also provide your own formatter classes as long",
61
+ "as they have been previously required using --require or",
62
+ "if they are in the folder structure such that cucumber",
63
+ "will require them automatically.",
64
+ "This option can be specified multiple times.") do |v|
65
+ @options[:formats][v] = @out_stream
66
+ @active_format = v
67
+ end
68
+ opts.on("-o", "--out FILE",
69
+ "Write output to a file instead of STDOUT. This option",
70
+ "applies to the previously specified --format, or the",
71
+ "default format if no format is specified.") do |v|
72
+ @options[:formats][@active_format] = v
73
+ end
74
+ opts.on("-t TAGS", "--tags TAGS",
75
+ "Only execute the features or scenarios with the specified tags.",
76
+ "TAGS must be comma-separated without spaces. Prefix tags with ~ to",
77
+ "exclude features or scenarios having that tag. Tags can be specified",
78
+ "with or without the @ prefix.") do |v|
79
+ @options[:include_tags], @options[:exclude_tags] = *parse_tags(v)
80
+ end
81
+ opts.on("-s SCENARIO", "--scenario SCENARIO",
82
+ "Only execute the scenario with the given name. If this option",
83
+ "is given more than once, run all the specified scenarios.") do |v|
84
+ @options[:scenario_names] << v
85
+ end
86
+ opts.on("-e", "--exclude PATTERN", "Don't run feature files matching PATTERN") do |v|
87
+ @options[:excludes] << v
88
+ end
89
+ opts.on("-p", "--profile PROFILE", "Pull commandline arguments from cucumber.yml.") do |v|
90
+ parse_args_from_profile(v)
91
+ end
92
+ opts.on("-c", "--[no-]color",
93
+ "Whether or not to use ANSI color in the output. Cucumber decides",
94
+ "based on your platform and the output destination if not specified.") do |v|
95
+ Term::ANSIColor.coloring = v
96
+ end
97
+ opts.on("-d", "--dry-run", "Invokes formatters without executing the steps.",
98
+ "Implies --quiet.") do
99
+ @options[:dry_run] = true
100
+ @quiet = true
101
+ end
102
+ opts.on("-a", "--autoformat DIRECTORY",
103
+ "Reformats (pretty prints) feature files and write them to DIRECTORY.",
104
+ "Be careful if you choose to overwrite the originals.",
105
+ "Implies --dry-run --formatter pretty.") do |directory|
106
+ @options[:autoformat] = directory
107
+ Term::ANSIColor.coloring = false
108
+ @options[:dry_run] = true
109
+ @quiet = true
110
+ end
111
+ opts.on("-m", "--no-multiline",
112
+ "Don't print multiline strings and tables under steps.") do
113
+ @options[:no_multiline] = true
114
+ end
115
+ opts.on("-n", "--no-source",
116
+ "Don't print the file and line of the step definition with the steps.") do
117
+ @options[:source] = false
118
+ end
119
+ opts.on("-i", "--no-snippets", "Don't print snippets for pending steps.") do
120
+ @options[:snippets] = false
121
+ end
122
+ opts.on("-q", "--quiet", "Alias for --no-snippets --no-source.") do
123
+ @quiet = true
124
+ end
125
+ opts.on("-b", "--backtrace", "Show full backtrace for all errors.") do
126
+ Exception.cucumber_full_backtrace = true
127
+ end
128
+ opts.on("-S", "--strict", "Fail if there are any undefined steps.") do
129
+ @options[:strict] = true
130
+ end
131
+ opts.on("-v", "--verbose", "Show the files and features loaded.") do
132
+ @options[:verbose] = true
133
+ end
134
+ opts.on("-g", "--guess", "Guess best match for Ambiguous steps.") do
135
+ @options[:guess] = true
136
+ end
137
+ opts.on("--no-diff", "Disable diff output on failing expectations.") do
138
+ @options[:diff_enabled] = false
139
+ end
140
+ opts.on("-S", "--step-definitions", "Print the regexp and line of all step definitions, then exit.") do
141
+ @options[:print_step_definitions] = true
142
+ end
143
+ opts.on_tail("--version", "Show version.") do
144
+ @out_stream.puts VERSION::STRING
145
+ Kernel.exit
146
+ end
147
+ opts.on_tail("-h", "--help", "You're looking at it.") do
148
+ @out_stream.puts opts.help
149
+ Kernel.exit
150
+ end
151
+ end.parse!
152
+
153
+ @options[:formats]['pretty'] = @out_stream if @options[:formats].empty?
154
+
155
+ @options[:snippets] = true if !@quiet && @options[:snippets].nil?
156
+ @options[:source] = true if !@quiet && @options[:source].nil?
157
+
158
+ # Whatever is left after option parsing is the FILE arguments
159
+ @paths += args
160
+ end
161
+
162
+ def verbose?
163
+ @options[:verbose]
164
+ end
165
+
166
+ def strict?
167
+ @options[:strict]
168
+ end
169
+
170
+ def guess?
171
+ @options[:guess]
172
+ end
173
+
174
+ def diff_enabled?
175
+ @options[:diff_enabled]
176
+ end
177
+
178
+ def print_step_definitions?
179
+ @options[:print_step_definitions]
180
+ end
181
+
182
+ def load_language
183
+ if Cucumber.language_incomplete?(@options[:lang])
184
+ list_keywords_and_exit(@options[:lang])
185
+ else
186
+ Cucumber.load_language(@options[:lang])
187
+ end
188
+ end
189
+
190
+ def parse_tags(tag_string)
191
+ tag_names = tag_string.split(",")
192
+ excludes, includes = tag_names.partition{|tag| tag =~ /^~/}
193
+ excludes = excludes.map{|tag| tag[1..-1]}
194
+
195
+ # Strip @
196
+ includes = includes.map{|tag| tag =~ /^@(.*)/ ? $1 : tag}
197
+ excludes = excludes.map{|tag| tag =~ /^@(.*)/ ? $1 : tag}
198
+ [includes, excludes]
199
+ end
200
+
201
+ def build_formatter_broadcaster(step_mother)
202
+ return Formatter::Pretty.new(step_mother, nil, @options) if @options[:autoformat]
203
+ formatters = @options[:formats].map do |format, out|
204
+ if String === out # file name
205
+ out = File.open(out, Cucumber.file_mode('w'))
206
+ at_exit do
207
+ out.flush
208
+ out.close
209
+ end
210
+ end
211
+
212
+ begin
213
+ formatter_class = formatter_class(format)
214
+ formatter_class.new(step_mother, out, @options)
215
+ rescue Exception => e
216
+ exit_with_error("Error creating formatter: #{format}", e)
217
+ end
218
+ end
219
+
220
+ broadcaster = Broadcaster.new(formatters)
221
+ broadcaster.options = @options
222
+ return broadcaster
223
+ end
224
+
225
+ def formatter_class(format)
226
+ case format
227
+ when 'pretty' then Formatter::Pretty
228
+ when 'progress' then Formatter::Progress
229
+ when 'profile' then Formatter::Profile
230
+ when 'rerun' then Formatter::Rerun
231
+ when 'html' then Formatter::Html
232
+ else
233
+ constantize(format)
234
+ end
235
+ end
236
+
237
+ def files_to_require
238
+ requires = @options[:require] || feature_dirs
239
+ files = requires.map do |path|
240
+ path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
241
+ File.directory?(path) ? Dir["#{path}/**/*.rb"] : path
242
+ end.flatten.uniq
243
+ sorted_files = files.sort { |a,b| (b =~ %r{/support/} || -1) <=> (a =~ %r{/support/} || -1) }.reject{|f| f =~ /^http/}
244
+ env_files = sorted_files.select {|f| f =~ %r{/support/env.rb} }
245
+ env_files + sorted_files.reject {|f| f =~ %r{/support/env.rb} }
246
+ end
247
+
248
+ def feature_files
249
+ potential_feature_files = @paths.map do |path|
250
+ path = path.gsub(/\\/, '/') # In case we're on windows. Globs don't work with backslashes.
251
+ path = path.chomp('/')
252
+ File.directory?(path) ? Dir["#{path}/**/*.feature"] : path
253
+ end.flatten.uniq
254
+
255
+ @options[:excludes].each do |exclude|
256
+ potential_feature_files.reject! do |path|
257
+ path =~ /#{Regexp.escape(exclude)}/
258
+ end
259
+ end
260
+
261
+ potential_feature_files
262
+ end
263
+
264
+ protected
265
+
266
+ def feature_dirs
267
+ feature_files.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
268
+ end
269
+
270
+ def constantize(camel_cased_word)
271
+ names = camel_cased_word.split('::')
272
+ names.shift if names.empty? || names.first.empty?
273
+
274
+ constant = Object
275
+ names.each do |name|
276
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
277
+ end
278
+ constant
279
+ end
280
+
281
+ def parse_args_from_profile(profile)
282
+ unless cucumber_yml.has_key?(profile)
283
+ return(exit_with_error <<-END_OF_ERROR)
284
+ Could not find profile: '#{profile}'
285
+
286
+ Defined profiles in cucumber.yml:
287
+ * #{cucumber_yml.keys.join("\n * ")}
288
+ END_OF_ERROR
289
+ end
290
+
291
+ args_from_yml = cucumber_yml[profile] || ''
292
+
293
+ if !args_from_yml.is_a?(String)
294
+ exit_with_error "Profiles must be defined as a String. The '#{profile}' profile was #{args_from_yml.inspect} (#{args_from_yml.class}).\n"
295
+ elsif args_from_yml =~ /^\s*$/
296
+ exit_with_error "The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml.\n"
297
+ else
298
+ parse!(args_from_yml.split(' '))
299
+ end
300
+
301
+ rescue YmlLoadError => e
302
+ exit_with_error(e.message)
303
+ end
304
+
305
+ def cucumber_yml
306
+ return @cucumber_yml if @cucumber_yml
307
+ unless File.exist?('cucumber.yml')
308
+ raise(YmlLoadError,"cucumber.yml was not found. Please refer to cucumber's documentaion 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")
309
+ end
310
+
311
+ require 'yaml'
312
+ begin
313
+ @cucumber_yml = YAML::load(IO.read('cucumber.yml'))
314
+ rescue Exception => e
315
+ raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentaion on correct profile usage.\n")
316
+ end
317
+
318
+ if @cucumber_yml.nil? || !@cucumber_yml.is_a?(Hash)
319
+ raise(YmlLoadError,"cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentaion on correct profile usage.\n")
320
+ end
321
+
322
+ return @cucumber_yml
323
+ end
324
+
325
+ def list_keywords_and_exit(lang)
326
+ unless Cucumber::LANGUAGES[lang]
327
+ exit_with_error("No language with key #{lang}")
328
+ end
329
+ LanguageHelpFormatter.list_keywords(@out_stream, lang)
330
+ Kernel.exit
331
+ end
332
+
333
+ def list_languages
334
+ LanguageHelpFormatter.list_languages(@out_stream)
335
+ Kernel.exit
336
+ end
337
+
338
+ def default_options
339
+ {
340
+ :strict => false,
341
+ :require => nil,
342
+ :lang => 'en',
343
+ :dry_run => false,
344
+ :formats => {},
345
+ :excludes => [],
346
+ :include_tags => [],
347
+ :exclude_tags => [],
348
+ :scenario_names => [],
349
+ :diff_enabled => true
350
+ }
351
+ end
352
+
353
+ def exit_with_error(error_message, e=nil)
354
+ @error_stream.puts(error_message)
355
+ if e
356
+ @error_stream.puts("#{e.message} (#{e.class})")
357
+ @error_stream.puts(e.backtrace.join("\n"))
358
+ end
359
+ Kernel.exit 1
360
+ end
361
+ end
362
+
363
+ end
364
+ end
@@ -0,0 +1,59 @@
1
+ require 'cucumber/formatter/pretty'
2
+
3
+ module Cucumber
4
+ module Cli
5
+ class LanguageHelpFormatter < Formatter::Pretty
6
+ INCOMPLETE = %{
7
+ The Cucumber grammar has evolved since this translation was written.
8
+ Please help us complete the translation by translating the missing words in
9
+
10
+ #{Cucumber::LANGUAGE_FILE}
11
+
12
+ Then contribute back to the Cucumber project. Details here:
13
+ http://wiki.github.com/aslakhellesoy/cucumber/spoken-languages
14
+ }
15
+
16
+ def self.list_languages(io)
17
+ raw = Cucumber::LANGUAGES.keys.sort.map do |lang|
18
+ [lang, Cucumber::LANGUAGES[lang]['name'], Cucumber::LANGUAGES[lang]['native']]
19
+ end
20
+ table = Ast::Table.new(raw)
21
+ new(nil, io, {:check_lang=>true}, '').visit_multiline_arg(table)
22
+ end
23
+
24
+ def self.list_keywords(io, lang)
25
+ raw = Cucumber::KEYWORD_KEYS.map do |key|
26
+ [key, Cucumber::LANGUAGES[lang][key]]
27
+ end
28
+ table = Ast::Table.new(raw)
29
+ new(nil, io, {:incomplete => Cucumber.language_incomplete?(lang)}, '').visit_multiline_arg(table)
30
+ end
31
+
32
+ def visit_multiline_arg(table)
33
+ if @options[:incomplete]
34
+ @io.puts(format_string(INCOMPLETE, :failed))
35
+ end
36
+ super
37
+ end
38
+
39
+ def visit_table_row(table_row)
40
+ @col = 1
41
+ super
42
+ end
43
+
44
+ def visit_table_cell_value(value, width, status)
45
+ if @col == 1
46
+ if(@options[:check_lang])
47
+ @incomplete = Cucumber.language_incomplete?(value)
48
+ end
49
+ status = :comment
50
+ elsif @incomplete
51
+ status = :undefined
52
+ end
53
+
54
+ @col += 1
55
+ super(value, width, status)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,109 @@
1
+ require 'optparse'
2
+ require 'cucumber'
3
+ require 'ostruct'
4
+ require 'cucumber/parser'
5
+ require 'cucumber/formatter'
6
+ require 'cucumber/cli/language_help_formatter'
7
+ require 'cucumber/cli/configuration'
8
+
9
+ module Cucumber
10
+ module Cli
11
+ class Main
12
+ class << self
13
+ def step_mother=(step_mother)
14
+ @step_mother = step_mother
15
+ @step_mother.extend(StepMother)
16
+ @step_mother.snippet_generator = StepDefinition
17
+ end
18
+
19
+ def execute(args)
20
+ new(args).execute!(@step_mother)
21
+ end
22
+ end
23
+
24
+ def initialize(args, out_stream = STDOUT, error_stream = STDERR)
25
+ @args = args
26
+ @out_stream = out_stream == STDOUT ? Formatter::ColorIO.new : out_stream
27
+ @error_stream = error_stream
28
+ end
29
+
30
+ def execute!(step_mother)
31
+ configuration.load_language
32
+ step_mother.options = configuration.options
33
+
34
+ require_files
35
+
36
+ if(configuration.print_step_definitions?)
37
+ step_mother.print_step_definitions(@out_stream)
38
+ Kernel.exit(0)
39
+ return # In specs, exit is stubbed
40
+ end
41
+
42
+ enable_diffing
43
+
44
+ features = load_plain_text_features
45
+
46
+ visitor = configuration.build_formatter_broadcaster(step_mother)
47
+ step_mother.visitor = visitor # Needed to support World#announce
48
+ visitor.visit_features(features)
49
+
50
+ failure = step_mother.steps(:failed).any? ||
51
+ (configuration.strict? && step_mother.steps(:undefined).any?)
52
+
53
+ Kernel.exit(failure ? 1 : 0)
54
+ end
55
+
56
+ private
57
+
58
+ def configuration
59
+ return @configuration if @configuration
60
+
61
+ @configuration = Configuration.new(@out_stream, @error_stream)
62
+ @configuration.parse!(@args)
63
+ @configuration
64
+ end
65
+
66
+ def require_files
67
+ verbose_log("Ruby files required:")
68
+ configuration.files_to_require.each do |lib|
69
+ begin
70
+ require lib
71
+ verbose_log(" * #{lib}")
72
+ rescue LoadError => e
73
+ e.message << "\nFailed to load #{lib}"
74
+ raise e
75
+ end
76
+ end
77
+ verbose_log("\n")
78
+ end
79
+
80
+ def load_plain_text_features
81
+ features = Ast::Features.new
82
+ parser = Parser::FeatureParser.new
83
+
84
+ verbose_log("Features:")
85
+ configuration.feature_files.each do |f|
86
+ features.add_feature(parser.parse_file(f))
87
+ verbose_log(" * #{f}")
88
+ end
89
+ verbose_log("\n"*2)
90
+ features
91
+ end
92
+
93
+ def verbose_log(string)
94
+ @out_stream.puts(string) if configuration.verbose?
95
+ end
96
+
97
+ def enable_diffing
98
+ if configuration.diff_enabled? && defined?(::Spec)
99
+ require 'spec/expectations/differs/default'
100
+ options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
101
+ ::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
102
+ end
103
+ end
104
+
105
+ end
106
+ end
107
+ end
108
+
109
+ Cucumber::Cli::Main.step_mother = self
@@ -0,0 +1,53 @@
1
+ # Exception extension that tweaks Exception backtraces:
2
+ #
3
+ # * The line of the failing .feature line is appended to the backtrace
4
+ # * The line that calls #cucumber_instance_exec is replaced with the StepDefinition's regexp
5
+ # * Non intersting lines are stripped out
6
+ #
7
+ # The result is that backtraces look like this:
8
+ #
9
+ # features/step_definitions/the_step_definition.rb:in `/some step/'
10
+ # features/the_feature_file.feature:41:in `Given some step'
11
+ #
12
+ # or if the exception is raised in the tested code:
13
+ #
14
+ # lib/myapp/some_file.rb:in `/some_method/'
15
+ # lib/myapp/some_other_file.rb:in `/some_other_method/'
16
+ # features/step_definitions/the_step_definition.rb:in `/some step/'
17
+ # features/the_feature_file.feature:41:in `Given some step'
18
+ #
19
+ # All backtrace munging can be turned off with the <tt>--backtrace</tt> switch
20
+ #
21
+ class Exception
22
+ CUCUMBER_FILTER_PATTERNS = [
23
+ /vendor\/rails|lib\/cucumber|lib\/rspec|gems\//
24
+ ]
25
+
26
+ INSTANCE_EXEC_OFFSET = (Cucumber::RUBY_1_9 || Cucumber::JRUBY) ? -3 : -4
27
+
28
+ def self.cucumber_full_backtrace=(v)
29
+ @@cucumber_full_backtrace = v
30
+ end
31
+ self.cucumber_full_backtrace = false
32
+
33
+ # Strips the backtrace from +line+ and down
34
+ def self.cucumber_strip_backtrace!(backtrace, instance_exec_invocation_line, pseudo_method)
35
+ return if @@cucumber_full_backtrace
36
+
37
+ instance_exec_pos = backtrace.index(instance_exec_invocation_line)
38
+ if instance_exec_pos
39
+ replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
40
+ backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
41
+ backtrace[replacement_line+1..-1] = nil
42
+
43
+ backtrace.compact!
44
+ else
45
+ # This happens with rails, because they screw up the backtrace
46
+ # before we get here (injecting erb stacktrace and such)
47
+ end
48
+
49
+ backtrace.reject! do |line|
50
+ CUCUMBER_FILTER_PATTERNS.detect{|p| line =~ p}
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,54 @@
1
+ require 'cucumber/platform'
2
+
3
+ module Cucumber
4
+ class ArityMismatchError < StandardError
5
+ end
6
+ end
7
+
8
+ class Object
9
+ def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
10
+ arity = block.arity
11
+ arity = 0 if arity == -1
12
+ cucumber_run_with_backtrace_filtering(pseudo_method) do
13
+ if check_arity && args.length != arity
14
+ instance_exec do
15
+ raise Cucumber::ArityMismatchError.new("expected #{arity} block argument(s), got #{args.length}")
16
+ end
17
+ else
18
+ instance_exec(*args, &block)
19
+ end
20
+ end
21
+ end
22
+
23
+ def cucumber_run_with_backtrace_filtering(pseudo_method)
24
+ begin
25
+ yield
26
+ rescue Exception => e
27
+ instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
28
+ Exception.cucumber_strip_backtrace!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
29
+ raise e
30
+ end
31
+ end
32
+
33
+ unless defined? instance_exec # 1.9
34
+ # http://eigenclass.org/hiki/bounded+space+instance_exec
35
+ module InstanceExecHelper; end
36
+ include InstanceExecHelper
37
+ def instance_exec(*args, &block)
38
+ begin
39
+ old_critical, Thread.critical = Thread.critical, true
40
+ n = 0
41
+ n += 1 while respond_to?(mname="__instance_exec#{n}")
42
+ InstanceExecHelper.module_eval{ define_method(mname, &block) }
43
+ ensure
44
+ Thread.critical = old_critical
45
+ end
46
+ begin
47
+ ret = send(mname, *args)
48
+ ensure
49
+ InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
50
+ end
51
+ ret
52
+ end
53
+ end
54
+ end