Sha256: 94040b09493326763be971b413eabbef028ffc75ad9f66f7c39bdc7c491ea9a8

Contents?: true

Size: 1.92 KB

Versions: 6

Compression:

Stored size: 1.92 KB

Contents

module Assets
  class Environment
    # Environment that caches assets
    class Cache < self
      include Adamantium::Flat, Equalizer.new(:environment)

      # Return inner environment
      #
      # @return [Environment]
      #
      # @api private
      #
      attr_reader :environment

      # Build cache environemnt
      #
      # @param [Enumerable<Rules>] rules
      #
      # @return [Cache]
      #
      # @api private
      #
      def self.build(rules)
        new(Dynamic.new(rules))
      end

      # Initialize object
      #
      # @param [Environment] environment
      #
      # @return [undefined]
      #
      # @api private
      #
      def initialize(environment)
        @environment, @cache = environment, {}
      end

      # Return rule
      #
      # @param [String] name
      #
      # @return [Rule] 
      #   if found
      #
      # @return [nil]
      #   otherwise
      #
      # @api private
      #
      def rule(name)
        environment.rule(name)
      end

      # Return asset
      #
      # @param [String] name
      #
      # @return [Asset]
      #   if found
      #
      # @return [nil]
      #   otherwise
      #
      def get(name)
        rule = rule(name) 
        return unless rule

        asset = @cache.fetch(name) do
          return miss(rule)
        end

        hit(rule, asset)
      end

    private

      # Process cache hit
      #
      # @param [Rule] rule
      # @param [Asset] asset
      #
      # @return [Asset]
      #
      # @api private
      #
      def hit(rule, asset)
        if rule.fresh_at?(asset.created_at)
          return asset 
        end

        miss(rule)
      end

      # Process cache miss 
      #
      # @param [Rule] rule
      #
      # @return [Asset]
      #   if found
      #
      # @return [nil]
      #   otherwise
      #
      # @api private
      #
      def miss(rule)
        @cache[rule.name] = rule.asset
      end

    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
mbj-assets-0.0.8 lib/assets/environment/cache.rb
mbj-assets-0.0.7 lib/assets/environment/cache.rb
mbj-assets-0.0.6 lib/assets/environment/cache.rb
mbj-assets-0.0.5 lib/assets/environment/cache.rb
mbj-assets-0.0.4 lib/assets/environment/cache.rb
mbj-assets-0.0.3 lib/assets/environment/cache.rb