From 456ac01890d532ceefdfa99e94983971f554f894 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Mon, 13 May 2013 21:06:56 +0200 Subject: [PATCH 1/3] Crash if a config file isn't there. If a configuration file is specified via the command line but does not exist, fail loudly and crash to preserve the current state. Do not fail if the requested file is the default configuration file, _config.yml. In that case, fall back on the defaults. --- lib/jekyll/configuration.rb | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index c428c1a6..69323dce 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -102,7 +102,10 @@ module Jekyll def config_files(override) # Get configuration from /_config.yml or / config_files = override.delete('config') - config_files = File.join(source(override), "_config.yml") if config_files.to_s.empty? + if config_files.to_s.empty? + config_files = File.join(source(override), "_config.yml") + @default_config_file = true + end config_files = [config_files] unless config_files.is_a? Array config_files end @@ -117,6 +120,14 @@ module Jekyll raise "Configuration file: (INVALID) #{file}".yellow if !next_config.is_a?(Hash) Jekyll.logger.info "Configuration file:", file next_config + rescue SystemCallError + if @default_config_file + Jekyll::Logger.warn "Configuration file:", "none" + {} + else + Jekyll::Logger.error "Fatal:", "The configuration file '#{file}' could not be found." + exit(1) + end end # Public: Read in a list of configuration files and merge with this hash @@ -133,9 +144,6 @@ module Jekyll new_config = read_config_file(config_file) configuration = configuration.deep_merge(new_config) end - rescue SystemCallError - # Errno:ENOENT = file not found - Jekyll.logger.warn "Configuration file:", "none" rescue => err Jekyll.logger.warn "WARNING:", "Error reading configuration. " + "Using defaults (and options)." From a7efb86d5c9289d0d0307d5b8c10e036c3a18d7b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 12 Jul 2013 11:56:22 +0200 Subject: [PATCH 2/3] Throw ArgumentError when there's an invalid config file, and catch only that. --- lib/jekyll/configuration.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 69323dce..a4894237 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -117,16 +117,16 @@ module Jekyll # Returns this configuration, overridden by the values in the file def read_config_file(file) next_config = YAML.safe_load_file(file) - raise "Configuration file: (INVALID) #{file}".yellow if !next_config.is_a?(Hash) + raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) if !next_config.is_a?(Hash) Jekyll.logger.info "Configuration file:", file next_config rescue SystemCallError if @default_config_file - Jekyll::Logger.warn "Configuration file:", "none" + Jekyll.logger.warn "Configuration file:", "none" {} else - Jekyll::Logger.error "Fatal:", "The configuration file '#{file}' could not be found." - exit(1) + Jekyll.logger.error "Fatal:", "The configuration file '#{file}' could not be found." + abort end end From 253fc8c506b47f901bbc018720b7e86329dffbcf Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 12 Jul 2013 12:22:06 +0200 Subject: [PATCH 3/3] Raise LoadError if the file doesn't exist but do not catch it. :) --- lib/jekyll/configuration.rb | 4 ++-- test/test_configuration.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a4894237..5b5dda4b 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -126,7 +126,7 @@ module Jekyll {} else Jekyll.logger.error "Fatal:", "The configuration file '#{file}' could not be found." - abort + raise LoadError end end @@ -144,7 +144,7 @@ module Jekyll new_config = read_config_file(config_file) configuration = configuration.deep_merge(new_config) end - rescue => err + rescue ArgumentError => err Jekyll.logger.warn "WARNING:", "Error reading configuration. " + "Using defaults (and options)." $stderr.puts "#{err}" diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 0f197643..0e6372b0 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -82,6 +82,7 @@ class TestConfiguration < Test::Unit::TestCase context "loading configuration" do setup do @path = File.join(Dir.pwd, '_config.yml') + @user_config = File.join(Dir.pwd, "my_config_file.yml") end should "fire warning with no _config.yml" do @@ -102,6 +103,14 @@ class TestConfiguration < Test::Unit::TestCase mock($stderr).puts("Configuration file: (INVALID) #{@path}".yellow) assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) end + + should "fire warning when user-specified config file isn't there" do + mock(YAML).safe_load_file(@user_config) { raise SystemCallError, "No such file or directory - #{@user_config}" } + mock($stderr).puts(("Fatal: ".rjust(20) + "The configuration file '#{@user_config}' could not be found.").red) + assert_raises LoadError do + Jekyll.configuration({'config' => [@user_config]}) + end + end end context "loading config from external file" do setup do