module Sprockets::Loader

def load_from_unloaded(unloaded)

successfully pulled from cache.
This method is only called when the given unloaded asset could not be

unloaded - An UnloadedAsset

Internal: Loads an asset and saves it to cache
def load_from_unloaded(unloaded)
  unless file?(unloaded.filename)
    raise FileNotFound, "could not find file: #{unloaded.filename}"
  end
  path_to_split =
    if index_alias = unloaded.params[:index_alias]
      expand_from_root index_alias
    else
      unloaded.filename
    end
  load_path, logical_path = paths_split(config[:paths], path_to_split)
  unless load_path
    target = path_to_split
    target += " (index alias of #{unloaded.filename})" if unloaded.params[:index_alias]
    raise FileOutsidePaths, "#{target} is no longer under a load path: #{self.paths.join(', ')}"
  end
  extname, file_type = match_path_extname(logical_path, mime_exts)
  logical_path = logical_path.chomp(extname)
  name = logical_path
  if pipeline = unloaded.params[:pipeline]
    logical_path += ".#{pipeline}"
  end
  if type = unloaded.params[:type]
    logical_path += config[:mime_types][type][:extensions].first
  end
  if type != file_type && !config[:transformers][file_type][type]
    raise ConversionError, "could not convert #{file_type.inspect} to #{type.inspect}"
  end
  processors = processors_for(type, file_type, pipeline)
  processors_dep_uri = build_processors_uri(type, file_type, pipeline)
  dependencies = config[:dependencies] + [processors_dep_uri]
  # Read into memory and process if theres a processor pipeline
  if processors.any?
    source_uri, _ = resolve!(unloaded.filename, pipeline: :source)
    source_asset = load(source_uri)
    source_path = source_asset.digest_path
    result = call_processors(processors, {
      environment: self,
      cache: self.cache,
      uri: unloaded.uri,
      filename: unloaded.filename,
      load_path: load_path,
      source_path: source_path,
      name: name,
      content_type: type,
      metadata: {
        dependencies: dependencies,
        map: []
      }
    })
    validate_processor_result!(result)
    source = result.delete(:data)
    metadata = result
    metadata[:charset] = source.encoding.name.downcase unless metadata.key?(:charset)
    metadata[:digest]  = digest(source)
    metadata[:length]  = source.bytesize
  else
    dependencies << build_file_digest_uri(unloaded.filename)
    metadata = {
      digest: file_digest(unloaded.filename),
      length: self.stat(unloaded.filename).size,
      dependencies: dependencies
    }
  end
  asset = {
    uri: unloaded.uri,
    load_path: load_path,
    filename: unloaded.filename,
    name: name,
    logical_path: logical_path,
    content_type: type,
    source: source,
    metadata: metadata,
    dependencies_digest: DigestUtils.digest(resolve_dependencies(metadata[:dependencies]))
  }
  asset[:id]  = pack_hexdigest(digest(asset))
  asset[:uri] = build_asset_uri(unloaded.filename, unloaded.params.merge(id: asset[:id]))
  store_asset(asset, unloaded)
  asset
end