rstacruz/sinatra-assetpack

View on GitHub
lib/sinatra/assetpack/buster_helpers.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Sinatra
  module AssetPack
    module BusterHelpers
      extend self
      # Returns the MD5 for all of the files concatenated together
      def cache_buster_hash(*files)
        content = files.sort.map do |f|
          Digest::MD5.file(f).hexdigest if f.is_a?(String) && File.file?(f)
        end.compact
        Digest::MD5.hexdigest(content.join) if content.any?
      end

      # Returns the maximum mtime for a given list of files.
      # It will return nil if none of them are found.
      def mtime_for(files)
        time = files.map { |f| File.mtime(f).to_i if f.is_a?(String) && File.file?(f) }.compact.max
        Time.at(time) if time
      end

      # Adds a cache buster for the given path.
      #
      # The 2nd parameter (and beyond) are the files to take mtime from.
      # If the files are not found, the paths will be left as they are.
      #
      #   add_cache_buster('/images/email.png', '/var/www/x/public/images/email.png')
      #
      def add_cache_buster(path, *files)
        hash = cache_buster_hash *files

        if hash
          path.gsub(/(\.[^.]+)$/) { |ext| ".#{hash}#{ext}" }
        else
          path
        end
      end
    end
  end
end