1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
require 'rake'
require 'rake/tasklib'
require 'sprockets'
require 'logger'
module Rake
# Simple Sprockets compilation Rake task macro.
#
# Rake::SprocketsTask.new do |t|
# t.environment = Sprockets::Environment.new
# t.output = "./public/assets"
# t.assets = %w( application.js application.css )
# end
#
class SprocketsTask < Rake::TaskLib
# Name of the task. Defaults to "assets".
#
# The name will also be used to suffix the clean and clobber
# tasks, "clean_assets" and "clobber_assets".
attr_accessor :name
# `Environment` instance used for finding assets.
#
# You'll most likely want to reassign `environment` to your own.
#
# Rake::SprocketsTask.new do |t|
# t.environment = Foo::Assets
# end
#
def environment
if !@environment.is_a?(Sprockets::Base) && @environment.respond_to?(:call)
@environment = @environment.call
else
@environment
end
end
attr_writer :environment
# Returns cached cached environment
def cached
@cached ||= environment.cached if environment
end
alias_method :index, :cached
# `Manifest` instance used for already compiled assets.
#
# Will be created by default if an environment and output
# directory are given
def manifest
if !@manifest.is_a?(Sprockets::Manifest) && @manifest.respond_to?(:call)
@manifest = @manifest.call
else
@manifest
end
end
attr_writer :manifest
# Directory to write compiled assets too. As well as the manifest file.
#
# t.output = "./public/assets"
#
attr_accessor :output
# Array of asset logical paths to compile.
#
# t.assets = %w( application.js jquery.js application.css )
#
attr_accessor :assets
# Number of old assets to keep.
attr_accessor :keep
# Logger to use during rake tasks. Defaults to using stderr.
#
# t.logger = Logger.new($stdout)
#
attr_accessor :logger
# Returns logger level Integer.
def log_level
@logger.level
end
# Set logger level with constant or symbol.
#
# t.log_level = Logger::INFO
# t.log_level = :debug
#
def log_level=(level)
if level.is_a?(Integer)
@logger.level = level
else
@logger.level = Logger.const_get(level.to_s.upcase)
end
end
def initialize(name = :assets)
@name = name
@environment = lambda { Sprockets::Environment.new(Dir.pwd) }
@manifest = lambda { Sprockets::Manifest.new(cached, output) }
@logger = Logger.new($stderr)
@logger.level = Logger::INFO
@keep = 2
yield self if block_given?
define
end
# Define tasks
def define
desc name == :assets ? "Compile assets" : "Compile #{name} assets"
task name do
with_logger do
manifest.compile(assets)
end
end
desc name == :assets ? "Remove all assets" : "Remove all #{name} assets"
task "clobber_#{name}" do
with_logger do
manifest.clobber
end
end
task :clobber => ["clobber_#{name}"]
desc name == :assets ? "Clean old assets" : "Clean old #{name} assets"
task "clean_#{name}" do
with_logger do
manifest.clean(keep)
end
end
task :clean => ["clean_#{name}"]
end
private
# Sub out environment logger with our rake task logger that
# writes to stderr.
def with_logger
if env = manifest.environment
old_logger = env.logger
env.logger = @logger
end
yield
ensure
env.logger = old_logger if env
end
end
end
|