Restructure data validation so that permalink check raises an error.

This commit is contained in:
Parker Moore 2016-01-15 16:11:08 -08:00
parent 89db3c6384
commit 06fa14c11a
3 changed files with 18 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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