jammit 0.6.5 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/jammit +3 -1
- data/jammit.gemspec +4 -3
- data/lib/jammit.rb +34 -19
- data/lib/jammit/compressor.rb +28 -15
- data/lib/jammit/cssmin_compressor.rb +10 -0
- data/lib/jammit/dependencies.rb +24 -7
- data/lib/jammit/jsmin_compressor.rb +10 -0
- data/lib/jammit/packager.rb +9 -6
- data/lib/jammit/sass_compressor.rb +17 -0
- metadata +29 -9
data/bin/jammit
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby -rrubygems
|
2
|
+
require 'pathname'
|
2
3
|
|
3
|
-
|
4
|
+
APP_ROOT = File.dirname(Pathname.new(__FILE__).realpath)
|
5
|
+
require File.join(APP_ROOT, '../lib/jammit/command_line.rb')
|
4
6
|
|
5
7
|
Jammit::CommandLine.new
|
data/jammit.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'jammit'
|
3
|
-
s.version = '0.6.
|
4
|
-
s.date = '
|
3
|
+
s.version = '0.6.6' # Keep version in sync with jammit.rb
|
4
|
+
s.date = '2013-03-20'
|
5
5
|
|
6
6
|
s.homepage = "http://documentcloud.github.com/jammit/"
|
7
7
|
s.summary = "Industrial Strength Asset Packaging for Rails"
|
@@ -26,7 +26,8 @@ Gem::Specification.new do |s|
|
|
26
26
|
'--main' << 'README' <<
|
27
27
|
'--all'
|
28
28
|
|
29
|
-
s.add_dependency '
|
29
|
+
s.add_dependency 'cssmin', ['>= 1.0.3']
|
30
|
+
s.add_dependency 'jsmin', ['>= 1.0.1']
|
30
31
|
|
31
32
|
s.files = Dir['lib/**/*', 'bin/*', 'rails/*', 'jammit.gemspec', 'LICENSE', 'README']
|
32
33
|
end
|
data/lib/jammit.rb
CHANGED
@@ -4,27 +4,31 @@ $LOAD_PATH.push File.expand_path(File.dirname(__FILE__))
|
|
4
4
|
# to all of the configuration options.
|
5
5
|
module Jammit
|
6
6
|
|
7
|
-
VERSION
|
7
|
+
VERSION = "0.6.6"
|
8
8
|
|
9
|
-
ROOT
|
9
|
+
ROOT = File.expand_path(File.dirname(__FILE__) + '/..')
|
10
10
|
|
11
|
-
ASSET_ROOT
|
11
|
+
ASSET_ROOT = File.expand_path((defined?(Rails) && Rails.root.to_s.length > 0) ? Rails.root : ENV['RAILS_ROOT'] || ".") unless defined?(ASSET_ROOT)
|
12
12
|
|
13
|
-
DEFAULT_PUBLIC_ROOT
|
13
|
+
DEFAULT_PUBLIC_ROOT = (defined?(Rails) && Rails.public_path.to_s.length > 0) ? Rails.public_path : File.join(ASSET_ROOT, 'public') unless defined?(PUBLIC_ROOT)
|
14
14
|
|
15
|
-
DEFAULT_CONFIG_PATH
|
15
|
+
DEFAULT_CONFIG_PATH = File.join(ASSET_ROOT, 'config', 'assets.yml')
|
16
16
|
|
17
|
-
DEFAULT_PACKAGE_PATH
|
17
|
+
DEFAULT_PACKAGE_PATH = "assets"
|
18
18
|
|
19
|
-
DEFAULT_JST_SCRIPT
|
19
|
+
DEFAULT_JST_SCRIPT = File.join(ROOT, 'lib/jammit/jst.js')
|
20
20
|
|
21
|
-
DEFAULT_JST_COMPILER
|
21
|
+
DEFAULT_JST_COMPILER = "template"
|
22
22
|
|
23
|
-
DEFAULT_JST_NAMESPACE
|
23
|
+
DEFAULT_JST_NAMESPACE = "window.JST"
|
24
24
|
|
25
|
-
|
25
|
+
JAVASCRIPT_COMPRESSORS = [:jsmin, :yui, :closure, :uglifier]
|
26
26
|
|
27
|
-
|
27
|
+
DEFAULT_JAVASCRIPT_COMPRESSOR = :jsmin
|
28
|
+
|
29
|
+
CSS_COMPRESSORS = [:cssmin, :yui, :sass]
|
30
|
+
|
31
|
+
DEFAULT_CSS_COMPRESSOR = :cssmin
|
28
32
|
|
29
33
|
# Extension matchers for JavaScript and JST, which need to be disambiguated.
|
30
34
|
JS_EXTENSION = /\.js\Z/
|
@@ -35,7 +39,7 @@ module Jammit
|
|
35
39
|
class PackageNotFound < NameError; end
|
36
40
|
|
37
41
|
# Jammit raises a MissingConfiguration exception when you try to load the
|
38
|
-
# configuration of an assets.yml file that doesn't exist, or are missing
|
42
|
+
# configuration of an assets.yml file that doesn't exist, or are missing
|
39
43
|
# a piece of required configuration.
|
40
44
|
class MissingConfiguration < NameError; end
|
41
45
|
|
@@ -50,17 +54,20 @@ module Jammit
|
|
50
54
|
attr_reader :configuration, :template_function, :template_namespace,
|
51
55
|
:embed_assets, :package_assets, :compress_assets, :gzip_assets,
|
52
56
|
:package_path, :mhtml_enabled, :include_jst_script, :config_path,
|
53
|
-
:javascript_compressor, :compressor_options, :
|
54
|
-
:
|
55
|
-
:
|
56
|
-
|
57
|
+
:javascript_compressor, :compressor_options, :css_compressor,
|
58
|
+
:css_compressor_options, :template_extension,
|
59
|
+
:template_extension_matcher, :allow_debugging,
|
60
|
+
:rewrite_relative_paths, :public_root
|
61
|
+
attr_accessor :javascript_compressors, :css_compressors
|
57
62
|
end
|
58
63
|
|
59
64
|
# The minimal required configuration.
|
60
65
|
@configuration = {}
|
61
66
|
@public_root = DEFAULT_PUBLIC_ROOT
|
62
67
|
@package_path = DEFAULT_PACKAGE_PATH
|
63
|
-
|
68
|
+
|
69
|
+
@javascript_compressors = JAVASCRIPT_COMPRESSORS
|
70
|
+
@css_compressors = CSS_COMPRESSORS
|
64
71
|
|
65
72
|
# Load the complete asset configuration from the specified @config_path@.
|
66
73
|
# If we're loading softly, don't let missing configuration error out.
|
@@ -71,7 +78,7 @@ module Jammit
|
|
71
78
|
conf = YAML.load(ERB.new(File.read(config_path)).result)
|
72
79
|
|
73
80
|
# Optionally overwrite configuration based on the environment.
|
74
|
-
rails_env = defined?(Rails) ? Rails.env : ENV['RAILS_ENV']
|
81
|
+
rails_env = (defined?(Rails) ? ::Rails.env : ENV['RAILS_ENV'] || "development")
|
75
82
|
conf.merge! conf.delete rails_env if conf.has_key? rails_env
|
76
83
|
|
77
84
|
@config_path = config_path
|
@@ -79,12 +86,14 @@ module Jammit
|
|
79
86
|
@package_path = conf[:package_path] || DEFAULT_PACKAGE_PATH
|
80
87
|
@embed_assets = conf[:embed_assets] || conf[:embed_images]
|
81
88
|
@compress_assets = !(conf[:compress_assets] == false)
|
89
|
+
@rewrite_relative_paths = !(conf[:rewrite_relative_paths] == false)
|
82
90
|
@gzip_assets = !(conf[:gzip_assets] == false)
|
83
91
|
@allow_debugging = !(conf[:allow_debugging] == false)
|
84
92
|
@mhtml_enabled = @embed_assets && @embed_assets != "datauri"
|
85
93
|
@compressor_options = symbolize_keys(conf[:compressor_options] || {})
|
86
94
|
@css_compressor_options = symbolize_keys(conf[:css_compressor_options] || {})
|
87
95
|
set_javascript_compressor(conf[:javascript_compressor])
|
96
|
+
set_css_compressor(conf[:css_compressor])
|
88
97
|
set_package_assets(conf[:package_assets])
|
89
98
|
set_template_function(conf[:template_function])
|
90
99
|
set_template_namespace(conf[:template_namespace])
|
@@ -148,7 +157,13 @@ module Jammit
|
|
148
157
|
# Ensure that the JavaScript compressor is a valid choice.
|
149
158
|
def self.set_javascript_compressor(value)
|
150
159
|
value = value && value.to_sym
|
151
|
-
@javascript_compressor =
|
160
|
+
@javascript_compressor = javascript_compressors.include?(value) ? value : DEFAULT_JAVASCRIPT_COMPRESSOR
|
161
|
+
end
|
162
|
+
|
163
|
+
# Ensure that the CSS compressor is a valid choice.
|
164
|
+
def self.set_css_compressor(value)
|
165
|
+
value = value && value.to_sym
|
166
|
+
@css_compressor = css_compressors.include?(value) ? value : DEFAULT_CSS_COMPRESSOR
|
152
167
|
end
|
153
168
|
|
154
169
|
# Turn asset packaging on or off, depending on configuration and environment.
|
data/lib/jammit/compressor.rb
CHANGED
@@ -15,9 +15,9 @@ module Jammit
|
|
15
15
|
'.gif' => 'image/gif',
|
16
16
|
'.tif' => 'image/tiff',
|
17
17
|
'.tiff' => 'image/tiff',
|
18
|
-
'.ttf' => 'font
|
18
|
+
'.ttf' => 'application/x-font-ttf',
|
19
19
|
'.otf' => 'font/opentype',
|
20
|
-
'.woff' => 'font
|
20
|
+
'.woff' => 'application/x-font-woff'
|
21
21
|
}
|
22
22
|
|
23
23
|
# Font extensions for which we allow embedding:
|
@@ -41,26 +41,39 @@ module Jammit
|
|
41
41
|
JST_START = "(function(){"
|
42
42
|
JST_END = "})();"
|
43
43
|
|
44
|
-
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
44
|
+
JAVASCRIPT_COMPRESSORS = {
|
45
|
+
:jsmin => Jammit.javascript_compressors.include?(:jsmin) ? Jammit::JsminCompressor : nil,
|
46
|
+
:yui => Jammit.javascript_compressors.include?(:yui) ? YUI::JavaScriptCompressor : nil,
|
47
|
+
:closure => Jammit.javascript_compressors.include?(:closure) ? Closure::Compiler : nil,
|
48
|
+
:uglifier => Jammit.javascript_compressors.include?(:uglifier) ? Jammit::Uglifier : nil
|
48
49
|
}
|
49
50
|
|
50
|
-
|
51
|
+
CSS_COMPRESSORS = {
|
52
|
+
:cssmin => Jammit.css_compressors.include?(:cssmin) ? Jammit::CssminCompressor : nil,
|
53
|
+
:yui => Jammit.css_compressors.include?(:yui) ? YUI::CssCompressor : nil,
|
54
|
+
:sass => Jammit.css_compressors.include?(:sass) ? Jammit::SassCompressor : nil
|
55
|
+
}
|
56
|
+
|
57
|
+
JAVASCRIPT_DEFAULT_OPTIONS = {
|
58
|
+
:jsmin => {},
|
51
59
|
:yui => {:munge => true},
|
52
60
|
:closure => {},
|
53
61
|
:uglifier => {:copyright => false}
|
54
62
|
}
|
55
63
|
|
56
|
-
#
|
57
|
-
# provided with YUI Compressor, Google Closure
|
64
|
+
# CSS compression can be provided with YUI Compressor or sass. JS
|
65
|
+
# compression can be provided with YUI Compressor, Google Closure
|
66
|
+
# Compiler or UglifyJS.
|
58
67
|
def initialize
|
59
|
-
Jammit.
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
68
|
+
if Jammit.javascript_compressors.include?(:yui) || Jammit.javascript_compressors.include?(:closure) || Jammit.css_compressors.include?(:yui)
|
69
|
+
Jammit.check_java_version
|
70
|
+
end
|
71
|
+
|
72
|
+
css_flavor = Jammit.css_compressor || Jammit::DEFAULT_CSS_COMPRESSOR
|
73
|
+
@css_compressor = CSS_COMPRESSORS[css_flavor].new(Jammit.css_compressor_options || {})
|
74
|
+
js_flavor = Jammit.javascript_compressor || Jammit::DEFAULT_JAVASCRIPT_COMPRESSOR
|
75
|
+
@options = JAVASCRIPT_DEFAULT_OPTIONS[js_flavor].merge(Jammit.compressor_options || {})
|
76
|
+
@js_compressor = JAVASCRIPT_COMPRESSORS[js_flavor].new(@options)
|
64
77
|
end
|
65
78
|
|
66
79
|
# Concatenate together a list of JavaScript paths, and pass them through the
|
@@ -179,7 +192,7 @@ module Jammit
|
|
179
192
|
def construct_asset_path(asset_path, css_path, variant)
|
180
193
|
public_path = absolute_path(asset_path, css_path)
|
181
194
|
return "__EMBED__#{public_path}" if embeddable?(public_path, variant)
|
182
|
-
source = asset_path.absolute? ? asset_path.to_s : relative_path(public_path)
|
195
|
+
source = asset_path.absolute? || ! Jammit.rewrite_relative_paths ? asset_path.to_s : relative_path(public_path)
|
183
196
|
rewrite_asset_path(source, public_path)
|
184
197
|
end
|
185
198
|
|
data/lib/jammit/dependencies.rb
CHANGED
@@ -7,28 +7,45 @@ require 'base64'
|
|
7
7
|
require 'pathname'
|
8
8
|
require 'fileutils'
|
9
9
|
|
10
|
-
#
|
11
|
-
|
10
|
+
# Try Uglifier.
|
11
|
+
begin
|
12
|
+
require 'uglifier'
|
13
|
+
require 'jammit/uglifier'
|
14
|
+
rescue LoadError
|
15
|
+
Jammit.javascript_compressors.delete :uglifier
|
16
|
+
end
|
17
|
+
|
18
|
+
# Try YUI
|
19
|
+
begin
|
20
|
+
require 'yui/compressor'
|
21
|
+
rescue LoadError
|
22
|
+
Jammit.javascript_compressors.delete :yui
|
23
|
+
Jammit.css_compressors.delete :yui
|
24
|
+
end
|
12
25
|
|
13
26
|
# Try Closure.
|
14
27
|
begin
|
15
28
|
require 'closure-compiler'
|
16
29
|
rescue LoadError
|
17
|
-
Jammit.
|
30
|
+
Jammit.javascript_compressors.delete :closure
|
18
31
|
end
|
19
32
|
|
20
|
-
# Try
|
33
|
+
# Try Sass
|
21
34
|
begin
|
22
|
-
require '
|
35
|
+
require 'sass'
|
36
|
+
require 'jammit/sass_compressor'
|
23
37
|
rescue LoadError
|
24
|
-
Jammit.
|
38
|
+
Jammit.css_compressors.delete :sass
|
25
39
|
end
|
26
40
|
|
27
41
|
# Load initial configuration before the rest of Jammit.
|
28
42
|
Jammit.load_configuration(Jammit::DEFAULT_CONFIG_PATH, true) if defined?(Rails)
|
29
43
|
|
30
44
|
# Jammit Core:
|
31
|
-
require '
|
45
|
+
require 'jsmin'
|
46
|
+
require 'cssmin'
|
47
|
+
require 'jammit/jsmin_compressor'
|
48
|
+
require 'jammit/cssmin_compressor'
|
32
49
|
require 'jammit/compressor'
|
33
50
|
require 'jammit/packager'
|
34
51
|
|
data/lib/jammit/packager.rb
CHANGED
@@ -14,7 +14,6 @@ module Jammit
|
|
14
14
|
# Jammit.configuration. When assets.yml is being changed on the fly,
|
15
15
|
# create a new Packager.
|
16
16
|
def initialize
|
17
|
-
@compressor = Compressor.new
|
18
17
|
@force = false
|
19
18
|
@package_names = nil
|
20
19
|
@config = {
|
@@ -71,21 +70,25 @@ module Jammit
|
|
71
70
|
package_for(package, extension)[:urls]
|
72
71
|
end
|
73
72
|
|
73
|
+
def compressor
|
74
|
+
@compressor ||= Compressor.new
|
75
|
+
end
|
76
|
+
|
74
77
|
# Return the compressed contents of a stylesheet package.
|
75
78
|
def pack_stylesheets(package, variant=nil, asset_url=nil)
|
76
|
-
|
79
|
+
compressor.compress_css(package_for(package, :css)[:paths], variant, asset_url)
|
77
80
|
end
|
78
81
|
|
79
82
|
# Return the compressed contents of a javascript package.
|
80
83
|
def pack_javascripts(package)
|
81
|
-
|
84
|
+
compressor.compress_js(package_for(package, :js)[:paths])
|
82
85
|
end
|
83
86
|
|
84
87
|
# Return the compiled contents of a JST package.
|
85
88
|
def pack_templates(package)
|
86
|
-
|
89
|
+
compressor.compile_jst(package_for(package, :js)[:paths])
|
87
90
|
end
|
88
|
-
|
91
|
+
|
89
92
|
|
90
93
|
private
|
91
94
|
|
@@ -109,7 +112,7 @@ module Jammit
|
|
109
112
|
def path_to_url
|
110
113
|
@path_to_url ||= /\A#{Regexp.escape(ASSET_ROOT)}(\/?#{Regexp.escape(Jammit.public_root.sub(ASSET_ROOT, ''))})?/
|
111
114
|
end
|
112
|
-
|
115
|
+
|
113
116
|
# Get the latest mtime of a list of files (plus the config path).
|
114
117
|
def latest_mtime(paths)
|
115
118
|
paths += [Jammit.config_path]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Wraps sass' css compressor to use the same API as the rest of
|
2
|
+
# Jammit's compressors.
|
3
|
+
class Jammit::SassCompressor
|
4
|
+
# Creates a new sass compressor. Jammit::SassCompressor doesn't use
|
5
|
+
# any options, the +options+ parameter is there for API
|
6
|
+
# compatibility.
|
7
|
+
def initialize(options = {})
|
8
|
+
end
|
9
|
+
|
10
|
+
# Compresses +css+ using sass' CSS parser, and returns the
|
11
|
+
# compressed css.
|
12
|
+
def compress(css)
|
13
|
+
root_node = ::Sass::SCSS::CssParser.new(css, 'jammit-combined-input').parse
|
14
|
+
root_node.options = {:style => :compressed}
|
15
|
+
root_node.render.strip
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jammit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 6
|
10
|
+
version: 0.6.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jeremy Ashkenas
|
@@ -15,24 +15,40 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-03-20 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: cssmin
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 17
|
29
29
|
segments:
|
30
|
+
- 1
|
30
31
|
- 0
|
31
|
-
- 9
|
32
32
|
- 3
|
33
|
-
version: 0.
|
33
|
+
version: 1.0.3
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: jsmin
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 21
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 0
|
48
|
+
- 1
|
49
|
+
version: 1.0.1
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
36
52
|
description: " Jammit is an industrial strength asset packaging library for Rails,\n providing both the CSS and JavaScript concatenation and compression that\n you'd expect, as well as YUI Compressor and Closure Compiler compatibility,\n ahead-of-time gzipping, built-in JavaScript template support, and optional\n Data-URI / MHTML image embedding.\n"
|
37
53
|
email: jeremy@documentcloud.org
|
38
54
|
executables:
|
@@ -45,12 +61,15 @@ files:
|
|
45
61
|
- lib/jammit/command_line.rb
|
46
62
|
- lib/jammit/compressor.rb
|
47
63
|
- lib/jammit/controller.rb
|
64
|
+
- lib/jammit/cssmin_compressor.rb
|
48
65
|
- lib/jammit/dependencies.rb
|
49
66
|
- lib/jammit/helper.rb
|
67
|
+
- lib/jammit/jsmin_compressor.rb
|
50
68
|
- lib/jammit/jst.js
|
51
69
|
- lib/jammit/packager.rb
|
52
70
|
- lib/jammit/railtie.rb
|
53
71
|
- lib/jammit/routes.rb
|
72
|
+
- lib/jammit/sass_compressor.rb
|
54
73
|
- lib/jammit/uglifier.rb
|
55
74
|
- lib/jammit.rb
|
56
75
|
- bin/jammit
|
@@ -93,9 +112,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
112
|
requirements: []
|
94
113
|
|
95
114
|
rubyforge_project: jammit
|
96
|
-
rubygems_version: 1.
|
115
|
+
rubygems_version: 1.8.24
|
97
116
|
signing_key:
|
98
117
|
specification_version: 3
|
99
118
|
summary: Industrial Strength Asset Packaging for Rails
|
100
119
|
test_files: []
|
101
120
|
|
121
|
+
has_rdoc:
|