[DRE-commits] [ruby-sprockets] 01/04: Imported Upstream version 2.10.0

Hleb Valoshka tsfgnu-guest at alioth.debian.org
Sat Oct 12 21:27:51 UTC 2013


This is an automated email from the git hooks/post-receive script.

tsfgnu-guest pushed a commit to branch master
in repository ruby-sprockets.

commit 14484cbc192715eb86a3c904bb5db1385416dbfb
Author: Hleb Valoshka <375GNU at Gmail.COM>
Date:   Sat Oct 12 23:42:18 2013 +0300

    Imported Upstream version 2.10.0
---
 README.md                            |   82 ++++++-
 bin/sprockets                        |    8 +
 checksums.yaml.gz                    |  Bin 0 -> 269 bytes
 lib/rake/sprocketstask.rb            |   37 ++-
 lib/sprockets.rb                     |   22 +-
 lib/sprockets/asset.rb               |   20 +-
 lib/sprockets/asset_attributes.rb    |   13 +-
 lib/sprockets/base.rb                |   69 +++++-
 lib/sprockets/bundled_asset.rb       |   11 +-
 lib/sprockets/closure_compressor.rb  |   22 ++
 lib/sprockets/compressing.rb         |   73 ++++++
 lib/sprockets/context.rb             |   56 ++++-
 lib/sprockets/directive_processor.rb |    4 +-
 lib/sprockets/engines.rb             |    8 +-
 lib/sprockets/environment.rb         |    1 +
 lib/sprockets/errors.rb              |    1 +
 lib/sprockets/index.rb               |    1 +
 lib/sprockets/jst_processor.rb       |    8 +-
 lib/sprockets/manifest.rb            |   89 +++++--
 lib/sprockets/processed_asset.rb     |    2 +-
 lib/sprockets/processing.rb          |   44 +---
 lib/sprockets/sass_cache_store.rb    |    6 +-
 lib/sprockets/sass_compressor.rb     |   27 +++
 lib/sprockets/sass_functions.rb      |   70 ++++++
 lib/sprockets/sass_importer.rb       |    4 +-
 lib/sprockets/sass_template.rb       |   19 +-
 lib/sprockets/static_asset.rb        |    1 +
 lib/sprockets/uglifier_compressor.rb |   29 +++
 lib/sprockets/version.rb             |    2 +-
 lib/sprockets/yui_compressor.rb      |   27 +++
 metadata.yml                         |  435 ++++++++++++++++++----------------
 31 files changed, 860 insertions(+), 331 deletions(-)

diff --git a/README.md b/README.md
index 338c950..55ac933 100644
--- a/README.md
+++ b/README.md
@@ -159,9 +159,9 @@ variables, mixins, operations and functions.
 
 If the `less` gem is available to your application, you can use LESS
 to write CSS assets in Sprockets. Note that the LESS compiler is
-written in JavaScript, and at the time of this writing, the `less` gem
-depends on `therubyracer` which embeds the V8 JavaScript runtime in
-Ruby.
+written in JavaScript and the `less` gem (on MRI) uses `therubyracer`
+which embeds the V8 JavaScript runtime in Ruby, while on JRuby you're
+going to need `therubyrhino` gem installed.
 
 To write CSS assets with LESS, use the extension `.css.less`.
 
@@ -361,6 +361,82 @@ submit a pull request.
 
 ## Version History ##
 
+**2.10.0** (May 24, 2013)
+
+* Support for `bower.json`
+
+**2.9.3** (April 20, 2013)
+
+* Fixed sass caching bug
+
+**2.9.2** (April 8, 2013)
+
+* Improve file freshness check performance
+* Directive processor encoding fixes
+
+**2.9.1** (April 6, 2013)
+
+* Support for Uglifier 2.x
+
+**2.9.0** (February 25, 2013)
+
+* Write out gzipped variants of bundled assets.
+
+**2.8.2** (December 10, 2012)
+
+* Fixed top level Sass constant references
+* Fixed manifest logger when environment is disabled
+
+**2.8.1** (October 31, 2012)
+
+* Fixed Sass importer bug
+
+**2.8.0** (October 16, 2012)
+
+* Allow manifest location to be seperated from output directory
+* Pass logical path and absolute path to each_logical_path iterator
+
+**2.7.0** (October 10, 2012)
+
+* Added --css-compressor and --js-compressor command line flags
+* Added css/js compressor shorthand
+* Change default manifest.json filename to be a randomized manifest-16HEXBYTES.json
+* Allow nil environment to be passed to manifest
+* Allow manifest instance to be set on rake task
+
+**2.6.0** (September 19, 2012)
+
+* Added bower component.json require support
+
+**2.5.0** (September 4, 2012)
+
+* Fixed Ruby 2.0 RegExp warning
+* Provide stubbed implementation of context *_path helpers
+* Add SassCompressor
+
+**2.4.5** (July 10, 2012)
+
+* Tweaked some logger levels
+
+**2.4.4** (July 2, 2012)
+
+* Canonicalize logical path extensions
+* Check absolute paths passed to depend_on
+
+**2.4.3** (May 16, 2012)
+
+* Exposed :sprockets in sass options
+* Include dependency paths in asset mtime
+
+**2.4.2** (May 7, 2012)
+
+* Fixed MultiJson feature detect
+
+**2.4.1** (April 26, 2012)
+
+* Fixed MultiJson API change
+* Fixed gzip mtime
+
 **2.4.0** (March 27, 2012)
 
 * Added global path registry
diff --git a/bin/sprockets b/bin/sprockets
index 2b776d7..a3fb651 100755
--- a/bin/sprockets
+++ b/bin/sprockets
@@ -40,6 +40,14 @@ OptionParser.new do |opts|
     manifest = Sprockets::Manifest.new(environment, directory)
   end
 
+  opts.on("--css-compressor=COMPRESSOR", "Use CSS compressor") do |compressor|
+    environment.css_compressor = compressor.to_sym
+  end
+
+  opts.on("--js-compressor=COMPRESSOR", "Use JavaScript compressor") do |compressor|
+    environment.js_compressor = compressor.to_sym
+  end
+
   opts.on("--noenv", "Disables .sprocketsrc file") do
   end
 
diff --git a/checksums.yaml.gz b/checksums.yaml.gz
new file mode 100644
index 0000000..19ab8c7
Binary files /dev/null and b/checksums.yaml.gz differ
diff --git a/lib/rake/sprocketstask.rb b/lib/rake/sprocketstask.rb
index b6101eb..7fb9c91 100644
--- a/lib/rake/sprocketstask.rb
+++ b/lib/rake/sprocketstask.rb
@@ -37,6 +37,24 @@ module Rake
     end
     attr_writer :environment
 
+    # Returns cached indexed environment
+    def index
+      @index ||= environment.index if environment
+    end
+
+    # `Manifest` instance used for already compiled assets.
+    #
+    # Will be created by default if an environment and output
+    # directory are given
+    def manifest
+      if !@manifest.is_a?(Sprockets::Manifest) && @manifest.respond_to?(:call)
+        @manifest = @manifest.call
+      else
+        @manifest
+      end
+    end
+    attr_writer :manifest
+
     # Directory to write compiled assets too. As well as the manifest file.
     #
     #   t.output = "./public/assets"
@@ -79,6 +97,7 @@ module Rake
     def initialize(name = :assets)
       @name         = name
       @environment  = lambda { Sprockets::Environment.new(Dir.pwd) }
+      @manifest     = lambda { Sprockets::Manifest.new(index, output) }
       @logger       = Logger.new($stderr)
       @logger.level = Logger::INFO
       @keep         = 2
@@ -117,24 +136,16 @@ module Rake
     end
 
     private
-      # Returns cached indexed environment
-      def index
-        @index ||= environment.index
-      end
-
-      # Returns manifest for tasks
-      def manifest
-        @manifest ||= Sprockets::Manifest.new(index, output)
-      end
-
       # Sub out environment logger with our rake task logger that
       # writes to stderr.
       def with_logger
-        old_logger = index.logger
-        index.logger = @logger
+        if env = manifest.environment
+          old_logger = env.logger
+          env.logger = @logger
+        end
         yield
       ensure
-        index.logger = old_logger
+        env.logger = old_logger if env
       end
   end
 end
diff --git a/lib/sprockets.rb b/lib/sprockets.rb
index aa95e39..fa05242 100644
--- a/lib/sprockets.rb
+++ b/lib/sprockets.rb
@@ -20,6 +20,7 @@ module Sprockets
   autoload :JstProcessor,            "sprockets/jst_processor"
   autoload :Processor,               "sprockets/processor"
   autoload :SassCacheStore,          "sprockets/sass_cache_store"
+  autoload :SassFunctions,           "sprockets/sass_functions"
   autoload :SassImporter,            "sprockets/sass_importer"
   autoload :SassTemplate,            "sprockets/sass_template"
   autoload :ScssTemplate,            "sprockets/scss_template"
@@ -43,8 +44,9 @@ module Sprockets
   require 'sprockets/engines'
   require 'sprockets/mime'
   require 'sprockets/processing'
+  require 'sprockets/compressing'
   require 'sprockets/paths'
-  extend Engines, Mime, Processing, Paths
+  extend Engines, Mime, Processing, Compressing, Paths
 
   @trail             = Hike::Trail.new(File.expand_path('..', __FILE__))
   @mime_types        = {}
@@ -52,6 +54,7 @@ module Sprockets
   @preprocessors     = Hash.new { |h, k| h[k] = [] }
   @postprocessors    = Hash.new { |h, k| h[k] = [] }
   @bundle_processors = Hash.new { |h, k| h[k] = [] }
+  @compressors       = Hash.new { |h, k| h[k] = {} }
 
   register_mime_type 'text/css', '.css'
   register_mime_type 'application/javascript', '.js'
@@ -66,6 +69,23 @@ module Sprockets
   require 'sprockets/charset_normalizer'
   register_bundle_processor 'text/css', CharsetNormalizer
 
+  require 'sprockets/sass_compressor'
+  register_compressor 'text/css', :sass, SassCompressor
+  register_compressor 'text/css', :scss, SassCompressor
+
+  require 'sprockets/yui_compressor'
+  register_compressor 'text/css', :yui, YUICompressor
+
+  require 'sprockets/closure_compressor'
+  register_compressor 'application/javascript', :closure, ClosureCompressor
+
+  require 'sprockets/uglifier_compressor'
+  register_compressor 'application/javascript', :uglifier, UglifierCompressor
+  register_compressor 'application/javascript', :uglify, UglifierCompressor
+
+  require 'sprockets/yui_compressor'
+  register_compressor 'application/javascript', :yui, YUICompressor
+
   # Cherry pick the default Tilt engines that make sense for
   # Sprockets. We don't need ones that only generate html like HAML.
 
diff --git a/lib/sprockets/asset.rb b/lib/sprockets/asset.rb
index 280daff..cabf717 100644
--- a/lib/sprockets/asset.rb
+++ b/lib/sprockets/asset.rb
@@ -33,11 +33,14 @@ module Sprockets
     alias_method :bytesize, :length
 
     def initialize(environment, logical_path, pathname)
+      raise ArgumentError, "Asset logical path has no extension: #{logical_path}" if File.extname(logical_path) == ""
+
       @root         = environment.root
       @logical_path = logical_path.to_s
       @pathname     = Pathname.new(pathname)
       @content_type = environment.content_type_of(pathname)
-      @mtime        = environment.stat(pathname).mtime
+      # drop precision to 1 second, same pattern followed elsewhere
+      @mtime        = Time.at(environment.stat(pathname).mtime.to_i)
       @length       = environment.stat(pathname).size
       @digest       = environment.file_digest(pathname).hexdigest
     end
@@ -56,8 +59,7 @@ module Sprockets
       end
 
       if mtime = coder['mtime']
-        # Parse time string
-        @mtime = Time.parse(mtime)
+        @mtime = Time.at(mtime)
       end
 
       if length = coder['length']
@@ -72,7 +74,7 @@ module Sprockets
       coder['logical_path'] = logical_path
       coder['pathname']     = relativize_root_path(pathname).to_s
       coder['content_type'] = content_type
-      coder['mtime']        = mtime.iso8601
+      coder['mtime']        = mtime.to_i
       coder['length']       = length
       coder['digest']       = digest
     end
@@ -145,12 +147,12 @@ module Sprockets
         if options[:compress]
           # Run contents through `Zlib`
           gz = Zlib::GzipWriter.new(f, Zlib::BEST_COMPRESSION)
+          gz.mtime = mtime.to_i
           gz.write to_s
           gz.close
         else
           # Write out as is
           f.write to_s
-          f.close
         end
       end
 
@@ -234,7 +236,7 @@ module Sprockets
           return false
         end
 
-        # Compare dependency mime to the actual mtime. If the
+        # Compare dependency mtime to the actual mtime. If the
         # dependency mtime is newer than the actual mtime, the file
         # hasn't changed since we created this `Asset` instance.
         #
@@ -242,7 +244,11 @@ module Sprockets
         # stale. Many deployment environments may recopy or recheckout
         # assets on each deploy. In this case the mtime would be the
         # time of deploy rather than modified time.
-        if mtime >= stat.mtime
+        #
+        # Note: to_i is used in eql? and write_to we assume fidelity of 1 second
+        #  if people save files more frequently than 1 second sprockets may
+        #  not pick it up, by design
+        if mtime.to_i >= stat.mtime.to_i
           return true
         end
 
diff --git a/lib/sprockets/asset_attributes.rb b/lib/sprockets/asset_attributes.rb
index 75fd0f4..cf705ec 100644
--- a/lib/sprockets/asset_attributes.rb
+++ b/lib/sprockets/asset_attributes.rb
@@ -17,10 +17,17 @@ module Sprockets
     def search_paths
       paths = [pathname.to_s]
 
+      path_without_extensions = extensions.inject(pathname) { |p, ext| p.sub(ext, '') }
+
+      # optimization: bower.json can only be nested one level deep
+      if !path_without_extensions.to_s.index('/')
+        paths << path_without_extensions.join("bower.json").to_s
+        # DEPRECATED bower configuration file
+        paths << path_without_extensions.join("component.json").to_s
+      end
+
       if pathname.basename(extensions.join).to_s != 'index'
-        path_without_extensions = extensions.inject(pathname) { |p, ext| p.sub(ext, '') }
-        index_path = path_without_extensions.join("index#{extensions.join}").to_s
-        paths << index_path
+        paths << path_without_extensions.join("index#{extensions.join}").to_s
       end
 
       paths
diff --git a/lib/sprockets/base.rb b/lib/sprockets/base.rb
index a676d05..8b94b5f 100644
--- a/lib/sprockets/base.rb
+++ b/lib/sprockets/base.rb
@@ -5,12 +5,13 @@ require 'sprockets/errors'
 require 'sprockets/processed_asset'
 require 'sprockets/server'
 require 'sprockets/static_asset'
+require 'multi_json'
 require 'pathname'
 
 module Sprockets
   # `Base` class for `Environment` and `Index`.
   class Base
-    include Caching, Paths, Mime, Processing, Engines, Server
+    include Caching, Paths, Mime, Processing, Compressing, Engines, Server
 
     # Returns a `Digest` implementation class.
     #
@@ -127,7 +128,23 @@ module Sprockets
       if block_given?
         args = attributes_for(logical_path).search_paths + [options]
         @trail.find(*args) do |path|
-          yield Pathname.new(path)
+          pathname = Pathname.new(path)
+          if %w( bower.json component.json ).include?(pathname.basename.to_s)
+            bower = json_decode(pathname.read)
+            case bower['main']
+            when String
+              yield pathname.dirname.join(bower['main'])
+            when Array
+              extname = File.extname(logical_path)
+              bower['main'].each do |fn|
+                if extname == "" || extname == File.extname(fn)
+                  yield pathname.dirname.join(fn)
+                end
+              end
+            end
+          else
+            yield pathname
+          end
         end
       else
         resolve(logical_path, options) do |pathname|
@@ -252,6 +269,16 @@ module Sprockets
       else
         begin
           pathname = resolve(logical_path)
+
+          # If logical path is missing a mime type extension, append
+          # the absolute path extname so it has one.
+          #
+          # Ensures some consistency between finding "foo/bar" vs
+          # "foo/bar.js".
+          if File.extname(logical_path) == ""
+            expanded_logical_path = attributes_for(pathname).logical_path
+            logical_path += File.extname(expanded_logical_path)
+          end
         rescue FileNotFound
           return nil
         end
@@ -301,13 +328,20 @@ module Sprockets
       nil
     end
 
-    def each_logical_path(*args)
+    def each_logical_path(*args, &block)
       return to_enum(__method__, *args) unless block_given?
       filters = args.flatten
       files = {}
       each_file do |filename|
         if logical_path = logical_path_for_filename(filename, filters)
-          yield logical_path unless files[logical_path]
+          unless files[logical_path]
+            if block.arity == 2
+              yield logical_path, filename.to_s
+            else
+              yield logical_path
+            end
+          end
+
           files[logical_path] = true
         end
       end
@@ -366,14 +400,14 @@ module Sprockets
       def logical_path_for_filename(filename, filters)
         logical_path = attributes_for(filename).logical_path.to_s
 
-        if matches_filter(filters, logical_path)
+        if matches_filter(filters, logical_path, filename)
           return logical_path
         end
 
         # If filename is an index file, retest with alias
         if File.basename(logical_path)[/[^\.]+/, 0] == 'index'
           path = logical_path.sub(/\/index\./, '.')
-          if matches_filter(filters, path)
+          if matches_filter(filters, path, filename)
             return path
           end
         end
@@ -381,18 +415,33 @@ module Sprockets
         nil
       end
 
-      def matches_filter(filters, filename)
+      def matches_filter(filters, logical_path, filename)
         return true if filters.empty?
 
         filters.any? do |filter|
           if filter.is_a?(Regexp)
-            filter.match(filename)
+            filter.match(logical_path)
           elsif filter.respond_to?(:call)
-            filter.call(filename)
+            if filter.arity == 1
+              filter.call(logical_path)
+            else
+              filter.call(logical_path, filename.to_s)
+            end
           else
-            File.fnmatch(filter.to_s, filename)
+            File.fnmatch(filter.to_s, logical_path)
           end
         end
       end
+
+      # Feature detect newer MultiJson API
+      if MultiJson.respond_to?(:dump)
+        def json_decode(obj)
+          MultiJson.load(obj)
+        end
+      else
+        def json_decode(obj)
+          MultiJson.decode(obj)
+        end
+      end
   end
 end
diff --git a/lib/sprockets/bundled_asset.rb b/lib/sprockets/bundled_asset.rb
index 5a036a1..1b2e810 100644
--- a/lib/sprockets/bundled_asset.rb
+++ b/lib/sprockets/bundled_asset.rb
@@ -13,20 +13,19 @@ module Sprockets
     def initialize(environment, logical_path, pathname)
       super(environment, logical_path, pathname)
 
-      @processed_asset = environment.find_asset(pathname, :bundle => false)
-      @required_assets = @processed_asset.required_assets
-
-      @source = ""
+      @processed_asset  = environment.find_asset(pathname, :bundle => false)
+      @required_assets  = @processed_asset.required_assets
+      @dependency_paths = @processed_asset.dependency_paths
 
       # Explode Asset into parts and gather the dependency bodies
-      to_a.each { |dependency| @source << dependency.to_s }
+      @source = to_a.map { |dependency| dependency.to_s }.join
 
       # Run bundle processors on concatenated source
       context = environment.context_class.new(environment, logical_path, pathname)
       @source = context.evaluate(pathname, :data => @source,
                   :processors => environment.bundle_processors(content_type))
 
-      @mtime  = to_a.map(&:mtime).max
+      @mtime  = (to_a + @dependency_paths).map(&:mtime).max
       @length = Rack::Utils.bytesize(source)
       @digest = environment.digest.update(source).hexdigest
     end
diff --git a/lib/sprockets/closure_compressor.rb b/lib/sprockets/closure_compressor.rb
new file mode 100644
index 0000000..567ca16
--- /dev/null
+++ b/lib/sprockets/closure_compressor.rb
@@ -0,0 +1,22 @@
+require 'tilt'
+
+module Sprockets
+  class ClosureCompressor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.engine_initialized?
+      defined?(::Closure::Compiler)
+    end
+
+    def initialize_engine
+      require_template_library 'closure-compiler'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      Closure::Compiler.new.compile(data)
+    end
+  end
+end
diff --git a/lib/sprockets/compressing.rb b/lib/sprockets/compressing.rb
new file mode 100644
index 0000000..6634125
--- /dev/null
+++ b/lib/sprockets/compressing.rb
@@ -0,0 +1,73 @@
+module Sprockets
+  # `Compressing` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Compressing
+    def compressors
+      deep_copy_hash(@compressors)
+    end
+
+    def register_compressor(mime_type, sym, klass)
+      @compressors[mime_type][sym] = klass
+    end
+
+    # Return CSS compressor or nil if none is set
+    def css_compressor
+      @css_compressor if defined? @css_compressor
+    end
+
+    # Assign a compressor to run on `text/css` assets.
+    #
+    # The compressor object must respond to `compress`.
+    def css_compressor=(compressor)
+      unregister_bundle_processor 'text/css', css_compressor if css_compressor
+      @css_compressor = nil
+      return unless compressor
+
+      if compressor.is_a?(Symbol)
+        compressor = compressors['text/css'][compressor] || raise(Error, "unknown compressor: #{compressor}")
+      end
+
+      if compressor.respond_to?(:compress)
+        klass = Class.new(Processor) do
+          @name = "css_compressor"
+          @processor = proc { |context, data| compressor.compress(data) }
+        end
+        @css_compressor = :css_compressor
+      else
+        @css_compressor = klass = compressor
+      end
+
+      register_bundle_processor 'text/css', klass
+    end
+
+    # Return JS compressor or nil if none is set
+    def js_compressor
+      @js_compressor if defined? @js_compressor
+    end
+
+    # Assign a compressor to run on `application/javascript` assets.
+    #
+    # The compressor object must respond to `compress`.
+    def js_compressor=(compressor)
+      unregister_bundle_processor 'application/javascript', js_compressor if js_compressor
+      @js_compressor = nil
+      return unless compressor
+
+      if compressor.is_a?(Symbol)
+        compressor = compressors['application/javascript'][compressor] || raise(Error, "unknown compressor: #{compressor}")
+      end
+
+      if compressor.respond_to?(:compress)
+        klass = Class.new(Processor) do
+          @name = "js_compressor"
+          @processor = proc { |context, data| compressor.compress(data) }
+        end
+        @js_compressor = :js_compressor
+      else
+        @js_compressor = klass = compressor
+      end
+
+      register_bundle_processor 'application/javascript', klass
+    end
+  end
+end
diff --git a/lib/sprockets/context.rb b/lib/sprockets/context.rb
index 6169dec..9b13406 100644
--- a/lib/sprockets/context.rb
+++ b/lib/sprockets/context.rb
@@ -81,7 +81,11 @@ module Sprockets
       attributes = environment.attributes_for(pathname)
 
       if pathname.absolute?
-        pathname
+        if environment.stat(pathname)
+          pathname
+        else
+          raise FileNotFound, "couldn't find file '#{pathname}'"
+        end
 
       elsif content_type = options[:content_type]
         content_type = self.content_type if content_type == :self
@@ -217,6 +221,56 @@ module Sprockets
       "data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
     end
 
+    # Expands logical path to full url to asset.
+    #
+    # NOTE: This helper is currently not implemented and should be
+    # customized by the application. Though, in the future, some
+    # basics implemention may be provided with different methods that
+    # are required to be overridden.
+    def asset_path(path, options = {})
+      message = <<-EOS
+Custom asset_path helper is not implemented
+
+Extend your environment context with a custom method.
+
+    environment.context_class.class_eval do
+      def asset_path(path, options = {})
+      end
+    end
+      EOS
+      raise NotImplementedError, message
+    end
+
+    # Expand logical image asset path.
+    def image_path(path)
+      asset_path(path, :type => :image)
+    end
+
+    # Expand logical video asset path.
+    def video_path(path)
+      asset_path(path, :type => :video)
+    end
+
+    # Expand logical audio asset path.
+    def audio_path(path)
+      asset_path(path, :type => :audio)
+    end
+
+    # Expand logical font asset path.
+    def font_path(path)
+      asset_path(path, :type => :font)
+    end
+
+    # Expand logical javascript asset path.
+    def javascript_path(path)
+      asset_path(path, :type => :javascript)
+    end
+
+    # Expand logical stylesheet asset path.
+    def stylesheet_path(path)
+      asset_path(path, :type => :stylesheet)
+    end
+
     private
       # Annotates exception backtrace with the original template that
       # the exception was raised in.
diff --git a/lib/sprockets/directive_processor.rb b/lib/sprockets/directive_processor.rb
index 7936946..5d29f32 100644
--- a/lib/sprockets/directive_processor.rb
+++ b/lib/sprockets/directive_processor.rb
@@ -65,7 +65,7 @@ module Sprockets
     #     //= require "foo"
     #
     DIRECTIVE_PATTERN = /
-      ^ [\W]* = \s* (\w+.*?) (\*\/)? $
+      ^ \W* = \s* (\w+.*?) (\*\/)? $
     /x
 
     attr_reader :pathname
@@ -92,6 +92,8 @@ module Sprockets
       @context = context
 
       @result = ""
+      @result.force_encoding(body.encoding) if body.respond_to?(:encoding)
+
       @has_written_body = false
 
       process_directives
diff --git a/lib/sprockets/engines.rb b/lib/sprockets/engines.rb
index 91d1b82..6a5b28f 100644
--- a/lib/sprockets/engines.rb
+++ b/lib/sprockets/engines.rb
@@ -28,12 +28,12 @@ module Sprockets
   #     Sprockets.register_engine '.sass', SassTemplate
   #
   module Engines
-    # Returns an `Array` of `Engine`s registered on the
-    # `Environment`. If an `ext` argument is supplied, the `Engine`
-    # register under that extension will be returned.
+    # Returns a `Hash` of `Engine`s registered on the `Environment`.
+    # If an `ext` argument is supplied, the `Engine` associated with
+    # that extension will be returned.
     #
     #     environment.engines
-    #     # => [CoffeeScriptTemplate, SassTemplate, ...]
+    #     # => {".coffee" => CoffeeScriptTemplate, ".sass" => SassTemplate, ...}
     #
     #     environment.engines('.coffee')
     #     # => CoffeeScriptTemplate
diff --git a/lib/sprockets/environment.rb b/lib/sprockets/environment.rb
index 7da8007..874c66a 100644
--- a/lib/sprockets/environment.rb
+++ b/lib/sprockets/environment.rb
@@ -37,6 +37,7 @@ module Sprockets
       @preprocessors     = Sprockets.preprocessors
       @postprocessors    = Sprockets.postprocessors
       @bundle_processors = Sprockets.bundle_processors
+      @compressors       = Sprockets.compressors
 
       Sprockets.paths.each do |path|
         append_path(path)
diff --git a/lib/sprockets/errors.rb b/lib/sprockets/errors.rb
index 98f03cf..f7a00c4 100644
--- a/lib/sprockets/errors.rb
+++ b/lib/sprockets/errors.rb
@@ -7,6 +7,7 @@ module Sprockets
   class EncodingError           < Error; end
   class FileNotFound            < Error; end
   class FileOutsidePaths        < Error; end
+  class NotImplementedError     < Error; end
   class UnserializeError        < Error; end
 
   module EngineError
diff --git a/lib/sprockets/index.rb b/lib/sprockets/index.rb
index 49518ce..8aa6ad6 100644
--- a/lib/sprockets/index.rb
+++ b/lib/sprockets/index.rb
@@ -31,6 +31,7 @@ module Sprockets
       @preprocessors     = environment.preprocessors
       @postprocessors    = environment.postprocessors
       @bundle_processors = environment.bundle_processors
+      @compressors       = environment.compressors
 
       # Initialize caches
       @assets  = {}
diff --git a/lib/sprockets/jst_processor.rb b/lib/sprockets/jst_processor.rb
index 5fe123c..4d85915 100644
--- a/lib/sprockets/jst_processor.rb
+++ b/lib/sprockets/jst_processor.rb
@@ -2,9 +2,7 @@ require 'tilt'
 
 module Sprockets
   class JstProcessor < Tilt::Template
-    def self.default_mime_type
-      'application/javascript'
-    end
+    self.default_mime_type = 'application/javascript'
 
     def self.default_namespace
       'this.JST'
@@ -18,9 +16,7 @@ module Sprockets
 
     def evaluate(scope, locals, &block)
       <<-JST
-(function() {
-  #{namespace} || (#{namespace} = {});
-  #{namespace}[#{scope.logical_path.inspect}] = #{indent(data)};
+(function() { #{namespace} || (#{namespace} = {}); #{namespace}[#{scope.logical_path.inspect}] = #{indent(data)};
 }).call(this);
       JST
     end
diff --git a/lib/sprockets/manifest.rb b/lib/sprockets/manifest.rb
index c07b893..dcc30ba 100644
--- a/lib/sprockets/manifest.rb
+++ b/lib/sprockets/manifest.rb
@@ -1,4 +1,5 @@
 require 'multi_json'
+require 'securerandom'
 require 'time'
 
 module Sprockets
@@ -18,26 +19,50 @@ module Sprockets
     # a full path to the manifest json file. The file may or may not
     # already exist. The dirname of the `path` will be used to write
     # compiled assets to. Otherwise, if the path is a directory, the
-    # filename will default to "manifest.json" in that directory.
+    # filename will default a random "manifest-123.json" file in that
+    # directory.
     #
     #   Manifest.new(environment, "./public/assets/manifest.json")
     #
-    def initialize(environment, path)
-      @environment = environment
+    def initialize(*args)
+      if args.first.is_a?(Base) || args.first.nil?
+        @environment = args.shift
+      end
 
-      if File.extname(path) == ""
-        @dir  = File.expand_path(path)
-        @path = File.join(@dir, 'manifest.json')
-      else
-        @path = File.expand_path(path)
-        @dir  = File.dirname(path)
+      @dir, @path = args[0], args[1]
+
+      # Expand paths
+      @dir  = File.expand_path(@dir) if @dir
+      @path = File.expand_path(@path) if @path
+
+      # If path is given as the second arg
+      if @dir && File.extname(@dir) != ""
+        @dir, @path = nil, @dir
+      end
+
+      # Default dir to the directory of the path
+      @dir ||= File.dirname(@path) if @path
+
+      # If directory is given w/o path, pick a random manifest.json location
+      if @dir && @path.nil?
+        # Find the first manifest.json in the directory
+        paths = Dir[File.join(@dir, "manifest*.json")]
+        if paths.any?
+          @path = paths.first
+        else
+          @path = File.join(@dir, "manifest-#{SecureRandom.hex(16)}.json")
+        end
+      end
+
+      unless @dir && @path
+        raise ArgumentError, "manifest requires output path"
       end
 
       data = nil
 
       begin
         if File.exist?(@path)
-          data = MultiJson.decode(File.read(@path))
+          data = json_decode(File.read(@path))
         end
       rescue MultiJson::DecodeError => e
         logger.error "#{@path} is invalid: #{e.class} #{e.message}"
@@ -83,8 +108,12 @@ module Sprockets
     #   compile("application.js")
     #
     def compile(*args)
+      unless environment
+        raise Error, "manifest requires environment for compilation"
+      end
+
       paths = environment.each_logical_path(*args).to_a +
-        args.flatten.select { |fn| Pathname.new(fn).absolute? }
+        args.flatten.select { |fn| Pathname.new(fn).absolute? if fn.is_a?(String)}
 
       paths.each do |path|
         if asset = find_asset(path)
@@ -103,6 +132,7 @@ module Sprockets
           else
             logger.info "Writing #{target}"
             asset.write_to target
+            asset.write_to "#{target}.gz" if asset.is_a?(BundledAsset)
           end
 
           save
@@ -118,6 +148,7 @@ module Sprockets
     #
     def remove(filename)
       path = File.join(dir, filename)
+      gzip = "#{path}.gz"
       logical_path = files[filename]['logical_path']
 
       if assets[logical_path] == filename
@@ -126,10 +157,11 @@ module Sprockets
 
       files.delete(filename)
       FileUtils.rm(path) if File.exist?(path)
+      FileUtils.rm(gzip) if File.exist?(gzip)
 
       save
 
-      logger.warn "Removed #{filename}"
+      logger.info "Removed #{filename}"
 
       nil
     end
@@ -152,7 +184,7 @@ module Sprockets
     # Wipe directive
     def clobber
       FileUtils.rm_r(@dir) if File.exist?(@dir)
-      logger.warn "Removed #{@dir}"
+      logger.info "Removed #{@dir}"
       nil
     end
 
@@ -178,7 +210,7 @@ module Sprockets
         ms = benchmark do
           asset = environment.find_asset(logical_path)
         end
-        logger.warn "Compiled #{logical_path}  (#{ms}ms)"
+        logger.debug "Compiled #{logical_path}  (#{ms}ms)"
         asset
       end
 
@@ -186,13 +218,38 @@ module Sprockets
       def save
         FileUtils.mkdir_p dir
         File.open(path, 'w') do |f|
-          f.write MultiJson.encode(@data)
+          f.write json_encode(@data)
         end
       end
 
     private
+      # Feature detect newer MultiJson API
+      if MultiJson.respond_to?(:dump)
+        def json_decode(obj)
+          MultiJson.load(obj)
+        end
+
+        def json_encode(obj)
+          MultiJson.dump(obj)
+        end
+      else
+        def json_decode(obj)
+          MultiJson.decode(obj)
+        end
+
+        def json_encode(obj)
+          MultiJson.encode(obj)
+        end
+      end
+
       def logger
-        environment.logger
+        if environment
+          environment.logger
+        else
+          logger = Logger.new($stderr)
+          logger.level = Logger::FATAL
+          logger
+        end
       end
 
       def benchmark
diff --git a/lib/sprockets/processed_asset.rb b/lib/sprockets/processed_asset.rb
index cef7c12..1793675 100644
--- a/lib/sprockets/processed_asset.rb
+++ b/lib/sprockets/processed_asset.rb
@@ -19,7 +19,7 @@ module Sprockets
       @dependency_digest = compute_dependency_digest(environment)
 
       elapsed_time = ((Time.now.to_f - start_time) * 1000).to_i
-      environment.logger.info "Compiled #{logical_path}  (#{elapsed_time}ms)  (pid #{Process.pid})"
+      environment.logger.debug "Compiled #{logical_path}  (#{elapsed_time}ms)  (pid #{Process.pid})"
     end
 
     # Interal: Used to check equality
diff --git a/lib/sprockets/processing.rb b/lib/sprockets/processing.rb
index 8fa750e..faeb4e9 100644
--- a/lib/sprockets/processing.rb
+++ b/lib/sprockets/processing.rb
@@ -65,7 +65,7 @@ module Sprockets
     #
     # A block can be passed for to create a shorthand processor.
     #
-    #     register_preprocessor :my_processor do |context, data|
+    #     register_preprocessor 'text/css', :my_processor do |context, data|
     #       data.gsub(...)
     #     end
     #
@@ -87,7 +87,7 @@ module Sprockets
     #
     # A block can be passed for to create a shorthand processor.
     #
-    #     register_postprocessor :my_processor do |context, data|
+    #     register_postprocessor 'text/css', :my_processor do |context, data|
     #       data.gsub(...)
     #     end
     #
@@ -192,46 +192,6 @@ module Sprockets
       @bundle_processors[mime_type].delete(klass)
     end
 
-    # Return CSS compressor or nil if none is set
-    def css_compressor
-      bundle_processors('text/css').detect { |klass|
-        klass.respond_to?(:name) &&
-          klass.name == 'Sprockets::Processor (css_compressor)'
-      }
-    end
-
-    # Assign a compressor to run on `text/css` assets.
-    #
-    # The compressor object must respond to `compress` or `compile`.
-    def css_compressor=(compressor)
-      unregister_bundle_processor 'text/css', :css_compressor
-      return unless compressor
-
-      register_bundle_processor 'text/css', :css_compressor do |context, data|
-        compressor.compress(data)
-      end
-    end
-
-    # Return JS compressor or nil if none is set
-    def js_compressor
-      bundle_processors('application/javascript').detect { |klass|
-        klass.respond_to?(:name) &&
-          klass.name == 'Sprockets::Processor (js_compressor)'
-      }
-    end
-
-    # Assign a compressor to run on `application/javascript` assets.
-    #
-    # The compressor object must respond to `compress` or `compile`.
-    def js_compressor=(compressor)
-      unregister_bundle_processor 'application/javascript', :js_compressor
-      return unless compressor
-
-      register_bundle_processor 'application/javascript', :js_compressor do |context, data|
-        compressor.compress(data)
-      end
-    end
-
     private
       def add_engine_to_trail(ext, klass)
         @trail.append_extension(ext.to_s)
diff --git a/lib/sprockets/sass_cache_store.rb b/lib/sprockets/sass_cache_store.rb
index 9ded8d7..d969a5c 100644
--- a/lib/sprockets/sass_cache_store.rb
+++ b/lib/sprockets/sass_cache_store.rb
@@ -16,10 +16,14 @@ module Sprockets
       if obj = environment.cache_get("sass/#{key}")
         return unless obj[:version] == version
         return unless obj[:sha] == sha
-        obj[:obj]
+        obj[:contents]
       else
         nil
       end
     end
+
+    def path_to(key)
+      key
+    end
   end
 end
diff --git a/lib/sprockets/sass_compressor.rb b/lib/sprockets/sass_compressor.rb
new file mode 100644
index 0000000..112d4ee
--- /dev/null
+++ b/lib/sprockets/sass_compressor.rb
@@ -0,0 +1,27 @@
+require 'tilt'
+
+module Sprockets
+  class SassCompressor < Tilt::Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined?(::Sass::Engine)
+    end
+
+    def initialize_engine
+      require_template_library 'sass'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      ::Sass::Engine.new(data, {
+        :syntax => :scss,
+        :cache => false,
+        :read_cache => false,
+        :style => :compressed
+      }).render
+    end
+  end
+end
diff --git a/lib/sprockets/sass_functions.rb b/lib/sprockets/sass_functions.rb
new file mode 100644
index 0000000..3e0e812
--- /dev/null
+++ b/lib/sprockets/sass_functions.rb
@@ -0,0 +1,70 @@
+require 'sass'
+
+module Sprockets
+  module SassFunctions
+    def asset_path(path)
+      Sass::Script::String.new(sprockets_context.asset_path(path.value), :string)
+    end
+
+    def asset_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.asset_path(path.value) + ")")
+    end
+
+    def image_path(path)
+      Sass::Script::String.new(sprockets_context.image_path(path.value), :string)
+    end
+
+    def image_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.image_path(path.value) + ")")
+    end
+
+    def video_path(path)
+      Sass::Script::String.new(sprockets_context.video_path(path.value), :string)
+    end
+
+    def video_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.video_path(path.value) + ")")
+    end
+
+    def audio_path(path)
+      Sass::Script::String.new(sprockets_context.audio_path(path.value), :string)
+    end
+
+    def audio_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.audio_path(path.value) + ")")
+    end
+
+    def font_path(path)
+      Sass::Script::String.new(sprockets_context.font_path(path.value), :string)
+    end
+
+    def font_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.font_path(path.value) + ")")
+    end
+
+    def javascript_path(path)
+      Sass::Script::String.new(sprockets_context.javascript_path(path.value), :string)
+    end
+
+    def javascript_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.javascript_path(path.value) + ")")
+    end
+
+    def stylesheet_path(path)
+      Sass::Script::String.new(sprockets_context.stylesheet_path(path.value), :string)
+    end
+
+    def stylesheet_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.stylesheet_path(path.value) + ")")
+    end
+
+    protected
+      def sprockets_context
+        options[:sprockets][:context]
+      end
+
+      def sprockets_environment
+        options[:sprockets][:environment]
+      end
+  end
+end
diff --git a/lib/sprockets/sass_importer.rb b/lib/sprockets/sass_importer.rb
index 5ac5eea..de1a347 100644
--- a/lib/sprockets/sass_importer.rb
+++ b/lib/sprockets/sass_importer.rb
@@ -13,7 +13,7 @@ module Sprockets
     def find_relative(*args)
       engine = super
       if engine && (filename = engine.options[:filename])
-        @context.depend_on_asset(filename)
+        @context.depend_on(filename)
       end
       engine
     end
@@ -21,7 +21,7 @@ module Sprockets
     def find(*args)
       engine = super
       if engine && (filename = engine.options[:filename])
-        @context.depend_on_asset(filename)
+        @context.depend_on(filename)
       end
       engine
     end
diff --git a/lib/sprockets/sass_template.rb b/lib/sprockets/sass_template.rb
index 3a9874b..5f1ba1a 100644
--- a/lib/sprockets/sass_template.rb
+++ b/lib/sprockets/sass_template.rb
@@ -10,11 +10,20 @@ module Sprockets
     self.default_mime_type = 'text/css'
 
     def self.engine_initialized?
-      defined? ::Sass::Engine
+      defined?(::Sass::Engine) && defined?(::Sass::Script::Functions) &&
+        ::Sass::Script::Functions < Sprockets::SassFunctions
     end
 
     def initialize_engine
-      require_template_library 'sass'
+      # Double check constant to avoid tilt warning
+      unless defined? ::Sass
+        require_template_library 'sass'
+      end
+
+      # Install custom functions. It'd be great if this didn't need to
+      # be installed globally, but could be passed into Engine as an
+      # option.
+      ::Sass::Script::Functions.send :include, Sprockets::SassFunctions
     end
 
     def prepare
@@ -34,7 +43,11 @@ module Sprockets
         :syntax => syntax,
         :cache_store => cache_store,
         :importer => SassImporter.new(context, context.pathname),
-        :load_paths => context.environment.paths.map { |path| SassImporter.new(context, path) }
+        :load_paths => context.environment.paths.map { |path| SassImporter.new(context, path) },
+        :sprockets => {
+          :context => context,
+          :environment => context.environment
+        }
       }
 
       ::Sass::Engine.new(data, options).render
diff --git a/lib/sprockets/static_asset.rb b/lib/sprockets/static_asset.rb
index 6c6ac56..70533bb 100644
--- a/lib/sprockets/static_asset.rb
+++ b/lib/sprockets/static_asset.rb
@@ -30,6 +30,7 @@ module Sprockets
         pathname.open('rb') do |rd|
           File.open("#{filename}+", 'wb') do |wr|
             gz = Zlib::GzipWriter.new(wr, Zlib::BEST_COMPRESSION)
+            gz.mtime = mtime.to_i
             buf = ""
             while rd.read(16384, buf)
               gz.write(buf)
diff --git a/lib/sprockets/uglifier_compressor.rb b/lib/sprockets/uglifier_compressor.rb
new file mode 100644
index 0000000..4d1e56c
--- /dev/null
+++ b/lib/sprockets/uglifier_compressor.rb
@@ -0,0 +1,29 @@
+require 'tilt'
+
+module Sprockets
+  class UglifierCompressor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.engine_initialized?
+      defined?(::Uglifier)
+    end
+
+    def initialize_engine
+      require_template_library 'uglifier'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      # Feature detect Uglifier 2.0 option support
+      if Uglifier::DEFAULTS[:copyright]
+        # Uglifier < 2.x
+        Uglifier.new(:copyright => false).compile(data)
+      else
+        # Uglifier >= 2.x
+        Uglifier.new(:comments => :none).compile(data)
+      end
+    end
+  end
+end
diff --git a/lib/sprockets/version.rb b/lib/sprockets/version.rb
index 145245b..fc2acb9 100644
--- a/lib/sprockets/version.rb
+++ b/lib/sprockets/version.rb
@@ -1,3 +1,3 @@
 module Sprockets
-  VERSION = "2.4.0"
+  VERSION = "2.10.0"
 end
diff --git a/lib/sprockets/yui_compressor.rb b/lib/sprockets/yui_compressor.rb
new file mode 100644
index 0000000..c0d6656
--- /dev/null
+++ b/lib/sprockets/yui_compressor.rb
@@ -0,0 +1,27 @@
+require 'tilt'
+
+module Sprockets
+  class YUICompressor < Tilt::Template
+    def self.engine_initialized?
+      defined?(::YUI)
+    end
+
+    def initialize_engine
+      require_template_library 'yui/compressor'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      case context.content_type
+      when 'application/javascript'
+        YUI::JavaScriptCompressor.new.compress(data)
+      when 'text/css'
+        YUI::CssCompressor.new.compress(data)
+      else
+        data
+      end
+    end
+  end
+end
diff --git a/metadata.yml b/metadata.yml
index 0eb3fa2..6922a3c 100644
--- a/metadata.yml
+++ b/metadata.yml
@@ -1,236 +1,256 @@
---- !ruby/object:Gem::Specification 
+--- !ruby/object:Gem::Specification
 name: sprockets
-version: !ruby/object:Gem::Version 
-  hash: 31
-  prerelease: 
-  segments: 
-  - 2
-  - 4
-  - 0
-  version: 2.4.0
+version: !ruby/object:Gem::Version
+  version: 2.10.0
 platform: ruby
-authors: 
+authors:
 - Sam Stephenson
 - Joshua Peek
 autorequire: 
 bindir: bin
 cert_chain: []
-
-date: 2012-03-27 00:00:00 -05:00
-default_executable: 
-dependencies: 
-- !ruby/object:Gem::Dependency 
+date: 2013-05-24 00:00:00.000000000 Z
+dependencies:
+- !ruby/object:Gem::Dependency
   name: hike
-  prerelease: false
-  requirement: &id001 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 11
-        segments: 
-        - 1
-        - 2
-        version: "1.2"
+      - !ruby/object:Gem::Version
+        version: '1.2'
   type: :runtime
-  version_requirements: *id001
-- !ruby/object:Gem::Dependency 
-  name: multi_json
   prerelease: false
-  requirement: &id002 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.2'
+- !ruby/object:Gem::Dependency
+  name: multi_json
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 15
-        segments: 
-        - 1
-        - 0
-        version: "1.0"
+      - !ruby/object:Gem::Version
+        version: '1.0'
   type: :runtime
-  version_requirements: *id002
-- !ruby/object:Gem::Dependency 
-  name: rack
   prerelease: false
-  requirement: &id003 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 15
-        segments: 
-        - 1
-        - 0
-        version: "1.0"
+      - !ruby/object:Gem::Version
+        version: '1.0'
+- !ruby/object:Gem::Dependency
+  name: rack
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.0'
   type: :runtime
-  version_requirements: *id003
-- !ruby/object:Gem::Dependency 
-  name: tilt
   prerelease: false
-  requirement: &id004 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 13
-        segments: 
-        - 1
-        - 1
-        version: "1.1"
-    - - "!="
-      - !ruby/object:Gem::Version 
-        hash: 27
-        segments: 
-        - 1
-        - 3
-        - 0
+      - !ruby/object:Gem::Version
+        version: '1.0'
+- !ruby/object:Gem::Dependency
+  name: tilt
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.1'
+    - - '!='
+      - !ruby/object:Gem::Version
         version: 1.3.0
   type: :runtime
-  version_requirements: *id004
-- !ruby/object:Gem::Dependency 
-  name: coffee-script
   prerelease: false
-  requirement: &id005 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 2
-        - 0
-        version: "2.0"
+      - !ruby/object:Gem::Version
+        version: '1.1'
+    - - '!='
+      - !ruby/object:Gem::Version
+        version: 1.3.0
+- !ruby/object:Gem::Dependency
+  name: closure-compiler
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id005
-- !ruby/object:Gem::Dependency 
-  name: coffee-script-source
   prerelease: false
-  requirement: &id006 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: coffee-script
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 31
-        segments: 
-        - 1
-        - 2
-        - 0
-        version: 1.2.0
+      - !ruby/object:Gem::Version
+        version: '2.0'
   type: :development
-  version_requirements: *id006
-- !ruby/object:Gem::Dependency 
-  name: eco
   prerelease: false
-  requirement: &id007 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '2.0'
+- !ruby/object:Gem::Dependency
+  name: coffee-script-source
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 15
-        segments: 
-        - 1
-        - 0
-        version: "1.0"
+      - !ruby/object:Gem::Version
+        version: '1.2'
   type: :development
-  version_requirements: *id007
-- !ruby/object:Gem::Dependency 
-  name: ejs
   prerelease: false
-  requirement: &id008 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 15
-        segments: 
-        - 1
-        - 0
-        version: "1.0"
+      - !ruby/object:Gem::Version
+        version: '1.2'
+- !ruby/object:Gem::Dependency
+  name: eco
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.0'
   type: :development
-  version_requirements: *id008
-- !ruby/object:Gem::Dependency 
-  name: execjs
   prerelease: false
-  requirement: &id009 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 15
-        segments: 
-        - 1
-        - 0
-        version: "1.0"
+      - !ruby/object:Gem::Version
+        version: '1.0'
+- !ruby/object:Gem::Dependency
+  name: ejs
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.0'
   type: :development
-  version_requirements: *id009
-- !ruby/object:Gem::Dependency 
-  name: json
   prerelease: false
-  requirement: &id010 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.0'
+- !ruby/object:Gem::Dependency
+  name: execjs
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.0'
   type: :development
-  version_requirements: *id010
-- !ruby/object:Gem::Dependency 
-  name: rack-test
   prerelease: false
-  requirement: &id011 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '1.0'
+- !ruby/object:Gem::Dependency
+  name: json
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id011
-- !ruby/object:Gem::Dependency 
-  name: rake
   prerelease: false
-  requirement: &id012 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
-    - - ">="
-      - !ruby/object:Gem::Version 
-        hash: 3
-        segments: 
-        - 0
-        version: "0"
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: rack-test
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id012
-- !ruby/object:Gem::Dependency 
+  prerelease: false
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: rake
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+  type: :development
+  prerelease: false
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
   name: sass
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - ~>
+      - !ruby/object:Gem::Version
+        version: '3.1'
+  type: :development
   prerelease: false
-  requirement: &id013 !ruby/object:Gem::Requirement 
-    none: false
-    requirements: 
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
     - - ~>
-      - !ruby/object:Gem::Version 
-        hash: 5
-        segments: 
-        - 3
-        - 1
-        version: "3.1"
+      - !ruby/object:Gem::Version
+        version: '3.1'
+- !ruby/object:Gem::Dependency
+  name: uglifier
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
   type: :development
-  version_requirements: *id013
-description: Sprockets is a Rack-based asset packaging system that concatenates and serves JavaScript, CoffeeScript, CSS, LESS, Sass, and SCSS.
-email: 
+  prerelease: false
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+- !ruby/object:Gem::Dependency
+  name: yui-compressor
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+  type: :development
+  prerelease: false
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - '>='
+      - !ruby/object:Gem::Version
+        version: '0'
+description: Sprockets is a Rack-based asset packaging system that concatenates and
+  serves JavaScript, CoffeeScript, CSS, LESS, Sass, and SCSS.
+email:
 - sstephenson at gmail.com
 - josh at joshpeek.com
-executables: 
+executables:
 - sprockets
 extensions: []
-
 extra_rdoc_files: []
-
-files: 
+files:
 - README.md
 - LICENSE
 - lib/rake/sprocketstask.rb
@@ -241,6 +261,8 @@ files:
 - lib/sprockets/cache/file_store.rb
 - lib/sprockets/caching.rb
 - lib/sprockets/charset_normalizer.rb
+- lib/sprockets/closure_compressor.rb
+- lib/sprockets/compressing.rb
 - lib/sprockets/context.rb
 - lib/sprockets/directive_processor.rb
 - lib/sprockets/eco_template.rb
@@ -258,48 +280,41 @@ files:
 - lib/sprockets/processor.rb
 - lib/sprockets/safety_colons.rb
 - lib/sprockets/sass_cache_store.rb
+- lib/sprockets/sass_compressor.rb
+- lib/sprockets/sass_functions.rb
 - lib/sprockets/sass_importer.rb
 - lib/sprockets/sass_template.rb
 - lib/sprockets/scss_template.rb
 - lib/sprockets/server.rb
 - lib/sprockets/static_asset.rb
+- lib/sprockets/uglifier_compressor.rb
 - lib/sprockets/utils.rb
 - lib/sprockets/version.rb
+- lib/sprockets/yui_compressor.rb
 - lib/sprockets.rb
 - bin/sprockets
-has_rdoc: true
 homepage: http://getsprockets.org/
-licenses: []
-
+licenses:
+- MIT
+metadata: {}
 post_install_message: 
 rdoc_options: []
-
-require_paths: 
+require_paths:
 - lib
-required_ruby_version: !ruby/object:Gem::Requirement 
-  none: false
-  requirements: 
-  - - ">="
-    - !ruby/object:Gem::Version 
-      hash: 3
-      segments: 
-      - 0
-      version: "0"
-required_rubygems_version: !ruby/object:Gem::Requirement 
-  none: false
-  requirements: 
-  - - ">="
-    - !ruby/object:Gem::Version 
-      hash: 3
-      segments: 
-      - 0
-      version: "0"
+required_ruby_version: !ruby/object:Gem::Requirement
+  requirements:
+  - - '>='
+    - !ruby/object:Gem::Version
+      version: '0'
+required_rubygems_version: !ruby/object:Gem::Requirement
+  requirements:
+  - - '>='
+    - !ruby/object:Gem::Version
+      version: '0'
 requirements: []
-
 rubyforge_project: sprockets
-rubygems_version: 1.6.2
+rubygems_version: 2.0.0
 signing_key: 
-specification_version: 3
+specification_version: 4
 summary: Rack-based asset packaging system
 test_files: []
-

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-sprockets.git



More information about the Pkg-ruby-extras-commits mailing list