rspec 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. data/CHANGES +122 -2
  2. data/README +10 -9
  3. data/Rakefile +22 -49
  4. data/TODO +2 -0
  5. data/bin/spec +1 -1
  6. data/bin/spec_translator +8 -8
  7. data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
  8. data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
  9. data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
  10. data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
  11. data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
  12. data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
  13. data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
  14. data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
  15. data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
  16. data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
  17. data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
  18. data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
  19. data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
  20. data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
  21. data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
  22. data/examples/pure/nested_classes_example.rb +36 -0
  23. data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
  24. data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
  25. data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
  26. data/examples/{priority.txt → pure/priority.txt} +0 -0
  27. data/examples/pure/shared_example_group_example.rb +66 -0
  28. data/examples/pure/shared_stack_examples.rb +38 -0
  29. data/examples/pure/spec_helper.rb +3 -0
  30. data/examples/{stack.rb → pure/stack.rb} +0 -0
  31. data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
  32. data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
  33. data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
  34. data/examples/stories/adder.rb +13 -0
  35. data/examples/stories/addition +34 -0
  36. data/examples/stories/addition.rb +9 -0
  37. data/examples/stories/calculator.rb +65 -0
  38. data/examples/stories/game-of-life/README.txt +21 -0
  39. data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
  40. data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
  41. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
  42. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
  43. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
  44. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
  45. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
  46. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
  47. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
  48. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
  49. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
  50. data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
  51. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
  52. data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
  53. data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
  54. data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
  55. data/examples/stories/game-of-life/life.rb +3 -0
  56. data/examples/stories/game-of-life/life/game.rb +23 -0
  57. data/examples/stories/game-of-life/life/grid.rb +43 -0
  58. data/examples/stories/helper.rb +9 -0
  59. data/examples/stories/steps/addition_steps.rb +18 -0
  60. data/lib/autotest/rspec.rb +1 -2
  61. data/lib/spec.rb +30 -6
  62. data/lib/spec/example.rb +12 -0
  63. data/lib/spec/{dsl → example}/configuration.rb +48 -39
  64. data/lib/spec/{dsl → example}/errors.rb +2 -2
  65. data/lib/spec/example/example_group.rb +16 -0
  66. data/lib/spec/example/example_group_factory.rb +62 -0
  67. data/lib/spec/example/example_group_methods.rb +412 -0
  68. data/lib/spec/example/example_matcher.rb +42 -0
  69. data/lib/spec/example/example_methods.rb +101 -0
  70. data/lib/spec/example/module_reopening_fix.rb +21 -0
  71. data/lib/spec/example/pending.rb +18 -0
  72. data/lib/spec/example/shared_example_group.rb +58 -0
  73. data/lib/spec/expectations/differs/default.rb +15 -10
  74. data/lib/spec/expectations/errors.rb +7 -1
  75. data/lib/spec/expectations/extensions/object.rb +12 -7
  76. data/lib/spec/expectations/handler.rb +13 -4
  77. data/lib/spec/extensions.rb +2 -0
  78. data/lib/spec/extensions/class.rb +24 -0
  79. data/lib/spec/extensions/main.rb +54 -0
  80. data/lib/spec/extensions/object.rb +5 -1
  81. data/lib/spec/interop/test.rb +10 -0
  82. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  83. data/lib/spec/interop/test/unit/testcase.rb +61 -0
  84. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  85. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  86. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +60 -0
  87. data/lib/spec/matchers.rb +11 -15
  88. data/lib/spec/matchers/be.rb +23 -6
  89. data/lib/spec/matchers/change.rb +25 -1
  90. data/lib/spec/matchers/exist.rb +17 -0
  91. data/lib/spec/matchers/operator_matcher.rb +1 -0
  92. data/lib/spec/matchers/simple_matcher.rb +29 -0
  93. data/lib/spec/matchers/throw_symbol.rb +2 -0
  94. data/lib/spec/mocks.rb +5 -2
  95. data/lib/spec/mocks/argument_expectation.rb +1 -1
  96. data/lib/spec/mocks/message_expectation.rb +62 -44
  97. data/lib/spec/mocks/methods.rb +2 -2
  98. data/lib/spec/mocks/mock.rb +24 -3
  99. data/lib/spec/mocks/proxy.rb +26 -23
  100. data/lib/spec/mocks/space.rb +1 -1
  101. data/lib/spec/mocks/spec_methods.rb +20 -12
  102. data/lib/spec/rake/spectask.rb +19 -1
  103. data/lib/spec/rake/verify_rcov.rb +1 -1
  104. data/lib/spec/runner.rb +33 -10
  105. data/lib/spec/runner/backtrace_tweaker.rb +3 -3
  106. data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
  107. data/lib/spec/runner/command_line.rb +18 -12
  108. data/lib/spec/runner/drb_command_line.rb +4 -5
  109. data/lib/spec/runner/example_group_runner.rb +59 -0
  110. data/lib/spec/runner/formatter/base_formatter.rb +10 -8
  111. data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
  112. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
  113. data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
  114. data/lib/spec/runner/formatter/html_formatter.rb +37 -27
  115. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  116. data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
  117. data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
  118. data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
  119. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
  120. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  121. data/lib/spec/runner/heckle_runner.rb +9 -9
  122. data/lib/spec/runner/option_parser.rb +140 -138
  123. data/lib/spec/runner/options.rb +168 -90
  124. data/lib/spec/runner/reporter.rb +58 -40
  125. data/lib/spec/runner/spec_parser.rb +11 -8
  126. data/lib/spec/story.rb +10 -0
  127. data/lib/spec/story/extensions.rb +1 -0
  128. data/lib/spec/story/extensions/main.rb +86 -0
  129. data/lib/spec/story/given_scenario.rb +14 -0
  130. data/lib/spec/story/runner.rb +58 -0
  131. data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
  132. data/lib/spec/story/runner/scenario_collector.rb +18 -0
  133. data/lib/spec/story/runner/scenario_runner.rb +46 -0
  134. data/lib/spec/story/runner/story_mediator.rb +123 -0
  135. data/lib/spec/story/runner/story_parser.rb +227 -0
  136. data/lib/spec/story/runner/story_runner.rb +67 -0
  137. data/lib/spec/story/scenario.rb +14 -0
  138. data/lib/spec/story/step.rb +48 -0
  139. data/lib/spec/story/step_group.rb +89 -0
  140. data/lib/spec/story/step_mother.rb +37 -0
  141. data/lib/spec/story/story.rb +42 -0
  142. data/lib/spec/story/world.rb +124 -0
  143. data/lib/spec/version.rb +4 -5
  144. data/plugins/mock_frameworks/rspec.rb +1 -1
  145. data/spec/autotest/rspec_spec.rb +13 -7
  146. data/spec/autotest_helper.rb +4 -3
  147. data/spec/rspec_suite.rb +7 -0
  148. data/spec/ruby_forker.rb +13 -0
  149. data/spec/spec/example/configuration_spec.rb +290 -0
  150. data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
  151. data/spec/spec/example/example_group_factory_spec.rb +129 -0
  152. data/spec/spec/example/example_group_methods_spec.rb +465 -0
  153. data/spec/spec/example/example_group_spec.rb +711 -0
  154. data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
  155. data/spec/spec/example/example_methods_spec.rb +75 -0
  156. data/spec/spec/example/example_runner_spec.rb +194 -0
  157. data/spec/spec/example/example_spec.rb +53 -0
  158. data/spec/spec/example/nested_example_group_spec.rb +59 -0
  159. data/spec/spec/example/pending_module_spec.rb +31 -0
  160. data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
  161. data/spec/spec/example/shared_example_group_spec.rb +265 -0
  162. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  163. data/spec/spec/expectations/differs/default_spec.rb +5 -3
  164. data/spec/spec/expectations/extensions/object_spec.rb +63 -2
  165. data/spec/spec/extensions/main_spec.rb +50 -0
  166. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
  167. data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
  168. data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
  169. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  170. data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
  171. data/spec/spec/matchers/be_spec.rb +15 -0
  172. data/spec/spec/matchers/change_spec.rb +87 -0
  173. data/spec/spec/matchers/description_generation_spec.rb +31 -37
  174. data/spec/spec/matchers/exist_spec.rb +31 -22
  175. data/spec/spec/matchers/handler_spec.rb +42 -1
  176. data/spec/spec/matchers/have_spec.rb +1 -1
  177. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
  178. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  179. data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
  180. data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
  181. data/spec/spec/mocks/bug_report_10263.rb +24 -0
  182. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  183. data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
  184. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
  185. data/spec/spec/mocks/mock_spec.rb +200 -102
  186. data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
  187. data/spec/spec/mocks/options_hash_spec.rb +19 -7
  188. data/spec/spec/mocks/partial_mock_spec.rb +31 -9
  189. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
  190. data/spec/spec/mocks/stub_spec.rb +120 -98
  191. data/spec/spec/package/bin_spec_spec.rb +7 -5
  192. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  193. data/spec/spec/runner/command_line_spec.rb +140 -27
  194. data/spec/spec/runner/drb_command_line_spec.rb +39 -31
  195. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
  196. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
  197. data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
  198. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  199. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
  200. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  201. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
  202. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
  203. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
  204. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
  205. data/spec/spec/runner/heckle_runner_spec.rb +29 -14
  206. data/spec/spec/runner/heckler_spec.rb +4 -5
  207. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
  208. data/spec/spec/runner/option_parser_spec.rb +86 -58
  209. data/spec/spec/runner/options_spec.rb +239 -120
  210. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  211. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  212. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  213. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -6
  214. data/spec/spec/runner/reporter_spec.rb +147 -163
  215. data/spec/spec/runner/spec_parser_spec.rb +31 -0
  216. data/spec/spec/runner_spec.rb +11 -0
  217. data/spec/spec/spec_classes.rb +12 -5
  218. data/spec/spec/story/builders.rb +46 -0
  219. data/spec/spec/story/extensions/main_spec.rb +161 -0
  220. data/spec/spec/story/extensions_spec.rb +14 -0
  221. data/spec/spec/story/given_scenario_spec.rb +27 -0
  222. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
  223. data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
  224. data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
  225. data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
  226. data/spec/spec/story/runner/story_parser_spec.rb +384 -0
  227. data/spec/spec/story/runner/story_runner_spec.rb +219 -0
  228. data/spec/spec/story/runner_spec.rb +106 -0
  229. data/spec/spec/story/scenario_spec.rb +20 -0
  230. data/spec/spec/story/step_group_spec.rb +157 -0
  231. data/spec/spec/story/step_mother_spec.rb +72 -0
  232. data/spec/spec/story/step_spec.rb +147 -0
  233. data/spec/spec/story/story_helper.rb +2 -0
  234. data/spec/spec/story/story_spec.rb +86 -0
  235. data/spec/spec/story/world_spec.rb +416 -0
  236. data/spec/spec/translator_spec.rb +2 -1
  237. data/spec/spec_helper.rb +59 -2
  238. data/stories/all.rb +5 -0
  239. data/stories/example_groups/autogenerated_docstrings +26 -0
  240. data/stories/example_groups/example_group_with_should_methods +17 -0
  241. data/stories/example_groups/nested_groups +17 -0
  242. data/stories/example_groups/output +20 -0
  243. data/stories/example_groups/stories.rb +7 -0
  244. data/stories/helper.rb +6 -0
  245. data/stories/interop/examples_and_tests_together +30 -0
  246. data/stories/interop/stories.rb +7 -0
  247. data/stories/interop/test_case_with_should_methods +17 -0
  248. data/stories/pending_stories/README +3 -0
  249. data/stories/resources/helpers/cmdline.rb +9 -0
  250. data/stories/resources/helpers/story_helper.rb +16 -0
  251. data/stories/resources/matchers/smart_match.rb +37 -0
  252. data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
  253. data/stories/resources/spec/simple_spec.rb +8 -0
  254. data/stories/resources/steps/running_rspec.rb +50 -0
  255. data/stories/resources/test/spec_and_test_together.rb +57 -0
  256. data/stories/resources/test/test_case_with_should_methods.rb +30 -0
  257. metadata +232 -106
  258. data/EXAMPLES.rd +0 -111
  259. data/examples/multi_threaded_behaviour_runner.rb +0 -25
  260. data/examples/shared_behaviours_example.rb +0 -39
  261. data/examples/spec_helper.rb +0 -1
  262. data/examples/test_case_adapter_example.rb +0 -26
  263. data/examples/test_case_spec.rb +0 -65
  264. data/lib/spec/dsl.rb +0 -11
  265. data/lib/spec/dsl/behaviour.rb +0 -220
  266. data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
  267. data/lib/spec/dsl/behaviour_eval.rb +0 -231
  268. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  269. data/lib/spec/dsl/composite_proc_builder.rb +0 -33
  270. data/lib/spec/dsl/description.rb +0 -76
  271. data/lib/spec/dsl/example.rb +0 -135
  272. data/lib/spec/dsl/example_matcher.rb +0 -40
  273. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  274. data/lib/spec/runner/behaviour_runner.rb +0 -123
  275. data/lib/spec/runner/extensions/kernel.rb +0 -50
  276. data/lib/spec/runner/extensions/object.rb +0 -32
  277. data/lib/spec/runner/formatter.rb +0 -9
  278. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
  279. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  280. data/lib/spec/test_case_adapter.rb +0 -10
  281. data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
  282. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
  283. data/spec/spec/dsl/behaviour_spec.rb +0 -661
  284. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
  285. data/spec/spec/dsl/configuration_spec.rb +0 -55
  286. data/spec/spec/dsl/description_spec.rb +0 -89
  287. data/spec/spec/dsl/example_class_spec.rb +0 -24
  288. data/spec/spec/dsl/example_instance_spec.rb +0 -160
  289. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  290. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
  291. data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
  292. data/spec/spec/runner/context_matching_spec.rb +0 -27
  293. data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
  294. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  295. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
  296. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
  297. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  298. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  299. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  300. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  301. data/spec/spec/runner/object_ext_spec.rb +0 -11
@@ -8,7 +8,7 @@ require 'rake/tasklib'
8
8
  module Spec
9
9
  module Rake
10
10
 
11
- # A Rake task that runs a set of RSpec contexts.
11
+ # A Rake task that runs a set of specs.
12
12
  #
13
13
  # Example:
14
14
  #
@@ -44,6 +44,17 @@ module Spec
44
44
  # Each attribute of this task may be a proc. This allows for lazy evaluation,
45
45
  # which is sometimes handy if you want to defer the evaluation of an attribute value
46
46
  # until the task is run (as opposed to when it is defined).
47
+ #
48
+ # This task can also be used to run existing Test::Unit tests and get RSpec
49
+ # output, for example like this:
50
+ #
51
+ # require 'rubygems'
52
+ # require 'spec/rake/spectask'
53
+ # Spec::Rake::SpecTask.new do |t|
54
+ # t.ruby_opts = ['-rtest/unit']
55
+ # t.spec_files = FileList['test/**/*_test.rb']
56
+ # end
57
+ #
47
58
  class SpecTask < ::Rake::TaskLib
48
59
  class << self
49
60
  def attr_accessor(*names)
@@ -106,6 +117,10 @@ module Spec
106
117
  # used, then the list of spec files is the union of the two.
107
118
  # Setting the SPEC environment variable overrides this.
108
119
  attr_accessor :spec_files
120
+
121
+ # Use verbose output. If this is set to true, the task will print
122
+ # the executed spec command to stdout. Defaults to false.
123
+ attr_accessor :verbose
109
124
 
110
125
  # Defines a new task, using the name +name+.
111
126
  def initialize(name=:spec)
@@ -161,6 +176,9 @@ module Spec
161
176
  cmd << %Q| > "#{out}"|
162
177
  STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
163
178
  end
179
+ if verbose
180
+ puts cmd
181
+ end
164
182
  unless system(cmd)
165
183
  STDERR.puts failure_message if failure_message
166
184
  raise("Command #{cmd} failed") if fail_on_error
@@ -38,7 +38,7 @@ module RCov
38
38
  total_coverage = nil
39
39
 
40
40
  File.open(index_html).each_line do |line|
41
- if line =~ /<tt.*>(\d+\.\d+)%<\/tt>&nbsp;<\/td>/
41
+ if line =~ /<tt class='coverage_total'>(\d+\.\d+)%<\/tt>/
42
42
  total_coverage = eval($1)
43
43
  break
44
44
  end
@@ -1,14 +1,12 @@
1
- require 'spec/runner/formatter'
2
- require 'spec/runner/behaviour_runner'
3
1
  require 'spec/runner/options'
4
2
  require 'spec/runner/option_parser'
3
+ require 'spec/runner/example_group_runner'
5
4
  require 'spec/runner/command_line'
6
5
  require 'spec/runner/drb_command_line'
7
6
  require 'spec/runner/backtrace_tweaker'
8
7
  require 'spec/runner/reporter'
9
- require 'spec/runner/extensions/object'
10
- require 'spec/runner/extensions/kernel'
11
8
  require 'spec/runner/spec_parser'
9
+ require 'spec/runner/class_and_arguments_parser'
12
10
 
13
11
  module Spec
14
12
  # == Behaviours and Examples
@@ -16,7 +14,7 @@ module Spec
16
14
  # Rather than expressing examples in classes, RSpec uses a custom domain specific language to
17
15
  # describe Behaviours and Examples of those behaviours.
18
16
  #
19
- # A Behaviour is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context
17
+ # A Example is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context
20
18
  # in which you will run your executable example - a set of known objects in a known starting state.
21
19
  # We begin be describing
22
20
  #
@@ -32,7 +30,7 @@ module Spec
32
30
  #
33
31
  # end
34
32
  #
35
- # We use the before block to set up the Behaviour (given), and then the #it method to
33
+ # We use the before block to set up the Example (given), and then the #it method to
36
34
  # hold the example code that expresses the event (when) and the expected outcome (then).
37
35
  #
38
36
  # == Helper Methods
@@ -47,7 +45,7 @@ module Spec
47
45
  #
48
46
  # == Setup and Teardown
49
47
  #
50
- # You can use before and after within a Behaviour. Both methods take an optional
48
+ # You can use before and after within a Example. Both methods take an optional
51
49
  # scope argument so you can run the block before :each example or before :all examples
52
50
  #
53
51
  # describe "..." do
@@ -140,10 +138,35 @@ module Spec
140
138
  # ...
141
139
  # end
142
140
  # end
141
+ #
142
+ # You can also assign the shared behaviour to a module and include that
143
+ #
144
+ # AllEditions = describe "All Editions", :shared => true do
145
+ # it "should do all editions stuff" ...
146
+ # end
147
+ #
148
+ # describe SmallEdition do
149
+ # it_should_behave_like AllEditions
150
+ #
151
+ # it "should do small edition stuff" do
152
+ # ...
153
+ # end
154
+ # end
155
+ #
156
+ # And, for those of you who prefer to use something more like Ruby, you
157
+ # can just include the module directly
158
+ #
159
+ # describe SmallEdition do
160
+ # include AllEditions
161
+ #
162
+ # it "should do small edition stuff" do
163
+ # ...
164
+ # end
165
+ # end
143
166
  module Runner
144
167
  class << self
145
168
  def configuration # :nodoc:
146
- @configuration ||= Spec::DSL::Configuration.new
169
+ @configuration ||= Spec::Example::Configuration.new
147
170
  end
148
171
 
149
172
  # Use this to configure various configurable aspects of
@@ -154,11 +177,11 @@ module Spec
154
177
  # end
155
178
  #
156
179
  # The yielded <tt>configuration</tt> object is a
157
- # Spec::DSL::Configuration instance. See its RDoc
180
+ # Spec::Example::Configuration instance. See its RDoc
158
181
  # for details about what you can do with it.
159
182
  #
160
183
  def configure
161
- yield configuration if @configuration.nil?
184
+ yield configuration
162
185
  end
163
186
  end
164
187
  end
@@ -7,7 +7,7 @@ module Spec
7
7
  end
8
8
 
9
9
  class NoisyBacktraceTweaker < BacktraceTweaker
10
- def tweak_backtrace(error, spec_name)
10
+ def tweak_backtrace(error)
11
11
  return if error.backtrace.nil?
12
12
  error.backtrace.each do |line|
13
13
  clean_up_double_slashes(line)
@@ -19,7 +19,7 @@ module Spec
19
19
  class QuietBacktraceTweaker < BacktraceTweaker
20
20
  unless defined?(IGNORE_PATTERNS)
21
21
  root_dir = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
22
- spec_files = Dir["#{root_dir}/lib/spec/*"].map do |path|
22
+ spec_files = Dir["#{root_dir}/lib/*"].map do |path|
23
23
  subpath = path[root_dir.length..-1]
24
24
  /#{subpath}/
25
25
  end
@@ -38,7 +38,7 @@ module Spec
38
38
  ]
39
39
  end
40
40
 
41
- def tweak_backtrace(error, spec_name)
41
+ def tweak_backtrace(error)
42
42
  return if error.backtrace.nil?
43
43
  error.backtrace.collect! do |line|
44
44
  clean_up_double_slashes(line)
@@ -0,0 +1,16 @@
1
+ module Spec
2
+ module Runner
3
+ class ClassAndArgumentsParser
4
+ class << self
5
+ def parse(s)
6
+ if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/
7
+ arg = $2 == "" ? nil : $2
8
+ [$1, arg]
9
+ else
10
+ raise "Couldn't parse #{s.inspect}"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -4,18 +4,24 @@ module Spec
4
4
  module Runner
5
5
  # Facade to run specs without having to fork a new ruby process (using `spec ...`)
6
6
  class CommandLine
7
- # Runs specs. +argv+ is the commandline args as per the spec commandline API, +err+
8
- # and +out+ are the streams output will be written to. +exit+ tells whether or
9
- # not a system exit should be called after the specs are run and
10
- # +warn_if_no_files+ tells whether or not a warning (the help message)
11
- # should be printed to +err+ in case no files are specified.
12
- def self.run(argv, err, out, exit=true, warn_if_no_files=true)
13
- old_behaviour_runner = defined?($behaviour_runner) ? $behaviour_runner : nil
14
- $behaviour_runner = OptionParser.new.create_behaviour_runner(argv, err, out, warn_if_no_files)
15
- return if $behaviour_runner.nil? # This is the case if we use --drb
16
-
17
- $behaviour_runner.run(argv, exit)
18
- $behaviour_runner = old_behaviour_runner
7
+ class << self
8
+ # Runs specs. +argv+ is the commandline args as per the spec commandline API, +err+
9
+ # and +out+ are the streams output will be written to.
10
+ def run(instance_rspec_options)
11
+ # NOTE - this call to init_rspec_options is not spec'd, but neither is any of this
12
+ # swapping of $rspec_options. That is all here to enable rspec to run against itself
13
+ # and maintain coverage in a single process. Therefore, DO NOT mess with this stuff
14
+ # unless you know what you are doing!
15
+ init_rspec_options(instance_rspec_options)
16
+ orig_rspec_options = rspec_options
17
+ begin
18
+ $rspec_options = instance_rspec_options
19
+ return $rspec_options.run_examples
20
+ ensure
21
+ ::Spec.run = true
22
+ $rspec_options = orig_rspec_options
23
+ end
24
+ end
19
25
  end
20
26
  end
21
27
  end
@@ -6,14 +6,13 @@ module Spec
6
6
  class DrbCommandLine
7
7
  # Runs specs on a DRB server. Note that this API is similar to that of
8
8
  # CommandLine - making it possible for clients to use both interchangeably.
9
- def self.run(argv, stderr, stdout, exit=true, warn_if_no_files=true)
9
+ def self.run(options)
10
10
  begin
11
11
  DRb.start_service
12
12
  spec_server = DRbObject.new_with_uri("druby://localhost:8989")
13
- spec_server.run(argv, stderr, stdout)
14
- rescue DRb::DRbConnError
15
- stderr.puts "No server is running"
16
- exit 1 if exit
13
+ spec_server.run(options.argv, options.error_stream, options.output_stream)
14
+ rescue DRb::DRbConnError => e
15
+ options.error_stream.puts "No server is running"
17
16
  end
18
17
  end
19
18
  end
@@ -0,0 +1,59 @@
1
+ module Spec
2
+ module Runner
3
+ class ExampleGroupRunner
4
+ def initialize(options)
5
+ @options = options
6
+ end
7
+
8
+ def load_files(files)
9
+ # It's important that loading files (or choosing not to) stays the
10
+ # responsibility of the ExampleGroupRunner. Some implementations (like)
11
+ # the one using DRb may choose *not* to load files, but instead tell
12
+ # someone else to do it over the wire.
13
+ files.each do |file|
14
+ load file
15
+ end
16
+ end
17
+
18
+ def run
19
+ prepare
20
+ success = true
21
+ example_groups.each do |example_group|
22
+ success = success & example_group.run
23
+ end
24
+ return success
25
+ ensure
26
+ finish
27
+ end
28
+
29
+ protected
30
+ def prepare
31
+ reporter.start(number_of_examples)
32
+ example_groups.reverse! if reverse
33
+ end
34
+
35
+ def finish
36
+ reporter.end
37
+ reporter.dump
38
+ end
39
+
40
+ def reporter
41
+ @options.reporter
42
+ end
43
+
44
+ def reverse
45
+ @options.reverse
46
+ end
47
+
48
+ def example_groups
49
+ @options.example_groups
50
+ end
51
+
52
+ def number_of_examples
53
+ @options.number_of_examples
54
+ end
55
+ end
56
+ # TODO: BT - Deprecate BehaviourRunner?
57
+ BehaviourRunner = ExampleGroupRunner
58
+ end
59
+ end
@@ -3,7 +3,9 @@ module Spec
3
3
  module Formatter
4
4
  # Baseclass for formatters that implements all required methods as no-ops.
5
5
  class BaseFormatter
6
- def initialize(where)
6
+ attr_accessor :example_group, :options, :where
7
+ def initialize(options, where)
8
+ @options = options
7
9
  @where = where
8
10
  end
9
11
 
@@ -12,16 +14,17 @@ module Spec
12
14
  # formatters that need to provide progress on feedback (graphical ones)
13
15
  #
14
16
  # This method will only be invoked once, and the next one to be invoked
15
- # is #add_behaviour
17
+ # is #add_example_group
16
18
  def start(example_count)
17
19
  end
18
20
 
19
- # This method is invoked at the beginning of the execution of each behaviour.
20
- # +name+ is the name of the behaviour and +first+ is true if it is the
21
- # first behaviour - otherwise it's false.
21
+ # This method is invoked at the beginning of the execution of each example_group.
22
+ # +name+ is the name of the example_group and +first+ is true if it is the
23
+ # first example_group - otherwise it's false.
22
24
  #
23
25
  # The next method to be invoked after this is #example_failed or #example_finished
24
- def add_behaviour(name)
26
+ def add_example_group(example_group)
27
+ @example_group = example_group
25
28
  end
26
29
 
27
30
  # This method is invoked when an +example+ starts.
@@ -41,10 +44,9 @@ module Spec
41
44
 
42
45
  # This method is invoked when an example is not yet implemented (i.e. has not
43
46
  # been provided a block), or when an ExamplePendingError is raised.
44
- # +name+ is the name of the example.
45
47
  # +message+ is the message from the ExamplePendingError, if it exists, or the
46
48
  # default value of "Not Yet Implemented"
47
- def example_pending(behaviour_name, example_name, message)
49
+ def example_pending(example_group_description, example, message)
48
50
  end
49
51
 
50
52
  # This method is invoked after all of the examples have executed. The next method
@@ -1,3 +1,5 @@
1
+ require 'spec/runner/formatter/base_formatter'
2
+
1
3
  module Spec
2
4
  module Runner
3
5
  module Formatter
@@ -5,13 +7,12 @@ module Spec
5
7
  # non-text based ones too - just ignore the +output+ constructor
6
8
  # argument.
7
9
  class BaseTextFormatter < BaseFormatter
8
- attr_writer :dry_run
9
-
10
+ attr_reader :output, :pending_examples
10
11
  # Creates a new instance that will write to +where+. If +where+ is a
11
12
  # String, output will be written to the File with that name, otherwise
12
13
  # +where+ is exected to be an IO (or an object that responds to #puts and #write).
13
- def initialize(where)
14
- super(where)
14
+ def initialize(options, where)
15
+ super
15
16
  if where.is_a?(String)
16
17
  @output = File.open(where, 'w')
17
18
  elsif where == STDOUT
@@ -22,21 +23,13 @@ module Spec
22
23
  else
23
24
  @output = where
24
25
  end
25
- @colour = false
26
- @dry_run = false
27
- @snippet_extractor = SnippetExtractor.new
28
26
  @pending_examples = []
29
27
  end
30
28
 
31
- def example_pending(behaviour_name, example_name, message)
32
- @pending_examples << ["#{behaviour_name} #{example_name}", message]
29
+ def example_pending(example_group_description, example, message)
30
+ @pending_examples << ["#{example_group_description} #{example.description}", message]
33
31
  end
34
32
 
35
- def colour=(colour)
36
- @colour = colour
37
- begin ; require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/ ; rescue LoadError ; raise "You must gem install win32console to use colour on Windows" ; end
38
- end
39
-
40
33
  def dump_failure(counter, failure)
41
34
  @output.puts
42
35
  @output.puts "#{counter.to_s})"
@@ -56,7 +49,7 @@ module Spec
56
49
  end
57
50
 
58
51
  def dump_summary(duration, example_count, failure_count, pending_count)
59
- return if @dry_run
52
+ return if dry_run?
60
53
  @output.puts
61
54
  @output.puts "Finished in #{duration} seconds"
62
55
  @output.puts
@@ -74,7 +67,6 @@ module Spec
74
67
  @output.puts red(summary)
75
68
  end
76
69
  @output.flush
77
- dump_pending
78
70
  end
79
71
 
80
72
  def dump_pending
@@ -100,13 +92,21 @@ module Spec
100
92
  end
101
93
 
102
94
  protected
103
-
95
+
96
+ def colour?
97
+ @options.colour ? true : false
98
+ end
99
+
100
+ def dry_run?
101
+ @options.dry_run ? true : false
102
+ end
103
+
104
104
  def backtrace_line(line)
105
105
  line.sub(/\A([^:]+:\d+)$/, '\\1:')
106
106
  end
107
107
 
108
108
  def colour(text, colour_code)
109
- return text unless @colour && output_to_tty?
109
+ return text unless colour? && output_to_tty?
110
110
  "#{colour_code}#{text}\e[0m"
111
111
  end
112
112
 
@@ -0,0 +1,31 @@
1
+ require 'spec/runner/formatter/base_text_formatter'
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ class FailingExampleGroupsFormatter < BaseTextFormatter
7
+ def add_example_group(example_group)
8
+ super
9
+ @example_group_description_parts = example_group.description_parts
10
+ end
11
+
12
+ def example_failed(example, counter, failure)
13
+ if @example_group_description_parts
14
+ description_parts = @example_group_description_parts.collect do |description|
15
+ description =~ /(.*) \(druby.*\)$/ ? $1 : description
16
+ end
17
+ @output.puts ::Spec::Example::ExampleGroupMethods.description_text(*description_parts)
18
+ @output.flush
19
+ @example_group_description_parts = nil
20
+ end
21
+ end
22
+
23
+ def dump_failure(counter, failure)
24
+ end
25
+
26
+ def dump_summary(duration, example_count, failure_count, pending_count)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end