Class: Vitrine::AssetCompiler
- Inherits:
-
Sinatra::Base
- Object
- Sinatra::Base
- Vitrine::AssetCompiler
- Defined in:
- lib/asset_compiler.rb
Overview
The part of Vitrine responsible for SASS and CoffeeScript compilation and caching. By default it will assume your public directory is set on the inner app in the Rack stack, and can be retreived using the standard Sinatra settings protocol, like so:
@app.settings.public_folder
However, you can also set this setting on the app object using the AssetCompiler#public_dir accessor.
use Vitrine::AssetCompiler do | compiler |
compiler.public_dir = File.dirname(__FILE__) + '/public'
end
This allows you to use the asset compiler when the inner app is not a Sinatra application.
Obviously, the usual limitation apply for this kind of workflow - you pretty much have to have an ExecJS env on yourserver, or else…
Instance Attribute Summary collapse
-
#public_dir ⇒ Object
An explicit override for
public_foldersetting, if set will take precedence over the setting.
Instance Method Summary collapse
- #cache_bust! ⇒ Object
- #forward_or_halt(msg) ⇒ Object
-
#get_public ⇒ Object
Get path to the public directory, trying (in order:) self.public_dir reader the inner app’s public_folder setting my own public_folder setting.
- #log(msg) ⇒ Object
- #mtime_cache(path) ⇒ Object
Instance Attribute Details
#public_dir ⇒ Object
An explicit override for public_folder setting, if set will take precedence over the setting
27 28 29 |
# File 'lib/asset_compiler.rb', line 27 def public_dir @public_dir end |
Instance Method Details
#cache_bust! ⇒ Object
109 110 111 112 113 |
# File 'lib/asset_compiler.rb', line 109 def cache_bust! response.headers['Cache-Control'] = 'private' response.headers['Pragma'] = 'no-cache' response.headers.delete('ETag') end |
#forward_or_halt(msg) ⇒ Object
142 143 144 145 146 147 148 149 |
# File 'lib/asset_compiler.rb', line 142 def forward_or_halt(msg) if @app log "Forwarding, #{msg} -> pub #{get_public.inspect}" forward else halt 404, msg end end |
#get_public ⇒ Object
Get path to the public directory, trying (in order:) self.public_dir reader the inner app’s public_folder setting my own public_folder setting
132 133 134 135 136 137 138 139 140 |
# File 'lib/asset_compiler.rb', line 132 def get_public inner_public = if @app && @app.respond_to?(:settings) @app.settings.public_folder else nil end choices = [@public_dir, inner_public, settings.public_dir] choices.compact.shift end |
#log(msg) ⇒ Object
151 152 153 |
# File 'lib/asset_compiler.rb', line 151 def log(msg) env['captivity.logger'].debug(msg) if env['captivity.logger'] end |
#mtime_cache(path) ⇒ Object
115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/asset_compiler.rb', line 115 def mtime_cache(path) # Mix in the request URL into the cache key so that we can hash # .map sourcemaps and .js compiles based off of the same file path # and mtime key = [File.(path), File.mtime(path), request.path_info, get_public] cache_sha = Digest::SHA1.hexdigest(Marshal.dump(key)) etag cache_sha cache_control :public, :must_revalidate log "---> Vitrine AC: Recompiling #{path} -> #{request.path_info}" end |