fail_fast 0.1.2 → 0.2.1
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.
- 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
         |