Class: Jammit::Packager
- Inherits:
-
Object
- Object
- Jammit::Packager
- Defined in:
- lib/jammit/packager.rb
Overview
The Jammit::Packager resolves the configuration file into lists of real assets that get merged into individual asset packages. Given the compiled contents of an asset package, the Packager knows how to cache that package with the correct timestamps.
Constant Summary collapse
- PATH_DIFF =
In Rails, the difference between a path and an asset URL is “public”.
PUBLIC_ROOT.sub(ASSET_ROOT, '')
- PATH_TO_URL =
/\A#{Regexp.escape(ASSET_ROOT)}(\/?#{Regexp.escape(PATH_DIFF)})?/
Instance Attribute Summary collapse
-
#force ⇒ Object
Set force to false to allow packages to only be rebuilt when their source files have changed since the last time their package was built.
-
#package_names ⇒ Object
Set force to false to allow packages to only be rebuilt when their source files have changed since the last time their package was built.
Instance Method Summary collapse
-
#cache(package, extension, contents, output_dir, suffix = nil, mtime = Time.now) ⇒ Object
Caches a single prebuilt asset package and gzips it at the highest compression level.
-
#individual_urls(package, extension) ⇒ Object
Get the list of individual assets for a package.
-
#initialize ⇒ Packager
constructor
Creating a new Packager will rebuild the list of assets from the Jammit.configuration.
-
#pack_javascripts(package) ⇒ Object
Return the compressed contents of a javascript package.
-
#pack_stylesheets(package, variant = nil, asset_url = nil) ⇒ Object
Return the compressed contents of a stylesheet package.
-
#pack_templates(package) ⇒ Object
Return the compiled contents of a JST package.
-
#precache_all(output_dir = nil, base_url = nil) ⇒ Object
Ask the packager to precache all defined assets, along with their gzip’d versions.
Constructor Details
#initialize ⇒ Packager
Creating a new Packager will rebuild the list of assets from the Jammit.configuration. When assets.yml is being changed on the fly, create a new Packager.
20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/jammit/packager.rb', line 20 def initialize @compressor = Compressor.new @force = false @package_names = nil @config = { :css => (Jammit.configuration[:stylesheets] || {}), :js => (Jammit.configuration[:javascripts] || {}) } @packages = { :css => create_packages(@config[:css]), :js => create_packages(@config[:js]) } end |
Instance Attribute Details
#force ⇒ Object
Set force to false to allow packages to only be rebuilt when their source files have changed since the last time their package was built.
15 16 17 |
# File 'lib/jammit/packager.rb', line 15 def force @force end |
#package_names ⇒ Object
Set force to false to allow packages to only be rebuilt when their source files have changed since the last time their package was built.
15 16 17 |
# File 'lib/jammit/packager.rb', line 15 def package_names @package_names end |
Instance Method Details
#cache(package, extension, contents, output_dir, suffix = nil, mtime = Time.now) ⇒ Object
Caches a single prebuilt asset package and gzips it at the highest compression level. Ensures that the modification time of both both variants is identical, for web server caching modules, as well as MHTML.
58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/jammit/packager.rb', line 58 def cache(package, extension, contents, output_dir, suffix=nil, mtime=Time.now) FileUtils.mkdir_p(output_dir) unless File.exists?(output_dir) raise OutputNotWritable, "Jammit doesn't have permission to write to \"#{output_dir}\"" unless File.writable?(output_dir) files = [] files << file_name = File.join(output_dir, Jammit.filename(package, extension, suffix)) File.open(file_name, 'wb+') {|f| f.write(contents) } if Jammit.gzip_assets files << zip_name = "#{file_name}.gz" Zlib::GzipWriter.open(zip_name, Zlib::BEST_COMPRESSION) {|f| f.write(contents) } end File.utime(mtime, mtime, *files) end |
#individual_urls(package, extension) ⇒ Object
Get the list of individual assets for a package.
72 73 74 |
# File 'lib/jammit/packager.rb', line 72 def individual_urls(package, extension) package_for(package, extension)[:urls] end |
#pack_javascripts(package) ⇒ Object
Return the compressed contents of a javascript package.
82 83 84 |
# File 'lib/jammit/packager.rb', line 82 def pack_javascripts(package) @compressor.compress_js(package_for(package, :js)[:paths]) end |
#pack_stylesheets(package, variant = nil, asset_url = nil) ⇒ Object
Return the compressed contents of a stylesheet package.
77 78 79 |
# File 'lib/jammit/packager.rb', line 77 def pack_stylesheets(package, variant=nil, asset_url=nil) @compressor.compress_css(package_for(package, :css)[:paths], variant, asset_url) end |
#pack_templates(package) ⇒ Object
Return the compiled contents of a JST package.
87 88 89 |
# File 'lib/jammit/packager.rb', line 87 def pack_templates(package) @compressor.compile_jst(package_for(package, :js)[:paths]) end |
#precache_all(output_dir = nil, base_url = nil) ⇒ Object
Ask the packager to precache all defined assets, along with their gzip’d versions. In order to prebuild the MHTML stylesheets, we need to know the base_url, because IE only supports MHTML with absolute references. Unless forced, will only rebuild assets whose source files have been changed since their last package build.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/jammit/packager.rb', line 39 def precache_all(output_dir=nil, base_url=nil) output_dir ||= File.join(PUBLIC_ROOT, Jammit.package_path) cacheable(:js, output_dir).each {|p| cache(p, 'js', pack_javascripts(p), output_dir) } cacheable(:css, output_dir).each do |p| cache(p, 'css', pack_stylesheets(p), output_dir) if Jammit. cache(p, 'css', pack_stylesheets(p, :datauri), output_dir, :datauri) if Jammit.mhtml_enabled && base_url mtime = Time.now asset_url = "#{base_url}#{Jammit.asset_url(p, :css, :mhtml, mtime)}" cache(p, 'css', pack_stylesheets(p, :mhtml, asset_url), output_dir, :mhtml, mtime) end end end end |