Class: Ram::Packager
- Inherits:
-
Object
- Object
- Ram::Packager
- Defined in:
- lib/ram/packager.rb
Overview
The Ram::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.
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 Ram.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 Ram.configuration. When assets.yml is being changed on the fly, create a new Packager.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/ram/packager.rb', line 17 def initialize # The difference between a path and an asset URL is "public". @path_diff = Ram.public_root.sub(ASSET_ROOT, '') @path_to_url = /\A#{Regexp.escape(ASSET_ROOT)}(\/?#{Regexp.escape(@path_diff)})?/ @compressor = Compressor.new @force = false @package_names = nil @config = { :css => (Ram.configuration[:stylesheets] || {}), :js => (Ram.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.
12 13 14 |
# File 'lib/ram/packager.rb', line 12 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.
12 13 14 |
# File 'lib/ram/packager.rb', line 12 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.
60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/ram/packager.rb', line 60 def cache(package, extension, contents, output_dir, suffix=nil, mtime=nil) FileUtils.mkdir_p(output_dir) unless File.exists?(output_dir) raise OutputNotWritable, "Ram 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, Ram.filename(package, extension, suffix)) File.open(file_name, 'wb+') {|f| f.write(contents) } if Ram.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.
75 76 77 |
# File 'lib/ram/packager.rb', line 75 def individual_urls(package, extension) package_for(package, extension)[:urls] end |
#pack_javascripts(package) ⇒ Object
Return the compressed contents of a javascript package.
85 86 87 |
# File 'lib/ram/packager.rb', line 85 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.
80 81 82 |
# File 'lib/ram/packager.rb', line 80 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.
90 91 92 |
# File 'lib/ram/packager.rb', line 90 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.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/ram/packager.rb', line 40 def precache_all(output_dir=nil, base_url=nil) output_dir ||= File.join(Ram.public_root, Ram.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 Ram. cache(p, 'css', pack_stylesheets(p, :datauri), output_dir, :datauri) if Ram.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}#{Ram.asset_url(p, :css, :mhtml, mtime)}" cache(p, 'css', pack_stylesheets(p, :mhtml, asset_url), output_dir, :mhtml, mtime) end end end end |