newbamboo-rspec 1.1.12

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 (324) hide show
  1. data/.autotest +4 -0
  2. data/History.txt +1263 -0
  3. data/License.txt +22 -0
  4. data/Manifest.txt +327 -0
  5. data/README.txt +57 -0
  6. data/Rakefile +104 -0
  7. data/TODO.txt +18 -0
  8. data/bin/autospec +4 -0
  9. data/bin/spec +4 -0
  10. data/examples/failing/README.txt +7 -0
  11. data/examples/failing/diffing_spec.rb +36 -0
  12. data/examples/failing/failing_autogenerated_docstrings_example.rb +19 -0
  13. data/examples/failing/failure_in_after.rb +10 -0
  14. data/examples/failing/failure_in_before.rb +10 -0
  15. data/examples/failing/mocking_example.rb +40 -0
  16. data/examples/failing/mocking_with_flexmock.rb +26 -0
  17. data/examples/failing/mocking_with_mocha.rb +25 -0
  18. data/examples/failing/mocking_with_rr.rb +27 -0
  19. data/examples/failing/partial_mock_example.rb +20 -0
  20. data/examples/failing/predicate_example.rb +34 -0
  21. data/examples/failing/raising_example.rb +47 -0
  22. data/examples/failing/spec_helper.rb +3 -0
  23. data/examples/failing/syntax_error_example.rb +7 -0
  24. data/examples/failing/team_spec.rb +44 -0
  25. data/examples/failing/timeout_behaviour.rb +7 -0
  26. data/examples/passing/autogenerated_docstrings_example.rb +25 -0
  27. data/examples/passing/before_and_after_example.rb +40 -0
  28. data/examples/passing/behave_as_example.rb +45 -0
  29. data/examples/passing/custom_expectation_matchers.rb +54 -0
  30. data/examples/passing/custom_formatter.rb +12 -0
  31. data/examples/passing/dynamic_spec.rb +9 -0
  32. data/examples/passing/file_accessor.rb +19 -0
  33. data/examples/passing/file_accessor_spec.rb +38 -0
  34. data/examples/passing/greeter_spec.rb +31 -0
  35. data/examples/passing/helper_method_example.rb +14 -0
  36. data/examples/passing/io_processor.rb +8 -0
  37. data/examples/passing/io_processor_spec.rb +21 -0
  38. data/examples/passing/legacy_spec.rb +11 -0
  39. data/examples/passing/mocking_example.rb +27 -0
  40. data/examples/passing/multi_threaded_example_group_runner.rb +26 -0
  41. data/examples/passing/nested_classes_example.rb +36 -0
  42. data/examples/passing/partial_mock_example.rb +29 -0
  43. data/examples/passing/pending_example.rb +20 -0
  44. data/examples/passing/predicate_example.rb +27 -0
  45. data/examples/passing/priority.txt +1 -0
  46. data/examples/passing/shared_example_group_example.rb +81 -0
  47. data/examples/passing/shared_stack_examples.rb +36 -0
  48. data/examples/passing/simple_matcher_example.rb +31 -0
  49. data/examples/passing/spec_helper.rb +3 -0
  50. data/examples/passing/stack.rb +36 -0
  51. data/examples/passing/stack_spec.rb +64 -0
  52. data/examples/passing/stack_spec_with_nested_example_groups.rb +67 -0
  53. data/examples/passing/stubbing_example.rb +69 -0
  54. data/examples/passing/yielding_example.rb +33 -0
  55. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
  56. data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
  57. data/features/example_groups/autogenerated_docstrings.feature +45 -0
  58. data/features/example_groups/example_group_with_should_methods.feature +17 -0
  59. data/features/example_groups/nested_groups.feature +17 -0
  60. data/features/example_groups/output.feature +20 -0
  61. data/features/interop/examples_and_tests_together.feature +31 -0
  62. data/features/interop/test_but_not_test_unit.feature +14 -0
  63. data/features/interop/test_case_with_should_methods.feature +17 -0
  64. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  65. data/features/step_definitions/running_rspec.rb +54 -0
  66. data/features/support/env.rb +26 -0
  67. data/features/support/helpers/cmdline.rb +9 -0
  68. data/features/support/matchers/smart_match.rb +37 -0
  69. data/init.rb +9 -0
  70. data/lib/adapters/mock_frameworks/flexmock.rb +24 -0
  71. data/lib/adapters/mock_frameworks/mocha.rb +20 -0
  72. data/lib/adapters/mock_frameworks/rr.rb +22 -0
  73. data/lib/adapters/mock_frameworks/rspec.rb +20 -0
  74. data/lib/autotest/discover.rb +3 -0
  75. data/lib/autotest/rspec.rb +47 -0
  76. data/lib/spec/dsl/main.rb +87 -0
  77. data/lib/spec/dsl.rb +1 -0
  78. data/lib/spec/example/before_and_after_hooks.rb +99 -0
  79. data/lib/spec/example/errors.rb +30 -0
  80. data/lib/spec/example/example_group.rb +26 -0
  81. data/lib/spec/example/example_group_factory.rb +98 -0
  82. data/lib/spec/example/example_group_methods.rb +376 -0
  83. data/lib/spec/example/example_matcher.rb +44 -0
  84. data/lib/spec/example/example_methods.rb +137 -0
  85. data/lib/spec/example/module_reopening_fix.rb +21 -0
  86. data/lib/spec/example/pending.rb +18 -0
  87. data/lib/spec/example/shared_example_group.rb +59 -0
  88. data/lib/spec/example.rb +187 -0
  89. data/lib/spec/expectations/differs/default.rb +66 -0
  90. data/lib/spec/expectations/errors.rb +12 -0
  91. data/lib/spec/expectations/extensions/object.rb +63 -0
  92. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  93. data/lib/spec/expectations/extensions.rb +2 -0
  94. data/lib/spec/expectations/handler.rb +32 -0
  95. data/lib/spec/expectations.rb +60 -0
  96. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  97. data/lib/spec/interop/test/unit/testcase.rb +73 -0
  98. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  99. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  100. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  101. data/lib/spec/interop/test.rb +12 -0
  102. data/lib/spec/matchers/be.rb +208 -0
  103. data/lib/spec/matchers/be_close.rb +21 -0
  104. data/lib/spec/matchers/change.rb +148 -0
  105. data/lib/spec/matchers/eql.rb +25 -0
  106. data/lib/spec/matchers/equal.rb +25 -0
  107. data/lib/spec/matchers/errors.rb +5 -0
  108. data/lib/spec/matchers/exist.rb +16 -0
  109. data/lib/spec/matchers/generated_descriptions.rb +48 -0
  110. data/lib/spec/matchers/has.rb +15 -0
  111. data/lib/spec/matchers/have.rb +150 -0
  112. data/lib/spec/matchers/include.rb +80 -0
  113. data/lib/spec/matchers/match.rb +22 -0
  114. data/lib/spec/matchers/match_array.rb +79 -0
  115. data/lib/spec/matchers/method_missing.rb +9 -0
  116. data/lib/spec/matchers/operator_matcher.rb +70 -0
  117. data/lib/spec/matchers/raise_error.rb +128 -0
  118. data/lib/spec/matchers/respond_to.rb +71 -0
  119. data/lib/spec/matchers/satisfy.rb +47 -0
  120. data/lib/spec/matchers/simple_matcher.rb +132 -0
  121. data/lib/spec/matchers/throw_symbol.rb +106 -0
  122. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  123. data/lib/spec/matchers.rb +141 -0
  124. data/lib/spec/mocks/argument_expectation.rb +49 -0
  125. data/lib/spec/mocks/argument_matchers.rb +237 -0
  126. data/lib/spec/mocks/error_generator.rb +82 -0
  127. data/lib/spec/mocks/errors.rb +10 -0
  128. data/lib/spec/mocks/extensions/object.rb +3 -0
  129. data/lib/spec/mocks/extensions.rb +1 -0
  130. data/lib/spec/mocks/framework.rb +15 -0
  131. data/lib/spec/mocks/message_expectation.rb +331 -0
  132. data/lib/spec/mocks/methods.rb +51 -0
  133. data/lib/spec/mocks/mock.rb +55 -0
  134. data/lib/spec/mocks/order_group.rb +29 -0
  135. data/lib/spec/mocks/proxy.rb +230 -0
  136. data/lib/spec/mocks/space.rb +28 -0
  137. data/lib/spec/mocks/spec_methods.rb +55 -0
  138. data/lib/spec/mocks.rb +200 -0
  139. data/lib/spec/rake/spectask.rb +225 -0
  140. data/lib/spec/rake/verify_rcov.rb +52 -0
  141. data/lib/spec/ruby.rb +9 -0
  142. data/lib/spec/runner/backtrace_tweaker.rb +58 -0
  143. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  144. data/lib/spec/runner/command_line.rb +35 -0
  145. data/lib/spec/runner/configuration.rb +166 -0
  146. data/lib/spec/runner/drb_command_line.rb +20 -0
  147. data/lib/spec/runner/example_group_runner.rb +70 -0
  148. data/lib/spec/runner/formatter/base_formatter.rb +79 -0
  149. data/lib/spec/runner/formatter/base_text_formatter.rb +127 -0
  150. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
  151. data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
  152. data/lib/spec/runner/formatter/html_formatter.rb +340 -0
  153. data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  154. data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
  155. data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
  156. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  157. data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
  158. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  159. data/lib/spec/runner/heckle_runner.rb +74 -0
  160. data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
  161. data/lib/spec/runner/option_parser.rb +204 -0
  162. data/lib/spec/runner/options.rb +320 -0
  163. data/lib/spec/runner/reporter.rb +167 -0
  164. data/lib/spec/runner/spec_parser.rb +73 -0
  165. data/lib/spec/runner.rb +88 -0
  166. data/lib/spec/version.rb +15 -0
  167. data/lib/spec.rb +7 -0
  168. data/resources/rake/examples.rake +7 -0
  169. data/resources/rake/examples_with_rcov.rake +9 -0
  170. data/resources/rake/failing_examples_with_html.rake +9 -0
  171. data/resources/rake/verify_rcov.rake +7 -0
  172. data/resources/spec/example_group_with_should_methods.rb +12 -0
  173. data/resources/spec/simple_spec.rb +8 -0
  174. data/resources/test/spec_and_test_together.rb +57 -0
  175. data/resources/test/spec_including_test_but_not_unit.rb +11 -0
  176. data/resources/test/test_case_with_should_methods.rb +30 -0
  177. data/rspec.gemspec +32 -0
  178. data/spec/README.jruby +15 -0
  179. data/spec/autotest/autotest_helper.rb +6 -0
  180. data/spec/autotest/autotest_matchers.rb +47 -0
  181. data/spec/autotest/discover_spec.rb +8 -0
  182. data/spec/autotest/failed_results_re_spec.rb +24 -0
  183. data/spec/autotest/rspec_spec.rb +114 -0
  184. data/spec/rspec_suite.rb +6 -0
  185. data/spec/ruby_forker.rb +13 -0
  186. data/spec/spec/dsl/main_spec.rb +88 -0
  187. data/spec/spec/example/example_group_class_definition_spec.rb +49 -0
  188. data/spec/spec/example/example_group_factory_spec.rb +224 -0
  189. data/spec/spec/example/example_group_methods_spec.rb +653 -0
  190. data/spec/spec/example/example_group_spec.rb +661 -0
  191. data/spec/spec/example/example_matcher_spec.rb +79 -0
  192. data/spec/spec/example/example_methods_spec.rb +204 -0
  193. data/spec/spec/example/helper_method_spec.rb +24 -0
  194. data/spec/spec/example/nested_example_group_spec.rb +71 -0
  195. data/spec/spec/example/pending_module_spec.rb +139 -0
  196. data/spec/spec/example/predicate_matcher_spec.rb +21 -0
  197. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  198. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  199. data/spec/spec/expectations/differs/default_spec.rb +127 -0
  200. data/spec/spec/expectations/extensions/object_spec.rb +45 -0
  201. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  202. data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
  203. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  204. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  205. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  206. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  207. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  208. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  209. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  210. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  211. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  212. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  213. data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
  214. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  215. data/spec/spec/matchers/be_close_spec.rb +41 -0
  216. data/spec/spec/matchers/be_spec.rb +303 -0
  217. data/spec/spec/matchers/change_spec.rb +329 -0
  218. data/spec/spec/matchers/description_generation_spec.rb +172 -0
  219. data/spec/spec/matchers/eql_spec.rb +29 -0
  220. data/spec/spec/matchers/equal_spec.rb +29 -0
  221. data/spec/spec/matchers/exist_spec.rb +57 -0
  222. data/spec/spec/matchers/handler_spec.rb +111 -0
  223. data/spec/spec/matchers/has_spec.rb +63 -0
  224. data/spec/spec/matchers/have_spec.rb +399 -0
  225. data/spec/spec/matchers/include_spec.rb +88 -0
  226. data/spec/spec/matchers/match_array_spec.rb +83 -0
  227. data/spec/spec/matchers/match_spec.rb +37 -0
  228. data/spec/spec/matchers/matcher_methods_spec.rb +66 -0
  229. data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
  230. data/spec/spec/matchers/raise_error_spec.rb +333 -0
  231. data/spec/spec/matchers/respond_to_spec.rb +116 -0
  232. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  233. data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
  234. data/spec/spec/matchers/throw_symbol_spec.rb +96 -0
  235. data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
  236. data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
  237. data/spec/spec/mocks/at_least_spec.rb +97 -0
  238. data/spec/spec/mocks/at_most_spec.rb +93 -0
  239. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  240. data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
  241. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  242. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  243. data/spec/spec/mocks/bug_report_496.rb +19 -0
  244. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  245. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  246. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  247. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  248. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  249. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  250. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  251. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  252. data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
  253. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  254. data/spec/spec/mocks/mock_spec.rb +579 -0
  255. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  256. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  257. data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
  258. data/spec/spec/mocks/once_counts_spec.rb +53 -0
  259. data/spec/spec/mocks/options_hash_spec.rb +35 -0
  260. data/spec/spec/mocks/partial_mock_spec.rb +149 -0
  261. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  262. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  263. data/spec/spec/mocks/precise_counts_spec.rb +52 -0
  264. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  265. data/spec/spec/mocks/stub_spec.rb +194 -0
  266. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
  267. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  268. data/spec/spec/package/bin_spec_spec.rb +22 -0
  269. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  270. data/spec/spec/runner/command_line_spec.rb +141 -0
  271. data/spec/spec/runner/configuration_spec.rb +301 -0
  272. data/spec/spec/runner/drb_command_line_spec.rb +97 -0
  273. data/spec/spec/runner/empty_file.txt +0 -0
  274. data/spec/spec/runner/example_group_runner_spec.rb +33 -0
  275. data/spec/spec/runner/examples.txt +2 -0
  276. data/spec/spec/runner/failed.txt +3 -0
  277. data/spec/spec/runner/formatter/base_formatter_spec.rb +23 -0
  278. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
  279. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  280. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
  281. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
  282. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
  283. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
  284. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
  285. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +379 -0
  286. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
  287. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
  288. data/spec/spec/runner/formatter/html_formatter_spec.rb +62 -0
  289. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
  290. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  291. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +145 -0
  292. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
  293. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +104 -0
  294. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
  295. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
  296. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +373 -0
  297. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
  298. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
  299. data/spec/spec/runner/heckle_runner_spec.rb +78 -0
  300. data/spec/spec/runner/heckler_spec.rb +20 -0
  301. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  302. data/spec/spec/runner/option_parser_spec.rb +396 -0
  303. data/spec/spec/runner/options_spec.rb +469 -0
  304. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  305. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  306. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  307. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
  308. data/spec/spec/runner/reporter_spec.rb +238 -0
  309. data/spec/spec/runner/resources/a_bar.rb +0 -0
  310. data/spec/spec/runner/resources/a_foo.rb +0 -0
  311. data/spec/spec/runner/resources/a_spec.rb +1 -0
  312. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  313. data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
  314. data/spec/spec/runner/spec.opts +2 -0
  315. data/spec/spec/runner/spec_drb.opts +1 -0
  316. data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
  317. data/spec/spec/runner/spec_parser_spec.rb +91 -0
  318. data/spec/spec/runner/spec_spaced.opts +2 -0
  319. data/spec/spec/runner_spec.rb +11 -0
  320. data/spec/spec/spec_classes.rb +133 -0
  321. data/spec/spec/spec_spec.rb +21 -0
  322. data/spec/spec.opts +6 -0
  323. data/spec/spec_helper.rb +107 -0
  324. metadata +388 -0
@@ -0,0 +1,340 @@
1
+ require 'erb'
2
+ require 'spec/runner/formatter/base_text_formatter'
3
+
4
+ module Spec
5
+ module Runner
6
+ module Formatter
7
+ class HtmlFormatter < BaseTextFormatter
8
+ include ERB::Util # for the #h method
9
+
10
+ def initialize(options, output)
11
+ super
12
+ @example_group_number = 0
13
+ @example_number = 0
14
+ end
15
+
16
+ def method_missing(sym, *args)
17
+ # no-op
18
+ end
19
+
20
+ # The number of the currently running example_group
21
+ def example_group_number
22
+ @example_group_number
23
+ end
24
+
25
+ # The number of the currently running example (a global counter)
26
+ def example_number
27
+ @example_number
28
+ end
29
+
30
+ def start(example_count)
31
+ @example_count = example_count
32
+
33
+ @output.puts html_header
34
+ @output.puts report_header
35
+ @output.flush
36
+ end
37
+
38
+ def add_example_group(example_group)
39
+ super
40
+ @example_group_red = false
41
+ @example_group_red = false
42
+ @example_group_number += 1
43
+ unless example_group_number == 1
44
+ @output.puts " </dl>"
45
+ @output.puts "</div>"
46
+ end
47
+ @output.puts "<div class=\"example_group\">"
48
+ @output.puts " <dl>"
49
+ @output.puts " <dt id=\"example_group_#{example_group_number}\">#{h(example_group.description)}</dt>"
50
+ @output.flush
51
+ end
52
+
53
+ def start_dump
54
+ @output.puts " </dl>"
55
+ @output.puts "</div>"
56
+ @output.flush
57
+ end
58
+
59
+ def example_started(example)
60
+ @example_number += 1
61
+ end
62
+
63
+ def example_passed(example)
64
+ move_progress
65
+ @output.puts " <dd class=\"spec passed\"><span class=\"passed_spec_name\">#{h(example.description)}</span></dd>"
66
+ @output.flush
67
+ end
68
+
69
+ def example_failed(example, counter, failure)
70
+ extra = extra_failure_content(failure)
71
+ failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
72
+ @output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>" unless @header_red
73
+ @header_red = true
74
+ @output.puts " <script type=\"text/javascript\">makeRed('example_group_#{example_group_number}');</script>" unless @example_group_red
75
+ @example_group_red = true
76
+ move_progress
77
+ @output.puts " <dd class=\"spec #{failure_style}\">"
78
+ @output.puts " <span class=\"failed_spec_name\">#{h(example.description)}</span>"
79
+ @output.puts " <div class=\"failure\" id=\"failure_#{counter}\">"
80
+ @output.puts " <div class=\"message\"><pre>#{h(failure.exception.message)}</pre></div>" unless failure.exception.nil?
81
+ @output.puts " <div class=\"backtrace\"><pre>#{format_backtrace(failure.exception.backtrace)}</pre></div>" unless failure.exception.nil?
82
+ @output.puts extra unless extra == ""
83
+ @output.puts " </div>"
84
+ @output.puts " </dd>"
85
+ @output.flush
86
+ end
87
+
88
+ def example_pending(example, message, pending_caller)
89
+ @output.puts " <script type=\"text/javascript\">makeYellow('rspec-header');</script>" unless @header_red
90
+ @output.puts " <script type=\"text/javascript\">makeYellow('example_group_#{example_group_number}');</script>" unless @example_group_red
91
+ move_progress
92
+ @output.puts " <dd class=\"spec not_implemented\"><span class=\"not_implemented_spec_name\">#{h(example.description)} (PENDING: #{h(message)})</span></dd>"
93
+ @output.flush
94
+ end
95
+
96
+ # Override this method if you wish to output extra HTML for a failed spec. For example, you
97
+ # could output links to images or other files produced during the specs.
98
+ #
99
+ def extra_failure_content(failure)
100
+ require 'spec/runner/formatter/snippet_extractor'
101
+ @snippet_extractor ||= SnippetExtractor.new
102
+ " <pre class=\"ruby\"><code>#{@snippet_extractor.snippet(failure.exception)}</code></pre>"
103
+ end
104
+
105
+ def move_progress
106
+ @output.puts " <script type=\"text/javascript\">moveProgressBar('#{percent_done}');</script>"
107
+ @output.flush
108
+ end
109
+
110
+ def percent_done
111
+ result = 100.0
112
+ if @example_count != 0
113
+ result = ((example_number).to_f / @example_count.to_f * 1000).to_i / 10.0
114
+ end
115
+ result
116
+ end
117
+
118
+ def dump_failure(counter, failure)
119
+ end
120
+
121
+ def dump_summary(duration, example_count, failure_count, pending_count)
122
+ if dry_run?
123
+ totals = "This was a dry-run"
124
+ else
125
+ totals = "#{example_count} example#{'s' unless example_count == 1}, #{failure_count} failure#{'s' unless failure_count == 1}"
126
+ totals << ", #{pending_count} pending" if pending_count > 0
127
+ end
128
+ @output.puts "<script type=\"text/javascript\">document.getElementById('duration').innerHTML = \"Finished in <strong>#{duration} seconds</strong>\";</script>"
129
+ @output.puts "<script type=\"text/javascript\">document.getElementById('totals').innerHTML = \"#{totals}\";</script>"
130
+ @output.puts "</div>"
131
+ @output.puts "</div>"
132
+ @output.puts "</body>"
133
+ @output.puts "</html>"
134
+ @output.flush
135
+ end
136
+
137
+ def html_header
138
+ <<-EOF
139
+ <?xml version="1.0" encoding="UTF-8"?>
140
+ <!DOCTYPE html
141
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
142
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
143
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
144
+ <head>
145
+ <title>RSpec results</title>
146
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
147
+ <meta http-equiv="Expires" content="-1" />
148
+ <meta http-equiv="Pragma" content="no-cache" />
149
+ <style type="text/css">
150
+ body {
151
+ margin: 0;
152
+ padding: 0;
153
+ background: #fff;
154
+ font-size: 80%;
155
+ }
156
+ </style>
157
+ <script type="text/javascript">
158
+ // <![CDATA[
159
+ #{global_scripts}
160
+ // ]]>
161
+ </script>
162
+ <style type="text/css">
163
+ #{global_styles}
164
+ </style>
165
+ </head>
166
+ <body>
167
+ EOF
168
+ end
169
+
170
+ def report_header
171
+ <<-EOF
172
+ <div class="rspec-report">
173
+
174
+ <div id="rspec-header">
175
+ <div id="label">
176
+ <h1>RSpec Results</h1>
177
+ </div>
178
+
179
+ <div id="summary">
180
+ <p id="totals">&nbsp;</p>
181
+ <p id="duration">&nbsp;</p>
182
+ </div>
183
+ </div>
184
+
185
+ <div class="results">
186
+ EOF
187
+ end
188
+
189
+ def global_scripts
190
+ <<-EOF
191
+ function moveProgressBar(percentDone) {
192
+ document.getElementById("rspec-header").style.width = percentDone +"%";
193
+ }
194
+ function makeRed(element_id) {
195
+ document.getElementById(element_id).style.background = '#C40D0D';
196
+ document.getElementById(element_id).style.color = '#FFFFFF';
197
+ }
198
+
199
+ function makeYellow(element_id) {
200
+ if (element_id == "rspec-header" && document.getElementById(element_id).style.background != '#C40D0D')
201
+ {
202
+ document.getElementById(element_id).style.background = '#FAF834';
203
+ document.getElementById(element_id).style.color = '#000000';
204
+ }
205
+ else
206
+ {
207
+ document.getElementById(element_id).style.background = '#FAF834';
208
+ document.getElementById(element_id).style.color = '#000000';
209
+ }
210
+ }
211
+ EOF
212
+ end
213
+
214
+ def global_styles
215
+ <<-EOF
216
+ #rspec-header {
217
+ background: #65C400; color: #fff; height: 42px;
218
+ }
219
+
220
+ .rspec-report h1 {
221
+ margin: 0px 10px 0px 10px;
222
+ padding: 10px;
223
+ font-family: "Lucida Grande", Helvetica, sans-serif;
224
+ font-size: 1.8em;
225
+ float: left;
226
+ }
227
+
228
+ #summary {
229
+ margin: 0; padding: 5px 10px;
230
+ font-family: "Lucida Grande", Helvetica, sans-serif;
231
+ text-align: right;
232
+ top: 0px;
233
+ right: 0px;
234
+ float:right;
235
+ }
236
+
237
+ #summary p {
238
+ margin: 0 0 0 2px;
239
+ }
240
+
241
+ #summary #totals {
242
+ font-size: 1.2em;
243
+ }
244
+
245
+ .example_group {
246
+ margin: 0 10px 5px;
247
+ background: #fff;
248
+ }
249
+
250
+ dl {
251
+ margin: 0; padding: 0 0 5px;
252
+ font: normal 11px "Lucida Grande", Helvetica, sans-serif;
253
+ }
254
+
255
+ dt {
256
+ padding: 3px;
257
+ background: #65C400;
258
+ color: #fff;
259
+ font-weight: bold;
260
+ }
261
+
262
+ dd {
263
+ margin: 5px 0 5px 5px;
264
+ padding: 3px 3px 3px 18px;
265
+ }
266
+
267
+ dd.spec.passed {
268
+ border-left: 5px solid #65C400;
269
+ border-bottom: 1px solid #65C400;
270
+ background: #DBFFB4; color: #3D7700;
271
+ }
272
+
273
+ dd.spec.failed {
274
+ border-left: 5px solid #C20000;
275
+ border-bottom: 1px solid #C20000;
276
+ color: #C20000; background: #FFFBD3;
277
+ }
278
+
279
+ dd.spec.not_implemented {
280
+ border-left: 5px solid #FAF834;
281
+ border-bottom: 1px solid #FAF834;
282
+ background: #FCFB98; color: #131313;
283
+ }
284
+
285
+ dd.spec.pending_fixed {
286
+ border-left: 5px solid #0000C2;
287
+ border-bottom: 1px solid #0000C2;
288
+ color: #0000C2; background: #D3FBFF;
289
+ }
290
+
291
+ .backtrace {
292
+ color: #000;
293
+ font-size: 12px;
294
+ }
295
+
296
+ a {
297
+ color: #BE5C00;
298
+ }
299
+
300
+ /* Ruby code, style similar to vibrant ink */
301
+ .ruby {
302
+ font-size: 12px;
303
+ font-family: monospace;
304
+ color: white;
305
+ background-color: black;
306
+ padding: 0.1em 0 0.2em 0;
307
+ }
308
+
309
+ .ruby .keyword { color: #FF6600; }
310
+ .ruby .constant { color: #339999; }
311
+ .ruby .attribute { color: white; }
312
+ .ruby .global { color: white; }
313
+ .ruby .module { color: white; }
314
+ .ruby .class { color: white; }
315
+ .ruby .string { color: #66FF00; }
316
+ .ruby .ident { color: white; }
317
+ .ruby .method { color: #FFCC00; }
318
+ .ruby .number { color: white; }
319
+ .ruby .char { color: white; }
320
+ .ruby .comment { color: #9933CC; }
321
+ .ruby .symbol { color: white; }
322
+ .ruby .regex { color: #44B4CC; }
323
+ .ruby .punct { color: white; }
324
+ .ruby .escape { color: white; }
325
+ .ruby .interp { color: white; }
326
+ .ruby .expr { color: white; }
327
+
328
+ .ruby .offending { background-color: gray; }
329
+ .ruby .linenum {
330
+ width: 75px;
331
+ padding: 0.1em 1em 0.2em 0;
332
+ color: #000000;
333
+ background-color: #FFFBD3;
334
+ }
335
+ EOF
336
+ end
337
+ end
338
+ end
339
+ end
340
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class NestedTextFormatter < BaseTextFormatter
7
+ attr_reader :previous_nested_example_groups
8
+ def initialize(options, where)
9
+ super
10
+ @previous_nested_example_groups = []
11
+ end
12
+
13
+ def add_example_group(example_group)
14
+ super
15
+
16
+ current_nested_example_groups = described_example_group_chain
17
+ current_nested_example_groups.each_with_index do |nested_example_group, i|
18
+ unless nested_example_group == previous_nested_example_groups[i]
19
+ output.puts "#{' ' * i}#{nested_example_group.description_args.join}"
20
+ end
21
+ end
22
+
23
+ @previous_nested_example_groups = described_example_group_chain
24
+ end
25
+
26
+ def example_failed(example, counter, failure)
27
+ message = if failure.expectation_not_met?
28
+ "#{current_indentation}#{example.description} (FAILED - #{counter})"
29
+ else
30
+ "#{current_indentation}#{example.description} (ERROR - #{counter})"
31
+ end
32
+
33
+ output.puts(failure.expectation_not_met? ? red(message) : magenta(message))
34
+ output.flush
35
+ end
36
+
37
+ def example_passed(example)
38
+ message = "#{current_indentation}#{example.description}"
39
+ output.puts green(message)
40
+ output.flush
41
+ end
42
+
43
+ def example_pending(example, message, pending_caller)
44
+ super
45
+ output.puts yellow("#{current_indentation}#{example.description} (PENDING: #{message})")
46
+ output.flush
47
+ end
48
+
49
+ def current_indentation
50
+ ' ' * previous_nested_example_groups.length
51
+ end
52
+
53
+ def described_example_group_chain
54
+ example_group_chain = []
55
+ example_group.__send__(:example_group_hierarchy).each do |example_group_class|
56
+ unless example_group_class.description_args.empty?
57
+ example_group_chain << example_group_class
58
+ end
59
+ end
60
+ example_group_chain
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec/runner/formatter/progress_bar_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class ProfileFormatter < ProgressBarFormatter
7
+
8
+ def initialize(options, where)
9
+ super
10
+ @example_times = []
11
+ end
12
+
13
+ def start(count)
14
+ @output.puts "Profiling enabled."
15
+ end
16
+
17
+ def example_started(example)
18
+ @time = Time.now
19
+ end
20
+
21
+ def example_passed(example)
22
+ super
23
+ @example_times << [
24
+ example_group.description,
25
+ example.description,
26
+ Time.now - @time
27
+ ]
28
+ end
29
+
30
+ def start_dump
31
+ super
32
+ @output.puts "\n\nTop 10 slowest examples:\n"
33
+
34
+ @example_times = @example_times.sort_by do |description, example, time|
35
+ time
36
+ end.reverse
37
+
38
+ @example_times[0..9].each do |description, example, time|
39
+ @output.print red(sprintf("%.7f", time))
40
+ @output.puts " #{description} #{example}"
41
+ end
42
+ @output.flush
43
+ end
44
+
45
+ def method_missing(sym, *args)
46
+ # ignore
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class ProgressBarFormatter < BaseTextFormatter
7
+ def example_failed(example, counter, failure)
8
+ @output.print colourise('F', failure)
9
+ @output.flush
10
+ end
11
+
12
+ def example_passed(example)
13
+ @output.print green('.')
14
+ @output.flush
15
+ end
16
+
17
+ def example_pending(example, message, pending_caller)
18
+ super
19
+ @output.print yellow('*')
20
+ @output.flush
21
+ end
22
+
23
+ def start_dump
24
+ @output.puts
25
+ @output.flush
26
+ end
27
+
28
+ def method_missing(sym, *args)
29
+ # ignore
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,52 @@
1
+ module Spec
2
+ module Runner
3
+ module Formatter
4
+ # This class extracts code snippets by looking at the backtrace of the passed error
5
+ class SnippetExtractor #:nodoc:
6
+ class NullConverter; def convert(code, pre); code; end; end #:nodoc:
7
+ begin; require 'rubygems'; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
8
+
9
+ def snippet(error)
10
+ raw_code, line = snippet_for(error.backtrace[0])
11
+ highlighted = @@converter.convert(raw_code, false)
12
+ highlighted << "\n<span class=\"comment\"># gem install syntax to get syntax highlighting</span>" if @@converter.is_a?(NullConverter)
13
+ post_process(highlighted, line)
14
+ end
15
+
16
+ def snippet_for(error_line)
17
+ if error_line =~ /(.*):(\d+)/
18
+ file = $1
19
+ line = $2.to_i
20
+ [lines_around(file, line), line]
21
+ else
22
+ ["# Couldn't get snippet for #{error_line}", 1]
23
+ end
24
+ end
25
+
26
+ def lines_around(file, line)
27
+ if File.file?(file)
28
+ lines = File.open(file).read.split("\n")
29
+ min = [0, line-3].max
30
+ max = [line+1, lines.length-1].min
31
+ selected_lines = []
32
+ selected_lines.join("\n")
33
+ lines[min..max].join("\n")
34
+ else
35
+ "# Couldn't get snippet for #{file}"
36
+ end
37
+ end
38
+
39
+ def post_process(highlighted, offending_line)
40
+ new_lines = []
41
+ highlighted.split("\n").each_with_index do |line, i|
42
+ new_line = "<span class=\"linenum\">#{offending_line+i-2}</span>#{line}"
43
+ new_line = "<span class=\"offending\">#{new_line}</span>" if i == 2
44
+ new_lines << new_line
45
+ end
46
+ new_lines.join("\n")
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class SpecdocFormatter < BaseTextFormatter
7
+ def add_example_group(example_group)
8
+ super
9
+ output.puts
10
+ output.puts example_group.description
11
+ output.flush
12
+ end
13
+
14
+ def example_failed(example, counter, failure)
15
+ message = if failure.expectation_not_met?
16
+ "- #{example.description} (FAILED - #{counter})"
17
+ else
18
+ "- #{example.description} (ERROR - #{counter})"
19
+ end
20
+
21
+ output.puts(failure.expectation_not_met? ? red(message) : magenta(message))
22
+ output.flush
23
+ end
24
+
25
+ def example_passed(example)
26
+ message = "- #{example.description}"
27
+ output.puts green(message)
28
+ output.flush
29
+ end
30
+
31
+ def example_pending(example, message, pending_caller)
32
+ super
33
+ output.puts yellow("- #{example.description} (PENDING: #{message})")
34
+ output.flush
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec/runner/formatter/html_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ # Formats backtraces so they're clickable by TextMate
7
+ class TextMateFormatter < HtmlFormatter
8
+ def backtrace_line(line)
9
+ line.gsub(/([^:]*\.rb):(\d*)/) do
10
+ "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,74 @@
1
+ unless Spec::Ruby.version.to_f == 1.9
2
+ begin
3
+ require 'rubygems'
4
+ require 'heckle'
5
+ rescue LoadError ; raise "You must gem install heckle to use --heckle" ; end
6
+
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
15
+ end
16
+
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
26
+
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
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
40
+
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
46
+ end
47
+ end
48
+
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
56
+ end
57
+ end
58
+
59
+ #Supports Heckle 1.2 and prior (earlier versions used Heckle::Base)
60
+ class Heckler < (Heckle.const_defined?(:Base) ? Heckle::Base : Heckle)
61
+ def initialize(klass_name, method_name, rspec_options)
62
+ super(klass_name, method_name)
63
+ @rspec_options = rspec_options
64
+ end
65
+
66
+ def tests_pass?
67
+ success = @rspec_options.run_examples
68
+ success
69
+ end
70
+
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +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