From df1efeff25e60c3b7852fe92f7109e4b2d5f1aa9 Mon Sep 17 00:00:00 2001 From: Alex Kessinger Date: Wed, 10 Apr 2013 10:19:48 -0700 Subject: [PATCH 1/3] Accept multiple config files from command line Parse config as if it can contain multiple references to config files. This allows you to pass in multiple config files from the command line Helps with issues #514 and #703 --- lib/jekyll.rb | 16 +++++++++++----- test/test_configuration.rb | 14 ++++++++++++-- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index ab35a3b2..a1f0cdfd 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -136,13 +136,19 @@ module Jekyll source = override['source'] || Jekyll::DEFAULTS['source'] # Get configuration from /_config.yml or / - config_file = override.delete('config') - config_file = File.join(source, "_config.yml") if config_file.to_s.empty? + config_files = override.delete('config') + config_files = File.join(source, "_config.yml") if config_files.to_s.empty? + # If config is a list of space separate config files + config_files = config_files.split(' ') begin - config = YAML.safe_load_file(config_file) - raise "Configuration file: (INVALID) #{config_file}" if !config.is_a?(Hash) - $stdout.puts "Configuration file: #{config_file}" + config = {} + config_files.each do |config_file| + next_config = YAML.safe_load_file(config_file) + raise "Configuration file: (INVALID) #{config_file}" if !next_config.is_a?(Hash) + $stdout.puts "Configuration file: #{config_file}" + config = config.deep_merge(next_config) + end rescue SystemCallError # Errno:ENOENT = file not found $stderr.puts "Configuration file: none" diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 40b091de..ec42b8f5 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -46,10 +46,20 @@ class TestConfiguration < Test::Unit::TestCase assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] }) end - should "load default config if path passed is empty" do + should "load multiple config files" do mock(YAML).safe_load_file(@paths[:default]) { Hash.new } + mock(YAML).safe_load_file(@paths[:other]) { Hash.new } mock($stdout).puts("Configuration file: #{@paths[:default]}") - assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] }) + mock($stdout).puts("Configuration file: #{@paths[:other]}") + assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => "#{@paths[:default]} #{@paths[:other]}" }) + end + + should "load multiple config files and last config should win" do + mock(YAML).safe_load_file(@paths[:default]) { {"baseurl" => "http://example.dev"} } + mock(YAML).safe_load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} } + mock($stdout).puts("Configuration file: #{@paths[:default]}") + mock($stdout).puts("Configuration file: #{@paths[:other]}") + assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => "#{@paths[:default]} #{@paths[:other]}" }) end end end From 1e209c9bf3fcea671fcacfa01064fca40d49b21b Mon Sep 17 00:00:00 2001 From: Alex Kessinger Date: Wed, 10 Apr 2013 11:38:49 -0700 Subject: [PATCH 2/3] Upgrade --config to accept an array of files --- bin/jekyll | 4 ++-- lib/jekyll.rb | 5 +++-- test/test_configuration.rb | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/bin/jekyll b/bin/jekyll index 1c3324ba..79c368d8 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -44,7 +44,7 @@ command :build do |c| c.syntax = 'jekyll build [options]' c.description = 'Build your site' - c.option '--config [CONFIG_FILE]', 'Custom configuration file' + c.option '--config [CONFIG_FILE]', Array, 'Custom configuration file' c.option '--future', 'Publishes posts with a future date' c.option '--limit_posts MAX_POSTS', 'Limits the number of posts to parse and publish' c.option '-w', '--watch', 'Watch for changes and rebuild' @@ -63,7 +63,7 @@ command :serve do |c| c.syntax = 'jekyll serve [options]' c.description = 'Serve your site locally' - c.option '--config [CONFIG_FILE]', 'Custom configuration file' + c.option '--config [CONFIG_FILE]', Array,'Custom configuration file' c.option '--future', 'Publishes posts with a future date' c.option '--limit_posts MAX_POSTS', 'Limits the number of posts to parse and publish' c.option '-w', '--watch', 'Watch for changes and rebuild' diff --git a/lib/jekyll.rb b/lib/jekyll.rb index a1f0cdfd..a88dedc7 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -138,8 +138,9 @@ module Jekyll # Get configuration from /_config.yml or / config_files = override.delete('config') config_files = File.join(source, "_config.yml") if config_files.to_s.empty? - # If config is a list of space separate config files - config_files = config_files.split(' ') + if not config_files.is_a? Array + config_files = [config_files] + end begin config = {} diff --git a/test/test_configuration.rb b/test/test_configuration.rb index ec42b8f5..361408d6 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -51,7 +51,7 @@ class TestConfiguration < Test::Unit::TestCase mock(YAML).safe_load_file(@paths[:other]) { Hash.new } mock($stdout).puts("Configuration file: #{@paths[:default]}") mock($stdout).puts("Configuration file: #{@paths[:other]}") - assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => "#{@paths[:default]} #{@paths[:other]}" }) + assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) end should "load multiple config files and last config should win" do @@ -59,7 +59,7 @@ class TestConfiguration < Test::Unit::TestCase mock(YAML).safe_load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} } mock($stdout).puts("Configuration file: #{@paths[:default]}") mock($stdout).puts("Configuration file: #{@paths[:other]}") - assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => "#{@paths[:default]} #{@paths[:other]}" }) + assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) end end end From 14a669530edabe19976af9329994bc94fe8b0217 Mon Sep 17 00:00:00 2001 From: Alex Kessinger Date: Thu, 11 Apr 2013 10:17:59 -0700 Subject: [PATCH 3/3] Fixing tests, and making it more ruby friendly --- lib/jekyll.rb | 2 +- test/test_configuration.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index a88dedc7..b3f6b22f 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -138,7 +138,7 @@ module Jekyll # Get configuration from /_config.yml or / config_files = override.delete('config') config_files = File.join(source, "_config.yml") if config_files.to_s.empty? - if not config_files.is_a? Array + unless config_files.is_a? Array config_files = [config_files] end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 361408d6..988d1c7d 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -46,6 +46,12 @@ class TestConfiguration < Test::Unit::TestCase assert_equal Jekyll::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] }) end + should "load default config if path passed is empty" do + mock(YAML).safe_load_file(@paths[:default]) { Hash.new } + mock($stdout).puts("Configuration file: #{@paths[:default]}") + assert_equal Jekyll::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] }) + end + should "load multiple config files" do mock(YAML).safe_load_file(@paths[:default]) { Hash.new } mock(YAML).safe_load_file(@paths[:other]) { Hash.new }