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,204 @@
1
+ require 'optparse'
2
+ require 'stringio'
3
+
4
+ module Spec
5
+ module Runner
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
20
+
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",
27
+ "Builtin formats: unified|u|context|c",
28
+ "You can also specify a custom differ class",
29
+ "(in which case you should also specify --require)"],
30
+ :colour => ["-c", "--colour", "--color", "Show coloured (red/green) output"],
31
+ :example => ["-e", "--example [NAME|FILE_NAME]", "Execute example(s) with matching name(s). If the argument is",
32
+ "the path to an existing file (typically generated by a previous",
33
+ "run using --format failing_examples:file.txt), then the examples",
34
+ "on each line of thatfile will be executed. If the file is empty,",
35
+ "all examples will be run (as if --example was not specified).",
36
+ " ",
37
+ "If the argument is not an existing file, then it is treated as",
38
+ "an example name directly, causing RSpec to run just the example",
39
+ "matching that name"],
40
+ :specification => ["-s", "--specification [NAME]", "DEPRECATED - use -e instead", "(This will be removed when autotest works with -e)"],
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",
44
+ "the formatter where to write the output. All built-in formats",
45
+ "expect WHERE to be a file name, and will write to $stdout if it's",
46
+ "not specified. The --format option may be specified several times",
47
+ "if you want several outputs",
48
+ " ",
49
+ "Builtin formats:",
50
+ "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 intented",
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",
57
+ " ",
58
+ "FORMAT can also be the name of a custom formatter class",
59
+ "(in which case you should also specify --require to load it)"],
60
+ :require => ["-r", "--require FILE", "Require FILE before running specs",
61
+ "Useful for loading custom formatters or other extensions.",
62
+ "If this option is used it must come before the others"],
63
+ :backtrace => ["-b", "--backtrace", "Output full backtrace"],
64
+ :loadby => ["-L", "--loadby STRATEGY", "Specify the strategy by which spec files should be loaded.",
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."],
68
+ :reverse => ["-R", "--reverse", "Run examples in reverse order"],
69
+ :timeout => ["-t", "--timeout FLOAT", "Interrupt and fail each example that doesn't complete in the",
70
+ "specified time"],
71
+ :heckle => ["-H", "--heckle CODE", "If all examples pass, this will mutate the classes and methods",
72
+ "identified by CODE little by little and run all the examples again",
73
+ "for each mutation. The intent is that for each mutation, at least",
74
+ "one example *should* fail, and RSpec will tell you if this is not the",
75
+ "case. CODE should be either Some::Module, Some::Class or",
76
+ "Some::Fabulous#method}"],
77
+ :dry_run => ["-d", "--dry-run", "Invokes formatters without executing the examples."],
78
+ :options_file => ["-O", "--options PATH", "Read options from a file"],
79
+ :generate_options => ["-G", "--generate-options PATH", "Generate an options file for --options"],
80
+ :runner => ["-U", "--runner RUNNER", "Use a custom Runner."],
81
+ :drb => ["-X", "--drb", "Run examples via DRb. (For example against script/spec_server)"],
82
+ :version => ["-v", "--version", "Show version"],
83
+ :help => ["-h", "--help", "You're looking at it"]
84
+ }
85
+
86
+ def initialize(err, out)
87
+ super()
88
+ @error_stream = err
89
+ @out_stream = out
90
+ @options = Options.new(@error_stream, @out_stream)
91
+
92
+ @file_factory = File
93
+
94
+ self.banner = "Usage: spec (FILE|DIRECTORY|GLOB)+ [options]"
95
+ self.separator ""
96
+ on(*OPTIONS[:pattern]) {|pattern| @options.filename_pattern = pattern}
97
+ on(*OPTIONS[:diff]) {|diff| @options.parse_diff(diff)}
98
+ on(*OPTIONS[:colour]) {@options.colour = true}
99
+ on(*OPTIONS[:example]) {|example| @options.parse_example(example)}
100
+ on(*OPTIONS[:specification]) {|example| @options.parse_example(example)}
101
+ on(*OPTIONS[:line]) {|line_number| @options.line_number = line_number.to_i}
102
+ on(*OPTIONS[:format]) {|format| @options.parse_format(format)}
103
+ on(*OPTIONS[:require]) {|requires| invoke_requires(requires)}
104
+ on(*OPTIONS[:backtrace]) {@options.backtrace_tweaker = NoisyBacktraceTweaker.new}
105
+ on(*OPTIONS[:loadby]) {|loadby| @options.loadby = loadby}
106
+ on(*OPTIONS[:reverse]) {@options.reverse = true}
107
+ on(*OPTIONS[:timeout]) {|timeout| @options.timeout = timeout.to_f}
108
+ on(*OPTIONS[:heckle]) {|heckle| @options.load_heckle_runner(heckle)}
109
+ on(*OPTIONS[:dry_run]) {@options.dry_run = true}
110
+ on(*OPTIONS[:options_file]) {|options_file| parse_options_file(options_file)}
111
+ on(*OPTIONS[:generate_options]) {|options_file|}
112
+ on(*OPTIONS[:runner]) {|runner| @options.user_input_for_runner = runner}
113
+ on(*OPTIONS[:drb]) {}
114
+ on(*OPTIONS[:version]) {parse_version}
115
+ on_tail(*OPTIONS[:help]) {parse_help}
116
+ end
117
+
118
+ def order!(argv, &blk)
119
+ @argv = argv.dup
120
+ @argv = (@argv.empty? && self.class.spec_command?) ? ['--help'] : @argv
121
+ @options.argv = @argv.dup
122
+ return if parse_generate_options
123
+ return if parse_drb
124
+
125
+ super(@argv) do |file|
126
+ @options.files << file
127
+ blk.call(file) if blk
128
+ end
129
+
130
+ @options
131
+ end
132
+
133
+ protected
134
+ def invoke_requires(requires)
135
+ requires.split(",").each do |file|
136
+ require file
137
+ end
138
+ end
139
+
140
+ def parse_options_file(options_file)
141
+ option_file_args = IO.readlines(options_file).map {|l| l.chomp.split " "}.flatten
142
+ @argv.push(*option_file_args)
143
+ # TODO - this is a brute force solution to http://rspec.lighthouseapp.com/projects/5645/tickets/293.
144
+ # Let's look for a cleaner way. Might not be one. But let's look. If not, perhaps
145
+ # this can be moved to a different method to indicate the special handling for drb?
146
+ parse_drb(@argv)
147
+ end
148
+
149
+ def parse_generate_options
150
+ # Remove the --generate-options option and the argument before writing to file
151
+ options_file = nil
152
+ ['-G', '--generate-options'].each do |option|
153
+ if index = @argv.index(option)
154
+ @argv.delete_at(index)
155
+ options_file = @argv.delete_at(index)
156
+ end
157
+ end
158
+
159
+ if options_file
160
+ write_generated_options(options_file)
161
+ return true
162
+ else
163
+ return false
164
+ end
165
+ end
166
+
167
+ def write_generated_options(options_file)
168
+ File.open(options_file, 'w') do |io|
169
+ io.puts @argv.join("\n")
170
+ end
171
+ @out_stream.puts "\nOptions written to #{options_file}. You can now use these options with:"
172
+ @out_stream.puts "spec --options #{options_file}"
173
+ @options.examples_should_not_be_run
174
+ end
175
+
176
+ def parse_drb(argv = nil)
177
+ argv ||= @options.argv # TODO - see note about about http://rspec.lighthouseapp.com/projects/5645/tickets/293
178
+ is_drb = false
179
+ is_drb ||= argv.delete(OPTIONS[:drb][0])
180
+ is_drb ||= argv.delete(OPTIONS[:drb][1])
181
+ return false unless is_drb
182
+ @options.examples_should_not_be_run
183
+ DrbCommandLine.run(
184
+ self.class.parse(argv, @error_stream, @out_stream)
185
+ )
186
+ true
187
+ end
188
+
189
+ def parse_version
190
+ @out_stream.puts ::Spec::VERSION::SUMMARY
191
+ exit if stdout?
192
+ end
193
+
194
+ def parse_help
195
+ @out_stream.puts self
196
+ exit if stdout?
197
+ end
198
+
199
+ def stdout?
200
+ @out_stream == $stdout
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,320 @@
1
+ module Spec
2
+ module Runner
3
+ class Options
4
+ FILE_SORTERS = {
5
+ 'mtime' => lambda {|file_a, file_b| File.mtime(file_b) <=> File.mtime(file_a)}
6
+ }
7
+
8
+ EXAMPLE_FORMATTERS = { # Load these lazily for better speed
9
+ 'specdoc' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'],
10
+ 's' => ['spec/runner/formatter/specdoc_formatter', 'Formatter::SpecdocFormatter'],
11
+ 'nested' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'],
12
+ 'n' => ['spec/runner/formatter/nested_text_formatter', 'Formatter::NestedTextFormatter'],
13
+ 'html' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'],
14
+ 'h' => ['spec/runner/formatter/html_formatter', 'Formatter::HtmlFormatter'],
15
+ 'progress' => ['spec/runner/formatter/progress_bar_formatter', 'Formatter::ProgressBarFormatter'],
16
+ 'p' => ['spec/runner/formatter/progress_bar_formatter', 'Formatter::ProgressBarFormatter'],
17
+ 'failing_examples' => ['spec/runner/formatter/failing_examples_formatter', 'Formatter::FailingExamplesFormatter'],
18
+ 'e' => ['spec/runner/formatter/failing_examples_formatter', 'Formatter::FailingExamplesFormatter'],
19
+ 'failing_example_groups' => ['spec/runner/formatter/failing_example_groups_formatter', 'Formatter::FailingExampleGroupsFormatter'],
20
+ 'g' => ['spec/runner/formatter/failing_example_groups_formatter', 'Formatter::FailingExampleGroupsFormatter'],
21
+ 'profile' => ['spec/runner/formatter/profile_formatter', 'Formatter::ProfileFormatter'],
22
+ 'o' => ['spec/runner/formatter/profile_formatter', 'Formatter::ProfileFormatter'],
23
+ 'textmate' => ['spec/runner/formatter/text_mate_formatter', 'Formatter::TextMateFormatter']
24
+ }
25
+
26
+ attr_accessor(
27
+ :filename_pattern,
28
+ :backtrace_tweaker,
29
+ :context_lines,
30
+ :diff_format,
31
+ :dry_run,
32
+ :profile,
33
+ :heckle_runner,
34
+ :line_number,
35
+ :loadby,
36
+ :reporter,
37
+ :reverse,
38
+ :timeout,
39
+ :verbose,
40
+ :user_input_for_runner,
41
+ :error_stream,
42
+ :output_stream,
43
+ # TODO: BT - Figure out a better name
44
+ :argv
45
+ )
46
+ attr_reader :colour, :differ_class, :files, :examples, :example_groups
47
+
48
+ def initialize(error_stream, output_stream)
49
+ @error_stream = error_stream
50
+ @output_stream = output_stream
51
+ @filename_pattern = "**/*_spec.rb"
52
+ @backtrace_tweaker = QuietBacktraceTweaker.new
53
+ @examples = []
54
+ @colour = false
55
+ @profile = false
56
+ @dry_run = false
57
+ @reporter = Reporter.new(self)
58
+ @context_lines = 3
59
+ @diff_format = :unified
60
+ @files = []
61
+ @example_groups = []
62
+ @result = nil
63
+ @examples_run = false
64
+ @examples_should_be_run = nil
65
+ @user_input_for_runner = nil
66
+ @after_suite_parts = []
67
+ end
68
+
69
+ def add_example_group(example_group)
70
+ @example_groups << example_group
71
+ end
72
+
73
+ def remove_example_group(example_group)
74
+ @example_groups.delete(example_group)
75
+ end
76
+
77
+ def run_examples
78
+ return true unless examples_should_be_run?
79
+ success = true
80
+ begin
81
+ runner = custom_runner || ExampleGroupRunner.new(self)
82
+
83
+ unless @files_loaded
84
+ runner.load_files(files_to_load)
85
+ @files_loaded = true
86
+ end
87
+
88
+ # TODO - this has to happen after the files get loaded,
89
+ # otherwise the before_suite_parts are not populated
90
+ # from the configuration. There is no spec for this
91
+ # directly, but features/before_and_after_blocks/before_and_after_blocks.story
92
+ # will fail if this happens before the files are loaded.
93
+ before_suite_parts.each do |part|
94
+ part.call
95
+ end
96
+
97
+ if example_groups.empty?
98
+ true
99
+ else
100
+ set_spec_from_line_number if line_number
101
+ success = runner.run
102
+ @examples_run = true
103
+ heckle if heckle_runner
104
+ success
105
+ end
106
+ ensure
107
+ after_suite_parts.each do |part|
108
+ part.call(success)
109
+ end
110
+ end
111
+ end
112
+
113
+ def before_suite_parts
114
+ Spec::Example::BeforeAndAfterHooks.before_suite_parts
115
+ end
116
+
117
+ def after_suite_parts
118
+ Spec::Example::BeforeAndAfterHooks.after_suite_parts
119
+ end
120
+
121
+ def examples_run?
122
+ @examples_run
123
+ end
124
+
125
+ def examples_should_not_be_run
126
+ @examples_should_be_run = false
127
+ end
128
+
129
+ def predicate_matchers
130
+ # TODO - don't like this dependency - perhaps store these in here instead?
131
+ Spec::Runner.configuration.predicate_matchers
132
+ end
133
+
134
+ def mock_framework
135
+ # TODO - don't like this dependency - perhaps store this in here instead?
136
+ Spec::Runner.configuration.mock_framework
137
+ end
138
+
139
+ def colour=(colour)
140
+ @colour = colour
141
+ if @colour && RUBY_PLATFORM =~ /mswin|mingw/ ;\
142
+ begin ;\
143
+ replace_output = @output_stream.equal?($stdout) ;\
144
+ require 'rubygems' ;\
145
+ require 'Win32/Console/ANSI' ;\
146
+ @output_stream = $stdout if replace_output ;\
147
+ rescue LoadError ;\
148
+ warn "You must 'gem install win32console' to use colour on Windows" ;\
149
+ @colour = false ;\
150
+ end
151
+ end
152
+ end
153
+
154
+ def parse_diff(format)
155
+ case format
156
+ when :context, 'context', 'c'
157
+ @diff_format = :context
158
+ default_differ
159
+ when :unified, 'unified', 'u', '', nil
160
+ @diff_format = :unified
161
+ default_differ
162
+ else
163
+ @diff_format = :custom
164
+ self.differ_class = load_class(format, 'differ', '--diff')
165
+ end
166
+ end
167
+
168
+ def parse_example(example)
169
+ if(File.file?(example))
170
+ @examples = [File.open(example).read.split("\n")].flatten
171
+ else
172
+ @examples = [example]
173
+ end
174
+ end
175
+
176
+ def parse_format(format_arg)
177
+ format, where = ClassAndArgumentsParser.parse(format_arg)
178
+ unless where
179
+ raise "When using several --format options only one of them can be without a file" if @out_used
180
+ where = @output_stream
181
+ @out_used = true
182
+ end
183
+ @format_options ||= []
184
+ @format_options << [format, where]
185
+ end
186
+
187
+ def formatters
188
+ @format_options ||= [['progress', @output_stream]]
189
+ @formatters ||= load_formatters(@format_options, EXAMPLE_FORMATTERS)
190
+ end
191
+
192
+ def load_formatters(format_options, formatters)
193
+ format_options.map do |format, where|
194
+ formatter_type = if formatters[format]
195
+ require formatters[format][0]
196
+ eval(formatters[format][1], binding, __FILE__, __LINE__)
197
+ else
198
+ load_class(format, 'formatter', '--format')
199
+ end
200
+ formatter_type.new(self, where)
201
+ end
202
+ end
203
+
204
+ def load_heckle_runner(heckle)
205
+ suffix = [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM} ? '_unsupported' : ''
206
+ require "spec/runner/heckle_runner#{suffix}"
207
+ @heckle_runner = HeckleRunner.new(heckle)
208
+ end
209
+
210
+ def number_of_examples
211
+ return examples.size unless examples.empty?
212
+ @example_groups.inject(0) {|sum, group| sum + group.number_of_examples}
213
+ end
214
+
215
+ def files_to_load
216
+ result = []
217
+ sorted_files.each do |file|
218
+ if File.directory?(file)
219
+ filename_pattern.split(",").each do |pattern|
220
+ result += Dir[File.expand_path("#{file}/#{pattern.strip}")]
221
+ end
222
+ elsif File.file?(file)
223
+ result << file
224
+ else
225
+ raise "File or directory not found: #{file}"
226
+ end
227
+ end
228
+ result
229
+ end
230
+
231
+ def dry_run?
232
+ @dry_run == true
233
+ end
234
+
235
+ protected
236
+ def examples_should_be_run?
237
+ return @examples_should_be_run unless @examples_should_be_run.nil?
238
+ @examples_should_be_run = true
239
+ end
240
+
241
+ def differ_class=(klass)
242
+ return unless klass
243
+ @differ_class = klass
244
+ Spec::Expectations.differ = self.differ_class.new(self)
245
+ end
246
+
247
+ def load_class(name, kind, option)
248
+ if name =~ /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/
249
+ arg = $2 == "" ? nil : $2
250
+ [$1, arg]
251
+ else
252
+ m = "#{name.inspect} is not a valid class name"
253
+ @error_stream.puts m
254
+ raise m
255
+ end
256
+ begin
257
+ eval(name, binding, __FILE__, __LINE__)
258
+ rescue NameError => e
259
+ @error_stream.puts "Couldn't find #{kind} class #{name}"
260
+ @error_stream.puts "Make sure the --require option is specified *before* #{option}"
261
+ if $_spec_spec ; raise e ; else exit(1) ; end
262
+ end
263
+ end
264
+
265
+ def custom_runner
266
+ return nil unless custom_runner?
267
+ klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner)
268
+ runner_type = load_class(klass_name, 'example group runner', '--runner')
269
+ return runner_type.new(self, arg)
270
+ end
271
+
272
+ def custom_runner?
273
+ return user_input_for_runner ? true : false
274
+ end
275
+
276
+ def heckle
277
+ heckle_runner = self.heckle_runner
278
+ self.heckle_runner = nil
279
+ heckle_runner.heckle_with
280
+ end
281
+
282
+ def sorted_files
283
+ return sorter ? files.sort(&sorter) : files
284
+ end
285
+
286
+ def sorter
287
+ FILE_SORTERS[loadby]
288
+ end
289
+
290
+ def default_differ
291
+ require 'spec/expectations/differs/default'
292
+ self.differ_class = Spec::Expectations::Differs::Default
293
+ end
294
+
295
+ def set_spec_from_line_number
296
+ if examples.empty?
297
+ if files.length == 1
298
+ if File.directory?(files[0])
299
+ error_stream.puts "You must specify one file, not a directory when using the --line option"
300
+ exit(1) if stderr?
301
+ else
302
+ example = SpecParser.new(self).spec_name_for(files[0], line_number)
303
+ @examples = [example]
304
+ end
305
+ else
306
+ error_stream.puts "Only one file can be specified when using the --line option: #{files.inspect}"
307
+ exit(3) if stderr?
308
+ end
309
+ else
310
+ error_stream.puts "You cannot use both --line and --example"
311
+ exit(4) if stderr?
312
+ end
313
+ end
314
+
315
+ def stderr?
316
+ @error_stream == $stderr
317
+ end
318
+ end
319
+ end
320
+ end
@@ -0,0 +1,167 @@
1
+ module Spec
2
+ module Runner
3
+ class Reporter
4
+ attr_reader :options, :example_groups
5
+
6
+ def initialize(options)
7
+ @options = options
8
+ @options.reporter = self
9
+ clear
10
+ end
11
+
12
+ def add_example_group(example_group)
13
+ formatters.each do |f|
14
+ f.add_example_group(example_group)
15
+ end
16
+ example_groups << example_group
17
+ end
18
+
19
+ def example_started(example)
20
+ formatters.each{|f| f.example_started(example)}
21
+ end
22
+
23
+ def example_finished(example, error=nil)
24
+ @examples << example
25
+
26
+ if error.nil?
27
+ example_passed(example)
28
+ elsif Spec::Example::ExamplePendingError === error
29
+ example_pending(example, error.pending_caller, error.message)
30
+ else
31
+ example_failed(example, error)
32
+ end
33
+ end
34
+
35
+ def failure(example, error)
36
+ backtrace_tweaker.tweak_backtrace(error)
37
+ failure = Failure.new(example, error)
38
+ @failures << failure
39
+ formatters.each do |f|
40
+ f.example_failed(example, @failures.length, failure)
41
+ end
42
+ end
43
+ alias_method :example_failed, :failure
44
+
45
+ def start(number_of_examples)
46
+ clear
47
+ @start_time = Time.new
48
+ formatters.each{|f| f.start(number_of_examples)}
49
+ end
50
+
51
+ def end
52
+ @end_time = Time.new
53
+ end
54
+
55
+ # Dumps the summary and returns the total number of failures
56
+ def dump
57
+ formatters.each{|f| f.start_dump}
58
+ dump_pending
59
+ dump_failures
60
+ formatters.each do |f|
61
+ f.dump_summary(duration, @examples.length, @failures.length, @pending_count)
62
+ f.close
63
+ end
64
+ @failures.length
65
+ end
66
+
67
+ private
68
+
69
+ def formatters
70
+ @options.formatters
71
+ end
72
+
73
+ def backtrace_tweaker
74
+ @options.backtrace_tweaker
75
+ end
76
+
77
+ def clear
78
+ @example_groups = []
79
+ @failures = []
80
+ @pending_count = 0
81
+ @examples = []
82
+ @start_time = nil
83
+ @end_time = nil
84
+ end
85
+
86
+ def dump_failures
87
+ return if @failures.empty?
88
+ @failures.inject(1) do |index, failure|
89
+ formatters.each{|f| f.dump_failure(index, failure)}
90
+ index + 1
91
+ end
92
+ end
93
+
94
+ def dump_pending
95
+ formatters.each{|f| f.dump_pending}
96
+ end
97
+
98
+ def duration
99
+ return @end_time - @start_time unless (@end_time.nil? or @start_time.nil?)
100
+ return "0.0"
101
+ end
102
+
103
+ def example_passed(example)
104
+ formatters.each{|f| f.example_passed(example)}
105
+ end
106
+
107
+ EXAMPLE_PENDING_DEPRECATION_WARNING = <<-WARNING
108
+ DEPRECATION NOTICE: RSpec's formatters have changed example_pending
109
+ to accept three arguments instead of just two. Please see the rdoc
110
+ for Spec::Runner::Formatter::BaseFormatter#example_pending
111
+ for more information.
112
+
113
+ Please update any custom formatters to accept the third argument
114
+ to example_pending. Support for example_pending with two arguments
115
+ and this warning message will be removed after the RSpec 1.1.5 release.
116
+ WARNING
117
+
118
+ def example_pending(example, pending_caller, message="Not Yet Implemented")
119
+ @pending_count += 1
120
+ formatters.each do |formatter|
121
+ if formatter_uses_deprecated_example_pending_method?(formatter)
122
+ Kernel.warn EXAMPLE_PENDING_DEPRECATION_WARNING
123
+ formatter.example_pending(example, message)
124
+ else
125
+ formatter.example_pending(example, message, pending_caller)
126
+ end
127
+ end
128
+ end
129
+
130
+ def formatter_uses_deprecated_example_pending_method?(formatter)
131
+ formatter.method(:example_pending).arity == 2
132
+ end
133
+
134
+ class Failure
135
+ attr_reader :example, :exception
136
+
137
+ def initialize(example, exception)
138
+ @example = example
139
+ @exception = exception
140
+ end
141
+
142
+ def header
143
+ if expectation_not_met?
144
+ "'#{example_name}' FAILED"
145
+ elsif pending_fixed?
146
+ "'#{example_name}' FIXED"
147
+ else
148
+ "#{@exception.class.name} in '#{example_name}'"
149
+ end
150
+ end
151
+
152
+ def pending_fixed?
153
+ @exception.is_a?(Spec::Example::PendingExampleFixedError)
154
+ end
155
+
156
+ def expectation_not_met?
157
+ @exception.is_a?(Spec::Expectations::ExpectationNotMetError)
158
+ end
159
+
160
+ protected
161
+ def example_name
162
+ @example.full_description
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end