1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- require 'sprockets/base'
- module Sprockets
- # `Index` is a special cached version of `Environment`.
- #
- # The expection is that all of its file system methods are cached
- # for the instances lifetime. This makes `Index` much faster. This
- # behavior is ideal in production environments where the file system
- # is immutable.
- #
- # `Index` should not be initialized directly. Instead use
- # `Environment#index`.
- class Index < Base
- def initialize(environment)
- @environment = environment
- # Copy environment attributes
- @logger = environment.logger
- @context_class = environment.context_class
- @cache = environment.cache
- @trail = environment.trail.index
- @digest = environment.digest
- @digest_class = environment.digest_class
- @version = environment.version
- @mime_types = environment.mime_types
- @engines = environment.engines
- @preprocessors = environment.preprocessors
- @postprocessors = environment.postprocessors
- @bundle_processors = environment.bundle_processors
- # Initialize caches
- @assets = {}
- @digests = {}
- end
- # No-op return self as index
- def index
- self
- end
- # Cache calls to `file_digest`
- def file_digest(pathname)
- key = pathname.to_s
- if @digests.key?(key)
- @digests[key]
- else
- @digests[key] = super
- end
- end
- # Cache `find_asset` calls
- def find_asset(path, options = {})
- options[:bundle] = true unless options.key?(:bundle)
- if asset = @assets[cache_key_for(path, options)]
- asset
- elsif asset = super
- logical_path_cache_key = cache_key_for(path, options)
- full_path_cache_key = cache_key_for(asset.pathname, options)
- # Cache on Index
- @assets[logical_path_cache_key] = @assets[full_path_cache_key] = asset
- # Push cache upstream to Environment
- @environment.instance_eval do
- @assets[logical_path_cache_key] = @assets[full_path_cache_key] = asset
- end
- asset
- end
- end
- protected
- # Index is immutable, any methods that try to clear the cache
- # should bomb.
- def expire_index!
- raise TypeError, "can't modify immutable index"
- end
- # Cache asset building in memory and in persisted cache.
- def build_asset(path, pathname, options)
- # Memory cache
- key = cache_key_for(pathname, options)
- if @assets.key?(key)
- @assets[key]
- else
- @assets[key] = begin
- # Persisted cache
- cache_asset(key) do
- super
- end
- end
- end
- end
- end
- end
|