diff --git a/lib/jekyll/drops/drop.rb b/lib/jekyll/drops/drop.rb index 81714309..d5db7cb6 100644 --- a/lib/jekyll/drops/drop.rb +++ b/lib/jekyll/drops/drop.rb @@ -3,7 +3,7 @@ module Jekyll module Drops class Drop < Liquid::Drop - NON_CONTENT_METHODS = [:[], :[]=, :inspect, :to_h, :fallback_data].freeze + NON_CONTENT_METHODS = [:fallback_data].freeze # Get or set whether the drop class is mutable. # Mutability determines whether or not pre-defined fields may be @@ -86,7 +86,7 @@ module Jekyll # Returns an Array of strings which represent method-specific keys. def content_methods @content_methods ||= ( - self.class.instance_methods(false) - NON_CONTENT_METHODS + self.class.instance_methods - Jekyll::Drops::Drop.instance_methods - NON_CONTENT_METHODS ).map(&:to_s).reject do |method| method.end_with?("=") end diff --git a/lib/jekyll/drops/excerpt_drop.rb b/lib/jekyll/drops/excerpt_drop.rb new file mode 100644 index 00000000..5d61aeb1 --- /dev/null +++ b/lib/jekyll/drops/excerpt_drop.rb @@ -0,0 +1,15 @@ +# encoding: UTF-8 + +module Jekyll + module Drops + class ExcerptDrop < DocumentDrop + def layout + @obj.doc.data["layout"] + end + + def excerpt + nil + end + end + end +end diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb index f6425892..8fef70ed 100644 --- a/lib/jekyll/excerpt.rb +++ b/lib/jekyll/excerpt.rb @@ -7,7 +7,7 @@ module Jekyll attr_writer :output def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, - :render_with_liquid?, :collection, :related_posts + :render_with_liquid?, :collection, :related_posts, :url # Initialize this Excerpt instance. # @@ -59,10 +59,7 @@ module Jekyll end def to_liquid - doc.data["excerpt"] = nil - @to_liquid ||= doc.to_liquid - doc.data["excerpt"] = self - @to_liquid + Jekyll::Drops::ExcerptDrop.new(self) end # Returns the shorthand String identifier of this doc. diff --git a/test/helper.rb b/test/helper.rb index 3a3dafa2..6904894f 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -28,7 +28,7 @@ require "minitest/autorun" require "minitest/reporters" require "minitest/profile" require "rspec/mocks" -require "jekyll" +require_relative "../lib/jekyll.rb" Jekyll.logger = Logger.new(StringIO.new) diff --git a/test/test_excerpt_drop.rb b/test/test_excerpt_drop.rb new file mode 100644 index 00000000..f8c75f9a --- /dev/null +++ b/test/test_excerpt_drop.rb @@ -0,0 +1,36 @@ +require "helper" + +class TestExcerptDrop < JekyllUnitTest + context "an excerpt drop" do + setup do + @site = fixture_site + @site.read + @doc = @site.docs_to_write.find { |d| !d.data["layout"].nil? } + @doc_drop = @doc.to_liquid + @excerpt = @doc.data["excerpt"] + @excerpt_drop = @excerpt.to_liquid + end + + should "have the right thing" do + assert @doc.is_a? Jekyll::Document + assert @doc_drop.is_a? Jekyll::Drops::DocumentDrop + assert @excerpt.is_a? Jekyll::Excerpt + assert @excerpt_drop.is_a? Jekyll::Drops::ExcerptDrop + end + + should "not have an excerpt" do + assert_nil @excerpt.data["excerpt"] + assert @excerpt_drop.class.invokable? "excerpt" + assert_nil @excerpt_drop["excerpt"] + end + + should "inherit the layout for the drop but not the excerpt" do + assert_nil @excerpt.data["layout"] + assert_equal @excerpt_drop["layout"], @doc_drop["layout"] + end + + should "inherit values from the document" do + assert_equal @excerpt_drop.keys.sort, @doc_drop.keys.sort + end + end +end