From 51706e8da7d2a927832ec3ee6de7c6a328c4fbc6 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Thu, 28 Nov 2013 22:11:56 -0500 Subject: [PATCH 1/5] Parse TOML or YAML in Jekyll::Configuration. --- jekyll.gemspec | 1 + lib/jekyll/configuration.rb | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index ee48478c..c3dafc33 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -32,6 +32,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency('safe_yaml', "~> 0.9.7") s.add_runtime_dependency('colorator', "~> 0.1") s.add_runtime_dependency('redcarpet', "~> 2.3.0") + s.add_runtime_dependency('toml', '~> 0.0.4') s.add_development_dependency('rake', "~> 10.1") s.add_development_dependency('rdoc', "~> 3.11") diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index 442fa5e6..ae75034b 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -99,6 +99,17 @@ module Jekyll override['source'] || self['source'] || DEFAULTS['source'] end + def safe_load_file(filename) + case File.extname(filename) + when '.toml' + TOML.load_file(filename) + when /\.y(a)?ml/ + YAML.safe_load_file(filename) + else + raise ArgumentError, "No parser for '#{filename}' is available."kk + end + end + # Public: Generate list of configuration files from the override # # override - the command-line options hash @@ -121,8 +132,8 @@ 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 ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) if !next_config.is_a?(Hash) + next_config = safe_load_file(file) + raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) unless next_config.is_a?(Hash) Jekyll.logger.info "Configuration file:", file next_config rescue SystemCallError From 1e32af47a6fef6237744e8d9585853be9b765a33 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Nov 2013 23:22:10 -0500 Subject: [PATCH 2/5] Better config file parser error if it's not there. --- lib/jekyll/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index ae75034b..a58efd8c 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -106,7 +106,7 @@ module Jekyll when /\.y(a)?ml/ YAML.safe_load_file(filename) else - raise ArgumentError, "No parser for '#{filename}' is available."kk + raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead." end end From 22b95aee38567add4af283060cc4f310164d28dd Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Nov 2013 23:33:25 -0500 Subject: [PATCH 3/5] Give that LoadError a good message. --- lib/jekyll/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index a58efd8c..a72e51d8 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -142,7 +142,7 @@ module Jekyll {} else Jekyll.logger.error "Fatal:", "The configuration file '#{file}' could not be found." - raise LoadError + raise LoadError, "The Configuration file '#{file}' could not be found." end end From b8bbc6e08b7c3bee42d85ae3c970907ce8a53051 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Nov 2013 23:33:38 -0500 Subject: [PATCH 4/5] require the TOML gem, idiot. --- lib/jekyll.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 633994e4..2ec3c8ec 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -26,6 +26,7 @@ require 'pathname' require 'liquid' require 'maruku' require 'colorator' +require 'toml' # internal requires require 'jekyll/core_ext' From 3b0c8ad6541aef774399902e05b4b16cb073aa06 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 29 Nov 2013 23:33:52 -0500 Subject: [PATCH 5/5] Add some unit tests for TOML integration. --- test/source/_config.dev.toml | 2 ++ test/test_configuration.rb | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 test/source/_config.dev.toml diff --git a/test/source/_config.dev.toml b/test/source/_config.dev.toml new file mode 100644 index 00000000..7ac863f8 --- /dev/null +++ b/test/source/_config.dev.toml @@ -0,0 +1,2 @@ +baseurl = "/you-beautiful-blog-you" +title = "My magnificent site, wut" diff --git a/test/test_configuration.rb b/test/test_configuration.rb index c57408e5..d911b779 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -30,7 +30,7 @@ class TestConfiguration < Test::Unit::TestCase @config = Configuration[{"source" => source_dir}] @no_override = {} @one_config_file = {"config" => "config.yml"} - @multiple_files = {"config" => %w[config/site.yml config/deploy.yml configuration.yml]} + @multiple_files = {"config" => %w[config/site.yml config/deploy.toml configuration.yml]} end should "always return an array" do @@ -45,7 +45,7 @@ class TestConfiguration < Test::Unit::TestCase assert_equal %w[config.yml], @config.config_files(@one_config_file) end should "return an array of the config files if given many config files" do - assert_equal %w[config/site.yml config/deploy.yml configuration.yml], @config.config_files(@multiple_files) + assert_equal %w[config/site.yml config/deploy.toml configuration.yml], @config.config_files(@multiple_files) end end context "#backwards_compatibilize" do @@ -131,6 +131,7 @@ class TestConfiguration < Test::Unit::TestCase @paths = { :default => File.join(Dir.pwd, '_config.yml'), :other => File.join(Dir.pwd, '_config.live.yml'), + :toml => source_dir('_config.dev.toml'), :empty => "" } end @@ -153,12 +154,20 @@ class TestConfiguration < Test::Unit::TestCase assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] }) end + should "successfully load a TOML file" do + Jekyll.logger.log_level = Jekyll::Stevenson::WARN + assert_equal Jekyll::Configuration::DEFAULTS.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] }) + Jekyll.logger.log_level = Jekyll::Stevenson::INFO + 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 } + mock(TOML).load_file(@paths[:toml]) { Hash.new } mock($stdout).puts("Configuration file: #{@paths[:default]}") mock($stdout).puts("Configuration file: #{@paths[:other]}") - assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) + mock($stdout).puts("Configuration file: #{@paths[:toml]}") + assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] }) end should "load multiple config files and last config should win" do