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 = nil) ⇒ 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 = nil) ⇒ 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.
59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/jammit/packager.rb', line 59 def cache(package, extension, contents, output_dir, suffix=nil, mtime=nil) 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) mtime ||= latest_mtime package_for(package, extension.to_sym)[:paths] 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.
74 75 76 |
# File 'lib/jammit/packager.rb', line 74 def individual_urls(package, extension) package_for(package, extension)[:urls] end |
#pack_javascripts(package) ⇒ Object
Return the compressed contents of a javascript package.
84 85 86 |
# File 'lib/jammit/packager.rb', line 84 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.
79 80 81 |
# File 'lib/jammit/packager.rb', line 79 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.
89 90 91 |
# File 'lib/jammit/packager.rb', line 89 def pack_templates(package) @compressor.compile_jst(package_for(package, :js)[:paths], package) 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 54 |
# 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 raise MissingConfiguration, "A --base-url option is required in order to generate MHTML." unless base_url mtime = latest_mtime package_for(p, :css)[:paths] 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 |