From f8a63157d797d16716266f46dd29e0def64a0000 Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Mon, 28 Sep 2015 13:58:50 -0300 Subject: [PATCH 1/6] Empty permalink now shows an error --- lib/jekyll/convertible.rb | 13 +++++++++++++ test/fixtures/empty_permalink.erb | 4 ++++ test/test_convertible.rb | 9 +++++++++ 3 files changed, 26 insertions(+) create mode 100644 test/fixtures/empty_permalink.erb diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 746f4bd1..5406f13d 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,6 +61,10 @@ module Jekyll Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end + unless valid_permalink?(self.data['permalink']) + Jekyll.logger.error "Error:", "Invalid permalink in #{File.join(base, name)}" + end + self.data end @@ -266,6 +270,15 @@ module Jekyll Jekyll::Hooks.trigger hook_owner, :post_render, self end + # Check data permalink + # + # permalink - the data permalink + # + # Returns true if the permalink is valid, false if otherwise + def valid_permalink?(permalink) + permalink.nil? || permalink.length > 0 + end + # Write the generated page file to the destination directory. # # dest - The String path to the destination dir. diff --git a/test/fixtures/empty_permalink.erb b/test/fixtures/empty_permalink.erb new file mode 100644 index 00000000..6dabf63b --- /dev/null +++ b/test/fixtures/empty_permalink.erb @@ -0,0 +1,4 @@ +--- +permalink: '' +--- +Empty Permalink diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 09c69737..840fa323 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -49,5 +49,14 @@ class TestConvertible < JekyllUnitTest assert_match(/invalid byte sequence in UTF-8/, out) assert_match(/#{File.join(@base, name)}/, out) end + + should "parse the front-matter but show an error if permalink is empty" do + name = 'empty_permalink.erb' + out = capture_stderr do + @convertible.read_yaml(@base, name) + end + assert_match(/Invalid permalink/, out) + assert_match(/#{File.join(@base, name)}/, out) + end end end From 568174222382479fe7d63eee86632086d16daefa Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Fri, 15 Jan 2016 14:04:16 -0200 Subject: [PATCH 2/6] Check if permalink key was given --- lib/jekyll/convertible.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 5406f13d..23d338a3 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,7 +61,7 @@ module Jekyll Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end - unless valid_permalink?(self.data['permalink']) + if self.data['permalink'] && empty_permalink?(self.data['permalink']) Jekyll.logger.error "Error:", "Invalid permalink in #{File.join(base, name)}" end @@ -275,8 +275,8 @@ module Jekyll # permalink - the data permalink # # Returns true if the permalink is valid, false if otherwise - def valid_permalink?(permalink) - permalink.nil? || permalink.length > 0 + def empty_permalink?(permalink) + permalink.length == 0 end # Write the generated page file to the destination directory. From 156e093b5cca3b534c1bb7b3ad0493e8dbbdcc14 Mon Sep 17 00:00:00 2001 From: Pedro Euko Date: Fri, 15 Jan 2016 14:34:39 -0200 Subject: [PATCH 3/6] Ensure no errors when there is no permalink --- test/test_convertible.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 840fa323..0c5acf1a 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -58,5 +58,12 @@ class TestConvertible < JekyllUnitTest assert_match(/Invalid permalink/, out) assert_match(/#{File.join(@base, name)}/, out) end + + should "parse the front-matter correctly whitout permalink" do + out = capture_stderr do + @convertible.read_yaml(@base, 'front_matter.erb') + end + refute_match(/Invalid permalink/, out) + end end end From 948dcf27141744095e78a3e702b896a39134aa91 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 15:51:32 -0800 Subject: [PATCH 4/6] Convertible: consolidate empty check into Convertible#read --- lib/jekyll/convertible.rb | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 23d338a3..8edc4bfa 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -61,8 +61,8 @@ module Jekyll Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end - if self.data['permalink'] && empty_permalink?(self.data['permalink']) - Jekyll.logger.error "Error:", "Invalid permalink in #{File.join(base, name)}" + if self.data['permalink'] && self.data['permalink'].size == 0 + Jekyll.logger.abort_with "Fatal:", "Invalid permalink in #{File.join(base, name)}" end self.data @@ -270,15 +270,6 @@ module Jekyll Jekyll::Hooks.trigger hook_owner, :post_render, self end - # Check data permalink - # - # permalink - the data permalink - # - # Returns true if the permalink is valid, false if otherwise - def empty_permalink?(permalink) - permalink.length == 0 - end - # Write the generated page file to the destination directory. # # dest - The String path to the destination dir. From 89db3c63842ed4d2a4b8101e71fbc32efa34310d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 15:52:54 -0800 Subject: [PATCH 5/6] Convertible: separate data validation out of #read --- lib/jekyll/convertible.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 8edc4bfa..7f3702d3 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -56,16 +56,23 @@ module Jekyll end self.data ||= {} + + validate_data! + validate_permalink! + self.data + end + + def validate_data! unless self.data.is_a?(Hash) Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" end - + end + + def validate_permalink! if self.data['permalink'] && self.data['permalink'].size == 0 Jekyll.logger.abort_with "Fatal:", "Invalid permalink in #{File.join(base, name)}" end - - self.data end # Transform the contents based on the content type. From 06fa14c11ace8970b7fb7aad4159ffc1382d20d1 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 16:11:08 -0800 Subject: [PATCH 6/6] Restructure data validation so that permalink check raises an error. --- lib/jekyll/convertible.rb | 24 +++++++++++++----------- lib/jekyll/errors.rb | 6 ++++-- test/test_convertible.rb | 4 +--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index 7f3702d3..a8e1d0a4 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -42,6 +42,8 @@ module Jekyll # # Returns nothing. def read_yaml(base, name, opts = {}) + filename = File.join(base, name) + begin self.content = File.read(site.in_source_dir(base, name), merged_file_read_opts(opts)) @@ -50,28 +52,28 @@ module Jekyll self.data = SafeYAML.load(Regexp.last_match(1)) end rescue SyntaxError => e - Jekyll.logger.warn "YAML Exception reading #{File.join(base, name)}: #{e.message}" + Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" rescue Exception => e - Jekyll.logger.warn "Error reading file #{File.join(base, name)}: #{e.message}" + Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" end self.data ||= {} - - validate_data! - validate_permalink! + + validate_data! filename + validate_permalink! filename self.data end - - def validate_data! + + def validate_data!(filename) unless self.data.is_a?(Hash) - Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}" + raise Errors::InvalidYAMLFrontMatterError, "Invalid YAML front matter in #{filename}" end end - - def validate_permalink! + + def validate_permalink!(filename) if self.data['permalink'] && self.data['permalink'].size == 0 - Jekyll.logger.abort_with "Fatal:", "Invalid permalink in #{File.join(base, name)}" + raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" end end diff --git a/lib/jekyll/errors.rb b/lib/jekyll/errors.rb index 2b0dbc0c..36b2643d 100644 --- a/lib/jekyll/errors.rb +++ b/lib/jekyll/errors.rb @@ -2,7 +2,9 @@ module Jekyll module Errors FatalException = Class.new(::RuntimeError) - MissingDependencyException = Class.new(FatalException) - DropMutationException = Class.new(FatalException) + DropMutationException = Class.new(FatalException) + InvalidPermalinkError = Class.new(FatalException) + InvalidYAMLFrontMatterError = Class.new(FatalException) + MissingDependencyException = Class.new(FatalException) end end diff --git a/test/test_convertible.rb b/test/test_convertible.rb index 0c5acf1a..524ecdf4 100644 --- a/test/test_convertible.rb +++ b/test/test_convertible.rb @@ -52,11 +52,9 @@ class TestConvertible < JekyllUnitTest should "parse the front-matter but show an error if permalink is empty" do name = 'empty_permalink.erb' - out = capture_stderr do + assert_raises(Errors::InvalidPermalinkError) do @convertible.read_yaml(@base, name) end - assert_match(/Invalid permalink/, out) - assert_match(/#{File.join(@base, name)}/, out) end should "parse the front-matter correctly whitout permalink" do