fail_fast 0.5.2 → 0.6.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 (48) hide show
  1. data/CHANGELOG.txt +6 -0
  2. data/README.markdown +16 -3
  3. data/fail_fast.gemspec +7 -3
  4. data/lib/fail_fast.rb +88 -1
  5. data/lib/fail_fast/base/base.rb +11 -7
  6. data/lib/fail_fast/base/console_utils.rb +20 -0
  7. data/lib/fail_fast/base/utils.rb +0 -13
  8. data/lib/fail_fast/error_reporter.rb +7 -0
  9. data/lib/fail_fast/error_reporter/base.rb +40 -0
  10. data/lib/fail_fast/error_reporter/hoptoad.rb +34 -0
  11. data/lib/fail_fast/error_reporter/hoptoad/post_error_request.xml.erb +23 -0
  12. data/lib/fail_fast/error_reporter/stdout.rb +9 -0
  13. data/lib/fail_fast/report.txt.erb +9 -4
  14. data/lib/fail_fast/support/error_details.rb +5 -1
  15. data/show_all_errors.rb +5 -5
  16. data/spec/{fixtures → _/fixtures}/empty.yml +0 -0
  17. data/spec/{fixtures → _/fixtures}/simple.yml +3 -3
  18. data/spec/_/support/errors.rb +13 -0
  19. data/spec/_/support/errors_reporters.rb +3 -0
  20. data/spec/_/support/hoptoad.rb +7 -0
  21. data/spec/_/support/it_extensions.rb +126 -0
  22. data/spec/_/support/stdout.rb +8 -0
  23. data/spec/_/support/vcr.rb +11 -0
  24. data/spec/_/support/webmock.rb +4 -0
  25. data/spec/_/support/xml.rb +4 -0
  26. data/spec/_vcr_cassette_library/FailFast_ErrorReporter_Hoptoad/when_1_errors_occurs_in_1_block.yml +35 -0
  27. data/spec/_vcr_cassette_library/FailFast_ErrorReporter_Hoptoad/when_2_errors_occur_in_1_block.yml +37 -0
  28. data/spec/_vcr_cassette_library/FailFast_ErrorReporter_Hoptoad/when_3_errors_occur_in_2_blocks.yml +71 -0
  29. data/spec/_vcr_cassette_library/FailFast_ErrorReporter_Hoptoad/when_the_API_token_is_invalid.yml +67 -0
  30. data/spec/_vcr_cassette_library/FailFast_ErrorReporter_Hoptoad/when_the_API_token_is_valid.yml +35 -0
  31. data/spec/base/error_details_spec.rb +8 -0
  32. data/spec/error_reporter/fail_fast_spec.rb +73 -0
  33. data/spec/error_reporter/global_reporters_spec.rb +22 -0
  34. data/spec/error_reporter/hoptoad/expected_error_1_request.xml.erb +21 -0
  35. data/spec/error_reporter/hoptoad/expected_error_2_request.xml.erb +22 -0
  36. data/spec/error_reporter/hoptoad/hoptoad_activation_spec.rb +14 -0
  37. data/spec/error_reporter/hoptoad/hoptoad_requests_spec.rb +63 -0
  38. data/spec/error_reporter/hoptoad/hoptoad_responses_spec.rb +35 -0
  39. data/spec/error_reporter/stdout/stdout_spec.rb +24 -0
  40. data/spec/extensions/file_or_directory_exists_spec.rb +2 -2
  41. data/spec/extensions/has_url_spec.rb +3 -6
  42. data/spec/extensions/key_prefix_spec.rb +1 -1
  43. data/spec/how_to_use_spec.rb +1 -3
  44. data/spec/spec_helper.rb +13 -134
  45. metadata +120 -18
  46. data/lib/fail_fast/base/messaging.rb +0 -40
  47. data/lib/fail_fast/main.rb +0 -34
  48. data/spec/base/report_printing_spec.rb +0 -29
@@ -0,0 +1,73 @@
1
+ # Prove that FailFast,
2
+ # - register FailFast::ErrorReporter::Stdout as default errors reporter.
3
+ # - when it detects 1/many error(s), calls report(..) with the proper parameters on its errors reporter.
4
+
5
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
6
+
7
+ describe 'FailFast and error reporters :' do
8
+
9
+ let(:ff) {FailFast.new(nil,nil)}
10
+
11
+ it 'only reports errors to Stdout by default' do
12
+ ff.error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout]
13
+ end
14
+
15
+ it 'can register multiple error reporters' do
16
+ ff.register_errors_reporter(DummyErrorReporter.new)
17
+ ff.error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout, DummyErrorReporter]
18
+ end
19
+
20
+ it 'ignores duplicate registration' do
21
+ ff.register_errors_reporter(DummyErrorReporter.new)
22
+ ff.register_errors_reporter ff.error_reporters.first
23
+ ff.register_errors_reporter ff.error_reporters.last
24
+ ff.error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout, DummyErrorReporter]
25
+ end
26
+
27
+
28
+ it "calls all the registered reporters, when an error occurs" do
29
+ ff.register_errors_reporter(DummyErrorReporter.new)
30
+ ff.error_reporters[0].should_receive(:report).once
31
+ ff.error_reporters[1].should_receive(:report).once
32
+
33
+ ff.check_now.but_fail_later do # = what we test!
34
+ has_value_for(:www_unknown , :message => "www_unknown is missing" ) #
35
+ has_value_for(:www_unknown2, :message => "www_unknown2 is missing") #
36
+ end #
37
+ end
38
+ end
39
+
40
+ describe FailFast do
41
+
42
+ let(:error_1) { FailFast::ErrorDetails.new(:www_unknown , :missing_value, nil, "www_unknown is missing" ) }
43
+ let(:error_2) { FailFast::ErrorDetails.new(:www_unknown2, :missing_value, nil, "www_unknown2 is missing") }
44
+ let(:two_errors) { [error_1, error_2] }
45
+ let(:two_errors_context) do {:errors_to_report => two_errors, :config_file_path => SIMPLE_FILE_PATH, :keys_prefix => nil} end
46
+
47
+ describe ".check_now" do
48
+ it "passes all the detected errors and the context to Stdout.report" do
49
+ FailFast(SIMPLE_FILE_PATH).tap do |ff|
50
+ ff.error_reporters.first.should_receive(:report).with(two_errors, two_errors_context) # the test
51
+ begin
52
+ ff.check_now do # = what we test!
53
+ has_value_for(:www_unknown , :message => "www_unknown is missing" ) #
54
+ has_value_for(:www_unknown2, :message => "www_unknown2 is missing") #
55
+ end #
56
+ rescue
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ describe ".check_now.but_fail_later" do
63
+ it "passes all the detected errors and the context to Stdout.report" do
64
+ FailFast(SIMPLE_FILE_PATH).tap do |ff|
65
+ ff.error_reporters.first.should_receive(:report).with(two_errors, two_errors_context) # the test
66
+ ff.check_now.but_fail_later do # = what we test!
67
+ has_value_for(:www_unknown , :message => "www_unknown is missing" ) #
68
+ has_value_for(:www_unknown2, :message => "www_unknown2 is missing") #
69
+ end #
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe FailFast do
4
+
5
+ let(:ff) {FailFast.new(nil,nil)}
6
+
7
+ it 'reports errors only to FailFast::ErrorReporter::Stdout by default' do
8
+ ff.error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout]
9
+ end
10
+
11
+ describe ".report_to" do
12
+ it 'add errors reporters to the next FailFast check blocks that will be created' do
13
+ FailFast.new(nil,nil).error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout]
14
+ FailFast.report_to DummyErrorReporter.new
15
+ FailFast.new(nil,nil).error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout, DummyErrorReporter]
16
+ end
17
+
18
+ it "resets the default error reporters between each test" do
19
+ FailFast.new(nil,nil).error_reporters.collect{|o|o.class}.should == [FailFast::ErrorReporter::Stdout]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <notice version="2.0">
3
+ <api-key><%= @api_key %></api-key>
4
+ <notifier>
5
+ <name>FailFast Hoptoad Notifier</name>
6
+ <version>0.1</version>
7
+ <url>https://github.com/alainravet/fail_fast</url>
8
+ </notifier>
9
+ <error>
10
+ <class>FailFastError</class>
11
+ <message>FailFastError at <%= FROZEN_TIME %></message>
12
+ <backtrace>
13
+ <line method="<%= EMPTY_FILE_PATH %>" file="App not on path : 'azertyuiop'." number='1'/>
14
+ </backtrace>
15
+ </error>
16
+ <server-environment>
17
+ <project-root>/testapp</project-root>
18
+ <environment-name>test</environment-name>
19
+ <app-version>1.0.0</app-version>
20
+ </server-environment>
21
+ </notice>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <notice version="2.0">
3
+ <api-key><%= @api_key %></api-key>
4
+ <notifier>
5
+ <name>FailFast Hoptoad Notifier</name>
6
+ <version>0.1</version>
7
+ <url>https://github.com/alainravet/fail_fast</url>
8
+ </notifier>
9
+ <error>
10
+ <class>FailFastError</class>
11
+ <message>FailFastError at <%= FROZEN_TIME %></message>
12
+ <backtrace>
13
+ <line method="<%= SIMPLE_FILE_PATH %>" file="msg-A| Missing value for the key 'anykey_1'." number='1'/>
14
+ <line method="<%= SIMPLE_FILE_PATH %>" file="msg-B| Missing value for the key 'anykey_2'." number='2'/>
15
+ </backtrace>
16
+ </error>
17
+ <server-environment>
18
+ <project-root>/testapp</project-root>
19
+ <environment-name>test</environment-name>
20
+ <app-version>1.0.0</app-version>
21
+ </server-environment>
22
+ </notice>
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe FailFast::ErrorReporter::Hoptoad do
4
+
5
+ it 'is activated by adding it with FF#report_to to the global active error reporters' do
6
+ FailFast.report_to :hoptoad => VALID_HOPTOAD_API_KEY
7
+
8
+ FailFast.new.error_reporters.collect{|o|o.class}.
9
+ should == [FailFast::ErrorReporter::Stdout, FailFast::ErrorReporter::Hoptoad]
10
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
11
+ # The new global errors reporter
12
+ end
13
+
14
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe FailFast::ErrorReporter::Hoptoad do
4
+
5
+ let(:request_for_1_error_in_1_block){
6
+ a_request(:post, 'http://hoptoadapp.com/notifier_api/v2/notices').
7
+ with(:headers => {'Accept'=>'text/xml', 'Content-Type' => 'text/xml'},
8
+ :body => evaluate_xml_erb(File.join(File.dirname(__FILE__), 'expected_error_1_request.xml.erb')))
9
+
10
+ }
11
+
12
+ let(:request_for_2_errors_in_1_block){
13
+ a_request(:post, 'http://hoptoadapp.com/notifier_api/v2/notices').
14
+ with(:headers => {'Accept'=>'text/xml', 'Content-Type' => 'text/xml'},
15
+ :body => evaluate_xml_erb(File.join(File.dirname(__FILE__), 'expected_error_2_request.xml.erb')))
16
+
17
+ }
18
+
19
+ #--------------------------------------------------------
20
+
21
+ before { Timecop.freeze(FROZEN_TIME); } #capture_stdout}
22
+ after { Timecop.return ; } #restore_stdout}
23
+ before do
24
+ @api_key = VALID_HOPTOAD_API_KEY
25
+ @reporter = FailFast.report_to(:hoptoad => @api_key).first
26
+ end
27
+
28
+ #--------------------------------------------------------
29
+
30
+
31
+ context 'when 1 errors occurs in 1 block' do
32
+ use_vcr_cassette :record => :new_episodes
33
+
34
+ it 'POSTs 1 xml request to hoptoadapp.com' do
35
+ produce_1_error_in_1_check_block
36
+ request_for_1_error_in_1_block.should have_been_made
37
+ end
38
+ end
39
+
40
+
41
+ context 'when 2 errors occur in 1 block' do
42
+ use_vcr_cassette :record => :new_episodes
43
+
44
+ it 'POSTs 1 xml request to hoptoadapp.com' do
45
+ produce_2_errors_in_1_check_block
46
+ request_for_2_errors_in_1_block.should have_been_made
47
+ end
48
+ end
49
+
50
+
51
+ context 'when 3 errors occur in 2 blocks' do
52
+ use_vcr_cassette :record => :new_episodes
53
+
54
+ it 'POSTs 2 xml requests to hoptoadapp.com' do
55
+ produce_1_error_in_1_check_block
56
+ produce_2_errors_in_1_check_block
57
+
58
+ request_for_1_error_in_1_block .should have_been_made
59
+ request_for_2_errors_in_1_block.should have_been_made
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,35 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe FailFast::ErrorReporter::Hoptoad do
4
+
5
+ context 'when the API token is invalid' do
6
+ use_vcr_cassette :record => :new_episodes
7
+ before do
8
+ FailFast.send :reset_global_error_reporters
9
+ @api_key = INVALID_HOPTOAD_API_KEY
10
+ @reporter = FailFast.report_to(:hoptoad => @api_key).first
11
+ end
12
+
13
+ example 'POST => 422' do
14
+ produce_1_error_in_1_check_block
15
+ @reporter.response.code.to_i.should == 422
16
+ end
17
+ end
18
+
19
+
20
+ context 'when the API token is valid' do
21
+ use_vcr_cassette :record => :new_episodes
22
+
23
+ before do
24
+ FailFast.send :reset_global_error_reporters
25
+ @api_key = VALID_HOPTOAD_API_KEY
26
+ @reporter = FailFast.report_to(:hoptoad => @api_key).first
27
+ end
28
+
29
+ example 'POST => 200' do
30
+ produce_1_error_in_1_check_block
31
+ @reporter.response.code.to_i.should == 200
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe FailFast::ErrorReporter::Stdout do
4
+ before(:each) { capture_stdout }
5
+ after( :each) { restore_stdout }
6
+
7
+ context 'when 2 errors are detected in a config file' do
8
+ before do
9
+ produce_2_errors_in_1_check_block
10
+ end
11
+ it("prints to $stdout the config file path") do
12
+ $stdout.string.should match(/error.*#{SIMPLE_FILE_PATH}/mi)
13
+ end
14
+ it "prints to $stdout the 1st error details" do
15
+ $stdout.string.should match(/error.*msg-A.*missing value.*anykey_1/mi)
16
+ end
17
+ it "prints to $stdout the 2nd error details" do
18
+ $stdout.string.should match(/error.*msg-B.*missing value.*anykey_2/mi)
19
+ end
20
+ it "prints everything in sequence and in the right order" do
21
+ $stdout.string.should match(/error.*#{SIMPLE_FILE_PATH}.*msg-A.*missing value.*anykey_1.*msg-B.*missing value.*anykey_2/mi)
22
+ end
23
+ end
24
+ end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- a_dir = SPEC_DIR + '/fixtures'
4
- a_file = SPEC_DIR + '/fixtures/simple.yml'
3
+ a_dir = SPEC_DIR + '/_/fixtures'
4
+ a_file = SPEC_DIR + '/_/fixtures/simple.yml'
5
5
 
6
6
 
7
7
  describe 'directory_exists' do
@@ -1,12 +1,9 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe 'has_url_for()' do
4
- before(:all) do
5
- FakeWeb.register_uri(:get, "http://example.com/index.html", :body => "I'm reachable!")
6
- FakeWeb.register_uri(:get, "http://localhost/index.html" , :body => "I'm reachable!")
7
- FakeWeb.register_uri(:get, "http://localhost/index.html" , :body => "I'm reachable!")
8
- FakeWeb.register_uri(:get, "http://localhost:3200" , :body => "I'm reachable!")
9
- end
4
+ before(:each) do
5
+ stub_request(:get, "http://example.com" ).to_return(:body => "I'm reachable!")
6
+ end
10
7
 
11
8
  it_should_return_true( 'when the value is an url') { has_url_for 'test/url' }
12
9
  it_should_not_raise_an_error('when the value is an url') { has_url_for 'test/url' }
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
3
3
  describe 'the key prefix' do
4
4
 
5
5
  example 'works fine in all the checkers' do
6
- FakeWeb.register_uri(:get, "http://localhost:3200" , :body => "I'm reachable!")
6
+ stub_request(:get, "http://localhost:3200").to_return(:body => "I'm reachable!")
7
7
 
8
8
  conn = Mongo::Connection.new
9
9
  conn.should_receive(:database_names).any_number_of_times.and_return %w(sample_mongoDB)
@@ -35,9 +35,7 @@ describe "typical usage" do
35
35
  end
36
36
 
37
37
  def fake_the_remote_services
38
- FakeWeb.register_uri(:get, "http://example.com/index.html", :body => "I'm reachable!")
39
- FakeWeb.register_uri(:get, "http://localhost/index.html", :body => "I'm reachable!")
40
- FakeWeb.register_uri(:get, "http://example.com", :body => "I'm reachable!")
38
+ stub_request(:get, "http://example.com" ).to_return(:body => "I'm reachable!")
41
39
 
42
40
  conn = Mongo::Connection.new
43
41
  conn.should_receive(:database_names).any_number_of_times.and_return %w(sample_mongoDB)
@@ -1,148 +1,27 @@
1
1
  require 'rubygems'
2
2
  require 'fail_fast'
3
+
3
4
  require 'spec'
4
- require 'spec/autorun'
5
- require 'fakeweb'
6
- #gem 'mongo', '1.0'
5
+ require 'timecop'
7
6
  require 'mongo'
7
+ require 'active_support/inflector'
8
8
 
9
- SPEC_DIR = File.dirname(File.expand_path(__FILE__))
10
- UNKNOWN_FILE_PATH = 'an_unknown_file_path'
11
- EMPTY_FILE_PATH = File.expand_path(File.dirname(__FILE__) + '/fixtures/empty.yml')
12
- SIMPLE_FILE_PATH = File.expand_path(File.dirname(__FILE__) + '/fixtures/simple.yml')
13
-
14
- class ExitTriggered < StandardError ; end
15
- module Kernel
16
- def exit(param=nil)
17
- raise ExitTriggered.new('Kernel.exit was called')
18
- end
19
- end
20
-
21
-
22
- module DSLMacros
23
- module InstanceMethods
24
- def capture_stdout
25
- @@original_stdout = STDOUT
26
- $stdout = StringIO.new
27
- end
28
-
29
- def restore_stdout
30
- $stdout = @@original_stdout
31
- end
32
- end
33
- module ClassMethods
34
-
35
- def it_should_return_true(msg, &block)
36
- it "returns true #{msg}" do
37
- capture_stdout
38
- begin
39
- FailFast(SIMPLE_FILE_PATH).check.but_fail_later do
40
- raise "BUG : @@errorz should be empty \n#{errors.inspect}" unless errors.empty?
41
- result = self.instance_eval(&block)
42
- #TODO : BETTER ERROR REPORTING
43
- result.should == true
44
- end
45
- rescue => e
46
- raise e
47
- end
48
- restore_stdout
49
- end
50
- end
51
-
52
-
53
- def it_should_return_false(msg, &block)
54
- it "returns false #{msg}" do
55
- capture_stdout
56
- begin
57
- FailFast(SIMPLE_FILE_PATH).check.but_fail_later do
58
- raise "BUG : @@errorz should be empty \n#{errors.inspect}" unless errors.empty?
59
- result = self.instance_eval(&block)
60
- #TODO : BETTER ERROR REPORTING
61
- result.should == false
62
- end
63
- rescue => e
64
- raise e
65
- end
66
- restore_stdout
67
- end
68
- end
9
+ SPEC_DIR = File.dirname(File.expand_path(__FILE__))
69
10
 
70
- def it_should_not_raise_an_error(msg, &block)
71
- it "does not raise an error #{msg}" do
72
- capture_stdout
73
- begin
74
- FailFast(SIMPLE_FILE_PATH).check do
75
- raise "BUG : @@errorz should be empty \n#{errors.inspect}" unless errors.empty?
76
- self.instance_eval(&block)
77
- end
78
- rescue => e
79
- raise e
80
- ensure
81
- if FailFast.failed?
82
- fail "ZZshould not have raised an error, but it raised\n#{FailFast.global_errors.join("\n")}"
83
- end
84
- end
85
- restore_stdout
86
- end
87
- end
11
+ UNKNOWN_FILE_PATH = 'an_unknown_file_path'
12
+ EMPTY_FILE_PATH = SPEC_DIR + '/_/fixtures/empty.yml'
13
+ SIMPLE_FILE_PATH = SPEC_DIR + '/_/fixtures/simple.yml'
88
14
 
89
- def it_should_raise_an_error(key, kind, msg, &block)
90
- it "raises an error #{kind}-#{key}-#{msg}" do
91
- capture_stdout
92
- begin
93
- FailFast(SIMPLE_FILE_PATH).check do
94
- raise "BUG : @@errorz should be empty \n#{errors.inspect}" unless errors.empty?
95
- self.instance_eval(&block)
96
- end
97
- rescue => e
98
- # uncomment the next line after the refactoring/once error are no longer raise
99
- # raise e
100
- ensure
101
- if !FailFast.failed?
102
- fail "\ne2d\nshould have raised a #{kind} error for #{key} \n==#{e}"
103
- elsif FailFast.global_errors.length == 1 && !FailFast.global_errors.first.has_key_and_kind?(key, kind)
104
- fail "\ne2e\nshould have raised a #{kind.inspect} error for #{key.inspect}, but raised instead #{FailFast.global_errors.inspect}"
105
- elsif 2 <= FailFast.global_errors.length
106
- fail "\ne2f\nshould have raised only a #{kind} error for #{key}\n#{FailFast.global_errors.join("\n")}"
107
- end
108
- end
109
- restore_stdout
110
- end
111
- end
112
- def it_should_raise_a_direct_error(value, kind, msg, &block)
113
- it "raises an error #{kind}-#{value}-#{msg}" do
114
- capture_stdout
115
- begin
116
- FailFast(SIMPLE_FILE_PATH).check do
117
- raise "BUG : @@errorz should be empty \n#{errors.inspect}" unless errors.empty?
118
- self.instance_eval(&block)
119
- end
120
- rescue => e
121
- # uncomment the next line after the refactoring/once error are no longer raise
122
- # raise e
123
- ensure
124
- if !FailFast.failed?
125
- fail "\ne2d\nshould have raised a #{kind} error for #{value} \n==#{e}"
126
- elsif FailFast.global_errors.length == 1 && !FailFast.global_errors.first.has_value_and_kind?(value, kind)
127
- fail "\ne2e\nshould have raised a #{kind.inspect} error for #{value.inspect}\n, but raised instead\n#{FailFast.global_errors.inspect}"
128
- elsif 2 <= FailFast.global_errors.length
129
- fail "\ne2f\nshould have raised only 1 #{kind} error for #{value}\nbut raised instead\n#{FailFast.global_errors.join("\n")}"
130
- end
131
- end
132
- restore_stdout
133
- end
134
- end
15
+ require 'time'
16
+ FROZEN_TIME = Time.parse('1999-05-04 03:02:01 +0200')
135
17
 
136
- end
137
18
 
138
- def self.included(receiver)
139
- receiver.extend(ClassMethods)
140
- receiver.send :include, InstanceMethods
141
- end
142
- end
143
19
  Spec::Runner.configure do |config|
144
- config.include(DSLMacros)
145
20
  config.before(:each) do
146
21
  FailFast.reset_error_db!
22
+ FailFast.send :reset_global_error_reporters
147
23
  end
148
24
  end
25
+
26
+
27
+ Dir[File.join(SPEC_DIR, '_/support/**/*.rb')].each {|f| require f}