Class Merb::Assets::AbstractAssetBundler
In: merb-assets/lib/merb-assets/assets.rb
Parent: Object

An abstract class for bundling text assets into single files.

Methods

Included Modules

Merb::Assets::AssetHelpers

External Aliases

add_callback -> after_bundling

Public Class methods

Parameters

&block:A block to add as a post-bundle callback.

Examples

  add_callback { |filename| `yuicompressor #{filename}` }

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 139
139:         def add_callback(&block)
140:           callbacks << block
141:         end

The type of asset for which the bundler is responsible. Override this method in your bundler code.

Raises

NotImplementedError:This method is implemented by the bundler.

Returns

Symbol:The type of the asset

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 161
161:         def asset_type
162:           raise NotImplementedError, "should return a symbol for the first argument to be passed to asset_path"
163:         end

Mark a bundle as cached.

Parameters

name<~to_s>:Name of the bundle

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 110
110:         def cache_bundle(name)
111:           cached_bundles.push(name.to_s)
112:         end

Test if a bundle has been cached.

Parameters

name<~to_s>:Name of the bundle

Returns

Boolean:Whether the bundle has been cached or not.

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 130
130:         def cached_bundle?(name)
131:           cached_bundles.include?(name.to_s)
132:         end

Retrieve existing callbacks.

Returns

Array[Proc]:An array of existing callbacks.

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 148
148:         def callbacks
149:           @callbacks ||= []
150:           return @callbacks
151:         end

Parameters

name<~to_s>:Name of the bundle. If name is true, it will be converted to :all.
*files<String>:Names of the files to bundle.

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 170
170:       def initialize(name, *files)
171:         @bundle_name = name == true ? :all : name
172:         @bundle_filename = Merb.root / asset_path(self.class.asset_type, @bundle_name, true)
173:         @files = files.map { |f| Merb.root / asset_path(self.class.asset_type, f, true) }
174:       end

Purge a bundle from the cache.

Parameters

name<~to_s>:Name of the bundle

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 119
119:         def purge_bundle(name)
120:           cached_bundles.delete(name.to_s)
121:         end

Public Instance methods

Creates the new bundled file, executing all the callbacks.

Returns

Symbol:Name of the bundle.

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 180
180:       def bundle!
181:         # TODO: push it out to the helper level so we don't have to create the helper object.
182:         unless self.class.cached_bundle?(@bundle_name)
183:           # skip regeneration of new bundled files - preventing multiple merb apps stepping on eachother
184:           # file needs to be older than 60 seconds to be regenerated
185:           if File.exist?(@bundle_filename) && File.mtime(@bundle_filename) >= Time.now - 60
186:             return @bundle_name # serve the old file for now - to be regenerated later
187:           end
188:           bundle_files(@bundle_filename, *@files)
189:           if File.exist?(@bundle_filename)
190:             self.class.callbacks.each { |c| c.call(@bundle_filename) }
191:             Merb.logger.info("Assets: bundled :#{@bundle_name} into #{File.basename(@bundle_filename)}")
192:             self.class.cache_bundle(@bundle_name)
193:           end
194:         end
195:         return @bundle_name
196:       end

Protected Instance methods

Bundle all the files into one.

Parameters

filename<String>:Name of the bundle file.
*files<String>:Filenames to be bundled.

[Source]

     # File merb-assets/lib/merb-assets/assets.rb, line 207
207:       def bundle_files(filename, *files)
208:         File.open(filename, "w") do |f|
209:           f.flock(File::LOCK_EX)
210:           files.each { |file| f.puts(File.read(file)) }
211:           f.flock(File::LOCK_UN)
212:         end
213:       end

[Validate]