rspec 1.1.11 → 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 (269) hide show
  1. data/.autotest +4 -0
  2. data/History.txt +55 -0
  3. data/Manifest.txt +102 -122
  4. data/README.txt +30 -12
  5. data/Rakefile +10 -10
  6. data/TODO.txt +10 -2
  7. data/{failing_examples → examples/failing}/README.txt +0 -0
  8. data/{failing_examples → examples/failing}/diffing_spec.rb +0 -0
  9. data/{failing_examples → examples/failing}/failing_autogenerated_docstrings_example.rb +0 -0
  10. data/{failing_examples/failure_in_teardown.rb → examples/failing/failure_in_after.rb} +1 -1
  11. data/{failing_examples/failure_in_setup.rb → examples/failing/failure_in_before.rb} +1 -1
  12. data/{failing_examples → examples/failing}/mocking_example.rb +0 -0
  13. data/{failing_examples → examples/failing}/mocking_with_flexmock.rb +0 -0
  14. data/{failing_examples → examples/failing}/mocking_with_mocha.rb +0 -0
  15. data/{failing_examples → examples/failing}/mocking_with_rr.rb +0 -0
  16. data/{failing_examples → examples/failing}/partial_mock_example.rb +0 -0
  17. data/{failing_examples → examples/failing}/predicate_example.rb +5 -0
  18. data/{failing_examples → examples/failing}/raising_example.rb +0 -0
  19. data/{failing_examples → examples/failing}/spec_helper.rb +1 -1
  20. data/{failing_examples → examples/failing}/syntax_error_example.rb +0 -0
  21. data/{failing_examples → examples/failing}/team_spec.rb +0 -0
  22. data/{failing_examples → examples/failing}/timeout_behaviour.rb +0 -0
  23. data/examples/{pure → passing}/autogenerated_docstrings_example.rb +6 -0
  24. data/examples/{pure → passing}/before_and_after_example.rb +0 -0
  25. data/examples/{pure → passing}/behave_as_example.rb +0 -0
  26. data/examples/{pure → passing}/custom_expectation_matchers.rb +0 -0
  27. data/examples/{pure → passing}/custom_formatter.rb +1 -1
  28. data/examples/{pure → passing}/dynamic_spec.rb +2 -2
  29. data/examples/{pure → passing}/file_accessor.rb +0 -0
  30. data/examples/{pure → passing}/file_accessor_spec.rb +0 -0
  31. data/examples/{pure → passing}/greeter_spec.rb +0 -0
  32. data/examples/{pure → passing}/helper_method_example.rb +0 -0
  33. data/examples/{pure → passing}/io_processor.rb +0 -0
  34. data/examples/{pure → passing}/io_processor_spec.rb +0 -0
  35. data/examples/{pure → passing}/legacy_spec.rb +0 -0
  36. data/examples/{pure → passing}/mocking_example.rb +0 -0
  37. data/examples/{pure/multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +1 -3
  38. data/examples/{pure → passing}/nested_classes_example.rb +0 -0
  39. data/examples/{pure → passing}/partial_mock_example.rb +0 -0
  40. data/examples/{pure → passing}/pending_example.rb +0 -0
  41. data/examples/{pure → passing}/predicate_example.rb +0 -0
  42. data/examples/{pure → passing}/priority.txt +0 -0
  43. data/examples/{pure → passing}/shared_example_group_example.rb +0 -0
  44. data/examples/{pure → passing}/shared_stack_examples.rb +1 -3
  45. data/examples/passing/simple_matcher_example.rb +31 -0
  46. data/examples/{pure → passing}/spec_helper.rb +0 -0
  47. data/examples/{pure → passing}/stack.rb +0 -0
  48. data/examples/{pure → passing}/stack_spec.rb +3 -2
  49. data/examples/{pure → passing}/stack_spec_with_nested_example_groups.rb +0 -0
  50. data/examples/{pure → passing}/stubbing_example.rb +0 -0
  51. data/examples/{pure → passing}/yielding_example.rb +0 -0
  52. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
  53. data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
  54. data/{stories/example_groups/autogenerated_docstrings → features/example_groups/autogenerated_docstrings.feature} +5 -5
  55. data/{stories/example_groups/example_group_with_should_methods → features/example_groups/example_group_with_should_methods.feature} +3 -3
  56. data/{stories/example_groups/nested_groups → features/example_groups/nested_groups.feature} +4 -4
  57. data/{stories/example_groups/output → features/example_groups/output.feature} +3 -8
  58. data/{stories/interop/examples_and_tests_together → features/interop/examples_and_tests_together.feature} +5 -4
  59. data/features/interop/test_but_not_test_unit.feature +14 -0
  60. data/{stories/interop/test_case_with_should_methods → features/interop/test_case_with_should_methods.feature} +2 -2
  61. data/{stories/mock_framework_integration/use_flexmock.story → features/mock_framework_integration/use_flexmock.feature} +1 -1
  62. data/features/step_definitions/running_rspec.rb +54 -0
  63. data/features/support/env.rb +26 -0
  64. data/{stories/resources → features/support}/helpers/cmdline.rb +0 -0
  65. data/{stories/resources → features/support}/helpers/story_helper.rb +1 -1
  66. data/{stories/resources → features/support}/matchers/smart_match.rb +0 -0
  67. data/{plugins → lib/adapters}/mock_frameworks/flexmock.rb +1 -1
  68. data/{plugins → lib/adapters}/mock_frameworks/mocha.rb +1 -1
  69. data/{plugins → lib/adapters}/mock_frameworks/rr.rb +1 -1
  70. data/{plugins → lib/adapters}/mock_frameworks/rspec.rb +2 -2
  71. data/lib/autotest/rspec.rb +4 -3
  72. data/lib/spec.rb +2 -27
  73. data/lib/spec/dsl.rb +1 -0
  74. data/lib/spec/{extensions → dsl}/main.rb +10 -10
  75. data/lib/spec/example.rb +175 -1
  76. data/lib/spec/example/before_and_after_hooks.rb +30 -24
  77. data/lib/spec/example/example_group.rb +1 -0
  78. data/lib/spec/example/example_group_factory.rb +26 -9
  79. data/lib/spec/example/example_group_methods.rb +138 -113
  80. data/lib/spec/example/example_methods.rb +88 -25
  81. data/lib/spec/example/shared_example_group.rb +28 -21
  82. data/lib/spec/expectations.rb +22 -18
  83. data/lib/spec/expectations/handler.rb +16 -36
  84. data/lib/spec/interop/test/unit/testcase.rb +19 -17
  85. data/lib/spec/interop/test/unit/testresult.rb +1 -1
  86. data/lib/spec/interop/test/unit/testsuite_adapter.rb +1 -1
  87. data/lib/spec/matchers.rb +7 -28
  88. data/lib/spec/matchers/be.rb +103 -116
  89. data/lib/spec/matchers/be_close.rb +6 -22
  90. data/lib/spec/matchers/eql.rb +7 -25
  91. data/lib/spec/matchers/equal.rb +7 -25
  92. data/lib/spec/matchers/errors.rb +5 -0
  93. data/lib/spec/matchers/exist.rb +8 -14
  94. data/lib/spec/matchers/generated_descriptions.rb +48 -0
  95. data/lib/spec/matchers/has.rb +12 -28
  96. data/lib/spec/matchers/include.rb +12 -9
  97. data/lib/spec/matchers/match.rb +8 -27
  98. data/lib/spec/matchers/match_array.rb +79 -0
  99. data/lib/spec/matchers/method_missing.rb +9 -0
  100. data/lib/spec/matchers/operator_matcher.rb +39 -48
  101. data/lib/spec/matchers/raise_error.rb +4 -8
  102. data/lib/spec/matchers/respond_to.rb +33 -8
  103. data/lib/spec/matchers/throw_symbol.rb +49 -17
  104. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  105. data/lib/spec/mocks/argument_constraints.rb +77 -5
  106. data/lib/spec/mocks/message_expectation.rb +7 -7
  107. data/lib/spec/mocks/proxy.rb +14 -12
  108. data/lib/spec/rake/spectask.rb +4 -6
  109. data/lib/spec/ruby.rb +9 -0
  110. data/lib/spec/runner.rb +37 -162
  111. data/lib/spec/runner/backtrace_tweaker.rb +5 -3
  112. data/lib/spec/runner/class_and_arguments_parser.rb +7 -9
  113. data/lib/spec/runner/command_line.rb +6 -8
  114. data/lib/spec/{example → runner}/configuration.rb +46 -47
  115. data/lib/spec/runner/example_group_runner.rb +15 -4
  116. data/lib/spec/runner/formatter/base_text_formatter.rb +4 -3
  117. data/lib/spec/runner/formatter/html_formatter.rb +14 -11
  118. data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
  119. data/lib/spec/runner/heckle_runner.rb +58 -56
  120. data/lib/spec/runner/option_parser.rb +8 -4
  121. data/lib/spec/runner/options.rb +29 -14
  122. data/lib/spec/runner/reporter.rb +1 -1
  123. data/lib/spec/runner/spec_parser.rb +11 -9
  124. data/lib/spec/story/runner.rb +40 -42
  125. data/lib/spec/story/runner/story_runner.rb +10 -6
  126. data/lib/spec/story/world.rb +66 -70
  127. data/lib/spec/version.rb +4 -2
  128. data/{rake_tasks → resources/rake}/examples.rake +0 -0
  129. data/{rake_tasks → resources/rake}/examples_with_rcov.rake +0 -0
  130. data/{rake_tasks → resources/rake}/failing_examples_with_html.rake +0 -0
  131. data/{rake_tasks → resources/rake}/verify_rcov.rake +0 -0
  132. data/{stories/resources → resources}/spec/example_group_with_should_methods.rb +1 -1
  133. data/{stories/resources → resources}/spec/simple_spec.rb +1 -1
  134. data/resources/spec/spec_with_flexmock.rb +19 -0
  135. data/{stories/resources → resources}/test/spec_and_test_together.rb +1 -1
  136. data/resources/test/spec_including_test_but_not_unit.rb +11 -0
  137. data/{stories/resources → resources}/test/test_case_with_should_methods.rb +2 -2
  138. data/rspec.gemspec +16 -6
  139. data/spec/autotest/autotest_helper.rb +2 -2
  140. data/spec/autotest/discover_spec.rb +4 -15
  141. data/spec/autotest/failed_results_re_spec.rb +24 -0
  142. data/spec/autotest/rspec_spec.rb +2 -38
  143. data/spec/spec/dsl/main_spec.rb +88 -0
  144. data/spec/spec/example/example_group_class_definition_spec.rb +6 -2
  145. data/spec/spec/example/example_group_factory_spec.rb +50 -10
  146. data/spec/spec/example/example_group_methods_spec.rb +210 -160
  147. data/spec/spec/example/example_group_spec.rb +44 -52
  148. data/spec/spec/example/example_matcher_spec.rb +6 -23
  149. data/spec/spec/example/example_methods_spec.rb +176 -54
  150. data/spec/spec/example/helper_method_spec.rb +24 -0
  151. data/spec/spec/example/pending_module_spec.rb +2 -8
  152. data/spec/spec/example/shared_example_group_spec.rb +56 -80
  153. data/spec/spec/expectations/extensions/object_spec.rb +0 -50
  154. data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
  155. data/spec/spec/interop/test/unit/spec_spec.rb +1 -5
  156. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +4 -0
  157. data/spec/spec/matchers/be_close_spec.rb +12 -10
  158. data/spec/spec/matchers/be_spec.rb +62 -7
  159. data/spec/spec/matchers/description_generation_spec.rb +19 -0
  160. data/spec/spec/matchers/eql_spec.rb +7 -6
  161. data/spec/spec/matchers/equal_spec.rb +7 -6
  162. data/spec/spec/matchers/handler_spec.rb +4 -43
  163. data/spec/spec/matchers/has_spec.rb +1 -1
  164. data/spec/spec/matchers/have_spec.rb +23 -18
  165. data/spec/spec/matchers/include_spec.rb +24 -0
  166. data/spec/spec/matchers/match_array_spec.rb +83 -0
  167. data/spec/spec/matchers/matcher_methods_spec.rb +1 -13
  168. data/spec/spec/matchers/raise_error_spec.rb +18 -0
  169. data/spec/spec/matchers/respond_to_spec.rb +71 -9
  170. data/spec/spec/matchers/throw_symbol_spec.rb +85 -43
  171. data/spec/spec/mocks/bug_report_11545_spec.rb +4 -5
  172. data/spec/spec/mocks/bug_report_496.rb +11 -9
  173. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  174. data/spec/spec/mocks/hash_including_matcher_spec.rb +39 -2
  175. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  176. data/spec/spec/mocks/mock_spec.rb +5 -6
  177. data/spec/spec/mocks/nil_expectation_warning_spec.rb +2 -2
  178. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +18 -3
  179. data/spec/spec/mocks/stub_spec.rb +6 -0
  180. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
  181. data/spec/spec/runner/command_line_spec.rb +4 -4
  182. data/spec/spec/runner/configuration_spec.rb +301 -0
  183. data/spec/spec/runner/drb_command_line_spec.rb +4 -4
  184. data/spec/spec/runner/example_group_runner_spec.rb +33 -0
  185. data/spec/spec/runner/formatter/base_formatter_spec.rb +13 -102
  186. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
  187. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +5 -5
  188. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
  189. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +6 -6
  190. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +9 -9
  191. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +6 -6
  192. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +10 -10
  193. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +39 -30
  194. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
  195. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
  196. data/spec/spec/runner/formatter/html_formatter_spec.rb +14 -13
  197. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +5 -5
  198. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +7 -17
  199. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +18 -17
  200. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +5 -5
  201. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +6 -6
  202. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +33 -30
  203. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
  204. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
  205. data/spec/spec/runner/heckler_spec.rb +16 -9
  206. data/spec/spec/runner/option_parser_spec.rb +3 -18
  207. data/spec/spec/runner/options_spec.rb +27 -8
  208. data/spec/spec/runner/reporter_spec.rb +5 -5
  209. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  210. data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
  211. data/spec/spec/runner/spec_parser_spec.rb +85 -79
  212. data/spec/spec/spec_spec.rb +21 -0
  213. data/spec/spec_helper.rb +9 -1
  214. data/story_server/prototype/javascripts/prototype.js +1 -1
  215. metadata +119 -131
  216. data/examples/stories/adder.rb +0 -13
  217. data/examples/stories/addition +0 -34
  218. data/examples/stories/addition.rb +0 -9
  219. data/examples/stories/calculator.rb +0 -65
  220. data/examples/stories/game-of-life/.loadpath +0 -5
  221. data/examples/stories/game-of-life/README.txt +0 -21
  222. data/examples/stories/game-of-life/behaviour/everything.rb +0 -6
  223. data/examples/stories/game-of-life/behaviour/examples/examples.rb +0 -3
  224. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +0 -35
  225. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +0 -66
  226. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +0 -21
  227. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +0 -21
  228. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +0 -42
  229. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +0 -42
  230. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +0 -17
  231. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +0 -53
  232. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +0 -52
  233. data/examples/stories/game-of-life/behaviour/stories/helper.rb +0 -6
  234. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +0 -26
  235. data/examples/stories/game-of-life/behaviour/stories/steps.rb +0 -5
  236. data/examples/stories/game-of-life/behaviour/stories/stories.rb +0 -3
  237. data/examples/stories/game-of-life/behaviour/stories/stories.txt +0 -22
  238. data/examples/stories/game-of-life/life.rb +0 -3
  239. data/examples/stories/game-of-life/life/game.rb +0 -23
  240. data/examples/stories/game-of-life/life/grid.rb +0 -43
  241. data/examples/stories/helper.rb +0 -9
  242. data/examples/stories/steps/addition_steps.rb +0 -18
  243. data/lib/spec/adapters.rb +0 -1
  244. data/lib/spec/adapters/ruby_engine.rb +0 -26
  245. data/lib/spec/adapters/ruby_engine/mri.rb +0 -8
  246. data/lib/spec/adapters/ruby_engine/rubinius.rb +0 -8
  247. data/lib/spec/extensions.rb +0 -4
  248. data/lib/spec/extensions/class.rb +0 -24
  249. data/lib/spec/extensions/metaclass.rb +0 -7
  250. data/lib/spec/extensions/object.rb +0 -6
  251. data/spec/spec/adapters/ruby_engine_spec.rb +0 -16
  252. data/spec/spec/example/configuration_spec.rb +0 -296
  253. data/spec/spec/example/example_runner_spec.rb +0 -194
  254. data/spec/spec/extensions/main_spec.rb +0 -71
  255. data/stories/all.rb +0 -5
  256. data/stories/configuration/before_blocks.story +0 -21
  257. data/stories/configuration/stories.rb +0 -7
  258. data/stories/example_groups/stories.rb +0 -7
  259. data/stories/helper.rb +0 -6
  260. data/stories/interop/stories.rb +0 -7
  261. data/stories/mock_framework_integration/stories.rb +0 -7
  262. data/stories/pending_stories/README +0 -3
  263. data/stories/resources/spec/before_blocks_example.rb +0 -32
  264. data/stories/resources/spec/spec_with_flexmock.rb +0 -18
  265. data/stories/resources/steps/running_rspec.rb +0 -50
  266. data/stories/resources/stories/failing_story.rb +0 -15
  267. data/stories/stories/multiline_steps.story +0 -23
  268. data/stories/stories/steps/multiline_steps.rb +0 -13
  269. data/stories/stories/stories.rb +0 -6
@@ -10,6 +10,10 @@ module Spec
10
10
  parser.parse(args)
11
11
  parser.options
12
12
  end
13
+
14
+ def spec_command?
15
+ $0.split('/').last == 'spec'
16
+ end
13
17
  end
14
18
 
15
19
  attr_reader :options
@@ -34,8 +38,8 @@ module Spec
34
38
  "an example name directly, causing RSpec to run just the example",
35
39
  "matching that name"],
36
40
  :specification => ["-s", "--specification [NAME]", "DEPRECATED - use -e instead", "(This will be removed when autotest works with -e)"],
37
- :line => ["-l", "--line LINE_NUMBER", Integer, "Execute behaviour or specification at given line.",
38
- "(does not work for dynamically generated specs)"],
41
+ :line => ["-l", "--line LINE_NUMBER", Integer, "Execute example group or example at given line.",
42
+ "(does not work for dynamically generated examples)"],
39
43
  :format => ["-f", "--format FORMAT[:WHERE]","Specifies what format to use for output. Specify WHERE to tell",
40
44
  "the formatter where to write the output. All built-in formats",
41
45
  "expect WHERE to be a file name, and will write to $stdout if it's",
@@ -115,10 +119,10 @@ module Spec
115
119
  on(*OPTIONS[:version]) {parse_version}
116
120
  on_tail(*OPTIONS[:help]) {parse_help}
117
121
  end
118
-
122
+
119
123
  def order!(argv, &blk)
120
124
  @argv = argv.dup
121
- @argv = (@argv.empty? && Spec.spec_command?) ? ['--help'] : @argv
125
+ @argv = (@argv.empty? && self.class.spec_command?) ? ['--help'] : @argv
122
126
  @options.argv = @argv.dup
123
127
  return if parse_generate_options
124
128
  return if parse_drb
@@ -40,7 +40,6 @@ module Spec
40
40
  :diff_format,
41
41
  :dry_run,
42
42
  :profile,
43
- :examples,
44
43
  :heckle_runner,
45
44
  :line_number,
46
45
  :loadby,
@@ -51,12 +50,10 @@ module Spec
51
50
  :user_input_for_runner,
52
51
  :error_stream,
53
52
  :output_stream,
54
- :before_suite_parts,
55
- :after_suite_parts,
56
53
  # TODO: BT - Figure out a better name
57
54
  :argv
58
55
  )
59
- attr_reader :colour, :differ_class, :files, :example_groups
56
+ attr_reader :colour, :differ_class, :files, :examples, :example_groups
60
57
 
61
58
  def initialize(error_stream, output_stream)
62
59
  @error_stream = error_stream
@@ -76,7 +73,6 @@ module Spec
76
73
  @examples_run = false
77
74
  @examples_should_be_run = nil
78
75
  @user_input_for_runner = nil
79
- @before_suite_parts = []
80
76
  @after_suite_parts = []
81
77
  end
82
78
 
@@ -123,6 +119,14 @@ module Spec
123
119
  end
124
120
  end
125
121
  end
122
+
123
+ def before_suite_parts
124
+ Spec::Example::BeforeAndAfterHooks.before_suite_parts
125
+ end
126
+
127
+ def after_suite_parts
128
+ Spec::Example::BeforeAndAfterHooks.after_suite_parts
129
+ end
126
130
 
127
131
  def examples_run?
128
132
  @examples_run
@@ -130,7 +134,17 @@ module Spec
130
134
 
131
135
  def examples_should_not_be_run
132
136
  @examples_should_be_run = false
133
- end
137
+ end
138
+
139
+ def predicate_matchers
140
+ # TODO - don't like this dependency - perhaps store these in here instead?
141
+ Spec::Runner.configuration.predicate_matchers
142
+ end
143
+
144
+ def mock_framework
145
+ # TODO - don't like this dependency - perhaps store this in here instead?
146
+ Spec::Runner.configuration.mock_framework
147
+ end
134
148
 
135
149
  def colour=(colour)
136
150
  @colour = colour
@@ -163,7 +177,7 @@ module Spec
163
177
 
164
178
  def parse_example(example)
165
179
  if(File.file?(example))
166
- @examples = File.open(example).read.split("\n")
180
+ @examples = [File.open(example).read.split("\n")].flatten
167
181
  else
168
182
  @examples = [example]
169
183
  end
@@ -209,11 +223,8 @@ module Spec
209
223
  end
210
224
 
211
225
  def number_of_examples
212
- total = 0
213
- @example_groups.each do |example_group|
214
- total += example_group.number_of_examples
215
- end
216
- total
226
+ return examples.size unless examples.empty?
227
+ @example_groups.inject(0) {|sum, group| sum + group.number_of_examples}
217
228
  end
218
229
 
219
230
  def files_to_load
@@ -232,6 +243,10 @@ module Spec
232
243
  result
233
244
  end
234
245
 
246
+ def dry_run?
247
+ @dry_run == true
248
+ end
249
+
235
250
  protected
236
251
  def examples_should_be_run?
237
252
  return @examples_should_be_run unless @examples_should_be_run.nil?
@@ -265,7 +280,7 @@ module Spec
265
280
  def custom_runner
266
281
  return nil unless custom_runner?
267
282
  klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner)
268
- runner_type = load_class(klass_name, 'behaviour runner', '--runner')
283
+ runner_type = load_class(klass_name, 'example group runner', '--runner')
269
284
  return runner_type.new(self, arg)
270
285
  end
271
286
 
@@ -299,7 +314,7 @@ module Spec
299
314
  error_stream.puts "You must specify one file, not a directory when using the --line option"
300
315
  exit(1) if stderr?
301
316
  else
302
- example = SpecParser.new.spec_name_for(files[0], line_number)
317
+ example = SpecParser.new(self).spec_name_for(files[0], line_number)
303
318
  @examples = [example]
304
319
  end
305
320
  else
@@ -159,7 +159,7 @@ module Spec
159
159
 
160
160
  protected
161
161
  def example_name
162
- @example.__full_description
162
+ @example.full_description
163
163
  end
164
164
  end
165
165
  end
@@ -4,15 +4,16 @@ module Spec
4
4
  class SpecParser
5
5
  attr_reader :best_match
6
6
 
7
- def initialize
7
+ def initialize(run_options)
8
8
  @best_match = {}
9
+ @run_options = run_options
9
10
  end
10
11
 
11
12
  def spec_name_for(file, line_number)
12
13
  best_match.clear
13
14
  file = File.expand_path(file)
14
- Spec::Runner.options.example_groups.each do |example_group|
15
- consider_example_groups_for_best_match example_group, file, line_number
15
+ @run_options.example_groups.each do |example_group|
16
+ consider_example_group_for_best_match example_group, file, line_number
16
17
 
17
18
  example_group.examples.each do |example|
18
19
  consider_example_for_best_match example, example_group, file, line_number
@@ -31,8 +32,8 @@ module Spec
31
32
 
32
33
  protected
33
34
 
34
- def consider_example_groups_for_best_match(example_group, file, line_number)
35
- parsed_backtrace = parse_backtrace(example_group.registration_backtrace)
35
+ def consider_example_group_for_best_match(example_group, file, line_number)
36
+ parsed_backtrace = parse_backtrace(example_group.backtrace)
36
37
  parsed_backtrace.each do |example_file, example_line|
37
38
  if is_best_match?(file, line_number, example_file, example_line)
38
39
  best_match.clear
@@ -43,7 +44,7 @@ module Spec
43
44
  end
44
45
 
45
46
  def consider_example_for_best_match(example, example_group, file, line_number)
46
- parsed_backtrace = parse_backtrace(example.implementation_backtrace)
47
+ parsed_backtrace = parse_backtrace(example.backtrace)
47
48
  parsed_backtrace.each do |example_file, example_line|
48
49
  if is_best_match?(file, line_number, example_file, example_line)
49
50
  best_match.clear
@@ -61,9 +62,10 @@ module Spec
61
62
  end
62
63
 
63
64
  def parse_backtrace(backtrace)
64
- backtrace.collect do |trace_line|
65
- split_line = trace_line.split(':')
66
- [split_line[0], Integer(split_line[1])]
65
+ Array(backtrace).collect do |trace_line|
66
+ trace_line =~ /(.*)\:(\d*)(\:|$)/
67
+ file, number = $1, $2
68
+ [file, Integer(number)]
67
69
  end
68
70
  end
69
71
  end
@@ -8,52 +8,50 @@ require 'spec/story/runner/plain_text_story_runner.rb'
8
8
  module Spec
9
9
  module Story
10
10
  module Runner
11
- class << self
12
- def run_options # :nodoc:
13
- Spec::Runner.options
14
- end
15
-
16
- def story_runner # :nodoc:
17
- unless @story_runner
18
- @story_runner = create_story_runner
19
- run_options.story_formatters.each do |formatter|
20
- register_listener(formatter)
21
- end
22
- self.register_exit_hook
23
- end
24
- @story_runner
25
- end
26
-
27
- def scenario_runner # :nodoc:
28
- @scenario_runner ||= ScenarioRunner.new
29
- end
30
-
31
- def world_creator # :nodoc:
32
- @world_creator ||= World
33
- end
34
-
35
- def create_story_runner
36
- Runner::StoryRunner.new(scenario_runner, world_creator)
37
- end
38
-
39
- # Use this to register a customer output formatter.
40
- def register_listener(listener)
41
- story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended
42
- world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed
43
- scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed
44
- end
45
-
46
- def register_exit_hook # :nodoc:
47
- at_exit do
48
- exit Runner.story_runner.run_stories unless $!
11
+ def self.run_options # :nodoc:
12
+ Spec::Runner.options
13
+ end
14
+
15
+ def self.story_runner # :nodoc:
16
+ unless @story_runner
17
+ @story_runner = create_story_runner
18
+ run_options.story_formatters.each do |formatter|
19
+ register_listener(formatter)
49
20
  end
21
+ self.register_exit_hook
50
22
  end
51
-
52
- def dry_run
53
- run_options.dry_run
23
+ @story_runner
24
+ end
25
+
26
+ def self.scenario_runner # :nodoc:
27
+ @scenario_runner ||= ScenarioRunner.new
28
+ end
29
+
30
+ def self.world_creator # :nodoc:
31
+ @world_creator ||= World
32
+ end
33
+
34
+ def self.create_story_runner
35
+ Runner::StoryRunner.new(scenario_runner, world_creator)
36
+ end
37
+
38
+ # Use this to register a customer output formatter.
39
+ def self.register_listener(listener)
40
+ story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended
41
+ world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed
42
+ scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed
43
+ end
44
+
45
+ def self.register_exit_hook # :nodoc:
46
+ at_exit do
47
+ exit Runner.story_runner.run_stories unless $!
54
48
  end
55
-
56
49
  end
50
+
51
+ def self.dry_run
52
+ run_options.dry_run
53
+ end
54
+
57
55
  end
58
56
  end
59
57
  end
@@ -2,12 +2,16 @@ module Spec
2
2
  module Story
3
3
  module Runner
4
4
  class StoryRunner
5
- class << self
6
- attr_accessor :current_story_runner
7
-
8
- def scenario_from_current_story(scenario_name)
9
- current_story_runner.scenario_from_current_story(scenario_name)
10
- end
5
+ def self.current_story_runner
6
+ @current_story_runner
7
+ end
8
+
9
+ def self.current_story_runner=(current_story_runner)
10
+ @current_story_runner = current_story_runner
11
+ end
12
+
13
+ def self.scenario_from_current_story(scenario_name)
14
+ current_story_runner.scenario_from_current_story(scenario_name)
11
15
  end
12
16
 
13
17
  attr_accessor :stories, :scenarios, :current_story
@@ -15,82 +15,78 @@ module Spec
15
15
  module World
16
16
  include ::Spec::Example::Pending
17
17
  include ::Spec::Matchers
18
- # store steps and listeners in the singleton metaclass.
19
- # This serves both to keep them out of the way of runtime Worlds
20
- # and to make them available to all instances.
21
- class << self
22
- def create(cls = Object, *args)
23
- cls.new(*args).extend(World)
24
- end
25
-
26
- def listeners
27
- @listeners ||= []
28
- end
29
-
30
- def add_listener(listener)
31
- listeners() << listener
32
- end
33
-
34
- def step_mother
35
- @step_mother ||= StepMother.new
36
- end
37
-
38
- def use(steps)
39
- step_mother.use(steps)
40
- end
41
-
42
- def step_names
43
- @step_names ||= []
44
- end
45
18
 
46
- def run_given_scenario_with_suspended_listeners(world, type, name, scenario)
47
- current_listeners = Array.new(listeners)
48
- begin
49
- listeners.each { |l| l.found_scenario(type, name) }
50
- @listeners.clear
51
- scenario.perform(world, name) unless dry_run
52
- ensure
53
- @listeners.replace(current_listeners)
54
- end
55
- end
56
-
57
- def store_and_call(world, type, name, *args, &block)
58
- if block_given?
59
- step_mother.store(type, Step.new(name, &block))
60
- end
61
- step = step_mother.find(type, name)
19
+ def self.create(cls = Object, *args)
20
+ cls.new(*args).extend(World)
21
+ end
22
+
23
+ def self.listeners
24
+ @listeners ||= []
25
+ end
26
+
27
+ def self.add_listener(listener)
28
+ listeners() << listener
29
+ end
30
+
31
+ def self.step_mother
32
+ @step_mother ||= StepMother.new
33
+ end
34
+
35
+ def self.use(steps)
36
+ step_mother.use(steps)
37
+ end
38
+
39
+ def self.step_names
40
+ @step_names ||= []
41
+ end
62
42
 
63
- step_name = step.name
64
- step_names << step_name
65
-
66
- # It's important to have access to the parsed args here, so
67
- # we can give them to the listeners. The HTML reporter needs
68
- # the args so it can style them. See the generated output in
69
- # story_server/prototype/rspec_stories.html (generated by rake stories)
70
- args = step.parse_args(name) if args.empty?
71
- begin
72
- listeners.each { |l| l.step_upcoming(type, step_name, *args) }
73
- step.perform(world, *args) unless dry_run
74
- listeners.each { |l| l.step_succeeded(type, step_name, *args) }
75
- rescue Exception => e
76
- case e
77
- when Spec::Example::ExamplePendingError
78
- @listeners.each { |l| l.step_pending(type, step_name, *args) }
79
- else
80
- @listeners.each { |l| l.step_failed(type, step_name, *args) }
81
- end
82
- errors << e
83
- end
43
+ def self.run_given_scenario_with_suspended_listeners(world, type, name, scenario)
44
+ current_listeners = Array.new(listeners)
45
+ begin
46
+ listeners.each { |l| l.found_scenario(type, name) }
47
+ @listeners.clear
48
+ scenario.perform(world, name) unless dry_run
49
+ ensure
50
+ @listeners.replace(current_listeners)
84
51
  end
85
-
86
- def errors
87
- @errors ||= []
52
+ end
53
+
54
+ def self.store_and_call(world, type, name, *args, &block)
55
+ if block_given?
56
+ step_mother.store(type, Step.new(name, &block))
88
57
  end
58
+ step = step_mother.find(type, name)
59
+
60
+ step_name = step.name
61
+ step_names << step_name
89
62
 
90
- def dry_run
91
- ::Spec::Story::Runner.dry_run
63
+ # It's important to have access to the parsed args here, so
64
+ # we can give them to the listeners. The HTML reporter needs
65
+ # the args so it can style them. See the generated output in
66
+ # story_server/prototype/rspec_stories.html (generated by rake stories)
67
+ args = step.parse_args(name) if args.empty?
68
+ begin
69
+ listeners.each { |l| l.step_upcoming(type, step_name, *args) }
70
+ step.perform(world, *args) unless dry_run
71
+ listeners.each { |l| l.step_succeeded(type, step_name, *args) }
72
+ rescue Exception => e
73
+ case e
74
+ when Spec::Example::ExamplePendingError
75
+ @listeners.each { |l| l.step_pending(type, step_name, *args) }
76
+ else
77
+ @listeners.each { |l| l.step_failed(type, step_name, *args) }
78
+ end
79
+ errors << e
92
80
  end
93
- end # end of class << self
81
+ end
82
+
83
+ def self.errors
84
+ @errors ||= []
85
+ end
86
+
87
+ def self.dry_run
88
+ ::Spec::Story::Runner.dry_run
89
+ end
94
90
 
95
91
  def start_collecting_errors
96
92
  errors.clear