This repository has been archived by the owner on Jun 10, 2018. It is now read-only.
forked from rails/sprockets
-
Notifications
You must be signed in to change notification settings - Fork 24
/
sprocketstask.rb
140 lines (120 loc) · 3.3 KB
/
sprocketstask.rb
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
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
# 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) }
@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
# Returns cached indexed environment
def index
@index ||= environment.index
end
# Returns manifest for tasks
def manifest
@manifest ||= Sprockets::Manifest.new(index, output)
end
# Sub out environment logger with our rake task logger that
# writes to stderr.
def with_logger
old_logger = index.logger
index.logger = @logger
yield
ensure
index.logger = old_logger
end
end
end