[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