Sha256: e9c09734b2835de5acd27bfbeba8575586d78b327d6171a0c6942532e962ae68

Contents?: true

Size: 1.13 KB

Versions: 5

Compression:

Stored size: 1.13 KB

Contents

# frozen_string_literal: true

module Jekyll
  # A singleton class that caches frozen instances of path strings returned from its methods.
  #
  # NOTE:
  #   This class exists because `File.join` allocates an Array and returns a new String on every
  #   call using **the same arguments**. Caching the result means reduced memory usage.
  #   However, the caches are never flushed so that they can be used even when a site is
  #   regenerating. The results are frozen to deter mutation of the cached string.
  #
  #   Therefore, employ this class only for situations where caching the result is necessary
  #   for performance reasons.
  #
  class PathManager
    # This class cannot be initialized from outside
    private_class_method :new

    # Wraps `File.join` to cache the frozen result.
    # Reassigns `nil`, empty strings and empty arrays to a frozen empty string beforehand.
    #
    # Returns a frozen string.
    def self.join(base, item)
      base = "" if base.nil? || base.empty?
      item = "" if item.nil? || item.empty?
      @join ||= {}
      @join[base] ||= {}
      @join[base][item] ||= File.join(base, item).freeze
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
jekyll-4.1.1 lib/jekyll/path_manager.rb
jekyll-4.1.0 lib/jekyll/path_manager.rb
jekyll-4.0.1 lib/jekyll/path_manager.rb
jekyll-4.0.0 lib/jekyll/path_manager.rb
jekyll-4.0.0.pre.beta1 lib/jekyll/path_manager.rb