Merge pull request #4285 from jekyll/drop-refactor
Merge pull request 4285
This commit is contained in:
		
						commit
						f386752184
					
				|  | @ -1,11 +1,13 @@ | ||||||
| # encoding: UTF-8 | # encoding: UTF-8 | ||||||
| require "jekyll/drops/immutable_drop" | require "jekyll/drops/drop" | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Drops |   module Drops | ||||||
|     class CollectionDrop < ImmutableDrop |     class CollectionDrop < Drop | ||||||
|       extend Forwardable |       extend Forwardable | ||||||
| 
 | 
 | ||||||
|  |       mutable false | ||||||
|  | 
 | ||||||
|       def_delegator :@obj, :write?, :output |       def_delegator :@obj, :write?, :output | ||||||
|       def_delegators :@obj, :label, :docs, :files, :directory, |       def_delegators :@obj, :label, :docs, :files, :directory, | ||||||
|                             :relative_directory |                             :relative_directory | ||||||
|  |  | ||||||
|  | @ -2,9 +2,11 @@ | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Drops |   module Drops | ||||||
|     class DocumentDrop < ImmutableDrop |     class DocumentDrop < Drop | ||||||
|       extend Forwardable |       extend Forwardable | ||||||
| 
 | 
 | ||||||
|  |       mutable false | ||||||
|  | 
 | ||||||
|       def_delegator :@obj, :next_doc, :next |       def_delegator :@obj, :next_doc, :next | ||||||
|       def_delegator :@obj, :previous_doc, :previous |       def_delegator :@obj, :previous_doc, :previous | ||||||
|       def_delegator :@obj, :relative_path, :path |       def_delegator :@obj, :relative_path, :path | ||||||
|  |  | ||||||
|  | @ -0,0 +1,74 @@ | ||||||
|  | # encoding: UTF-8 | ||||||
|  | 
 | ||||||
|  | module Jekyll | ||||||
|  |   module Drops | ||||||
|  |     class Drop < Liquid::Drop | ||||||
|  |       # Get or set whether the drop class is mutable. | ||||||
|  |       # Mutability determines whether or not pre-defined fields may be | ||||||
|  |       # overwritten. | ||||||
|  |       # | ||||||
|  |       # is_mutable - Boolean set mutability of the class (default: nil) | ||||||
|  |       # | ||||||
|  |       # Returns the mutability of the class | ||||||
|  |       def self.mutable(is_mutable = nil) | ||||||
|  |         if is_mutable | ||||||
|  |           @is_mutable = is_mutable | ||||||
|  |         end | ||||||
|  |         @is_mutable || false | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       # Create a new Drop | ||||||
|  |       # | ||||||
|  |       # obj - the Jekyll Site, Collection, or Document required by the | ||||||
|  |       # drop. | ||||||
|  |       # | ||||||
|  |       # Returns nothing | ||||||
|  |       def initialize(obj) | ||||||
|  |         @obj = obj | ||||||
|  |         @mutations = {} # only if mutable: true | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       # Access a method in the Drop or a field in the underlying hash data. | ||||||
|  |       # If mutable, checks the mutations first. Then checks the methods, | ||||||
|  |       # and finally check the underlying hash (e.g. document front matter) | ||||||
|  |       # if all the previous places didn't match. | ||||||
|  |       # | ||||||
|  |       # key - the string key whose value to fetch | ||||||
|  |       # | ||||||
|  |       # Returns the value for the given key, or nil if none exists | ||||||
|  |       def [](key) | ||||||
|  |         if self.class.mutable && @mutations.key?(key) | ||||||
|  |           @mutations[key] | ||||||
|  |         elsif respond_to? key | ||||||
|  |           public_send key | ||||||
|  |         else | ||||||
|  |           fallback_data[key] | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       # Set a field in the Drop. If mutable, sets in the mutations and | ||||||
|  |       # returns. If not mutable, checks first if it's trying to override a | ||||||
|  |       # Drop method and raises a DropMutationException if so. If not | ||||||
|  |       # mutable and the key is not a method on the Drop, then it sets the | ||||||
|  |       # key to the value in the underlying hash (e.g. document front | ||||||
|  |       # matter) | ||||||
|  |       # | ||||||
|  |       # key - the String key whose value to set | ||||||
|  |       # val - the Object to set the key's value to | ||||||
|  |       # | ||||||
|  |       # Returns the value the key was set to unless the Drop is not mutable | ||||||
|  |       # and the key matches a method in which case it raises a | ||||||
|  |       # DropMutationException. | ||||||
|  |       def []=(key, val) | ||||||
|  |         if self.class.mutable | ||||||
|  |           @mutations[key] = val | ||||||
|  |         elsif respond_to? key | ||||||
|  |           raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." | ||||||
|  |         else | ||||||
|  |           fallback_data[key] = val | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| # encoding: UTF-8 |  | ||||||
| 
 |  | ||||||
| module Jekyll |  | ||||||
|   module Drops |  | ||||||
|     class ImmutableDrop < Liquid::Drop |  | ||||||
|       def initialize(obj) |  | ||||||
|         @obj = obj |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def [](key) |  | ||||||
|         if respond_to? key |  | ||||||
|           public_send key |  | ||||||
|         else |  | ||||||
|           fallback_data[key] |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def []=(key, val) |  | ||||||
|         if respond_to? key |  | ||||||
|           raise DropMutationException, "Key #{key} cannot be set in the drop." |  | ||||||
|         else |  | ||||||
|           fallback_data[key] = val |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -1,28 +0,0 @@ | ||||||
| # encoding: UTF-8 |  | ||||||
| 
 |  | ||||||
| module Jekyll |  | ||||||
|   module Drops |  | ||||||
|     class MutableDrop < Liquid::Drop |  | ||||||
| 
 |  | ||||||
|       def initialize(obj) |  | ||||||
|         @obj = obj |  | ||||||
|         @mutations = {} |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def [](key) |  | ||||||
|         if @mutations.key? key |  | ||||||
|           @mutations[key] |  | ||||||
|         elsif respond_to? key |  | ||||||
|           public_send key |  | ||||||
|         else |  | ||||||
|           fallback_data[key] |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def []=(key, val) |  | ||||||
|         @mutations[key] = val |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -2,9 +2,11 @@ | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Drops |   module Drops | ||||||
|     class SiteDrop < ImmutableDrop |     class SiteDrop < Drop | ||||||
|       extend Forwardable |       extend Forwardable | ||||||
| 
 | 
 | ||||||
|  |       mutable false | ||||||
|  | 
 | ||||||
|       def_delegator  :@obj, :site_data, :data |       def_delegator  :@obj, :site_data, :data | ||||||
|       def_delegators :@obj, :time, :pages, :static_files, :documents, |       def_delegators :@obj, :time, :pages, :static_files, :documents, | ||||||
|                             :tags, :categories |                             :tags, :categories | ||||||
|  |  | ||||||
|  | @ -2,7 +2,8 @@ | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Drops |   module Drops | ||||||
|     class UnifiedPayloadDrop < ImmutableDrop |     class UnifiedPayloadDrop < Drop | ||||||
|  |       mutable false | ||||||
| 
 | 
 | ||||||
|       attr_accessor :page, :layout, :content, :paginator |       attr_accessor :page, :layout, :content, :paginator | ||||||
|       attr_accessor :highlighter_prefix, :highlighter_suffix |       attr_accessor :highlighter_prefix, :highlighter_suffix | ||||||
|  |  | ||||||
|  | @ -2,9 +2,11 @@ | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Drops |   module Drops | ||||||
|     class UrlDrop < ImmutableDrop |     class UrlDrop < Drop | ||||||
|       extend Forwardable |       extend Forwardable | ||||||
| 
 | 
 | ||||||
|  |       mutable false | ||||||
|  | 
 | ||||||
|       def_delegator :@obj, :cleaned_relative_path, :path |       def_delegator :@obj, :cleaned_relative_path, :path | ||||||
|       def_delegator :@obj, :output_ext, :output_ext |       def_delegator :@obj, :output_ext, :output_ext | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue