From 2dbce8ca9f050cc886c7d693597b0f231903ef1c Mon Sep 17 00:00:00 2001 From: stereobooster Date: Mon, 16 Jul 2012 11:58:12 +0300 Subject: [PATCH 1/3] fix error for case with wrong encoding or error in YAML --- lib/jekyll/convertible.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 1fe34877..f6244d62 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -32,7 +32,7 @@ module Jekyll self.content = $POSTMATCH self.data = YAML.load($1) end - rescue => e + rescue Exception => e puts "YAML Exception reading #{name}: #{e.message}" end From a5a6900948ed94e3968c8a043fcdda31a55af1e8 Mon Sep 17 00:00:00 2001 From: stereobooster Date: Mon, 16 Jul 2012 12:15:32 +0300 Subject: [PATCH 2/3] fix error for case with broken encoding --- lib/jekyll/convertible.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index f6244d62..dab0545c 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -25,14 +25,16 @@ module Jekyll # # Returns nothing. def read_yaml(base, name) - self.content = File.read(File.join(base, name)) - begin + self.content = File.read(File.join(base, name)) + if self.content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m self.content = $POSTMATCH self.data = YAML.load($1) end - rescue Exception => e + rescue => e + puts "Error reading file #{name}: #{e.message}" + rescue SyntaxError => e puts "YAML Exception reading #{name}: #{e.message}" end From da096f307b31fcc0a1e7fe0e80658f335901bcae Mon Sep 17 00:00:00 2001 From: stereobooster Date: Sun, 30 Dec 2012 02:08:46 +0200 Subject: [PATCH 3/3] Add testcases for YAML syntax error and non UTF-8 encoding --- test/fixtures/broken_front_matter2.erb | 4 ++++ test/fixtures/broken_front_matter3.erb | 7 +++++++ test/helper.rb | 10 ++++++++++ test/test_convertible.rb | 18 ++++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 test/fixtures/broken_front_matter2.erb create mode 100644 test/fixtures/broken_front_matter3.erb diff --git a/test/fixtures/broken_front_matter2.erb b/test/fixtures/broken_front_matter2.erb new file mode 100644 index 00000000..f895dd26 --- /dev/null +++ b/test/fixtures/broken_front_matter2.erb @@ -0,0 +1,4 @@ +--- +bad yaml: [ +--- +Real content starts here diff --git a/test/fixtures/broken_front_matter3.erb b/test/fixtures/broken_front_matter3.erb new file mode 100644 index 00000000..5fff53b7 --- /dev/null +++ b/test/fixtures/broken_front_matter3.erb @@ -0,0 +1,7 @@ +--- +test: good +--- +Real content starts here + +Русский текст + diff --git a/test/helper.rb b/test/helper.rb index c6a8a763..491a41c7 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -31,4 +31,14 @@ class Test::Unit::TestCase def clear_dest FileUtils.rm_rf(dest_dir) end + + def capture_stdout + $old_stdout = $stdout + $stdout = StringIO.new + yield + $stdout.rewind + return $stdout.string + ensure + $stdout = $old_stdout + end end diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 2032715b..b9a9e41c 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -18,5 +18,23 @@ class TestConvertible < Test::Unit::TestCase ret = @convertible.read_yaml(@base, 'broken_front_matter1.erb') assert_equal({}, ret) end + + should "not parse if there is syntax error in front-matter" do + out = capture_stdout do + ret = @convertible.read_yaml(@base, 'broken_front_matter2.erb') + assert_equal({}, ret) + end + assert_match(/YAML Exception|syntax error/, out) + end + + if RUBY_VERSION >= '1.9.2' + should "not parse if there is encoding error in file" do + out = capture_stdout do + ret = @convertible.read_yaml(@base, 'broken_front_matter3.erb') + assert_equal({}, ret) + end + assert_match(/invalid byte sequence in UTF-8/, out) + end + end end end