lib/jim/bundler.rb in jim-0.1.0 vs lib/jim/bundler.rb in jim-0.1.1

- old
+ new

@@ -1,22 +1,42 @@ module Jim + # Bundler takes parses a Jimfile that specifies requirements as names and + # versions and then can bundle, compress, or copy those files into specific dirs + # or files. + # + # A Jimfile has a really simple format: + # + # // comments look like JS comments + # // you can set options by adding comments that look like JSON pairs + # // bundle_path: /path/to/bundle.js + # + # // A requirement is just a name and an optional version + # // requirements are resolved and bundled in order of specification + # jquery 1.4.2 + # jquery.color + # sammy 0.5.0 + # + # class Bundler class MissingFile < Jim::Error; end - + attr_accessor :jimfile, :index, :requirements, :paths, :options - - def initialize(jimfile, index, options = {}) + + # create a new bundler instance passing in the Jimfile as a `Pathname` or a + # string. `index` is a Jim::Index + def initialize(jimfile, index = nil, options = {}) self.jimfile = jimfile.is_a?(Pathname) ? jimfile.read : jimfile self.index = index || Jim::Index.new self.options = {} self.requirements = [] parse_jimfile self.options.merge(options) self.add(options[:vendor_dir]) if options[:vendor_dir] self.paths = [] end - + + # resove the requirements specified into Jimfile or raise a MissingFile error def resolve! self.requirements.each do |search| name, version = search.strip.split(/\s+/) path = self.index.find(name, version) if !path @@ -25,40 +45,47 @@ end self.paths << path end paths end - + + # concatenate all the requirements into a single file and write to `to` or to the + # path specified in the :bundled_path option def bundle!(to = nil) resolve! if paths.empty? to = options[:bundled_path] if to.nil? && options[:bundled_path] io = io_for_path(to) logger.info "bundling to #{to}" if to paths.each do |path| io << path.read << "\n" end io end - + + # concatenate all the requirements into a single file then run through a JS + # then write to `to` or to the path specified in the :bundled_path option. + # You can also use the YUI compressor by setting the option :compressor to 'yui' def compress!(to = nil) to = options[:compressed_path] if to.nil? && options[:compressed_path] io = io_for_path(to) logger.info "compressing to #{to}" io << js_compress(bundle!(false)) io end - + + # copy each of the requirements into the dir specified with `dir` or the path + # specified with the :vendor_dir option def vendor!(dir = nil) resolve! if paths.empty? dir ||= options[:vendor_dir] dir ||= 'vendor' # default logger.info "vendoring to #{dir}" paths.each do |path| Jim::Installer.new(path, dir, :shallow => true).install end end - + private def io_for_path(to) case to when IO to @@ -70,33 +97,41 @@ io_for_path(to) else "" end end - + def parse_jimfile jimfile.each_line do |line| if /^\/\/\s?([^\:]+)\:\s(.*)$/.match line self.options[$1.to_sym] = $2.strip elsif line !~ /^\// && line.strip != '' self.requirements << line end end end - + def js_compress(uncompressed) if options[:compressor] == 'yui' - require "yui/compressor" + begin + require "yui/compressor" + rescue LoadError + raise "You must install the yui compressor gem to use the compressor\ngem install yui-compressor" + end compressor = ::YUI::JavaScriptCompressor.new else - require 'closure-compiler' + begin + require 'closure-compiler' + rescue LoadError + raise "You must install the closure compiler gem to use the compressor\ngem install closure-compiler" + end compressor = ::Closure::Compiler.new end compressor.compress(uncompressed) end - + def logger Jim.logger end - + end end \ No newline at end of file