rspec 1.0.0 → 1.3.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 (456) hide show
  1. data/.document +7 -0
  2. data/History.rdoc +1546 -0
  3. data/{MIT-LICENSE → License.txt} +3 -1
  4. data/Manifest.txt +384 -0
  5. data/README.rdoc +41 -0
  6. data/Rakefile +94 -229
  7. data/Ruby1.9.rdoc +31 -0
  8. data/TODO.txt +17 -0
  9. data/Upgrade.rdoc +260 -0
  10. data/bin/autospec +4 -0
  11. data/bin/spec +5 -3
  12. data/cucumber.yml +5 -0
  13. data/examples/failing/README.txt +11 -0
  14. data/examples/failing/diffing_spec.rb +36 -0
  15. data/examples/failing/failing_implicit_docstrings_example.rb +17 -0
  16. data/examples/failing/failure_in_after.rb +10 -0
  17. data/examples/failing/failure_in_before.rb +10 -0
  18. data/examples/failing/mocking_example.rb +38 -0
  19. data/examples/failing/mocking_with_flexmock.rb +26 -0
  20. data/examples/failing/mocking_with_mocha.rb +25 -0
  21. data/examples/failing/mocking_with_rr.rb +27 -0
  22. data/examples/failing/partial_mock_example.rb +18 -0
  23. data/examples/failing/pending_example.rb +7 -0
  24. data/examples/failing/predicate_example.rb +32 -0
  25. data/examples/failing/raising_example.rb +47 -0
  26. data/examples/failing/syntax_error_example.rb +7 -0
  27. data/examples/failing/team_spec.rb +41 -0
  28. data/examples/failing/timeout_behaviour.rb +5 -0
  29. data/examples/{custom_formatter.rb → passing/custom_formatter.rb} +1 -1
  30. data/examples/passing/dynamic_spec.rb +7 -0
  31. data/examples/{file_accessor.rb → passing/file_accessor.rb} +18 -18
  32. data/examples/{file_accessor_spec.rb → passing/file_accessor_spec.rb} +37 -38
  33. data/examples/passing/filtered_formatter.rb +17 -0
  34. data/examples/passing/filtered_formatter_example.rb +31 -0
  35. data/examples/{greeter_spec.rb → passing/greeter_spec.rb} +1 -1
  36. data/examples/passing/helper_method_example.rb +12 -0
  37. data/examples/passing/implicit_docstrings_example.rb +16 -0
  38. data/examples/{io_processor.rb → passing/io_processor.rb} +8 -8
  39. data/examples/{io_processor_spec.rb → passing/io_processor_spec.rb} +2 -3
  40. data/examples/{mocking_example.rb → passing/mocking_example.rb} +0 -2
  41. data/examples/{multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +10 -9
  42. data/examples/passing/nested_classes_example.rb +35 -0
  43. data/examples/passing/options_example.rb +29 -0
  44. data/examples/passing/options_formatter.rb +20 -0
  45. data/examples/{partial_mock_example.rb → passing/partial_mock_example.rb} +2 -3
  46. data/examples/passing/pending_example.rb +18 -0
  47. data/examples/{predicate_example.rb → passing/predicate_example.rb} +1 -3
  48. data/examples/{shared_behaviours_example.rb → passing/shared_example_group_example.rb} +15 -11
  49. data/examples/passing/shared_stack_examples.rb +36 -0
  50. data/examples/passing/simple_matcher_example.rb +29 -0
  51. data/examples/{stack.rb → passing/stack.rb} +1 -1
  52. data/examples/{stack_spec.rb → passing/stack_spec.rb} +6 -40
  53. data/examples/passing/stack_spec_with_nested_example_groups.rb +66 -0
  54. data/examples/{stubbing_example.rb → passing/stubbing_example.rb} +1 -3
  55. data/examples/passing/yielding_example.rb +31 -0
  56. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +85 -0
  57. data/features/before_and_after_blocks/before_and_after_blocks.feature +167 -0
  58. data/features/command_line/line_number_option.feature +56 -0
  59. data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
  60. data/features/example_groups/define_example_attribute.feature +41 -0
  61. data/features/example_groups/example_group_with_should_methods.feature +29 -0
  62. data/features/example_groups/implicit_docstrings.feature +59 -0
  63. data/features/example_groups/nested_groups.feature +32 -0
  64. data/features/expectations/customized_message.feature +54 -0
  65. data/features/expectations/expect_change.feature +65 -0
  66. data/features/expectations/expect_error.feature +44 -0
  67. data/features/extensions/custom_example_group.feature +19 -0
  68. data/features/formatters/custom_formatter.feature +30 -0
  69. data/features/formatters/nested_formatter.feature +32 -0
  70. data/features/interop/cucumber_stubs_dont_leak.feature +11 -0
  71. data/features/interop/examples_and_tests_together.feature +84 -0
  72. data/features/interop/rspec_output.feature +25 -0
  73. data/features/interop/test_but_not_test_unit.feature +26 -0
  74. data/features/interop/test_case_with_should_methods.feature +46 -0
  75. data/features/load_paths/add_lib_to_load_path.feature +20 -0
  76. data/features/load_paths/add_spec_to_load_path.feature +20 -0
  77. data/features/matchers/define_diffable_matcher.feature +26 -0
  78. data/features/matchers/define_matcher.feature +179 -0
  79. data/features/matchers/define_matcher_outside_rspec.feature +38 -0
  80. data/features/matchers/define_matcher_with_fluent_interface.feature +48 -0
  81. data/features/matchers/define_wrapped_matcher.feature +56 -0
  82. data/features/matchers/match_unless_raises.feature +60 -0
  83. data/features/matchers/match_unless_raises_unexpected_error.feature +39 -0
  84. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  85. data/features/mock_framework_integration/use_mocha.feature +27 -0
  86. data/features/mock_framework_integration/use_rr.feature +27 -0
  87. data/features/mocks/block_local_expectations.feature +62 -0
  88. data/features/mocks/mix_stubs_and_mocks.feature +22 -0
  89. data/features/mocks/stub_implementation.feature +26 -0
  90. data/features/pending/pending_examples.feature +81 -0
  91. data/features/runner/specify_line_number.feature +32 -0
  92. data/features/spec_helper/spec_helper.feature +25 -0
  93. data/features/step_definitions/running_rspec_steps.rb +52 -0
  94. data/features/step_definitions/stubbing_steps.rb +16 -0
  95. data/features/subject/explicit_subject.feature +31 -0
  96. data/features/subject/implicit_subject.feature +43 -0
  97. data/features/support/env.rb +83 -0
  98. data/features/support/matchers/smart_match.rb +31 -0
  99. data/geminstaller.yml +29 -0
  100. data/init.rb +9 -0
  101. data/lib/autotest/discover.rb +3 -0
  102. data/lib/autotest/rspec.rb +54 -0
  103. data/lib/spec/adapters/mock_frameworks/flexmock.rb +24 -0
  104. data/{plugins → lib/spec/adapters}/mock_frameworks/mocha.rb +8 -4
  105. data/lib/spec/adapters/mock_frameworks/rr.rb +22 -0
  106. data/lib/spec/adapters/mock_frameworks/rspec.rb +21 -0
  107. data/lib/spec/autorun.rb +3 -0
  108. data/lib/spec/deprecation.rb +41 -0
  109. data/lib/spec/dsl/main.rb +93 -0
  110. data/lib/spec/dsl.rb +1 -10
  111. data/lib/spec/example/args_and_options.rb +27 -0
  112. data/lib/spec/example/before_and_after_hooks.rb +93 -0
  113. data/lib/spec/example/errors.rb +25 -0
  114. data/lib/spec/example/example_group.rb +10 -0
  115. data/lib/spec/example/example_group_factory.rb +82 -0
  116. data/lib/spec/example/example_group_hierarchy.rb +53 -0
  117. data/lib/spec/example/example_group_methods.rb +287 -0
  118. data/lib/spec/example/example_group_proxy.rb +61 -0
  119. data/lib/spec/example/example_matcher.rb +43 -0
  120. data/lib/spec/example/example_methods.rb +152 -0
  121. data/lib/spec/example/example_proxy.rb +41 -0
  122. data/lib/spec/example/module_reopening_fix.rb +43 -0
  123. data/lib/spec/example/pending.rb +18 -0
  124. data/lib/spec/example/predicate_matchers.rb +46 -0
  125. data/lib/spec/example/shared_example_group.rb +59 -0
  126. data/lib/spec/example/subject.rb +114 -0
  127. data/lib/spec/example.rb +164 -0
  128. data/lib/spec/expectations/errors.rb +7 -1
  129. data/lib/spec/expectations/extensions/kernel.rb +52 -0
  130. data/lib/spec/expectations/extensions.rb +1 -2
  131. data/lib/spec/expectations/fail_with.rb +45 -0
  132. data/lib/spec/expectations/handler.rb +37 -30
  133. data/lib/spec/expectations.rb +2 -23
  134. data/lib/spec/extensions/instance_exec.rb +31 -0
  135. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  136. data/lib/spec/interop/test/unit/testcase.rb +56 -0
  137. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  138. data/lib/spec/interop/test/unit/testsuite_adapter.rb +36 -0
  139. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  140. data/lib/spec/interop/test.rb +44 -0
  141. data/lib/spec/matchers/be.rb +183 -140
  142. data/lib/spec/matchers/be_close.rb +18 -23
  143. data/lib/spec/matchers/be_instance_of.rb +26 -0
  144. data/lib/spec/matchers/be_kind_of.rb +26 -0
  145. data/lib/spec/matchers/change.rb +72 -41
  146. data/lib/spec/matchers/compatibility.rb +14 -0
  147. data/lib/spec/matchers/dsl.rb +20 -0
  148. data/lib/spec/matchers/eql.rb +25 -26
  149. data/lib/spec/matchers/equal.rb +35 -25
  150. data/lib/spec/matchers/errors.rb +5 -0
  151. data/lib/spec/matchers/exist.rb +16 -0
  152. data/lib/spec/matchers/generated_descriptions.rb +36 -0
  153. data/lib/spec/matchers/has.rb +17 -26
  154. data/lib/spec/matchers/have.rb +36 -24
  155. data/lib/spec/matchers/include.rb +22 -48
  156. data/lib/spec/matchers/match.rb +11 -31
  157. data/lib/spec/matchers/match_array.rb +71 -0
  158. data/lib/spec/matchers/matcher.rb +132 -0
  159. data/lib/spec/matchers/method_missing.rb +9 -0
  160. data/lib/spec/matchers/operator_matcher.rb +55 -44
  161. data/lib/spec/matchers/pretty.rb +37 -0
  162. data/lib/spec/matchers/raise_exception.rb +131 -0
  163. data/lib/spec/matchers/respond_to.rb +35 -9
  164. data/lib/spec/matchers/satisfy.rb +2 -2
  165. data/lib/spec/matchers/simple_matcher.rb +134 -0
  166. data/lib/spec/matchers/throw_symbol.rb +56 -31
  167. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  168. data/lib/spec/matchers.rb +104 -48
  169. data/lib/spec/mocks/argument_expectation.rb +28 -112
  170. data/lib/spec/mocks/argument_matchers.rb +237 -0
  171. data/lib/spec/mocks/error_generator.rb +20 -13
  172. data/lib/spec/mocks/errors.rb +1 -1
  173. data/lib/spec/mocks/example_methods.rb +69 -0
  174. data/lib/spec/mocks/extensions.rb +1 -0
  175. data/lib/spec/mocks/framework.rb +15 -0
  176. data/lib/spec/mocks/message_expectation.rb +206 -93
  177. data/lib/spec/mocks/methods.rb +66 -7
  178. data/lib/spec/mocks/mock.rb +53 -11
  179. data/lib/spec/mocks/proxy.rb +160 -55
  180. data/lib/spec/mocks/space.rb +2 -2
  181. data/lib/spec/mocks.rb +14 -23
  182. data/lib/spec/rake/spectask.rb +108 -53
  183. data/lib/spec/rake/verify_rcov.rb +4 -4
  184. data/lib/spec/ruby.rb +9 -0
  185. data/lib/spec/runner/backtrace_tweaker.rb +45 -23
  186. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  187. data/lib/spec/runner/command_line.rb +7 -14
  188. data/lib/spec/runner/configuration.rb +202 -0
  189. data/lib/spec/runner/differs/default.rb +93 -0
  190. data/lib/spec/runner/differs/load-diff-lcs.rb +12 -0
  191. data/lib/spec/runner/drb_command_line.rb +18 -7
  192. data/lib/spec/runner/example_group_runner.rb +58 -0
  193. data/lib/spec/runner/extensions/kernel.rb +5 -46
  194. data/lib/spec/runner/formatter/base_formatter.rb +97 -26
  195. data/lib/spec/runner/formatter/base_text_formatter.rb +79 -39
  196. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +25 -0
  197. data/lib/spec/runner/formatter/failing_examples_formatter.rb +6 -8
  198. data/lib/spec/runner/formatter/html_formatter.rb +101 -75
  199. data/lib/spec/runner/formatter/nested_text_formatter.rb +50 -0
  200. data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
  201. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  202. data/lib/spec/runner/formatter/progress_bar_formatter.rb +11 -8
  203. data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
  204. data/lib/spec/runner/formatter/snippet_extractor.rb +2 -2
  205. data/lib/spec/runner/formatter/specdoc_formatter.rb +20 -15
  206. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  207. data/lib/spec/runner/heckle_runner.rb +56 -56
  208. data/lib/spec/runner/{heckle_runner_win.rb → heckle_runner_unsupported.rb} +10 -10
  209. data/lib/spec/runner/line_number_query.rb +78 -0
  210. data/lib/spec/runner/option_parser.rb +147 -148
  211. data/lib/spec/runner/options.rb +343 -95
  212. data/lib/spec/runner/reporter.rb +117 -60
  213. data/lib/spec/runner.rb +39 -138
  214. data/lib/spec/stubs/cucumber.rb +5 -0
  215. data/lib/spec/test/unit.rb +10 -0
  216. data/lib/spec/version.rb +14 -22
  217. data/lib/spec.rb +5 -10
  218. data/resources/helpers/cmdline.rb +8 -0
  219. data/resources/rake/examples.rake +7 -0
  220. data/resources/rake/examples_with_rcov.rake +9 -0
  221. data/resources/rake/failing_examples_with_html.rake +9 -0
  222. data/resources/rake/verify_rcov.rake +7 -0
  223. data/spec/README.jruby +15 -0
  224. data/spec/autotest/autotest_helper.rb +8 -0
  225. data/spec/autotest/autotest_matchers.rb +38 -0
  226. data/spec/autotest/discover_spec.rb +8 -0
  227. data/spec/autotest/failed_results_re_spec.rb +31 -0
  228. data/spec/autotest/rspec_spec.rb +126 -0
  229. data/spec/ruby_forker.rb +13 -0
  230. data/spec/spec/dsl/main_spec.rb +103 -0
  231. data/spec/spec/example/example_group_class_definition_spec.rb +51 -0
  232. data/spec/spec/example/example_group_factory_spec.rb +180 -0
  233. data/spec/spec/example/example_group_methods_spec.rb +778 -0
  234. data/spec/spec/example/example_group_proxy_spec.rb +107 -0
  235. data/spec/spec/example/example_group_spec.rb +632 -0
  236. data/spec/spec/example/example_matcher_spec.rb +85 -0
  237. data/spec/spec/example/example_methods_spec.rb +162 -0
  238. data/spec/spec/example/example_proxy_spec.rb +57 -0
  239. data/spec/spec/example/helper_method_spec.rb +24 -0
  240. data/spec/spec/{dsl/behaviour_eval_spec.rb → example/nested_example_group_spec.rb} +25 -3
  241. data/spec/spec/example/pending_module_spec.rb +58 -0
  242. data/spec/spec/example/predicate_matcher_spec.rb +41 -0
  243. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  244. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  245. data/spec/spec/example/subject_spec.rb +110 -0
  246. data/spec/spec/expectations/differs/default_spec.rb +100 -13
  247. data/spec/spec/expectations/extensions/{object_spec.rb → kernel_spec.rb} +13 -14
  248. data/spec/spec/expectations/fail_with_spec.rb +42 -17
  249. data/spec/spec/expectations/handler_spec.rb +206 -0
  250. data/spec/spec/expectations/wrap_expectation_spec.rb +31 -0
  251. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  252. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  253. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  254. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  255. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  256. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  257. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  258. data/spec/spec/interop/test/unit/resources/test_case_with_various_names.rb +22 -0
  259. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  260. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  261. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  262. data/spec/spec/interop/test/unit/testcase_spec.rb +50 -0
  263. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  264. data/spec/spec/matchers/be_close_spec.rb +32 -21
  265. data/spec/spec/matchers/be_instance_of_spec.rb +36 -0
  266. data/spec/spec/matchers/be_kind_of_spec.rb +33 -0
  267. data/spec/spec/matchers/be_spec.rb +261 -10
  268. data/spec/spec/matchers/change_spec.rb +178 -61
  269. data/spec/spec/matchers/compatibility_spec.rb +28 -0
  270. data/spec/spec/matchers/description_generation_spec.rb +47 -46
  271. data/spec/spec/matchers/dsl_spec.rb +34 -0
  272. data/spec/spec/matchers/eql_spec.rb +14 -9
  273. data/spec/spec/matchers/equal_spec.rb +43 -14
  274. data/spec/spec/matchers/exist_spec.rb +41 -24
  275. data/spec/spec/matchers/has_spec.rb +154 -1
  276. data/spec/spec/matchers/have_spec.rb +311 -189
  277. data/spec/spec/matchers/include_spec.rb +45 -2
  278. data/spec/spec/matchers/match_array_spec.rb +115 -0
  279. data/spec/spec/matchers/match_spec.rb +25 -5
  280. data/spec/spec/matchers/matcher_spec.rb +289 -0
  281. data/spec/spec/matchers/matchers_spec.rb +2 -0
  282. data/spec/spec/matchers/operator_matcher_spec.rb +48 -15
  283. data/spec/spec/matchers/raise_exception_spec.rb +345 -0
  284. data/spec/spec/matchers/respond_to_spec.rb +78 -16
  285. data/spec/spec/matchers/satisfy_spec.rb +1 -1
  286. data/spec/spec/matchers/simple_matcher_spec.rb +100 -0
  287. data/spec/spec/matchers/throw_symbol_spec.rb +111 -41
  288. data/spec/spec/mocks/and_yield_spec.rb +117 -0
  289. data/spec/spec/mocks/any_number_of_times_spec.rb +9 -2
  290. data/spec/spec/mocks/argument_expectation_spec.rb +19 -15
  291. data/spec/spec/mocks/argument_matchers_spec.rb +19 -0
  292. data/spec/spec/mocks/at_least_spec.rb +2 -2
  293. data/spec/spec/mocks/at_most_spec.rb +3 -3
  294. data/spec/spec/mocks/bug_report_10260_spec.rb +1 -1
  295. data/spec/spec/mocks/bug_report_10263_spec.rb +27 -0
  296. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  297. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  298. data/spec/spec/mocks/bug_report_496_spec.rb +17 -0
  299. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  300. data/spec/spec/mocks/bug_report_7611_spec.rb +2 -2
  301. data/spec/spec/mocks/bug_report_7805_spec.rb +2 -2
  302. data/spec/spec/mocks/bug_report_8165_spec.rb +4 -4
  303. data/spec/spec/mocks/bug_report_8302_spec.rb +2 -2
  304. data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
  305. data/spec/spec/mocks/double_spec.rb +12 -0
  306. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  307. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  308. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  309. data/spec/spec/mocks/mock_ordering_spec.rb +15 -5
  310. data/spec/spec/mocks/mock_space_spec.rb +1 -1
  311. data/spec/spec/mocks/mock_spec.rb +346 -129
  312. data/spec/spec/mocks/multiple_return_value_spec.rb +9 -9
  313. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  314. data/spec/spec/mocks/null_object_mock_spec.rb +15 -1
  315. data/spec/spec/mocks/once_counts_spec.rb +2 -2
  316. data/spec/spec/mocks/options_hash_spec.rb +19 -17
  317. data/spec/spec/mocks/partial_mock_spec.rb +124 -12
  318. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +2 -2
  319. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  320. data/spec/spec/mocks/precise_counts_spec.rb +2 -2
  321. data/spec/spec/mocks/record_messages_spec.rb +2 -2
  322. data/spec/spec/mocks/stub_chain_spec.rb +42 -0
  323. data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
  324. data/spec/spec/mocks/stub_spec.rb +147 -103
  325. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +26 -0
  326. data/spec/spec/mocks/twice_counts_spec.rb +2 -2
  327. data/spec/spec/mocks/unstub_spec.rb +127 -0
  328. data/spec/spec/package/bin_spec_spec.rb +11 -7
  329. data/spec/spec/rake/spectask_spec.rb +150 -0
  330. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  331. data/spec/spec/runner/command_line_spec.rb +158 -29
  332. data/spec/spec/runner/configuration_spec.rb +320 -0
  333. data/spec/spec/runner/drb_command_line_spec.rb +137 -72
  334. data/spec/spec/runner/empty_file.txt +0 -0
  335. data/spec/spec/runner/example_group_runner_spec.rb +26 -0
  336. data/spec/spec/runner/examples.txt +2 -0
  337. data/spec/spec/runner/failed.txt +3 -0
  338. data/spec/spec/runner/formatter/base_formatter_spec.rb +30 -0
  339. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +113 -0
  340. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  341. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +17 -12
  342. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +377 -0
  343. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +377 -0
  344. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +377 -0
  345. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +377 -0
  346. data/spec/spec/runner/formatter/html_formatter_spec.rb +112 -52
  347. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +329 -0
  348. data/spec/spec/runner/formatter/profile_formatter_spec.rb +70 -0
  349. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +87 -16
  350. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  351. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +153 -50
  352. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6-jruby.html +371 -0
  353. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +371 -0
  354. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +371 -0
  355. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +371 -0
  356. data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +106 -0
  357. data/spec/spec/runner/heckle_runner_spec.rb +32 -17
  358. data/spec/spec/runner/heckler_spec.rb +17 -11
  359. data/spec/spec/runner/line_number_query/line_number_query_fixture.rb +70 -0
  360. data/spec/spec/runner/line_number_query_spec.rb +129 -0
  361. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +27 -21
  362. data/spec/spec/runner/option_parser_spec.rb +367 -164
  363. data/spec/spec/runner/options_spec.rb +506 -94
  364. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  365. data/spec/spec/runner/output_one_time_fixture_runner.rb +7 -0
  366. data/spec/spec/runner/output_one_time_spec.rb +15 -0
  367. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +94 -27
  368. data/spec/spec/runner/reporter_spec.rb +212 -121
  369. data/spec/spec/runner/resources/a_bar.rb +0 -0
  370. data/spec/spec/runner/resources/a_foo.rb +0 -0
  371. data/spec/spec/runner/resources/a_spec.rb +1 -0
  372. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  373. data/spec/spec/runner/resources/utf8_encoded.rb +8 -0
  374. data/spec/spec/runner/spec.opts +2 -0
  375. data/spec/spec/runner/spec_drb.opts +2 -0
  376. data/spec/spec/runner/spec_spaced.opts +2 -0
  377. data/spec/spec/runner_spec.rb +13 -0
  378. data/spec/spec.opts +6 -0
  379. data/spec/spec_helper.rb +87 -45
  380. data/spec/support/macros.rb +29 -0
  381. data/spec/{spec → support}/spec_classes.rb +26 -4
  382. metadata +461 -141
  383. data/CHANGES +0 -748
  384. data/EXAMPLES.rd +0 -108
  385. data/README +0 -70
  386. data/UPGRADE +0 -31
  387. data/bin/spec_translator +0 -8
  388. data/examples/auto_spec_description_example.rb +0 -19
  389. data/examples/before_and_after_example.rb +0 -39
  390. data/examples/behave_as_example.rb +0 -45
  391. data/examples/dynamic_spec.rb +0 -9
  392. data/examples/helper_method_example.rb +0 -11
  393. data/examples/legacy_spec.rb +0 -10
  394. data/examples/not_yet_implemented_spec.rb +0 -12
  395. data/examples/priority.txt +0 -1
  396. data/examples/spec_helper.rb +0 -1
  397. data/examples/test_case_adapter_example.rb +0 -26
  398. data/examples/test_case_spec.rb +0 -65
  399. data/lib/spec/dsl/behaviour.rb +0 -204
  400. data/lib/spec/dsl/behaviour_callbacks.rb +0 -77
  401. data/lib/spec/dsl/behaviour_eval.rb +0 -177
  402. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  403. data/lib/spec/dsl/composite_proc_builder.rb +0 -28
  404. data/lib/spec/dsl/configuration.rb +0 -119
  405. data/lib/spec/dsl/description.rb +0 -46
  406. data/lib/spec/dsl/example.rb +0 -127
  407. data/lib/spec/dsl/example_matcher.rb +0 -28
  408. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  409. data/lib/spec/expectations/differs/default.rb +0 -61
  410. data/lib/spec/expectations/extensions/object.rb +0 -66
  411. data/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
  412. data/lib/spec/extensions/object.rb +0 -6
  413. data/lib/spec/extensions.rb +0 -1
  414. data/lib/spec/matchers/raise_error.rb +0 -100
  415. data/lib/spec/mocks/argument_constraint_matchers.rb +0 -12
  416. data/lib/spec/mocks/spec_methods.rb +0 -30
  417. data/lib/spec/runner/behaviour_runner.rb +0 -102
  418. data/lib/spec/runner/extensions/object.rb +0 -32
  419. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -25
  420. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  421. data/lib/spec/runner/formatter.rb +0 -9
  422. data/lib/spec/runner/spec_parser.rb +0 -50
  423. data/lib/spec/test_case_adapter.rb +0 -10
  424. data/lib/spec/translator.rb +0 -106
  425. data/plugins/mock_frameworks/flexmock.rb +0 -27
  426. data/plugins/mock_frameworks/rspec.rb +0 -18
  427. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -30
  428. data/spec/spec/dsl/behaviour_spec.rb +0 -604
  429. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -57
  430. data/spec/spec/dsl/configuration_spec.rb +0 -50
  431. data/spec/spec/dsl/description_spec.rb +0 -81
  432. data/spec/spec/dsl/example_class_spec.rb +0 -24
  433. data/spec/spec/dsl/example_instance_spec.rb +0 -162
  434. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  435. data/spec/spec/dsl/predicate_matcher_spec.rb +0 -21
  436. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -208
  437. data/spec/spec/matchers/handler_spec.rb +0 -88
  438. data/spec/spec/matchers/matcher_methods_spec.rb +0 -78
  439. data/spec/spec/matchers/raise_error_spec.rb +0 -147
  440. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +0 -73
  441. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +0 -92
  442. data/spec/spec/runner/behaviour_runner_spec.rb +0 -118
  443. data/spec/spec/runner/context_matching_spec.rb +0 -27
  444. data/spec/spec/runner/execution_context_spec.rb +0 -31
  445. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  446. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -27
  447. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -21
  448. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  449. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  450. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  451. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  452. data/spec/spec/runner/object_ext_spec.rb +0 -11
  453. data/spec/spec/runner/spec_matcher_spec.rb +0 -102
  454. data/spec/spec/runner/spec_parser_spec.rb +0 -93
  455. data/spec/spec/translator_spec.rb +0 -216
  456. /data/examples/{custom_expectation_matchers.rb → passing/custom_matchers.rb} +0 -0
@@ -1,72 +1,72 @@
1
- begin
2
- require 'rubygems'
3
- require 'heckle'
4
- rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end
1
+ if Spec::Ruby.version.to_f < 1.9
2
+ begin
3
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
4
+ require 'heckle'
5
+ rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end
5
6
 
6
- module Spec
7
- module Runner
8
- # Creates a new Heckler configured to heckle all methods in the classes
9
- # whose name matches +filter+
10
- class HeckleRunner
11
- def initialize(filter, heckle_class=Heckler)
12
- @filter = filter
13
- @heckle_class = heckle_class
14
- end
15
-
16
- # Runs all the contexts held by +behaviour_runner+ once for each of the
17
- # methods in the matched classes.
18
- def heckle_with(behaviour_runner)
19
- if @filter =~ /(.*)[#\.](.*)/
20
- heckle_method($1, $2)
21
- else
22
- heckle_class_or_module(@filter)
7
+ module Spec
8
+ module Runner
9
+ # Creates a new Heckler configured to heckle all methods in the classes
10
+ # whose name matches +filter+
11
+ class HeckleRunner
12
+ def initialize(filter, heckle_class=Heckler)
13
+ @filter = filter
14
+ @heckle_class = heckle_class
23
15
  end
24
- end
25
16
 
26
- def heckle_method(class_name, method_name)
27
- verify_constant(class_name)
28
- heckle = @heckle_class.new(class_name, method_name, behaviour_runner)
29
- heckle.validate
30
- end
17
+ # Runs all the example groups held by +rspec_options+ once for each of the
18
+ # methods in the matched classes.
19
+ def heckle_with
20
+ if @filter =~ /(.*)[#\.](.*)/
21
+ heckle_method($1, $2)
22
+ else
23
+ heckle_class_or_module(@filter)
24
+ end
25
+ end
31
26
 
32
- def heckle_class_or_module(class_or_module_name)
33
- verify_constant(class_or_module_name)
34
- pattern = /^#{class_or_module_name}/
35
- classes = []
36
- ObjectSpace.each_object(Class) do |klass|
37
- classes << klass if klass.name =~ pattern
27
+ def heckle_method(class_name, method_name)
28
+ verify_constant(class_name)
29
+ heckle = @heckle_class.new(class_name, method_name, Spec::Runner.options)
30
+ heckle.validate
38
31
  end
32
+
33
+ def heckle_class_or_module(class_or_module_name)
34
+ verify_constant(class_or_module_name)
35
+ pattern = /^#{class_or_module_name}/
36
+ classes = []
37
+ ObjectSpace.each_object(Class) do |klass|
38
+ classes << klass if klass.name =~ pattern
39
+ end
39
40
 
40
- classes.each do |klass|
41
- klass.instance_methods(false).each do |method_name|
42
- heckle = @heckle_class.new(klass.name, method_name, behaviour_runner)
43
- heckle.validate
41
+ classes.each do |klass|
42
+ klass.instance_methods(false).each do |method_name|
43
+ heckle = @heckle_class.new(klass.name, method_name, Spec::Runner.options)
44
+ heckle.validate
45
+ end
44
46
  end
45
47
  end
46
- end
47
48
 
48
- def verify_constant(name)
49
- begin
50
- # This is defined in Heckle
51
- name.to_class
52
- rescue
53
- raise "Heckling failed - \"#{name}\" is not a known class or module"
49
+ def verify_constant(name)
50
+ begin
51
+ # This is defined in Heckle
52
+ name.to_class
53
+ rescue
54
+ raise "Heckling failed - \"#{name}\" is not a known class or module"
55
+ end
54
56
  end
55
57
  end
56
- end
57
58
 
58
- #Supports Heckle 1.2 and prior (earlier versions used Heckle::Base)
59
- class Heckler < (Heckle.const_defined?(:Base) ? Heckle::Base : Heckle)
60
- def initialize(klass_name, method_name, behaviour_runner)
61
- super(klass_name, method_name)
62
- @behaviour_runner = behaviour_runner
63
- end
59
+ class Heckler < Heckle
60
+ def initialize(klass_name, method_name, rspec_options)
61
+ super(klass_name, method_name)
62
+ @rspec_options = rspec_options
63
+ end
64
+
65
+ def tests_pass?
66
+ @rspec_options.run_examples
67
+ end
64
68
 
65
- def tests_pass?
66
- paths = [] # We can pass an empty array of paths - our specs are already loaded.
67
- failure_count = @behaviour_runner.run(paths, false)
68
- failure_count == 0
69
69
  end
70
70
  end
71
71
  end
72
- end
72
+ end
@@ -1,10 +1,10 @@
1
- module Spec
2
- module Runner
3
- # Dummy implementation for Windows that just fails (Heckle is not supported on Windows)
4
- class HeckleRunner
5
- def initialize(filter)
6
- raise "Heckle not supported on Windows"
7
- end
8
- end
9
- end
10
- end
1
+ module Spec
2
+ module Runner
3
+ # Dummy implementation for Windows that just fails (Heckle is not supported on Windows)
4
+ class HeckleRunner
5
+ def initialize(filter)
6
+ raise "Heckle is not supported on Windows or Ruby 1.9"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,78 @@
1
+ module Spec
2
+ module Runner
3
+ # Parses a spec file and finds the nearest example for a given line number.
4
+ class LineNumberQuery
5
+ attr_reader :best_match
6
+
7
+ def initialize(run_options)
8
+ @best_match = {}
9
+ @run_options = run_options
10
+ end
11
+
12
+ def spec_name_for(file, line_number)
13
+ best_match.clear
14
+ file = File.expand_path(file)
15
+ determine_best_match(file, line_number)
16
+ if best_match[:example_group]
17
+ if best_match[:example]
18
+ "#{best_match[:example_group].description} #{best_match[:example].description}"
19
+ else
20
+ best_match[:example_group].description
21
+ end
22
+ else
23
+ nil
24
+ end
25
+ end
26
+
27
+ def example_line_for(file, line_number)
28
+ determine_best_match(file, line_number)
29
+ best_match[:line]
30
+ end
31
+
32
+ protected
33
+
34
+ def determine_best_match(file, line_number)
35
+ best_match.clear
36
+ file = File.expand_path(file)
37
+ @run_options.example_groups.each do |example_group|
38
+ next unless example_group.location
39
+ consider_example_group_for_best_match(example_group, file, line_number)
40
+
41
+ example_group.examples.each do |example|
42
+ consider_example_for_best_match(example, example_group, file, line_number)
43
+ end
44
+ end
45
+ end
46
+
47
+ def consider_example_group_for_best_match(example_group, file, line_number)
48
+ example_group_file, example_group_line = parse_location(example_group.location)
49
+ if is_best_match?(file, line_number, example_group_file, example_group_line)
50
+ best_match.clear
51
+ best_match[:example_group] = example_group
52
+ best_match[:line] = example_group_line
53
+ end
54
+ end
55
+
56
+ def consider_example_for_best_match(example, example_group, file, line_number)
57
+ example_file, example_line = parse_location(example.location)
58
+ if is_best_match?(file, line_number, example_file, example_line)
59
+ best_match.clear
60
+ best_match[:example_group] = example_group
61
+ best_match[:example] = example
62
+ best_match[:line] = example_line
63
+ end
64
+ end
65
+
66
+ def is_best_match?(file, line_number, example_file, example_line)
67
+ file == File.expand_path(example_file) &&
68
+ example_line <= line_number &&
69
+ example_line > best_match[:line].to_i
70
+ end
71
+
72
+ def parse_location(location)
73
+ location =~ /(.*)\:(\d*)(\:|$)/
74
+ return $1, Integer($2)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -3,24 +3,27 @@ require 'stringio'
3
3
 
4
4
  module Spec
5
5
  module Runner
6
- class OptionParser
7
- BUILT_IN_FORMATTERS = {
8
- 'specdoc' => Formatter::SpecdocFormatter,
9
- 's' => Formatter::SpecdocFormatter,
10
- 'html' => Formatter::HtmlFormatter,
11
- 'h' => Formatter::HtmlFormatter,
12
- 'rdoc' => Formatter::RdocFormatter,
13
- 'r' => Formatter::RdocFormatter,
14
- 'progress' => Formatter::ProgressBarFormatter,
15
- 'p' => Formatter::ProgressBarFormatter,
16
- 'failing_examples' => Formatter::FailingExamplesFormatter,
17
- 'e' => Formatter::FailingExamplesFormatter,
18
- 'failing_behaviours' => Formatter::FailingBehavioursFormatter,
19
- 'b' => Formatter::FailingBehavioursFormatter
20
- }
6
+ class OptionParser < ::OptionParser
7
+ class << self
8
+ def parse(args, err, out)
9
+ parser = new(err, out)
10
+ parser.parse(args)
11
+ parser.options
12
+ end
13
+
14
+ def spec_command?
15
+ $0.split('/').last == 'spec'
16
+ end
17
+ end
18
+
19
+ attr_reader :options
21
20
 
22
- COMMAND_LINE = {
23
- :diff => ["-D", "--diff [FORMAT]", "Show diff of objects that are expected to be equal when they are not",
21
+ OPTIONS = {
22
+ :pattern => ["-p", "--pattern [PATTERN]","Limit files loaded to those matching this pattern. Defaults to '**/*_spec.rb'",
23
+ "Separate multiple patterns with commas.",
24
+ "Applies only to directories named on the command line (files",
25
+ "named explicitly on the command line will be loaded regardless)."],
26
+ :diff => ["-D", "--diff [FORMAT]","Show diff of objects that are expected to be equal when they are not",
24
27
  "Builtin formats: unified|u|context|c",
25
28
  "You can also specify a custom differ class",
26
29
  "(in which case you should also specify --require)"],
@@ -28,39 +31,40 @@ module Spec
28
31
  :example => ["-e", "--example [NAME|FILE_NAME]", "Execute example(s) with matching name(s). If the argument is",
29
32
  "the path to an existing file (typically generated by a previous",
30
33
  "run using --format failing_examples:file.txt), then the examples",
31
- "on each line of thatfile will be executed. If the file is empty,",
34
+ "on each line of that file will be executed. If the file is empty,",
32
35
  "all examples will be run (as if --example was not specified).",
33
36
  " ",
34
37
  "If the argument is not an existing file, then it is treated as",
35
38
  "an example name directly, causing RSpec to run just the example",
36
39
  "matching that name"],
37
40
  :specification => ["-s", "--specification [NAME]", "DEPRECATED - use -e instead", "(This will be removed when autotest works with -e)"],
38
- :line => ["-l", "--line LINE_NUMBER", Integer, "Execute behaviout or specification at given line.",
39
- "(does not work for dynamically generated specs)"],
40
- :format => ["-f", "--format FORMAT[:WHERE]", "Specifies what format to use for output. Specify WHERE to tell",
41
+ :line => ["-l", "--line LINE_NUMBER", Integer, "Execute example group or example at given line.",
42
+ "(does not work for dynamically generated examples)"],
43
+ :format => ["-f", "--format FORMAT[:WHERE]","Specifies what format to use for output. Specify WHERE to tell",
41
44
  "the formatter where to write the output. All built-in formats",
42
- "expect WHERE to be a file name, and will write to STDOUT if it's",
45
+ "expect WHERE to be a file name, and will write to $stdout if it's",
43
46
  "not specified. The --format option may be specified several times",
44
47
  "if you want several outputs",
45
48
  " ",
46
- "Builtin formats: ",
47
- "progress|p : Text progress",
48
- "specdoc|s : Behaviour doc as text",
49
- "rdoc|r : Behaviour doc as RDoc",
50
- "html|h : A nice HTML report",
51
- "failing_examples|e : Write all failing examples - input for --example",
52
- "failing_behaviours|b : Write all failing behaviours - input for --example",
49
+ "Builtin formats:",
50
+ "silent|l : No output", "progress|p : Text-based progress bar",
51
+ "profile|o : Text-based progress bar with profiling of 10 slowest examples",
52
+ "specdoc|s : Code example doc strings",
53
+ "nested|n : Code example doc strings with nested groups indented",
54
+ "html|h : A nice HTML report",
55
+ "failing_examples|e : Write all failing examples - input for --example",
56
+ "failing_example_groups|g : Write all failing example groups - input for --example",
53
57
  " ",
54
58
  "FORMAT can also be the name of a custom formatter class",
55
59
  "(in which case you should also specify --require to load it)"],
56
60
  :require => ["-r", "--require FILE", "Require FILE before running specs",
57
- "Useful for loading custom formatters or other extensions.",
58
- "If this option is used it must come before the others"],
61
+ "Useful for loading custom formatters or other extensions.",
62
+ "If this option is used it must come before the others"],
59
63
  :backtrace => ["-b", "--backtrace", "Output full backtrace"],
60
64
  :loadby => ["-L", "--loadby STRATEGY", "Specify the strategy by which spec files should be loaded.",
61
- "STRATEGY can currently only be 'mtime' (File modification time)",
62
- "By default, spec files are loaded in alphabetical order if --loadby",
63
- "is not specified."],
65
+ "STRATEGY can currently only be 'mtime' (File modification time)",
66
+ "By default, spec files are loaded in alphabetical order if --loadby",
67
+ "is not specified."],
64
68
  :reverse => ["-R", "--reverse", "Run examples in reverse order"],
65
69
  :timeout => ["-t", "--timeout FLOAT", "Interrupt and fail each example that doesn't complete in the",
66
70
  "specified time"],
@@ -73,153 +77,148 @@ module Spec
73
77
  :dry_run => ["-d", "--dry-run", "Invokes formatters without executing the examples."],
74
78
  :options_file => ["-O", "--options PATH", "Read options from a file"],
75
79
  :generate_options => ["-G", "--generate-options PATH", "Generate an options file for --options"],
76
- :runner => ["-U", "--runner RUNNER", "Use a custom BehaviourRunner."],
80
+ :runner => ["-U", "--runner RUNNER", "Use a custom Runner."],
81
+ :debug => ["-u", "--debugger", "Enable ruby-debugging."],
77
82
  :drb => ["-X", "--drb", "Run examples via DRb. (For example against script/spec_server)"],
83
+ :drb_port => ["--port PORT", "Port for DRb server. (Ignored without --drb)"],
78
84
  :version => ["-v", "--version", "Show version"],
79
85
  :help => ["-h", "--help", "You're looking at it"]
80
86
  }
81
87
 
82
- def initialize
83
- @spec_parser = SpecParser.new
88
+ def initialize(err, out)
89
+ super()
90
+ @error_stream = err
91
+ @out_stream = out
92
+ @options = Options.new(@error_stream, @out_stream)
93
+
84
94
  @file_factory = File
85
- end
86
95
 
87
- def create_behaviour_runner(args, err, out, warn_if_no_files)
88
- options = parse(args, err, out, warn_if_no_files)
89
- # Some exit points in parse (--generate-options, --drb) don't return the options,
90
- # but hand over control. In that case we don't want to continue.
91
- return nil unless options.is_a?(Options)
92
- options.create_behaviour_runner
96
+ self.banner = "Usage: spec (FILE(:LINE)?|DIRECTORY|GLOB)+ [options]"
97
+ self.separator ""
98
+ on(*OPTIONS[:pattern]) {|pattern| @options.filename_pattern = pattern}
99
+ on(*OPTIONS[:diff]) {|diff| @options.parse_diff(diff)}
100
+ on(*OPTIONS[:colour]) {@options.colour = true}
101
+ on(*OPTIONS[:example]) {|example| @options.parse_example(example)}
102
+ on(*OPTIONS[:specification]) {|example| @options.parse_example(example)}
103
+ on(*OPTIONS[:line]) {|line_number| @options.line_number = line_number.to_i}
104
+ on(*OPTIONS[:format]) {|format| @options.parse_format(format)}
105
+ on(*OPTIONS[:require]) {|requires| invoke_requires(requires)}
106
+ on(*OPTIONS[:backtrace]) {@options.backtrace_tweaker = NoisyBacktraceTweaker.new}
107
+ on(*OPTIONS[:loadby]) {|loadby| @options.loadby = loadby}
108
+ on(*OPTIONS[:reverse]) {@options.reverse = true}
109
+ on(*OPTIONS[:timeout]) {|timeout| @options.timeout = timeout.to_f}
110
+ on(*OPTIONS[:heckle]) {|heckle| @options.load_heckle_runner(heckle)}
111
+ on(*OPTIONS[:dry_run]) {@options.dry_run = true}
112
+ on(*OPTIONS[:options_file]) {|options_file|}
113
+ on(*OPTIONS[:generate_options]) {|options_file|}
114
+ on(*OPTIONS[:runner]) {|runner| @options.user_input_for_runner = runner}
115
+ on(*OPTIONS[:debug]) {@options.debug = true}
116
+ on(*OPTIONS[:drb]) {}
117
+ on(*OPTIONS[:drb_port]) {|port| @options.drb_port = port}
118
+ on(*OPTIONS[:version]) {parse_version}
119
+ on("--autospec") {@options.autospec = true}
120
+ on_tail(*OPTIONS[:help]) {parse_help}
93
121
  end
94
122
 
95
- def parse(args, err, out, warn_if_no_files)
96
- options_file = nil
97
- args_copy = args.dup
98
- options = Options.new
99
-
100
- opts = ::OptionParser.new do |opts|
101
- opts.banner = "Usage: spec (FILE|DIRECTORY|GLOB)+ [options]"
102
- opts.separator ""
103
-
104
- def opts.rspec_on(name, &block)
105
- on(*COMMAND_LINE[name], &block)
106
- end
107
-
108
- opts.rspec_on(:diff) {|diff| options.parse_diff(diff, out, err)}
109
-
110
- opts.rspec_on(:colour) {options.colour = true}
111
-
112
- opts.rspec_on(:example) {|example| options.parse_example(example)}
113
-
114
- opts.rspec_on(:specification) {|example| options.parse_example(example)}
115
-
116
- opts.rspec_on(:line) {|line_number| options.line_number = line_number.to_i}
117
-
118
- opts.rspec_on(:format) {|format| options.parse_format(format, out, err)}
119
-
120
- opts.rspec_on(:require) {|req| options.parse_require(req)}
121
-
122
- opts.rspec_on(:backtrace) {options.backtrace_tweaker = NoisyBacktraceTweaker.new}
123
-
124
- opts.rspec_on(:loadby) {|loadby| options.loadby = loadby}
123
+ def order!(argv, &blk)
124
+ @argv = argv.dup
125
+ @argv = (@argv.empty? & self.class.spec_command?) ? ['--help'] : @argv
125
126
 
126
- opts.rspec_on(:reverse) {options.reverse = true}
127
+ # Parse options file first
128
+ parse_file_options(:options_file, :parse_options_file)
127
129
 
128
- opts.rspec_on(:timeout) {|timeout| options.timeout = timeout.to_f}
130
+ @options.argv = @argv.dup
131
+ return if parse_file_options(:generate_options, :write_options_file)
132
+ return if parse_drb
129
133
 
130
- opts.rspec_on(:heckle) {|heckle| options.parse_heckle(heckle)}
131
-
132
- opts.rspec_on(:dry_run) {options.dry_run = true}
133
-
134
- opts.rspec_on(:options_file) do |options_file|
135
- return parse_options_file(options_file, out, err, args_copy, warn_if_no_files)
136
- end
137
-
138
- opts.rspec_on(:generate_options) do |options_file|
139
- options.parse_generate_options(options_file, args_copy, out)
134
+ super(@argv) do |file|
135
+ if file =~ /^(.+):(\d+)$/
136
+ file = $1
137
+ @options.line_number = $2.to_i
140
138
  end
141
139
 
142
- opts.rspec_on(:runner) do |runner|
143
- options.parse_runner(runner, out, err)
144
- end
140
+ @options.files << file
141
+ blk.call(file) if blk
142
+ end
145
143
 
146
- opts.rspec_on(:drb) do
147
- return parse_drb(args_copy, out, err, warn_if_no_files)
148
- end
144
+ @options
145
+ end
149
146
 
150
- opts.rspec_on(:version) {parse_version(out)}
147
+ protected
151
148
 
152
- opts.on_tail(*COMMAND_LINE[:help]) {parse_help(opts, out)}
149
+ def invoke_requires(requires)
150
+ requires.split(",").each do |file|
151
+ require file
153
152
  end
154
- opts.parse!(args)
153
+ end
155
154
 
156
- if args.empty? && warn_if_no_files
157
- err.puts "No files specified."
158
- err.puts opts
159
- exit(6) if err == $stderr
155
+ def parse_file_options(option_name, action)
156
+ # Remove the file option and the argument before handling the file
157
+ options_file = nil
158
+ options_list = OPTIONS[option_name][0..1]
159
+ options_list[1].gsub!(" PATH", "")
160
+ options_list.each do |option|
161
+ if index = @argv.index(option)
162
+ @argv.delete_at(index)
163
+ options_file = @argv.delete_at(index)
164
+ end
160
165
  end
161
-
162
- if options.line_number
163
- set_spec_from_line_number(options, args, err)
166
+
167
+ if options_file.nil? &&
168
+ File.exist?('spec/spec.opts') &&
169
+ !@argv.any?{|a| a =~ /^\-/ }
170
+ options_file = 'spec/spec.opts'
164
171
  end
165
172
 
166
- if options.formatters.empty?
167
- options.formatters << Formatter::ProgressBarFormatter.new(out)
173
+ if options_file
174
+ send(action, options_file)
175
+ return true
176
+ else
177
+ return false
168
178
  end
169
-
170
- options
171
179
  end
172
180
 
173
- def parse_options_file(options_file, out_stream, error_stream, args_copy, warn_if_no_files)
174
- # Remove the --options option and the argument before writing to file
175
- index = args_copy.index("-O") || args_copy.index("--options")
176
- args_copy.delete_at(index)
177
- args_copy.delete_at(index)
181
+ def parse_options_file(options_file)
182
+ option_file_args = File.readlines(options_file).map {|l| l.chomp.split " "}.flatten
183
+ @argv.push(*option_file_args)
184
+ end
178
185
 
179
- new_args = args_copy + IO.readlines(options_file).map {|l| l.chomp.split " "}.flatten
180
- return CommandLine.run(new_args, error_stream, out_stream, true, warn_if_no_files)
186
+ def write_options_file(options_file)
187
+ File.open(options_file, 'w') do |io|
188
+ io.puts @argv.join("\n")
189
+ end
190
+ @out_stream.puts "\nOptions written to #{options_file}. You can now use these options with:"
191
+ @out_stream.puts "spec --options #{options_file}"
192
+ @options.examples_should_not_be_run
181
193
  end
182
194
 
183
- def parse_drb(args_copy, out_stream, error_stream, warn_if_no_files)
184
- # Remove the --drb option
185
- index = args_copy.index("-X") || args_copy.index("--drb")
186
- args_copy.delete_at(index)
195
+ def parse_drb
196
+ argv = @options.argv
197
+ is_drb = false
198
+ is_drb ||= argv.delete(OPTIONS[:drb][0])
199
+ is_drb ||= argv.delete(OPTIONS[:drb][1])
200
+ return false unless is_drb
201
+ if DrbCommandLine.run(self.class.parse(argv, @error_stream, @out_stream))
202
+ @options.examples_should_not_be_run
203
+ true
204
+ else
205
+ @error_stream.puts "Running specs locally:"
206
+ false
207
+ end
208
+ end
187
209
 
188
- return DrbCommandLine.run(args_copy, error_stream, out_stream, true, warn_if_no_files)
210
+ def parse_version
211
+ @out_stream.puts ::Spec::VERSION::SUMMARY
212
+ exit if stdout?
189
213
  end
190
214
 
191
- def parse_version(out_stream)
192
- out_stream.puts ::Spec::VERSION::DESCRIPTION
193
- exit if out_stream == $stdout
215
+ def parse_help
216
+ @out_stream.puts self
217
+ exit if stdout?
194
218
  end
195
219
 
196
- def parse_help(opts, out_stream)
197
- out_stream.puts opts
198
- exit if out_stream == $stdout
199
- end
200
-
201
- def set_spec_from_line_number(options, args, err)
202
- if options.examples.empty?
203
- if args.length == 1
204
- if @file_factory.file?(args[0])
205
- source = @file_factory.open(args[0])
206
- example = @spec_parser.spec_name_for(source, options.line_number)
207
- options.parse_example(example)
208
- elsif @file_factory.directory?(args[0])
209
- err.puts "You must specify one file, not a directory when using the --line option"
210
- exit(1) if err == $stderr
211
- else
212
- err.puts "#{args[0]} does not exist"
213
- exit(2) if err == $stderr
214
- end
215
- else
216
- err.puts "Only one file can be specified when using the --line option: #{args.inspect}"
217
- exit(3) if err == $stderr
218
- end
219
- else
220
- err.puts "You cannot use both --line and --example"
221
- exit(4) if err == $stderr
222
- end
220
+ def stdout?
221
+ @out_stream == $stdout
223
222
  end
224
223
  end
225
224
  end