diff --git a/lib/jekyll.rb b/lib/jekyll.rb index bf286f1e..caa45e50 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -18,7 +18,7 @@ require 'rubygems' # stdlib require 'fileutils' require 'time' -require 'safe_yaml' +require 'safe_yaml/load' require 'English' require 'pathname' diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb index f5e10fe0..afa43d30 100644 --- a/lib/jekyll/configuration.rb +++ b/lib/jekyll/configuration.rb @@ -105,7 +105,7 @@ module Jekyll when '.toml' TOML.load_file(filename) when /\.y(a)?ml/ - YAML.safe_load_file(filename) + SafeYAML.load_file(filename) else raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead." end diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index ea0bcbbf..941312f3 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -45,7 +45,7 @@ module Jekyll merged_file_read_opts(opts)) if self.content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m self.content = $POSTMATCH - self.data = YAML.safe_load($1) + self.data = SafeYAML.load($1) end rescue SyntaxError => e puts "YAML Exception reading #{File.join(base, name)}: #{e.message}" diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index d201f025..7457ca6d 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -233,7 +233,7 @@ module Jekyll next if File.symlink?(path) && self.safe key = sanitize_filename(File.basename(entry, '.*')) - self.data[key] = YAML.safe_load_file(path) + self.data[key] = SafeYAML.load_file(path) end end diff --git a/test/test_configuration.rb b/test/test_configuration.rb index 36e6cb1d..a96141fa 100644 --- a/test/test_configuration.rb +++ b/test/test_configuration.rb @@ -106,31 +106,36 @@ class TestConfiguration < Test::Unit::TestCase end should "fire warning with no _config.yml" do - mock(YAML).safe_load_file(@path) { raise SystemCallError, "No such file or directory - #{@path}" } + mock(SafeYAML).load_file(@path) { raise SystemCallError, "No such file or directory - #{@path}" } mock($stderr).puts("Configuration file: none".yellow) assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) end should "load configuration as hash" do - mock(YAML).safe_load_file(@path) { Hash.new } + mock(SafeYAML).load_file(@path) { Hash.new } mock($stdout).puts("Configuration file: #{@path}") assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) end should "fire warning with bad config" do - mock(YAML).safe_load_file(@path) { Array.new } + mock(SafeYAML).load_file(@path) { Array.new } mock($stderr).puts(("WARNING: ".rjust(20) + "Error reading configuration. Using defaults (and options).").yellow) 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(SafeYAML).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 + + should "not clobber YAML.load to the dismay of other libraries" do + assert_equal :foo, YAML.load(':foo') + # as opposed to: assert_equal ':foo', SafeYAML.load(':foo') + end end context "loading config from external file" do setup do @@ -143,19 +148,19 @@ class TestConfiguration < Test::Unit::TestCase end should "load default config if no config_file is set" do - mock(YAML).safe_load_file(@paths[:default]) { Hash.new } + mock(SafeYAML).load_file(@paths[:default]) { Hash.new } mock($stdout).puts("Configuration file: #{@paths[:default]}") assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({}) end should "load different config if specified" do - mock(YAML).safe_load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} } + mock(SafeYAML).load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} } mock($stdout).puts("Configuration file: #{@paths[:other]}") assert_equal Jekyll::Configuration::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(SafeYAML).load_file(@paths[:default]) { Hash.new } mock($stdout).puts("Configuration file: #{@paths[:default]}") assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] }) end @@ -167,8 +172,8 @@ class TestConfiguration < Test::Unit::TestCase 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(SafeYAML).load_file(@paths[:default]) { Hash.new } + mock(SafeYAML).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]}") @@ -177,8 +182,8 @@ class TestConfiguration < Test::Unit::TestCase 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(SafeYAML).load_file(@paths[:default]) { {"baseurl" => "http://example.dev"} } + mock(SafeYAML).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::Configuration::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] }) diff --git a/test/test_site.rb b/test/test_site.rb index 45921a7e..5e639f50 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -330,7 +330,7 @@ class TestSite < Test::Unit::TestCase site = Site.new(Jekyll.configuration) site.process - file_content = YAML.safe_load_file(File.join(source_dir, '_data', 'members.yaml')) + file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.yaml')) assert_equal site.data['members'], file_content assert_equal site.site_payload['site']['data']['members'], file_content @@ -340,7 +340,7 @@ class TestSite < Test::Unit::TestCase site = Site.new(Jekyll.configuration) site.process - file_content = YAML.safe_load_file(File.join(source_dir, '_data', 'languages.yml')) + file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'languages.yml')) assert_equal site.data['languages'], file_content assert_equal site.site_payload['site']['data']['languages'], file_content @@ -350,7 +350,7 @@ class TestSite < Test::Unit::TestCase site = Site.new(Jekyll.configuration.merge({'safe' => false})) site.process - file_content = YAML.safe_load_file(File.join(source_dir, '_data', 'products.yml')) + file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'products.yml')) assert_equal site.data['products'], file_content assert_equal site.site_payload['site']['data']['products'], file_content