Class: Sprockets::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/sprockets/context.rb

Overview

They are typically accessed by ERB templates. You can mix in custom helpers by injecting them into ‘Environment#context_class`. Do not mix them into `Context` directly.

environment.context_class.class_eval do
  include MyHelper
  def asset_url; end
end

<%= asset_url "foo.png" %>

The ‘Context` also collects dependencies declared by assets. See `DirectiveProcessor` for an example of this.

Defined Under Namespace

Classes: ENVProxy

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input) ⇒ Context

Returns a new instance of Context.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/sprockets/context.rb', line 42

def initialize(input)
  @environment  = input[:environment]
  @metadata     = input[:metadata]
  @load_path    = input[:load_path]
  @logical_path = input[:name]
  @filename     = input[:filename]
  @dirname      = File.dirname(@filename)
  @content_type = input[:content_type]

  @required     = Set.new(@metadata[:required])
  @stubbed      = Set.new(@metadata[:stubbed])
  @links        = Set.new(@metadata[:links])
  @dependencies = Set.new(input[:metadata][:dependencies])
end

Instance Attribute Details

#content_typeObject (readonly)

Returns content type of file

'application/javascript'
'text/css'


88
89
90
# File 'lib/sprockets/context.rb', line 88

def content_type
  @content_type
end

#environmentObject (readonly)

Returns the value of attribute environment.



40
41
42
# File 'lib/sprockets/context.rb', line 40

def environment
  @environment
end

#filenameObject (readonly)

Returns the value of attribute filename.



40
41
42
# File 'lib/sprockets/context.rb', line 40

def filename
  @filename
end

#load_pathObject (readonly) Also known as: root_path

Returns the environment path that contains the file.

If ‘app/javascripts` and `app/stylesheets` are in your path, and current file is `app/javascripts/foo/bar.js`, `load_path` would return `app/javascripts`.



73
74
75
# File 'lib/sprockets/context.rb', line 73

def load_path
  @load_path
end

#logical_pathObject (readonly)

Returns logical path without any file extensions.

'app/javascripts/application.js'
# => 'application'


81
82
83
# File 'lib/sprockets/context.rb', line 81

def logical_path
  @logical_path
end

Instance Method Details

#asset_data_uri(path) ⇒ Object

Returns a ‘data:` URI with the contents of the asset at the specified path, and marks that path as a dependency of the current file.

Uses URI encoding for SVG files, base64 encoding for all the other files.

Use ‘asset_data_uri` from ERB with CSS or JavaScript assets:

#logo { background: url(<%= asset_data_uri 'logo.png' %>) }

$('<img>').attr('src', '<%= asset_data_uri 'avatar.jpg' %>')


201
202
203
204
205
206
207
208
# File 'lib/sprockets/context.rb', line 201

def asset_data_uri(path)
  asset = depend_on_asset(path)
  if asset.content_type == 'image/svg+xml'
    svg_asset_data_uri(asset)
  else
    base64_asset_data_uri(asset)
  end
end

#asset_path(path, options = {}) ⇒ Object

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 basic implementation may be provided with different methods that are required to be overridden.



216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/sprockets/context.rb', line 216

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

#audio_path(path) ⇒ Object

Expand logical audio asset path.



241
242
243
# File 'lib/sprockets/context.rb', line 241

def audio_path(path)
  asset_path(path, type: :audio)
end

#depend_on(path) ⇒ Object

‘depend_on` allows you to state a dependency on a file without including it.

This is used for caching purposes. Any changes made to the dependency file will invalidate the cache of the source file.



128
129
130
131
132
133
134
135
# File 'lib/sprockets/context.rb', line 128

def depend_on(path)
  if environment.absolute_path?(path) && environment.stat(path)
    @dependencies << environment.build_file_digest_uri(path)
  else
    resolve(path)
  end
  nil
end

#depend_on_asset(path) ⇒ Object

‘depend_on_asset` allows you to state an asset dependency without including it.

This is used for caching purposes. Any changes that would invalidate the dependency asset will invalidate the source file. Unlike ‘depend_on`, this will recursively include the target asset’s dependencies.



144
145
146
# File 'lib/sprockets/context.rb', line 144

def depend_on_asset(path)
  load(resolve(path))
end

#depend_on_env(key) ⇒ Object

‘depend_on_env` allows you to state a dependency on an environment variable.

This is used for caching purposes. Any changes in the value of the environment variable will invalidate the cache of the source file.



153
154
155
# File 'lib/sprockets/context.rb', line 153

def depend_on_env(key)
  @dependencies << "env:#{key}"
end

#env_proxyObject



64
65
66
# File 'lib/sprockets/context.rb', line 64

def env_proxy
  ENVProxy.new(self)
end

#font_path(path) ⇒ Object

Expand logical font asset path.



246
247
248
# File 'lib/sprockets/context.rb', line 246

def font_path(path)
  asset_path(path, type: :font)
end

#image_path(path) ⇒ Object

Expand logical image asset path.



231
232
233
# File 'lib/sprockets/context.rb', line 231

def image_path(path)
  asset_path(path, type: :image)
end

#javascript_path(path) ⇒ Object

Expand logical javascript asset path.



251
252
253
# File 'lib/sprockets/context.rb', line 251

def javascript_path(path)
  asset_path(path, type: :javascript)
end

‘link_asset` declares an external dependency on an asset without directly including it. The target asset is returned from this function making it easy to construct a link to it.

Returns an Asset or nil.



184
185
186
187
188
# File 'lib/sprockets/context.rb', line 184

def link_asset(path)
  asset = depend_on_asset(path)
  @links << asset.uri
  asset
end

#load(uri) ⇒ Object

Public: Load Asset by AssetURI and track it as a dependency.

uri - AssetURI

Returns Asset.



116
117
118
119
120
# File 'lib/sprockets/context.rb', line 116

def load(uri)
  asset = environment.load(uri)
  @dependencies.merge(asset.[:dependencies])
  asset
end

#metadataObject



57
58
59
60
61
62
# File 'lib/sprockets/context.rb', line 57

def 
  { required: @required,
    stubbed: @stubbed,
    links: @links,
    dependencies: @dependencies }
end

#require_asset(path) ⇒ Object

‘require_asset` declares `path` as a dependency of the file. The dependency will be inserted before the file and will only be included once.

If ERB processing is enabled, you can use it to dynamically require assets.

<%= require_asset "#{framework}.js" %>


166
167
168
169
# File 'lib/sprockets/context.rb', line 166

def require_asset(path)
  @required << resolve(path, accept: @content_type, pipeline: :self)
  nil
end

#resolve(path, **kargs) ⇒ Object

Public: Given a logical path, ‘resolve` will find and return an Asset URI. Relative paths will also be resolved. An accept type maybe given to restrict the search.

resolve("foo.js")
# => "file:///path/to/app/javascripts/foo.js?type=application/javascript"

resolve("./bar.js")
# => "file:///path/to/app/javascripts/bar.js?type=application/javascript"

path - String logical or absolute path accept - String content accept type

Returns an Asset URI String.



104
105
106
107
108
109
# File 'lib/sprockets/context.rb', line 104

def resolve(path, **kargs)
  kargs[:base_path] = @dirname
  uri, deps = environment.resolve!(path, **kargs)
  @dependencies.merge(deps)
  uri
end

#stub_asset(path) ⇒ Object

‘stub_asset` blacklists `path` from being included in the bundle. `path` must be an asset which may or may not already be included in the bundle.



174
175
176
177
# File 'lib/sprockets/context.rb', line 174

def stub_asset(path)
  @stubbed << resolve(path, accept: @content_type, pipeline: :self)
  nil
end

#stylesheet_path(path) ⇒ Object

Expand logical stylesheet asset path.



256
257
258
# File 'lib/sprockets/context.rb', line 256

def stylesheet_path(path)
  asset_path(path, type: :stylesheet)
end

#video_path(path) ⇒ Object

Expand logical video asset path.



236
237
238
# File 'lib/sprockets/context.rb', line 236

def video_path(path)
  asset_path(path, type: :video)
end