Module: Jammit

Defined in:
lib/jammit.rb,
lib/jammit/routes.rb,
lib/jammit/helper.rb,
lib/jammit/railtie.rb,
lib/jammit/packager.rb,
lib/jammit/controller.rb,
lib/jammit/compressor.rb,
lib/jammit/command_line.rb

Overview

Jammit is the central namespace for all Jammit classes, and provides access to all of the configuration options.

Defined Under Namespace

Modules: Helper, Routes Classes: CommandLine, Compressor, ConfigurationNotFound, Controller, DeprecationError, OutputNotWritable, PackageNotFound, Packager, Railtie

Constant Summary

VERSION =
"0.5.0"
ROOT =
File.expand_path(File.dirname(__FILE__) + '/..')
ASSET_ROOT =
File.expand_path((defined?(Rails) && Rails.root.to_s.length > 0) ? Rails.root : ".") unless defined?(ASSET_ROOT)
PUBLIC_ROOT =
(defined?(Rails) && Rails.public_path.to_s.length > 0) ? Rails.public_path : File.join(ASSET_ROOT, 'public') unless defined?(PUBLIC_ROOT)
DEFAULT_CONFIG_PATH =
File.join(ASSET_ROOT, 'config', 'assets.yml')
DEFAULT_PACKAGE_PATH =
"assets"
DEFAULT_JST_SCRIPT =
File.join(ROOT, 'lib/jammit/jst.js')
DEFAULT_JST_COMPILER =
"template"
DEFAULT_JST_NAMESPACE =
"window.JST"
AVAILABLE_COMPRESSORS =
[:yui, :closure]
DEFAULT_COMPRESSOR =
:yui
JS_EXTENSION =

Extension matchers for JavaScript and JST, which need to be disambiguated.

/\.js\Z/
DEFAULT_JST_EXTENSION =
"jst"

Class Attribute Summary (collapse)

Class Method Summary (collapse)

Class Attribute Details

+ (Object) compress_assets (readonly)

Returns the value of attribute compress_assets



49
50
51
# File 'lib/jammit.rb', line 49

def compress_assets
  @compress_assets
end

+ (Object) compressor_options (readonly)

Returns the value of attribute compressor_options



49
50
51
# File 'lib/jammit.rb', line 49

def compressor_options
  @compressor_options
end

+ (Object) config_path (readonly)

Returns the value of attribute config_path



49
50
51
# File 'lib/jammit.rb', line 49

def config_path
  @config_path
end

+ (Object) configuration (readonly)

Returns the value of attribute configuration



49
50
51
# File 'lib/jammit.rb', line 49

def configuration
  @configuration
end

+ (Object) css_compressor_options (readonly)

Returns the value of attribute css_compressor_options



49
50
51
# File 'lib/jammit.rb', line 49

def css_compressor_options
  @css_compressor_options
end

+ (Object) embed_assets (readonly)

Returns the value of attribute embed_assets



49
50
51
# File 'lib/jammit.rb', line 49

def embed_assets
  @embed_assets
end

+ (Object) gzip_assets (readonly)

Returns the value of attribute gzip_assets



49
50
51
# File 'lib/jammit.rb', line 49

def gzip_assets
  @gzip_assets
end

+ (Object) include_jst_script (readonly)

Returns the value of attribute include_jst_script



49
50
51
# File 'lib/jammit.rb', line 49

def include_jst_script
  @include_jst_script
end

+ (Object) javascript_compressor (readonly)

Returns the value of attribute javascript_compressor



49
50
51
# File 'lib/jammit.rb', line 49

def javascript_compressor
  @javascript_compressor
end

+ (Object) mhtml_enabled (readonly)

Returns the value of attribute mhtml_enabled



49
50
51
# File 'lib/jammit.rb', line 49

def mhtml_enabled
  @mhtml_enabled
end

+ (Object) package_assets (readonly)

Returns the value of attribute package_assets



49
50
51
# File 'lib/jammit.rb', line 49

def package_assets
  @package_assets
end

+ (Object) package_path (readonly)

Returns the value of attribute package_path



49
50
51
# File 'lib/jammit.rb', line 49

def package_path
  @package_path
end

+ (Object) template_extension (readonly)

Returns the value of attribute template_extension



49
50
51
# File 'lib/jammit.rb', line 49

def template_extension
  @template_extension
end

+ (Object) template_extension_matcher (readonly)

Returns the value of attribute template_extension_matcher



49
50
51
# File 'lib/jammit.rb', line 49

def template_extension_matcher
  @template_extension_matcher
end

+ (Object) template_function (readonly)

Returns the value of attribute template_function



49
50
51
# File 'lib/jammit.rb', line 49

def template_function
  @template_function
end

+ (Object) template_namespace (readonly)

Returns the value of attribute template_namespace



49
50
51
# File 'lib/jammit.rb', line 49

def template_namespace
  @template_namespace
end

Class Method Details

+ (Object) asset_url(package, extension, suffix = nil, mtime = nil)

Generates the server-absolute URL to an asset package.



106
107
108
109
# File 'lib/jammit.rb', line 106

def self.asset_url(package, extension, suffix=nil, mtime=nil)
  timestamp = mtime ? "?#{mtime.to_i}" : ''
  "/#{package_path}/#{filename(package, extension, suffix)}#{timestamp}"
end

+ (Object) check_for_deprecations (private)

Jammit 0.5+ no longer supports separate template packages.

Raises:



165
166
167
# File 'lib/jammit.rb', line 165

def self.check_for_deprecations
  raise DeprecationError, "Jammit 0.5+ no longer supports separate packages for templates.\nPlease fold your templates into the appropriate 'javascripts' package instead." if @configuration[:templates]
end

+ (Object) check_java_version (private)

The YUI Compressor requires Java > 1.4, and Closure requires Java > 1.6.



146
147
148
149
150
151
152
153
154
155
# File 'lib/jammit.rb', line 146

def self.check_java_version
  return true if @checked_java_version
  java = @compressor_options[:java] || 'java'
  @css_compressor_options[:java] ||= java if @compressor_options[:java]
  version = (`#{java} -version 2>&1`)[/\d+\.\d+/]
  disable_compression if !version ||
    (@javascript_compressor == :closure && version < '1.6') ||
    (@javascript_compressor == :yui && version < '1.4')
  @checked_java_version = true
end

+ (Object) disable_compression (private)

If we don’t have a working Java VM, then disable asset compression and complain loudly.



159
160
161
162
# File 'lib/jammit.rb', line 159

def self.disable_compression
  @compress_assets = false
  warn("Asset compression disabled -- Java unavailable.")
end

+ (Object) filename(package, extension, suffix = nil)

Generate the base filename for a version of a given package.



100
101
102
103
# File 'lib/jammit.rb', line 100

def self.filename(package, extension, suffix=nil)
  suffix_part  = suffix ? "-#{suffix}" : ''
  "#{package}#{suffix_part}.#{extension}"
end

+ (Object) load_configuration(config_path)

Load the complete asset configuration from the specified config_path.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/jammit.rb', line 61

def self.load_configuration(config_path)
  exists = config_path && File.exists?(config_path)
  raise ConfigurationNotFound, "could not find the \"#{config_path}\" configuration file" unless exists
  conf = YAML.load(ERB.new(File.read(config_path)).result)
  @config_path            = config_path
  @configuration          = symbolize_keys(conf)
  @package_path           = conf[:package_path] || DEFAULT_PACKAGE_PATH
  @embed_assets           = conf[:embed_assets] || conf[:embed_images]
  @compress_assets        = !(conf[:compress_assets] == false)
  @gzip_assets            = !(conf[:gzip_assets] == false)
  @mhtml_enabled          = @embed_assets && @embed_assets != "datauri"
  @compressor_options     = symbolize_keys(conf[:compressor_options] || {})
  @css_compressor_options = symbolize_keys(conf[:css_compressor_options] || {})
  set_javascript_compressor(conf[:javascript_compressor])
  set_package_assets(conf[:package_assets])
  set_template_function(conf[:template_function])
  set_template_namespace(conf[:template_namespace])
  set_template_extension(conf[:template_extension])
  symbolize_keys(conf[:stylesheets]) if conf[:stylesheets]
  symbolize_keys(conf[:javascripts]) if conf[:javascripts]
  check_java_version
  check_for_deprecations
  self
end

+ (Object) packager

Keep a global (thread-local) reference to a Jammit::Packager, to avoid recomputing asset lists unnecessarily.



95
96
97
# File 'lib/jammit.rb', line 95

def self.packager
  Thread.current[:jammit_packager] ||= Packager.new
end

+ (Object) reload!

Force a reload by resetting the Packager and reloading the configuration. In development, this will be called as a before_filter before every request.



88
89
90
91
# File 'lib/jammit.rb', line 88

def self.reload!
  Thread.current[:jammit_packager] = nil
  load_configuration(@config_path)
end

+ (Object) set_javascript_compressor(value) (private)

Ensure that the JavaScript compressor is a valid choice.



115
116
117
118
# File 'lib/jammit.rb', line 115

def self.set_javascript_compressor(value)
  value = value && value.to_sym
  @javascript_compressor = AVAILABLE_COMPRESSORS.include?(value) ? value : DEFAULT_COMPRESSOR
end

+ (Object) set_package_assets(value) (private)

Turn asset packaging on or off, depending on configuration and environment.



121
122
123
124
125
# File 'lib/jammit.rb', line 121

def self.set_package_assets(value)
  package_env     = !defined?(Rails) || !Rails.env.development?
  @package_assets = value == true || value.nil? ? package_env :
                    value == 'always'           ? true : false
end

+ (Object) set_template_extension(value) (private)

Set the extension for JS templates.



140
141
142
143
# File 'lib/jammit.rb', line 140

def self.set_template_extension(value)
  @template_extension = (value == true || value.nil? ? DEFAULT_JST_EXTENSION : value.to_s).gsub(/\A\.?(.*)\Z/, '\1')
  @template_extension_matcher = /\.#{Regexp.escape(@template_extension)}\Z/
end

+ (Object) set_template_function(value) (private)

Assign the JST template function, unless explicitly turned off.



128
129
130
131
132
# File 'lib/jammit.rb', line 128

def self.set_template_function(value)
  @template_function = value == true || value.nil? ? DEFAULT_JST_COMPILER :
                       value == false              ? '' : value
  @include_jst_script = @template_function == DEFAULT_JST_COMPILER
end

+ (Object) set_template_namespace(value) (private)

Set the root JS object in which to stash all compiled JST.



135
136
137
# File 'lib/jammit.rb', line 135

def self.set_template_namespace(value)
  @template_namespace = value == true || value.nil? ? DEFAULT_JST_NAMESPACE : value.to_s
end

+ (Object) symbolize_keys(hash) (private)

Clone of active_support’s symbolize_keys, so that we don’t have to depend on active_support in any fashion. Converts a hash’s keys to all symbols.



178
179
180
181
182
183
# File 'lib/jammit.rb', line 178

def self.symbolize_keys(hash)
  hash.keys.each do |key|
    hash[(key.to_sym rescue key) || key] = hash.delete(key)
  end
  hash
end

+ (Object) warn(message) (private)



169
170
171
172
173
174
# File 'lib/jammit.rb', line 169

def self.warn(message)
  message = "Jammit Warning: #{message}"
  @logger ||= (defined?(Rails) && Rails.logger ? Rails.logger :
               defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : nil)
  @logger ? @logger.warn(message) : STDERR.puts(message)
end