Merge pull request #4359 from jekyll/optimize-drop

Fix deep_merge_hashes! handling of drops and hashes
This commit is contained in:
Parker Moore 2016-01-15 15:19:18 -08:00
commit 15a2dacd37
6 changed files with 69 additions and 29 deletions

33
.gitignore vendored
View File

@ -1,21 +1,22 @@
Gemfile.lock
test/dest
*.gem
pkg/
*.swp
*~
_site/
.bundle/
.DS_Store
bbin/
gh-pages/
site/_site/
coverage
.ruby-version
.ruby-gemset
.sass-cache
tmp/*
.jekyll-metadata
/vendor
/test/source/file_name.txt
.analysis
.bundle/
.byebug_history
.jekyll-metadata
.ruby-gemset
.ruby-version
.sass-cache
/test/source/file_name.txt
/vendor
Gemfile.lock
_site/
bbin/
coverage
gh-pages/
pkg/
site/_site/
test/dest
tmp/*

View File

@ -18,6 +18,7 @@ group :test do
gem "rspec-mocks"
gem "nokogiri"
gem "rspec"
gem "byebug"
end
#

View File

@ -127,6 +127,7 @@ module Jekyll
result[key] = self[key]
end
end
alias_method :to_hash, :to_h
# Inspect the drop's keys and values through a JSON representation
# of its keys and values.
@ -145,6 +146,31 @@ module Jekyll
def each_key(&block)
keys.each(&block)
end
def merge(other, &block)
self.dup.tap do |me|
if block.nil?
me.merge!(other)
else
me.merge!(other, block)
end
end
end
def merge!(other)
other.each_key do |key|
if block_given?
self[key] = yield key, self[key], other[key]
else
if Utils.mergable?(self[key]) && Utils.mergable?(other[key])
self[key] = Utils.deep_merge_hashes(self[key], other[key])
next
end
self[key] = other[key] unless other[key].nil?
end
end
end
end
end
end

View File

@ -31,14 +31,12 @@ module Jekyll
#
# Thanks to whoever made it.
def deep_merge_hashes!(target, overwrite)
overwrite.each_key do |key|
if (overwrite[key].is_a?(Hash) || overwrite[key].is_a?(Drops::Drop)) &&
(target[key].is_a?(Hash) || target[key].is_a?(Drops::Drop))
target[key] = Utils.deep_merge_hashes(target[key], overwrite[key])
next
target.merge!(overwrite) do |key, old_val, new_val|
if new_val.nil?
old_val
else
mergable?(old_val) && mergable?(new_val) ? deep_merge_hashes(old_val, new_val) : new_val
end
target[key] = overwrite[key]
end
if target.respond_to?(:default_proc) && overwrite.respond_to?(:default_proc) && target.default_proc.nil?
@ -48,6 +46,10 @@ module Jekyll
target
end
def mergable?(value)
value.is_a?(Hash) || value.is_a?(Drops::Drop)
end
# Read array from the supplied hash favouring the singular key
# and then the plural key, and handling any nil entries.
#

View File

@ -37,6 +37,7 @@ class TestKramdown < JekyllUnitTest
should "support custom types" do
override = {
"highlighter" => nil,
'kramdown' => {
'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo'
}
@ -61,7 +62,14 @@ class TestKramdown < JekyllUnitTest
context "when a custom highlighter is chosen" do
should "use the chosen highlighter if it's available" do
override = { "markdown" => "kramdown", "kramdown" => { "syntax_highlighter" => :coderay }}
override = {
"highlighter" => nil,
"markdown" => "kramdown",
"kramdown" => {
"syntax_highlighter" => :coderay
}
}
markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override))
result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN))
~~~ruby
@ -77,11 +85,12 @@ class TestKramdown < JekyllUnitTest
override = {
"markdown" => "kramdown",
"kramdown" => {
"syntax_highlighter" => nil,
"enable_coderay" => true
}
"enable_coderay" => true,
}
}
@config.delete("highlighter")
@config["kramdown"].delete("syntax_highlighter")
markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override))
result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN))
~~~ruby
@ -97,6 +106,7 @@ class TestKramdown < JekyllUnitTest
should "move coderay to syntax_highlighter_opts" do
original = Kramdown::Document.method(:new)
markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, {
"higlighter" => nil,
"markdown" => "kramdown",
"kramdown" => {
"syntax_highlighter" => "coderay",

View File

@ -13,7 +13,7 @@ class TestUtils < JekyllUnitTest
merged = Utils.deep_merge_hashes(data, @site.site_payload)
assert merged.is_a? Hash
assert merged["site"].is_a? Drops::SiteDrop
assert_equal data["page"], {}
assert_equal data["page"], merged["page"]
end
should "merge a hash into a drop" do
@ -22,7 +22,7 @@ class TestUtils < JekyllUnitTest
merged = Utils.deep_merge_hashes(@site.site_payload, data)
assert merged.is_a? Drops::UnifiedPayloadDrop
assert merged["site"].is_a? Drops::SiteDrop
assert_equal data["page"], {}
assert_equal data["page"], merged["page"]
end
end