module Sprockets::ProcessorUtils
def autoload_processor(mod, filename)
filename - String require path for module
mod - Symbol name of processor class/module
Sprockets.autoload_processor :CoffeeScriptProcessor, 'sprockets/coffee_script_processor'
Internal: Setup autoload and wrapper for lazy loaded processor.
def autoload_processor(mod, filename) autoload(mod, filename) AutoloadProcessor.new(self, mod) end
def call_processors(processors, input)
input - Hash of input data to pass to each processor
processors - Array of processor callables
bundle.call(uglify.call(coffee.call(input)))
Think about:
The right to left order processing mirrors standard function composition.
Public: Invoke list of processors in right to left order.
def call_processors(processors, input) data = input[:data] || "" metadata = input[:metadata] || {} processors.reverse_each do |processor| result = processor.call(input.merge(data: data, metadata: metadata)) case result when NilClass when Hash data = result.delete(:data) if result.key?(:data) metadata.merge!(result) when String data = result else raise TypeError, "invalid processor return type: #{result.class}" end end metadata.merge(data: data) end
def compose_processors(*processors)
processors - Array of processors callables
Public: Compose processors in right to left order.
def compose_processors(*processors) context = self obj = method(:call_processors).to_proc.curry[processors] metaclass = (class << obj; self; end) metaclass.send(:define_method, :cache_key) do context.processors_cache_keys(processors) end obj end
def processor_cache_key(processor)
processor - Processor function
Internal: Get processor defined cached key.
def processor_cache_key(processor) processor.cache_key if processor.respond_to?(:cache_key) end
def processors_cache_keys(processors)
processors - Array of processor functions
Internal: Get combined cache keys for set of processors.
def processors_cache_keys(processors) processors.map { |processor| processor_cache_key(processor) } end