opal-rspec-cj 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.gitmodules +15 -0
  4. data/.travis.yml +13 -0
  5. data/.yardopts +5 -0
  6. data/CHANGELOG.md +25 -0
  7. data/Gemfile +8 -0
  8. data/README.md +147 -0
  9. data/Rakefile +26 -0
  10. data/config.ru +10 -0
  11. data/example/Gemfile +4 -0
  12. data/example/README.md +13 -0
  13. data/example/Rakefile +8 -0
  14. data/example/opal/user.rb +11 -0
  15. data/example/spec/user_spec.rb +15 -0
  16. data/lib/opal-rspec.rb +2 -0
  17. data/lib/opal/rspec.rb +20 -0
  18. data/lib/opal/rspec/rake_task.rb +63 -0
  19. data/lib/opal/rspec/version.rb +5 -0
  20. data/opal-rspec.gemspec +21 -0
  21. data/opal/opal-rspec.rb +1 -0
  22. data/opal/opal/rspec.rb +25 -0
  23. data/opal/opal/rspec/async.rb +289 -0
  24. data/opal/opal/rspec/browser_formatter.rb +188 -0
  25. data/opal/opal/rspec/fixes.rb +116 -0
  26. data/opal/opal/rspec/requires.rb +45 -0
  27. data/opal/opal/rspec/runner.rb +69 -0
  28. data/opal/opal/rspec/sprockets_runner.rb.erb +11 -0
  29. data/opal/opal/rspec/text_formatter.rb +74 -0
  30. data/spec/async_spec.rb +38 -0
  31. data/spec/example_spec.rb +163 -0
  32. data/spec/matchers_spec.rb +201 -0
  33. data/spec/mock_spec.rb +63 -0
  34. data/spec/named_subject_spec.rb +11 -0
  35. data/spec/should_syntax_spec.rb +17 -0
  36. data/vendor/spec_runner.js +50 -0
  37. data/vendor_lib/rspec-expectations.rb +1 -0
  38. data/vendor_lib/rspec.rb +3 -0
  39. data/vendor_lib/rspec/autorun.rb +2 -0
  40. data/vendor_lib/rspec/core.rb +203 -0
  41. data/vendor_lib/rspec/core/backport_random.rb +302 -0
  42. data/vendor_lib/rspec/core/backtrace_formatter.rb +65 -0
  43. data/vendor_lib/rspec/core/command_line.rb +36 -0
  44. data/vendor_lib/rspec/core/configuration.rb +1129 -0
  45. data/vendor_lib/rspec/core/configuration_options.rb +143 -0
  46. data/vendor_lib/rspec/core/drb_command_line.rb +26 -0
  47. data/vendor_lib/rspec/core/drb_options.rb +87 -0
  48. data/vendor_lib/rspec/core/dsl.rb +26 -0
  49. data/vendor_lib/rspec/core/example.rb +312 -0
  50. data/vendor_lib/rspec/core/example_group.rb +540 -0
  51. data/vendor_lib/rspec/core/filter_manager.rb +224 -0
  52. data/vendor_lib/rspec/core/flat_map.rb +17 -0
  53. data/vendor_lib/rspec/core/formatters.rb +54 -0
  54. data/vendor_lib/rspec/core/formatters/base_formatter.rb +291 -0
  55. data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +307 -0
  56. data/vendor_lib/rspec/core/formatters/deprecation_formatter.rb +193 -0
  57. data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +67 -0
  58. data/vendor_lib/rspec/core/formatters/helpers.rb +82 -0
  59. data/vendor_lib/rspec/core/formatters/html_formatter.rb +155 -0
  60. data/vendor_lib/rspec/core/formatters/html_printer.rb +408 -0
  61. data/vendor_lib/rspec/core/formatters/json_formatter.rb +99 -0
  62. data/vendor_lib/rspec/core/formatters/progress_formatter.rb +32 -0
  63. data/vendor_lib/rspec/core/formatters/snippet_extractor.rb +101 -0
  64. data/vendor_lib/rspec/core/hooks.rb +535 -0
  65. data/vendor_lib/rspec/core/memoized_helpers.rb +431 -0
  66. data/vendor_lib/rspec/core/metadata.rb +313 -0
  67. data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +11 -0
  68. data/vendor_lib/rspec/core/mocking/with_flexmock.rb +27 -0
  69. data/vendor_lib/rspec/core/mocking/with_mocha.rb +52 -0
  70. data/vendor_lib/rspec/core/mocking/with_rr.rb +27 -0
  71. data/vendor_lib/rspec/core/mocking/with_rspec.rb +27 -0
  72. data/vendor_lib/rspec/core/option_parser.rb +234 -0
  73. data/vendor_lib/rspec/core/ordering.rb +154 -0
  74. data/vendor_lib/rspec/core/pending.rb +110 -0
  75. data/vendor_lib/rspec/core/project_initializer.rb +88 -0
  76. data/vendor_lib/rspec/core/rake_task.rb +128 -0
  77. data/vendor_lib/rspec/core/reporter.rb +132 -0
  78. data/vendor_lib/rspec/core/ruby_project.rb +44 -0
  79. data/vendor_lib/rspec/core/runner.rb +97 -0
  80. data/vendor_lib/rspec/core/shared_context.rb +53 -0
  81. data/vendor_lib/rspec/core/shared_example_group.rb +146 -0
  82. data/vendor_lib/rspec/core/shared_example_group/collection.rb +27 -0
  83. data/vendor_lib/rspec/core/version.rb +7 -0
  84. data/vendor_lib/rspec/core/warnings.rb +22 -0
  85. data/vendor_lib/rspec/core/world.rb +131 -0
  86. data/vendor_lib/rspec/expectations.rb +75 -0
  87. data/vendor_lib/rspec/expectations/differ.rb +154 -0
  88. data/vendor_lib/rspec/expectations/errors.rb +9 -0
  89. data/vendor_lib/rspec/expectations/expectation_target.rb +87 -0
  90. data/vendor_lib/rspec/expectations/extensions.rb +1 -0
  91. data/vendor_lib/rspec/expectations/extensions/object.rb +29 -0
  92. data/vendor_lib/rspec/expectations/fail_with.rb +79 -0
  93. data/vendor_lib/rspec/expectations/handler.rb +68 -0
  94. data/vendor_lib/rspec/expectations/syntax.rb +182 -0
  95. data/vendor_lib/rspec/expectations/version.rb +8 -0
  96. data/vendor_lib/rspec/matchers.rb +633 -0
  97. data/vendor_lib/rspec/matchers/built_in.rb +39 -0
  98. data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +68 -0
  99. data/vendor_lib/rspec/matchers/built_in/be.rb +213 -0
  100. data/vendor_lib/rspec/matchers/built_in/be_instance_of.rb +15 -0
  101. data/vendor_lib/rspec/matchers/built_in/be_kind_of.rb +11 -0
  102. data/vendor_lib/rspec/matchers/built_in/be_within.rb +55 -0
  103. data/vendor_lib/rspec/matchers/built_in/change.rb +141 -0
  104. data/vendor_lib/rspec/matchers/built_in/cover.rb +21 -0
  105. data/vendor_lib/rspec/matchers/built_in/eq.rb +22 -0
  106. data/vendor_lib/rspec/matchers/built_in/eql.rb +23 -0
  107. data/vendor_lib/rspec/matchers/built_in/equal.rb +48 -0
  108. data/vendor_lib/rspec/matchers/built_in/exist.rb +26 -0
  109. data/vendor_lib/rspec/matchers/built_in/has.rb +48 -0
  110. data/vendor_lib/rspec/matchers/built_in/include.rb +61 -0
  111. data/vendor_lib/rspec/matchers/built_in/match.rb +17 -0
  112. data/vendor_lib/rspec/matchers/built_in/match_array.rb +51 -0
  113. data/vendor_lib/rspec/matchers/built_in/raise_error.rb +154 -0
  114. data/vendor_lib/rspec/matchers/built_in/respond_to.rb +74 -0
  115. data/vendor_lib/rspec/matchers/built_in/satisfy.rb +30 -0
  116. data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +48 -0
  117. data/vendor_lib/rspec/matchers/built_in/throw_symbol.rb +94 -0
  118. data/vendor_lib/rspec/matchers/built_in/yield.rb +297 -0
  119. data/vendor_lib/rspec/matchers/compatibility.rb +14 -0
  120. data/vendor_lib/rspec/matchers/configuration.rb +113 -0
  121. data/vendor_lib/rspec/matchers/dsl.rb +23 -0
  122. data/vendor_lib/rspec/matchers/generated_descriptions.rb +35 -0
  123. data/vendor_lib/rspec/matchers/matcher.rb +301 -0
  124. data/vendor_lib/rspec/matchers/method_missing.rb +12 -0
  125. data/vendor_lib/rspec/matchers/operator_matcher.rb +99 -0
  126. data/vendor_lib/rspec/matchers/pretty.rb +70 -0
  127. data/vendor_lib/rspec/matchers/test_unit_integration.rb +11 -0
  128. data/vendor_lib/rspec/mocks.rb +100 -0
  129. data/vendor_lib/rspec/mocks/any_instance/chain.rb +92 -0
  130. data/vendor_lib/rspec/mocks/any_instance/expectation_chain.rb +47 -0
  131. data/vendor_lib/rspec/mocks/any_instance/message_chains.rb +75 -0
  132. data/vendor_lib/rspec/mocks/any_instance/recorder.rb +200 -0
  133. data/vendor_lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
  134. data/vendor_lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
  135. data/vendor_lib/rspec/mocks/argument_list_matcher.rb +104 -0
  136. data/vendor_lib/rspec/mocks/argument_matchers.rb +264 -0
  137. data/vendor_lib/rspec/mocks/arity_calculator.rb +66 -0
  138. data/vendor_lib/rspec/mocks/configuration.rb +111 -0
  139. data/vendor_lib/rspec/mocks/error_generator.rb +203 -0
  140. data/vendor_lib/rspec/mocks/errors.rb +12 -0
  141. data/vendor_lib/rspec/mocks/example_methods.rb +201 -0
  142. data/vendor_lib/rspec/mocks/extensions/marshal.rb +17 -0
  143. data/vendor_lib/rspec/mocks/framework.rb +36 -0
  144. data/vendor_lib/rspec/mocks/instance_method_stasher.rb +112 -0
  145. data/vendor_lib/rspec/mocks/matchers/have_received.rb +99 -0
  146. data/vendor_lib/rspec/mocks/matchers/receive.rb +112 -0
  147. data/vendor_lib/rspec/mocks/matchers/receive_messages.rb +72 -0
  148. data/vendor_lib/rspec/mocks/message_expectation.rb +643 -0
  149. data/vendor_lib/rspec/mocks/method_double.rb +209 -0
  150. data/vendor_lib/rspec/mocks/method_reference.rb +95 -0
  151. data/vendor_lib/rspec/mocks/mock.rb +7 -0
  152. data/vendor_lib/rspec/mocks/mutate_const.rb +406 -0
  153. data/vendor_lib/rspec/mocks/object_reference.rb +90 -0
  154. data/vendor_lib/rspec/mocks/order_group.rb +82 -0
  155. data/vendor_lib/rspec/mocks/proxy.rb +269 -0
  156. data/vendor_lib/rspec/mocks/proxy_for_nil.rb +37 -0
  157. data/vendor_lib/rspec/mocks/space.rb +95 -0
  158. data/vendor_lib/rspec/mocks/standalone.rb +3 -0
  159. data/vendor_lib/rspec/mocks/stub_chain.rb +51 -0
  160. data/vendor_lib/rspec/mocks/syntax.rb +374 -0
  161. data/vendor_lib/rspec/mocks/targets.rb +90 -0
  162. data/vendor_lib/rspec/mocks/test_double.rb +109 -0
  163. data/vendor_lib/rspec/mocks/verifying_double.rb +77 -0
  164. data/vendor_lib/rspec/mocks/verifying_message_expecation.rb +60 -0
  165. data/vendor_lib/rspec/mocks/verifying_proxy.rb +151 -0
  166. data/vendor_lib/rspec/mocks/version.rb +7 -0
  167. data/vendor_lib/rspec/support.rb +6 -0
  168. data/vendor_lib/rspec/support/caller_filter.rb +56 -0
  169. data/vendor_lib/rspec/support/spec.rb +14 -0
  170. data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +29 -0
  171. data/vendor_lib/rspec/support/spec/in_sub_process.rb +40 -0
  172. data/vendor_lib/rspec/support/spec/stderr_splitter.rb +50 -0
  173. data/vendor_lib/rspec/support/version.rb +7 -0
  174. data/vendor_lib/rspec/support/warnings.rb +41 -0
  175. data/vendor_lib/rspec/version.rb +5 -0
  176. metadata +268 -0
@@ -0,0 +1,110 @@
1
+ module RSpec
2
+ module Core
3
+ module Pending
4
+ class PendingDeclaredInExample < StandardError; end
5
+
6
+ # If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
7
+ # will report unmet RSpec expectations as failures rather than errors.
8
+ begin
9
+ class PendingExampleFixedError < Test::Unit::AssertionFailedError; end
10
+ rescue
11
+ class PendingExampleFixedError < StandardError; end
12
+ end
13
+
14
+ NO_REASON_GIVEN = 'No reason given'
15
+ NOT_YET_IMPLEMENTED = 'Not yet implemented'
16
+
17
+ # @overload pending()
18
+ # @overload pending(message)
19
+ # @overload pending(message, &block)
20
+ #
21
+ # Stops execution of an example, and reports it as pending. Takes an
22
+ # optional message and block.
23
+ #
24
+ # @param [String] message optional message to add to the summary report.
25
+ # @param [Block] block optional block. If it fails, the example is
26
+ # reported as pending. If it executes cleanly the example fails.
27
+ #
28
+ # @example
29
+ #
30
+ # describe "an example" do
31
+ # # reported as "Pending: no reason given"
32
+ # it "is pending with no message" do
33
+ # pending
34
+ # this_does_not_get_executed
35
+ # end
36
+ #
37
+ # # reported as "Pending: something else getting finished"
38
+ # it "is pending with a custom message" do
39
+ # pending("something else getting finished")
40
+ # this_does_not_get_executed
41
+ # end
42
+ #
43
+ # # reported as "Pending: something else getting finished"
44
+ # it "is pending with a failing block" do
45
+ # pending("something else getting finished") do
46
+ # raise "this is the failure"
47
+ # end
48
+ # end
49
+ #
50
+ # # reported as failure, saying we expected the block to fail but
51
+ # # it passed.
52
+ # it "is pending with a passing block" do
53
+ # pending("something else getting finished") do
54
+ # true.should be(true)
55
+ # end
56
+ # end
57
+ # end
58
+ #
59
+ # @note `before(:each)` hooks are eval'd when you use the `pending`
60
+ # method within an example. If you want to declare an example `pending`
61
+ # and bypass the `before` hooks as well, you can pass `:pending => true`
62
+ # to the `it` method:
63
+ #
64
+ # it "does something", :pending => true do
65
+ # # ...
66
+ # end
67
+ #
68
+ # or pass `:pending => "something else getting finished"` to add a
69
+ # message to the summary report:
70
+ #
71
+ # it "does something", :pending => "something else getting finished" do
72
+ # # ...
73
+ # end
74
+ def pending(*args)
75
+ current_example = RSpec.current_example
76
+
77
+ return self.class.before(:each) { pending(*args) } unless current_example
78
+
79
+ options = args.last.is_a?(Hash) ? args.pop : {}
80
+ message = args.first || NO_REASON_GIVEN
81
+
82
+ if options[:unless] || (options.has_key?(:if) && !options[:if])
83
+ return block_given? ? yield : nil
84
+ end
85
+
86
+ current_example.metadata[:pending] = true
87
+ current_example.metadata[:execution_result][:pending_message] = message
88
+ current_example.execution_result[:pending_fixed] = false
89
+ if block_given?
90
+ begin
91
+ result = begin
92
+ yield
93
+ current_example.example_group_instance.instance_eval { verify_mocks_for_rspec }
94
+ end
95
+ current_example.metadata[:pending] = false
96
+ rescue Exception => e
97
+ current_example.execution_result[:exception] = e
98
+ ensure
99
+ teardown_mocks_for_rspec
100
+ end
101
+ if result
102
+ current_example.execution_result[:pending_fixed] = true
103
+ raise PendingExampleFixedError.new
104
+ end
105
+ end
106
+ raise PendingDeclaredInExample.new(message)
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,88 @@
1
+ module RSpec
2
+ module Core
3
+ class ProjectInitializer
4
+ def initialize(arg=nil)
5
+ @arg = arg
6
+ end
7
+
8
+ def run
9
+ create_spec_helper_file
10
+ create_dot_rspec_file
11
+
12
+ delete_if_confirmed("lib/tasks/rspec.rake", <<-MESSAGE)
13
+ If the file in lib/tasks/rspec.rake is the one generated by rspec-rails-1x,
14
+ you can get rid of it, as it is no longer needed with rspec-2.
15
+ MESSAGE
16
+ end
17
+
18
+ def create_dot_rspec_file
19
+ if File.exist?('.rspec')
20
+ report_exists('.rspec')
21
+ else
22
+ report_creating('.rspec')
23
+ File.open('.rspec','w') do |f|
24
+ f.write <<-CONTENT
25
+ --color
26
+ --format progress
27
+ CONTENT
28
+ end
29
+ end
30
+ end
31
+
32
+ def create_spec_helper_file
33
+ if File.exist?('spec/spec_helper.rb')
34
+ report_exists('spec/spec_helper.rb')
35
+ else
36
+ report_creating('spec/spec_helper.rb')
37
+ FileUtils.mkdir_p('spec')
38
+ File.open('spec/spec_helper.rb','w') do |f|
39
+ f.write <<-CONTENT
40
+ # This file was generated by the `rspec --init` command. Conventionally, all
41
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
42
+ # Require this file using `require "spec_helper"` to ensure that it is only
43
+ # loaded once.
44
+ #
45
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
46
+ RSpec.configure do |config|
47
+ # Limit the spec run to only specs with the focus metadata. If no specs have
48
+ # the filtering metadata and `run_all_when_everything_filtered = true` then
49
+ # all specs will run.
50
+ #config.filter_run :focus
51
+
52
+ # Run all specs when none match the provided filter. This works well in
53
+ # conjunction with `config.filter_run :focus`, as it will run the entire
54
+ # suite when no specs have `:filter` metadata.
55
+ #config.run_all_when_everything_filtered = true
56
+
57
+ # Run specs in random order to surface order dependencies. If you find an
58
+ # order dependency and want to debug it, you can fix the order by providing
59
+ # the seed, which is printed after each run.
60
+ # --seed 1234
61
+ #config.order = 'random'
62
+ end
63
+ CONTENT
64
+ end
65
+ end
66
+ end
67
+
68
+ def delete_if_confirmed(path, message)
69
+ if File.exist?(path)
70
+ puts
71
+ puts message
72
+ puts
73
+ puts " delete #{path}? [y/n]"
74
+ FileUtils.rm_rf(path) if gets =~ /y/i
75
+ end
76
+ end
77
+
78
+ def report_exists(file)
79
+ puts " exist #{file}"
80
+ end
81
+
82
+ def report_creating(file)
83
+ puts " create #{file}"
84
+ end
85
+
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,128 @@
1
+ require 'rspec/support/warnings'
2
+ require 'rake'
3
+ require 'rake/tasklib'
4
+ require 'shellwords'
5
+
6
+ module RSpec
7
+ module Core
8
+ class RakeTask < ::Rake::TaskLib
9
+ include ::Rake::DSL if defined?(::Rake::DSL)
10
+
11
+ # Name of task.
12
+ #
13
+ # default:
14
+ # :spec
15
+ attr_accessor :name
16
+
17
+ # Glob pattern to match files.
18
+ #
19
+ # default:
20
+ # 'spec/**/*_spec.rb'
21
+ attr_accessor :pattern
22
+
23
+ # Whether or not to fail Rake when an error occurs (typically when examples fail).
24
+ #
25
+ # default:
26
+ # true
27
+ attr_accessor :fail_on_error
28
+
29
+ # A message to print to stderr when there are failures.
30
+ attr_accessor :failure_message
31
+
32
+ # Use verbose output. If this is set to true, the task will print the
33
+ # executed spec command to stdout.
34
+ #
35
+ # default:
36
+ # true
37
+ attr_accessor :verbose
38
+
39
+ # Command line options to pass to ruby.
40
+ #
41
+ # default:
42
+ # nil
43
+ attr_accessor :ruby_opts
44
+
45
+ # Path to rspec
46
+ #
47
+ # default:
48
+ # 'rspec'
49
+ attr_accessor :rspec_path
50
+
51
+ # Command line options to pass to rspec.
52
+ #
53
+ # default:
54
+ # nil
55
+ attr_accessor :rspec_opts
56
+
57
+ # @deprecated
58
+ # Use rspec_opts instead.
59
+ #
60
+ # Command line options to pass to rspec.
61
+ #
62
+ # default:
63
+ # nil
64
+ def spec_opts=(opts)
65
+ RSpec.deprecate('RSpec::Core::RakeTask#spec_opts=', :replacement => 'rspec_opts=')
66
+ @rspec_opts = opts
67
+ end
68
+
69
+ def initialize(*args, &task_block)
70
+ setup_ivars(args)
71
+
72
+ desc "Run RSpec code examples" unless ::Rake.application.last_comment
73
+
74
+ task name, *args do |_, task_args|
75
+ RakeFileUtils.send(:verbose, verbose) do
76
+ task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block
77
+ run_task verbose
78
+ end
79
+ end
80
+ end
81
+
82
+ def setup_ivars(args)
83
+ @name = args.shift || :spec
84
+ @ruby_opts, @rspec_opts = nil, nil, nil
85
+ @verbose, @fail_on_error = true, true
86
+
87
+ @rspec_path = 'rspec'
88
+ @pattern = './spec{,/*/**}/*_spec.rb'
89
+ end
90
+
91
+ def run_task(verbose)
92
+ command = spec_command
93
+
94
+ begin
95
+ puts command if verbose
96
+ success = system(command)
97
+ rescue
98
+ puts failure_message if failure_message
99
+ end
100
+ abort("#{command} failed") if fail_on_error unless success
101
+ end
102
+
103
+ private
104
+
105
+ def files_to_run
106
+ if ENV['SPEC']
107
+ FileList[ ENV['SPEC'] ].sort
108
+ else
109
+ FileList[ pattern ].sort.map(&:shellescape)
110
+ end
111
+ end
112
+
113
+ def spec_command
114
+ cmd_parts = []
115
+ cmd_parts << RUBY
116
+ cmd_parts << ruby_opts
117
+ cmd_parts << "-S" << rspec_path
118
+ cmd_parts << files_to_run
119
+ cmd_parts << rspec_opts
120
+ cmd_parts.flatten.reject(&blank).join(" ")
121
+ end
122
+
123
+ def blank
124
+ lambda {|s| s.nil? || s == ""}
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,132 @@
1
+ module RSpec::Core
2
+ class Reporter
3
+ NOTIFICATIONS = %W[start message example_group_started example_group_finished example_started
4
+ example_passed example_failed example_pending start_dump dump_pending
5
+ dump_failures dump_summary seed close stop deprecation deprecation_summary].map(&:to_sym)
6
+
7
+ def initialize(configuration, *formatters)
8
+ @configuration = configuration
9
+ @listeners = Hash.new { |h,k| h[k] = [] }
10
+ formatters.each do |formatter|
11
+ register_listener(formatter, *NOTIFICATIONS)
12
+ end
13
+ @example_count = @failure_count = @pending_count = 0
14
+ @duration = @start = nil
15
+ end
16
+
17
+ # @api
18
+ # @param [Object] An obect that wishes to be notified of reporter events
19
+ # @param [Array] Array of symbols represents the events a listener wishes to subscribe too
20
+ #
21
+ # Registers a listener to a list of notifications. The reporter will send notification of
22
+ # events to all registered listeners
23
+ def register_listener(listener, *notifications)
24
+ notifications.each do |notification|
25
+ @listeners[notification.to_sym] << listener if listener.respond_to?(notification)
26
+ end
27
+ true
28
+ end
29
+
30
+ def registered_listeners(notification)
31
+ @listeners[notification]
32
+ end
33
+
34
+ # @api
35
+ # @overload report(count, &block)
36
+ # @overload report(count, &block)
37
+ # @param [Integer] count the number of examples being run
38
+ # @param [Block] block yields itself for further reporting.
39
+ #
40
+ # Initializes the report run and yields itself for further reporting. The
41
+ # block is required, so that the reporter can manage cleaning up after the
42
+ # run.
43
+ #
44
+ # @example
45
+ #
46
+ # reporter.report(group.examples.size) do |r|
47
+ # example_groups.map {|g| g.run(r) }
48
+ # end
49
+ #
50
+ def report(expected_example_count)
51
+ start(expected_example_count)
52
+ begin
53
+ yield self
54
+ ensure
55
+ finish
56
+ end
57
+ end
58
+
59
+ def start(expected_example_count)
60
+ @start = RSpec::Core::Time.now
61
+ notify :start, expected_example_count
62
+ end
63
+
64
+ def message(message)
65
+ notify :message, message
66
+ end
67
+
68
+ def example_group_started(group)
69
+ notify :example_group_started, group unless group.descendant_filtered_examples.empty?
70
+ end
71
+
72
+ def example_group_finished(group)
73
+ notify :example_group_finished, group unless group.descendant_filtered_examples.empty?
74
+ end
75
+
76
+ def example_started(example)
77
+ @example_count += 1
78
+ notify :example_started, example
79
+ end
80
+
81
+ def example_passed(example)
82
+ notify :example_passed, example
83
+ end
84
+
85
+ def example_failed(example)
86
+ @failure_count += 1
87
+ notify :example_failed, example
88
+ end
89
+
90
+ def example_pending(example)
91
+ @pending_count += 1
92
+ notify :example_pending, example
93
+ end
94
+
95
+ def deprecation(message)
96
+ notify :deprecation, message
97
+ end
98
+
99
+ def finish
100
+ begin
101
+ stop
102
+ notify :start_dump
103
+ notify :dump_pending
104
+ notify :dump_failures
105
+ notify :dump_summary, @duration, @example_count, @failure_count, @pending_count
106
+ notify :deprecation_summary
107
+ notify :seed, @configuration.seed if seed_used?
108
+ ensure
109
+ notify :close
110
+ end
111
+ end
112
+
113
+ alias_method :abort, :finish
114
+
115
+ def stop
116
+ @duration = (RSpec::Core::Time.now - @start).to_f if @start
117
+ notify :stop
118
+ end
119
+
120
+ def notify(event, *args, &block)
121
+ registered_listeners(event).each do |formatter|
122
+ formatter.send(event, *args, &block)
123
+ end
124
+ end
125
+
126
+ private
127
+
128
+ def seed_used?
129
+ @configuration.seed && @configuration.seed_used?
130
+ end
131
+ end
132
+ end