From 5d79c55b2cee0aa19ca57ad331333edba9db47b7 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 10:52:18 -0800 Subject: [PATCH 1/3] Fix deep_merge_hashes! handling of drops and hashes --- lib/jekyll/drops/drop.rb | 26 ++++++++++++++++++++++++++ lib/jekyll/utils.rb | 16 +++++++++------- test/test_utils.rb | 4 ++-- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index b13db5ef..35f0df26 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -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 diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index b6a05ff8..9ffff548 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -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. # diff --git a/test/test_utils.rb b/test/test_utils.rb index 49844038..d3720127 100644 --- a/test/test_utils.rb +++ b/test/test_utils.rb @@ -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 From 207fcbdef7ad7b0b72c48a806ba5af27525b13ca Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 15 Jan 2016 11:23:09 -0800 Subject: [PATCH 2/3] Add byebug for debugging purposes. --- .gitignore | 33 +++++++++++++++++---------------- Gemfile | 1 + 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 6441a147..1d62ecc3 100644 --- a/.gitignore +++ b/.gitignore @@ -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/* diff --git a/Gemfile b/Gemfile index 8e2d51ee..9e4796e6 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,7 @@ group :test do gem "rspec-mocks" gem "nokogiri" gem "rspec" + gem "byebug" end # From ea9cac5214bb0bff25159421c72c2189caca31d1 Mon Sep 17 00:00:00 2001 From: Jordon Bedwell Date: Fri, 15 Jan 2016 14:15:28 -0600 Subject: [PATCH 3/3] Add a nasty hack to reduce persistence until RSpec. --- test/test_kramdown.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb index 21ba5764..5836d369 100644 --- a/test/test_kramdown.rb +++ b/test/test_kramdown.rb @@ -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",