fail_fast 0.1.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +5 -0
- data/README.markdown +109 -49
- data/VERSION +1 -1
- data/fail_fast.gemspec +36 -24
- data/lib/fail_fast/base/base.rb +44 -0
- data/lib/fail_fast/base/utils.rb +58 -0
- data/lib/fail_fast/base/z_only_for_tests.rb +10 -0
- data/lib/fail_fast/{misc.rb → extensions/base_commands.rb} +3 -3
- data/lib/fail_fast/{check_active_record_db.rb → extensions/check_active_record_db.rb} +17 -52
- data/lib/fail_fast/{check_email.rb → extensions/check_email.rb} +1 -1
- data/lib/fail_fast/{check_file_system.rb → extensions/check_file_system.rb} +4 -4
- data/lib/fail_fast/{check_mongo_db.rb → extensions/check_mongo_db.rb} +4 -4
- data/lib/fail_fast/{check_url.rb → extensions/check_url.rb} +2 -2
- data/lib/fail_fast/extensions/check_value.rb +40 -0
- data/lib/fail_fast/main.rb +16 -71
- data/lib/fail_fast/report.txt.erb +45 -6
- data/lib/fail_fast/support/error_db.rb +23 -0
- data/lib/fail_fast/support/error_details.rb +10 -0
- data/lib/fail_fast/support/z_only_for_tests.rb +6 -0
- data/lib/fail_fast.rb +6 -10
- data/show_all_errors.rb +12 -1
- data/spec/errors_storage_spec.rb +18 -0
- data/spec/file_is_empty_spec.rb +32 -4
- data/spec/file_is_missing_spec.rb +5 -3
- data/spec/multiple_blocks_support_spec.rb +37 -0
- data/spec/report_printing_spec.rb +29 -0
- data/spec/spec_helper.rb +44 -18
- metadata +37 -25
- data/lib/fail_fast/check_value.rb +0 -38
- /data/spec/{misc_spec.rb → base_commands_spec.rb} +0 -0
- /data/spec/{has_active_record_db_spec.rb → check_active_record_db_spec.rb} +0 -0
- /data/spec/{has_email_for_spec.rb → check_email_spec.rb} +0 -0
- /data/spec/{file_system_spec.rb → check_file_system_spec.rb} +0 -0
- /data/spec/{has_mongoDB_for_spec.rb → check_mongo_db_spec.rb} +0 -0
- /data/spec/{has_url_for_spec.rb → check_url_spec.rb} +0 -0
- /data/spec/{has_value_for_spec.rb → check_value_spec.rb} +0 -0
data/CHANGELOG.txt
CHANGED
data/README.markdown
CHANGED
@@ -6,38 +6,85 @@
|
|
6
6
|
|
7
7
|
## How to use :
|
8
8
|
|
9
|
-
Early in your project boot sequence insert code like
|
10
9
|
|
11
|
-
|
12
|
-
FailFast('database.yml').check do
|
13
|
-
has_active_record_db_for Rails.env
|
14
|
-
end
|
10
|
+
### Case 1 : don't start the application if the DB cannot be reached.
|
15
11
|
|
16
|
-
|
17
|
-
has_mongoDB_for Rails.env
|
18
|
-
end
|
12
|
+
Early in your project boot sequence insert this code :
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
require 'fail_fast'
|
15
|
+
FailFast("path/to/database.yml").check do
|
16
|
+
has_active_record_db_for 'production'
|
17
|
+
end
|
23
18
|
|
24
|
-
only_if Rails.env.production? do
|
25
|
-
has_url_for 'bug_tracker/url', :reachable => true
|
26
|
-
end
|
27
19
|
|
28
|
-
|
29
|
-
|
20
|
+
If the DB connection fails,
|
21
|
+
* the application will exit immediately and
|
22
|
+
* you'll see this report :
|
23
|
+
|
24
|
+
|
25
|
+
+------------------------------------------------------------------------------------------
|
26
|
+
| FAIL_FAST error : precondition(s) not met in
|
27
|
+
| -----------------
|
28
|
+
| file : "path/to/database.yml"
|
29
|
+
| keys prefix : (none)
|
30
|
+
+------------------------------------------------------------------------------------------
|
31
|
+
| error key value
|
32
|
+
+------------------------------------------------------------------------------------------
|
33
|
+
| * active_record_db_connection_error production Unknown database 'a_db'
|
34
|
+
+------------------------------------------------------------------------------------------
|
35
|
+
|
36
|
+
Remark : `check` will call `exit(1)` at the end of the first block with an error.
|
37
|
+
If you want to collect and report all the errors before exiting, use `check_now.but_fail_later` (see case 2 below).
|
38
|
+
|
39
|
+
### Case 2 : collect errors in multiple blocks.
|
40
|
+
|
41
|
+
|
42
|
+
require 'fail_fast'
|
43
|
+
FailFast('database.yml').check_now.but_fail_later do
|
44
|
+
has_active_record_db_for 'production'
|
45
|
+
end
|
46
|
+
|
47
|
+
FailFast('database.mongo.yml').check_now.but_fail_later do
|
48
|
+
has_mongoDB_for Rails.env
|
49
|
+
end
|
50
|
+
|
51
|
+
FailFast('path_to/config.yml', prefix=Rails.env).check_now.but_fail_later do
|
52
|
+
has_values_for 'author/fname', 'author/lname'
|
53
|
+
has_email_for 'newsletter/to_address'
|
54
|
+
|
55
|
+
only_if Rails.env.production? do
|
56
|
+
has_url_for 'bug_tracker/url', :reachable => true
|
57
|
+
end
|
58
|
+
|
59
|
+
directory_exists_for '/tmp'
|
60
|
+
file_exists_for 'public/nda.pdf'
|
61
|
+
|
62
|
+
skip_if Rails.env.development? do
|
63
|
+
fail "I don't work on Sunday" if 0 == Time.now.wday
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
FailFast.fail_now # exit it an error was detected in any of the 3 blocks above.
|
30
68
|
|
31
|
-
skip_if Rails.env.development? do
|
32
|
-
fail "I don't work on Sunday" if 0 == Time.now.wday
|
33
|
-
end
|
34
|
-
end
|
35
69
|
|
36
70
|
If it fails, you'll get a report like this :
|
37
71
|
|
38
72
|
+------------------------------------------------------------------------------------------
|
39
|
-
| FAIL_FAST error :
|
40
|
-
|
|
73
|
+
| FAIL_FAST error : precondition(s) not met in
|
74
|
+
| -----------------
|
75
|
+
| file : "path/to/database.yml"
|
76
|
+
| keys prefix : (none)
|
77
|
+
+------------------------------------------------------------------------------------------
|
78
|
+
| error key value
|
79
|
+
+------------------------------------------------------------------------------------------
|
80
|
+
| * active_record_db_connection_error production Unknown database 'a_db'
|
81
|
+
+------------------------------------------------------------------------------------------
|
82
|
+
|
83
|
+
+------------------------------------------------------------------------------------------
|
84
|
+
| FAIL_FAST error : precondition(s) not met in
|
85
|
+
| -----------------
|
86
|
+
| file : "./spec/fixtures/simple.yml"
|
87
|
+
| keys prefix : none
|
41
88
|
+------------------------------------------------------------------------------------------
|
42
89
|
| error key value
|
43
90
|
+------------------------------------------------------------------------------------------
|
@@ -62,6 +109,17 @@ If it fails, you'll get a report like this :
|
|
62
109
|
| * fail a custom failure message
|
63
110
|
+------------------------------------------------------------------------------------------
|
64
111
|
|
112
|
+
### Case 3 : print an additional custom message if errors were detected
|
113
|
+
|
114
|
+
... # code like in the cases above.
|
115
|
+
|
116
|
+
if FailFast.failed?
|
117
|
+
puts "Cannot start the application due to the problems mentioned above."
|
118
|
+
puts "You can skip those test with the SKIP_FAIL_FAST environment variable"
|
119
|
+
FailFast.fail_now unless 'true'==ENV['SKIP_FAIL_FAST']
|
120
|
+
end
|
121
|
+
|
122
|
+
|
65
123
|
|
66
124
|
## Info :
|
67
125
|
|
@@ -89,11 +147,12 @@ You can also add custom rules, not related to any config files :
|
|
89
147
|
|
90
148
|
### _free/direct_ commands (not linked to the yaml file contents) :
|
91
149
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
150
|
+
fail "I don't work on Sunday" if (0 == Time.now.wday)
|
151
|
+
|
152
|
+
directory_exists '/tmp'
|
153
|
+
file_exists '/Users/me/.bash_profile'
|
154
|
+
has_mongoDB 'localhost', 'db_app_1'
|
155
|
+
has_active_record_db :host => 'dbserv', :adapter => 'mysql', :database => 'db'
|
97
156
|
|
98
157
|
### _keyed_ commands (linked to a value found in a yaml file) :
|
99
158
|
|
@@ -101,37 +160,38 @@ You can also add custom rules, not related to any config files :
|
|
101
160
|
|
102
161
|
*presence :*
|
103
162
|
|
104
|
-
|
105
|
-
|
163
|
+
has_value_for :application_name
|
164
|
+
has_values_for 'author/fname', 'author/lname'
|
106
165
|
|
107
166
|
*contents <-> a regexp or pattern :*
|
108
167
|
|
109
|
-
|
110
|
-
|
111
|
-
|
168
|
+
has_value_for 'level', /(alpha|beta|production)/
|
169
|
+
has_url_for 'bug_tracker/url'
|
170
|
+
has_email_for 'newsletter/to_address'
|
112
171
|
|
113
172
|
Test the file system :
|
114
173
|
|
115
|
-
|
116
|
-
|
174
|
+
directory_exists_for 'assets-upload_dir'
|
175
|
+
file_exists_for 'assets-nda_pdf_file'
|
117
176
|
|
118
177
|
Test external services :
|
119
178
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
179
|
+
# is a webserver up ?
|
180
|
+
has_url_for 'bug_tracker/url', :reachable => true
|
181
|
+
has_url_for 'bug_tracker/url', :reachable => true, :may_add_trailing_slash => true
|
182
|
+
|
183
|
+
# can we connect to a mongoDB db/server :
|
184
|
+
has_mongoDB_for 'test/mongoDB'
|
185
|
+
has_mongoDB_for 'test/unknown_mongoDB_db', :check_database => false
|
186
|
+
|
187
|
+
# can we connect to a SQL db :
|
188
|
+
has_active_record_db_for 'production/db_connection'
|
189
|
+
|
132
190
|
Misc :
|
133
|
-
|
191
|
+
|
192
|
+
fail "I don't work on Sunday" if 0 == Time.now.wday
|
134
193
|
|
135
194
|
Control commands :
|
136
|
-
|
137
|
-
|
195
|
+
|
196
|
+
skip_if <condition> do .. end
|
197
|
+
only_if <condition> do .. end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
data/fail_fast.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{fail_fast}
|
8
|
-
s.version = "0.1
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alain Ravet"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-07-05}
|
13
13
|
s.description = %q{raises an error if the yaml contents of a config file does not pass a test script.}
|
14
14
|
s.email = %q{alainravet@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,28 +26,37 @@ Gem::Specification.new do |s|
|
|
26
26
|
"VERSION",
|
27
27
|
"fail_fast.gemspec",
|
28
28
|
"lib/fail_fast.rb",
|
29
|
-
"lib/fail_fast/
|
30
|
-
"lib/fail_fast/
|
31
|
-
"lib/fail_fast/
|
32
|
-
"lib/fail_fast/
|
33
|
-
"lib/fail_fast/
|
34
|
-
"lib/fail_fast/
|
29
|
+
"lib/fail_fast/base/base.rb",
|
30
|
+
"lib/fail_fast/base/utils.rb",
|
31
|
+
"lib/fail_fast/base/z_only_for_tests.rb",
|
32
|
+
"lib/fail_fast/extensions/base_commands.rb",
|
33
|
+
"lib/fail_fast/extensions/check_active_record_db.rb",
|
34
|
+
"lib/fail_fast/extensions/check_email.rb",
|
35
|
+
"lib/fail_fast/extensions/check_file_system.rb",
|
36
|
+
"lib/fail_fast/extensions/check_mongo_db.rb",
|
37
|
+
"lib/fail_fast/extensions/check_url.rb",
|
38
|
+
"lib/fail_fast/extensions/check_value.rb",
|
35
39
|
"lib/fail_fast/main.rb",
|
36
|
-
"lib/fail_fast/misc.rb",
|
37
40
|
"lib/fail_fast/report.txt.erb",
|
41
|
+
"lib/fail_fast/support/error_db.rb",
|
42
|
+
"lib/fail_fast/support/error_details.rb",
|
43
|
+
"lib/fail_fast/support/z_only_for_tests.rb",
|
38
44
|
"show_all_errors.rb",
|
45
|
+
"spec/base_commands_spec.rb",
|
46
|
+
"spec/check_active_record_db_spec.rb",
|
47
|
+
"spec/check_email_spec.rb",
|
48
|
+
"spec/check_file_system_spec.rb",
|
49
|
+
"spec/check_mongo_db_spec.rb",
|
50
|
+
"spec/check_url_spec.rb",
|
51
|
+
"spec/check_value_spec.rb",
|
52
|
+
"spec/errors_storage_spec.rb",
|
39
53
|
"spec/file_is_empty_spec.rb",
|
40
54
|
"spec/file_is_missing_spec.rb",
|
41
|
-
"spec/file_system_spec.rb",
|
42
55
|
"spec/fixtures/empty.yml",
|
43
56
|
"spec/fixtures/simple.yml",
|
44
|
-
"spec/has_active_record_db_spec.rb",
|
45
|
-
"spec/has_email_for_spec.rb",
|
46
|
-
"spec/has_mongoDB_for_spec.rb",
|
47
|
-
"spec/has_url_for_spec.rb",
|
48
|
-
"spec/has_value_for_spec.rb",
|
49
57
|
"spec/how_to_use_spec.rb",
|
50
|
-
"spec/
|
58
|
+
"spec/multiple_blocks_support_spec.rb",
|
59
|
+
"spec/report_printing_spec.rb",
|
51
60
|
"spec/spec.opts",
|
52
61
|
"spec/spec_helper.rb"
|
53
62
|
]
|
@@ -57,16 +66,19 @@ Gem::Specification.new do |s|
|
|
57
66
|
s.rubygems_version = %q{1.3.7}
|
58
67
|
s.summary = %q{raises an error if the yaml contents of a config file does pass a test script.}
|
59
68
|
s.test_files = [
|
60
|
-
"spec/
|
69
|
+
"spec/base_commands_spec.rb",
|
70
|
+
"spec/check_active_record_db_spec.rb",
|
71
|
+
"spec/check_email_spec.rb",
|
72
|
+
"spec/check_file_system_spec.rb",
|
73
|
+
"spec/check_mongo_db_spec.rb",
|
74
|
+
"spec/check_url_spec.rb",
|
75
|
+
"spec/check_value_spec.rb",
|
76
|
+
"spec/errors_storage_spec.rb",
|
77
|
+
"spec/file_is_empty_spec.rb",
|
61
78
|
"spec/file_is_missing_spec.rb",
|
62
|
-
"spec/file_system_spec.rb",
|
63
|
-
"spec/has_active_record_db_spec.rb",
|
64
|
-
"spec/has_email_for_spec.rb",
|
65
|
-
"spec/has_mongoDB_for_spec.rb",
|
66
|
-
"spec/has_url_for_spec.rb",
|
67
|
-
"spec/has_value_for_spec.rb",
|
68
79
|
"spec/how_to_use_spec.rb",
|
69
|
-
"spec/
|
80
|
+
"spec/multiple_blocks_support_spec.rb",
|
81
|
+
"spec/report_printing_spec.rb",
|
70
82
|
"spec/spec_helper.rb"
|
71
83
|
]
|
72
84
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class FailFast
|
2
|
+
module Base
|
3
|
+
ERB_TEMPLATE = File.dirname(__FILE__) + '/../report.txt.erb'
|
4
|
+
|
5
|
+
def check(&block)
|
6
|
+
fail_now_mode = block_given? # false in the case of *.check_now.but_fail_now do .. end
|
7
|
+
|
8
|
+
@config_file_not_found = !File.exist?(@config_file_path)
|
9
|
+
if @config_file_not_found
|
10
|
+
add_error ErrorDetails.new(nil, :config_file_not_found, @config_file_path)
|
11
|
+
else
|
12
|
+
check_all_rules(&block) if block_given?
|
13
|
+
end
|
14
|
+
unless errors.empty?
|
15
|
+
print_errors
|
16
|
+
exit(1) if fail_now_mode
|
17
|
+
end
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
alias check_now check
|
22
|
+
|
23
|
+
def but_fail_later(&block)
|
24
|
+
return if @config_file_not_found
|
25
|
+
check_all_rules(&block) if block_given?
|
26
|
+
unless errors.empty?
|
27
|
+
print_errors
|
28
|
+
end
|
29
|
+
end
|
30
|
+
private
|
31
|
+
|
32
|
+
def check_all_rules(&block)
|
33
|
+
@yaml_config_as_hash = YAML.load(ERB.new(File.read(@config_file_path)).result) || {}
|
34
|
+
self.instance_eval(&block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def print_errors
|
38
|
+
@errors = errors
|
39
|
+
puts "\n\n\n" + ERB.new(File.read(ERB_TEMPLATE)).result(binding) + "\n\n"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
FailFast.send :include, FailFast::Base
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class FailFast
|
2
|
+
|
3
|
+
class Params < Struct.new(:key, :value, :regexp, :options) ; end
|
4
|
+
|
5
|
+
module Utils
|
6
|
+
|
7
|
+
def blank?(value)
|
8
|
+
value.nil? || (value.is_a?(String) && '' == value.strip)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Usage
|
12
|
+
# value_for_deep_key('one/two/three')
|
13
|
+
# returns
|
14
|
+
# @yaml_config_as_hash['one']['two']['three']
|
15
|
+
#
|
16
|
+
def value_for_deep_key(key)
|
17
|
+
key.to_s.split('/').inject(@yaml_config_as_hash) { |h, k| h[k] } rescue nil
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def key_value_regexp_options(key, params)
|
22
|
+
last = params.pop
|
23
|
+
if last.is_a?(Hash)
|
24
|
+
options = last
|
25
|
+
else
|
26
|
+
params << last
|
27
|
+
options = {}
|
28
|
+
end
|
29
|
+
|
30
|
+
last = params.pop
|
31
|
+
if last.is_a?(Regexp)
|
32
|
+
regexp = last
|
33
|
+
else
|
34
|
+
params << last
|
35
|
+
end
|
36
|
+
|
37
|
+
key = "#{@keys_prefix}/#{key}" if @keys_prefix
|
38
|
+
value = value_for_deep_key(key)
|
39
|
+
|
40
|
+
Params.new(key, value, regexp, options)
|
41
|
+
end
|
42
|
+
|
43
|
+
NO_COLOUR="\033[0m"
|
44
|
+
RED ="\033[31m"
|
45
|
+
LRED ="\033[1;31m"
|
46
|
+
BLUE ="\033[34m"
|
47
|
+
GREEN ="\033[32m"
|
48
|
+
YELLOW ="\033[1;33m"
|
49
|
+
|
50
|
+
def red( str) [RED, str, NO_COLOUR].join end
|
51
|
+
def lred( str) [LRED, str, NO_COLOUR].join end
|
52
|
+
def blue( str) [BLUE, str, NO_COLOUR].join end
|
53
|
+
def green( str) [GREEN, str, NO_COLOUR].join end
|
54
|
+
def yellow(str) [YELLOW, str, NO_COLOUR].join end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
FailFast.send :include, FailFast::Utils
|
@@ -1,12 +1,12 @@
|
|
1
1
|
class FailFast
|
2
|
-
module
|
2
|
+
module BaseCommands
|
3
3
|
|
4
4
|
# Usage
|
5
5
|
# if 0 == Time.now.wday
|
6
6
|
# fail "I don't work on Sunday""
|
7
7
|
# end
|
8
8
|
def fail(message)
|
9
|
-
|
9
|
+
add_error ErrorDetails.new(nil, :fail, message)
|
10
10
|
end
|
11
11
|
|
12
12
|
def only_if(condition, &block)
|
@@ -18,4 +18,4 @@ class FailFast
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
-
FailFast.send :include, FailFast::
|
21
|
+
FailFast.send :include, FailFast::BaseCommands
|
@@ -1,19 +1,4 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
# ActiveRecord::Base.establish_connection(
|
3
|
-
# :adapter => "mysql",
|
4
|
-
# :host => "localhost",
|
5
|
-
# :username => "myuser",
|
6
|
-
# :password => "mypass",
|
7
|
-
# :database => "somedatabase"
|
8
|
-
# )
|
9
|
-
# ActiveRecord::Base.establish_connection(
|
10
|
-
# :adapter => "sqlite",
|
11
|
-
# :database => "path/to/dbfile"
|
12
|
-
# )
|
13
|
-
# ActiveRecord::Base.establish_connection(
|
14
|
-
# :adapter => "sqlite3",
|
15
|
-
# :dbfile => ":memory:"
|
16
|
-
#)
|
17
2
|
|
18
3
|
class FailFast
|
19
4
|
module CheckActiveRecordDB
|
@@ -34,7 +19,7 @@ class FailFast
|
|
34
19
|
@error_message = e.message
|
35
20
|
end
|
36
21
|
unless @success
|
37
|
-
|
22
|
+
add_error ErrorDetails.new(nil, :active_record_db_connection_error, @error_message)
|
38
23
|
end
|
39
24
|
end
|
40
25
|
|
@@ -61,7 +46,7 @@ class FailFast
|
|
61
46
|
@error_message = e.message
|
62
47
|
end
|
63
48
|
unless @success
|
64
|
-
|
49
|
+
add_error ErrorDetails.new(key, :active_record_db_connection_error, @error_message)
|
65
50
|
end
|
66
51
|
end
|
67
52
|
|
@@ -70,38 +55,18 @@ end
|
|
70
55
|
|
71
56
|
FailFast.send :include, FailFast::CheckActiveRecordDB
|
72
57
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
value = value_for_deep_key(key)
|
89
|
-
host, port, db = value['host'], value['port'], value['database']
|
90
|
-
|
91
|
-
begin
|
92
|
-
@conn = Mongo::Connection.new(host, port)
|
93
|
-
rescue Mongo::ConnectionFailure
|
94
|
-
FailFast.errors << ErrorDetails.new(key, :mongoDB_server_not_found, host)
|
95
|
-
return
|
96
|
-
end
|
97
|
-
|
98
|
-
must_check_db = !(false == options[:check_database])
|
99
|
-
if must_check_db && !@conn.database_names.include?(db)
|
100
|
-
FailFast.errors << ErrorDetails.new(key, :mongoDB_db_not_found, db)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
|
58
|
+
# ActiveRecord::Base.establish_connection(
|
59
|
+
# :adapter => "mysql",
|
60
|
+
# :host => "localhost",
|
61
|
+
# :username => "myuser",
|
62
|
+
# :password => "mypass",
|
63
|
+
# :database => "somedatabase"
|
64
|
+
# )
|
65
|
+
# ActiveRecord::Base.establish_connection(
|
66
|
+
# :adapter => "sqlite",
|
67
|
+
# :database => "path/to/dbfile"
|
68
|
+
# )
|
69
|
+
# ActiveRecord::Base.establish_connection(
|
70
|
+
# :adapter => "sqlite3",
|
71
|
+
# :dbfile => ":memory:"
|
72
|
+
#)
|
@@ -8,7 +8,7 @@ class FailFast
|
|
8
8
|
#
|
9
9
|
def directory_exists(path, *params)
|
10
10
|
unless File.exists?(path) && File.directory?(path)
|
11
|
-
|
11
|
+
add_error ErrorDetails.new(nil, :directory_not_found, path)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -19,7 +19,7 @@ class FailFast
|
|
19
19
|
#
|
20
20
|
def file_exists(path, *params)
|
21
21
|
unless File.exists?(path) && File.file?(path)
|
22
|
-
|
22
|
+
add_error ErrorDetails.new(nil, :file_not_found, path)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -37,7 +37,7 @@ class FailFast
|
|
37
37
|
path = value_for_deep_key(key)
|
38
38
|
|
39
39
|
unless File.exists?(path) && File.directory?(path)
|
40
|
-
|
40
|
+
add_error ErrorDetails.new(key, :directory_not_found, p.value)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -55,7 +55,7 @@ class FailFast
|
|
55
55
|
path = value_for_deep_key(key)
|
56
56
|
|
57
57
|
unless File.exists?(path) && File.file?(path)
|
58
|
-
|
58
|
+
add_error ErrorDetails.new(key, :file_not_found, p.value)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -16,12 +16,12 @@ class FailFast
|
|
16
16
|
port = options.delete(:port)
|
17
17
|
@conn = Mongo::Connection.new(host, port, options)
|
18
18
|
rescue Mongo::ConnectionFailure
|
19
|
-
|
19
|
+
add_error ErrorDetails.new(nil, :mongoDB_server_not_found, host)
|
20
20
|
return
|
21
21
|
end
|
22
22
|
|
23
23
|
if db && !@conn.database_names.include?(db)
|
24
|
-
|
24
|
+
add_error ErrorDetails.new(nil, :mongoDB_db_not_found, db)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -45,13 +45,13 @@ class FailFast
|
|
45
45
|
begin
|
46
46
|
@conn = Mongo::Connection.new(host, port)
|
47
47
|
rescue Mongo::ConnectionFailure
|
48
|
-
|
48
|
+
add_error ErrorDetails.new(key, :mongoDB_server_not_found, host)
|
49
49
|
return
|
50
50
|
end
|
51
51
|
|
52
52
|
must_check_db = !(false == options[:check_database])
|
53
53
|
if must_check_db && !@conn.database_names.include?(db)
|
54
|
-
|
54
|
+
add_error ErrorDetails.new(key, :mongoDB_db_not_found, db)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -18,11 +18,11 @@ class FailFast
|
|
18
18
|
|
19
19
|
value = value_for_deep_key(key)
|
20
20
|
if UrlValidator.invalid_url?(value)
|
21
|
-
|
21
|
+
add_error ErrorDetails.new(key, :not_a_url, value)
|
22
22
|
return
|
23
23
|
end
|
24
24
|
if true==options.delete(:reachable) && UrlValidator.unreachable_url?(value, options)
|
25
|
-
|
25
|
+
add_error ErrorDetails.new(key, :url_not_reachable, value)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class FailFast
|
2
|
+
module CheckValue
|
3
|
+
|
4
|
+
# Usage
|
5
|
+
# has_values_for :sym_key, 'str_key'
|
6
|
+
#
|
7
|
+
def has_values_for(*keys)
|
8
|
+
keys.each{|key| has_value_for(key)}
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
# Usage
|
13
|
+
# has_value_for 'str_key'
|
14
|
+
# has_value_for :sym_key, /localhost/
|
15
|
+
# returns
|
16
|
+
# true if succesful, false otherwise
|
17
|
+
def has_value_for(key, *params)
|
18
|
+
p = key_value_regexp_options(key, params)
|
19
|
+
key, options = p.key, p.options
|
20
|
+
|
21
|
+
nof_errors = errors.size
|
22
|
+
if blank?(p.value)
|
23
|
+
add_error ErrorDetails.new(key, :missing_value, nil)
|
24
|
+
|
25
|
+
elsif p.regexp
|
26
|
+
add_error ErrorDetails.new(key, :value_does_not_match, p.value) unless p.value =~ p.regexp
|
27
|
+
|
28
|
+
elsif options.is_a?(Hash) && options[:in].is_a?(Range)
|
29
|
+
add_error ErrorDetails.new(key, :value_not_in_range, p.value) unless options[:in].include?(p.value)
|
30
|
+
|
31
|
+
elsif options.is_a?(Hash) && options[:in].is_a?(Array)
|
32
|
+
add_error ErrorDetails.new(key, :value_not_in_array, p.value) unless options[:in].include?(p.value)
|
33
|
+
end
|
34
|
+
no_new_error = nof_errors == errors.size
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
FailFast.send :include, FailFast::CheckValue
|