tension 0.3 → 0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +37 -1
- data/lib/tension/environment.rb +167 -0
- data/lib/tension/railtie.rb +10 -5
- data/lib/tension/tension_helper.rb +26 -0
- data/lib/tension.rb +21 -0
- data/tension.gemspec +5 -5
- metadata +18 -37
- data/lib/tension/application.rb +0 -62
- data/lib/tension/tagger.rb +0 -82
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 067f889277f3fb790d4fb64e6b196754f2ca9b92
|
4
|
+
data.tar.gz: ac1afed7e475d2e99cc72c330d224c1611951f13
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2124f18b0a5c85ac50891d6ac74d6fa3f528afbc08dbee97177b66553ef357e8a05c8a1ad5b57f2154cd1eb0585be6ce33529c7da8660ad9c8b742d8bd9393d7
|
7
|
+
data.tar.gz: 107bb478074ab4b6c502217b29a5b21db0a44ebb22cdd422887c9261788db40e5178a6a8ee7111390a65a63bc983a3a5e3282f53a10959ce98ad71155ed69ce0
|
data/README.md
CHANGED
@@ -3,4 +3,40 @@ Tension
|
|
3
3
|
_Tighten up Rails's asset pipeline for CSS & JS._
|
4
4
|
|
5
5
|
Rails's asset pipeline is smart and well–implemented under the hood, but it can
|
6
|
-
be a challenge to organize your CSS and JavaScript so that
|
6
|
+
be a challenge to organize your CSS and JavaScript so that you don't have to
|
7
|
+
struggle to maintain which files get compiled, where they live, and how they're
|
8
|
+
included in views and templates.
|
9
|
+
|
10
|
+
_Tension_ helps you out. It takes Rails's existing controller/view file structure
|
11
|
+
and applies it to JavaScript and CSS assets as well. Let's take a sample Rails app:
|
12
|
+
|
13
|
+
app
|
14
|
+
+ assets
|
15
|
+
+ controllers
|
16
|
+
+ account
|
17
|
+
+ api
|
18
|
+
+ blog
|
19
|
+
+ posts_controller.rb
|
20
|
+
+ models
|
21
|
+
+ views
|
22
|
+
+ account
|
23
|
+
+ api
|
24
|
+
+ blog
|
25
|
+
+ posts
|
26
|
+
+ index.html.erb
|
27
|
+
+ layouts
|
28
|
+
+ blog.html.erb
|
29
|
+
|
30
|
+
The standard structure Rails enforces is __module__ → __controller__ →
|
31
|
+
__action__. For the PostsController, the __action__ logic is tucked away alongside
|
32
|
+
other actions in `posts_controller.rb`, but its view is a separate file namespaced
|
33
|
+
under the _blog_ module and _posts_ controller.
|
34
|
+
|
35
|
+
This is a logical, intuitive structure. Our assets should follow it too.
|
36
|
+
|
37
|
+
Using Rails's asset pipeline you can drop an asset anywhere within the `assets`
|
38
|
+
directory and Rails will compile and serve it, but Rails enforces no logical
|
39
|
+
structure on your files. This leads to messy, hard-to-maintain code, and it gets
|
40
|
+
worse when you precompile assets in production.
|
41
|
+
|
42
|
+
...
|
@@ -0,0 +1,167 @@
|
|
1
|
+
module Tension
|
2
|
+
|
3
|
+
# Tension::Environment exposes `asset_paths`, which describes the assets that
|
4
|
+
# can be automatically included in templates.
|
5
|
+
#
|
6
|
+
# It's used automatically on application load (see Tension::Railtie) to populate
|
7
|
+
# the asset pipeline's list of assets to precompile, and caches the result in-
|
8
|
+
# process for use by Tension::Tagger when templates are rendered.
|
9
|
+
#
|
10
|
+
class Environment
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
GLOBAL_KEY = "::globals".freeze
|
15
|
+
COMMON_SUFFIX = "_common".freeze
|
16
|
+
ASSET_TYPES = [{ container: "javascripts", extension: "js" },
|
17
|
+
{ container: "stylesheets", extension: "css" }].freeze
|
18
|
+
|
19
|
+
# This method collects all asset paths for the asset pipeline to
|
20
|
+
# precompile. It determines which additional assets to include in the
|
21
|
+
# pipeline's precompilation process, so they can be automatically added
|
22
|
+
# to templates later (see Tension::Tagger).
|
23
|
+
#
|
24
|
+
# If an application's routes include `resources :people`, `asset_map`
|
25
|
+
# will attempt to locate the following assets:
|
26
|
+
#
|
27
|
+
# + people_common.{js,css}
|
28
|
+
# + people/index.{js,css}
|
29
|
+
# + people/show.{js,css}
|
30
|
+
# + people/new.{js,css}
|
31
|
+
# + people/edit.{js,css}
|
32
|
+
#
|
33
|
+
# Note that Tension ignores Sprockets' interpretation of `index.{js,css}`
|
34
|
+
# as a shared file, and therefore requires the `_common` suffix for
|
35
|
+
# controller-wide assets.
|
36
|
+
#
|
37
|
+
# Returns: an Hash of controller paths, each containing that controller's
|
38
|
+
# routed GET actions mapped to each action's best matching asset. E.g.
|
39
|
+
#
|
40
|
+
# { "people" => {
|
41
|
+
# "index" => {
|
42
|
+
# "js" => "javascripts/people/index.js",
|
43
|
+
# "css" => "javascripts/people_common.css"
|
44
|
+
# },
|
45
|
+
# "show" => {
|
46
|
+
# "js" => "javascripts/application.js",
|
47
|
+
# "css" => "javascripts/people_common.css"
|
48
|
+
# }
|
49
|
+
# }
|
50
|
+
#
|
51
|
+
def asset_map
|
52
|
+
if @asset_map.nil?
|
53
|
+
@asset_map = Hash.new
|
54
|
+
globals = Hash.new
|
55
|
+
|
56
|
+
ASSET_TYPES.each do |type|
|
57
|
+
# Find and store the global asset for this type.
|
58
|
+
global_asset = valid_asset( "application.#{ type[:extension] }" )
|
59
|
+
globals.store( type[:extension], global_asset )
|
60
|
+
end
|
61
|
+
|
62
|
+
# TODO: add support for looking up the tree...
|
63
|
+
search_paths.each_pair do |controller_path, actions|
|
64
|
+
next unless local_controller?( controller_path )
|
65
|
+
|
66
|
+
@asset_map.store( controller_path, Hash.new )
|
67
|
+
|
68
|
+
ASSET_TYPES.each do |type|
|
69
|
+
# Attempt to locate a common asset for this controller.
|
70
|
+
common_path = "#{ controller_path }#{ COMMON_SUFFIX }.#{ type[:extension] }"
|
71
|
+
common_asset = valid_asset( common_path ) || globals.fetch( type[:extension] )
|
72
|
+
|
73
|
+
actions.each do |action|
|
74
|
+
if @asset_map[ controller_path ][ action ].nil?
|
75
|
+
@asset_map.fetch( controller_path )
|
76
|
+
.store( action, Hash.new )
|
77
|
+
end
|
78
|
+
|
79
|
+
action_asset = valid_asset( "#{ [ controller_path, action ].join("/") }.#{ type[:extension] }" )
|
80
|
+
@asset_map.fetch( controller_path )
|
81
|
+
.fetch( action )
|
82
|
+
.store( type[:extension], action_asset || common_asset )
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
@asset_map
|
90
|
+
end
|
91
|
+
|
92
|
+
# All unique, existing asset paths.
|
93
|
+
def asset_paths
|
94
|
+
@asset_paths ||= Set.new.merge( extract_paths(asset_map) ).to_a
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
# Recursively extracts all paths from the `asset_map`.
|
101
|
+
def extract_paths hash
|
102
|
+
paths = Array.new
|
103
|
+
|
104
|
+
hash.each_pair do |key, value|
|
105
|
+
if value.is_a?(Hash)
|
106
|
+
paths.concat( extract_paths(value) )
|
107
|
+
else
|
108
|
+
paths << value.pathname.to_s
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
paths
|
113
|
+
end
|
114
|
+
|
115
|
+
# A hash of controller paths mapped to action names. These controller/action
|
116
|
+
# pairs correspond to configured routes for which assets may be required.
|
117
|
+
#
|
118
|
+
# e.g. { "blog" => [ "index", "show" ],
|
119
|
+
# "admin/blog" => [ "index", "show", "edit" ] }
|
120
|
+
#
|
121
|
+
def search_paths
|
122
|
+
@search_paths ||= configured_route_defaults.reduce( Hash.new ) do |accum, route_default|
|
123
|
+
accum[ route_default[:controller] ] ||= Array.new
|
124
|
+
accum[ route_default[:controller] ].push( route_default[:action] )
|
125
|
+
|
126
|
+
accum
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Routing defaults (including controller path and action name) for all
|
131
|
+
# configured GET routes.
|
132
|
+
#
|
133
|
+
def configured_route_defaults
|
134
|
+
if @configured_route_defaults.nil?
|
135
|
+
get_routes = Rails.application.routes.routes.find_all do |route|
|
136
|
+
route.verb.match("GET")
|
137
|
+
end
|
138
|
+
|
139
|
+
@configured_route_defaults = get_routes.map do |route|
|
140
|
+
route.defaults unless route.defaults.empty?
|
141
|
+
end
|
142
|
+
|
143
|
+
@configured_route_defaults.compact!
|
144
|
+
end
|
145
|
+
|
146
|
+
@configured_route_defaults
|
147
|
+
end
|
148
|
+
|
149
|
+
# Returns: a real BundledAsset present in the Sprockets index, or nil
|
150
|
+
# if no asset was found.
|
151
|
+
#
|
152
|
+
def valid_asset asset_path
|
153
|
+
Rails.application.assets.find_asset( asset_path )
|
154
|
+
end
|
155
|
+
|
156
|
+
# Returns: true if the controller targeted in the routes is present in this
|
157
|
+
# app's local code rather than in a gem. Gems are responsible for ensuring
|
158
|
+
# availability of their own assets.
|
159
|
+
#
|
160
|
+
def local_controller? controller_path
|
161
|
+
File.exists?("#{ Rails.root }/app/controllers/#{ controller_path }_controller.rb")
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
end
|
data/lib/tension/railtie.rb
CHANGED
@@ -4,14 +4,19 @@ module Tension
|
|
4
4
|
require "rails"
|
5
5
|
|
6
6
|
class Railtie < Rails::Railtie
|
7
|
+
initializer "tension.add_assets_to_precompile_list" do |app|
|
8
|
+
ActiveSupport.on_load :after_initialize do
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
Rails.application.reload_routes!
|
11
|
+
Tension.load_assets!
|
12
|
+
|
13
|
+
ApplicationHelper.send(:include, Tension::TensionHelper)
|
14
|
+
|
15
|
+
Rails.application.config.assets.precompile << lambda do |path, filename|
|
16
|
+
Tension::Environment.asset_paths.include?( filename )
|
12
17
|
end
|
18
|
+
|
13
19
|
end
|
14
20
|
end
|
15
|
-
|
16
21
|
end
|
17
22
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Tension
|
2
|
+
|
3
|
+
# Tagger is included in ActionView::Helpers so it can be called from
|
4
|
+
# templates and layouts.
|
5
|
+
module TensionHelper
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Just call
|
9
|
+
def asset_for type, request = request
|
10
|
+
asset = Tension::Environment.asset_map
|
11
|
+
.fetch( request.params[:controller] )
|
12
|
+
.fetch( request.params[:action] )
|
13
|
+
.fetch( type.to_s )
|
14
|
+
|
15
|
+
include_method = case type
|
16
|
+
when :js
|
17
|
+
:javascript_include_tag
|
18
|
+
when :css
|
19
|
+
:stylesheet_link_tag
|
20
|
+
end
|
21
|
+
|
22
|
+
send( include_method, asset.logical_path )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/tension.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'active_support/ordered_options'
|
2
|
+
|
3
|
+
require 'tension/environment'
|
4
|
+
require 'tension/railtie' if defined?(Rails)
|
5
|
+
require 'tension/tension_helper'
|
6
|
+
|
7
|
+
module Tension
|
8
|
+
def self.load_assets!
|
9
|
+
!!Tension::Environment.asset_map
|
10
|
+
end
|
11
|
+
|
12
|
+
# def self.config
|
13
|
+
# @config ||= begin
|
14
|
+
# config = ActiveSupport::OrderedOptions.new
|
15
|
+
|
16
|
+
# config.enabled = !Rails.env.development? && !Rails.env.test?
|
17
|
+
|
18
|
+
# config
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
end
|
data/tension.gemspec
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "tension"
|
3
3
|
|
4
|
-
s.version = "0.
|
5
|
-
s.date = "2013-
|
4
|
+
s.version = "0.9"
|
5
|
+
s.date = "2013-03-21"
|
6
|
+
s.license = "MIT"
|
6
7
|
|
7
8
|
s.summary = "Tighten up Rails's asset pipeline for CSS & JS."
|
8
|
-
s.description = "Tension brings some sanity to CSS & JS organization for modern front–end development."
|
9
|
+
s.description = "Tension brings some sanity to Rails's CSS & JS organization for modern front–end development."
|
9
10
|
|
10
11
|
s.authors = [ "Piers Mainwaring" ]
|
11
12
|
s.email = "piers@impossibly.org"
|
@@ -13,6 +14,5 @@ Gem::Specification.new do |s|
|
|
13
14
|
s.homepage = "https://github.com/piersadrian/tension"
|
14
15
|
s.require_paths = [ "lib" ]
|
15
16
|
|
16
|
-
s.add_dependency "
|
17
|
-
s.add_dependency "activesupport", "~> 3.2.0"
|
17
|
+
s.add_dependency "rails", ">= 3.2"
|
18
18
|
end
|
metadata
CHANGED
@@ -1,50 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.9'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Piers Mainwaring
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
prerelease: false
|
14
|
+
name: rails
|
17
15
|
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 3.2
|
22
|
-
none: false
|
19
|
+
version: '3.2'
|
23
20
|
type: :runtime
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
requirements:
|
26
|
-
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
version: 3.2.0
|
29
|
-
none: false
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: activesupport
|
32
21
|
prerelease: false
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 3.2.0
|
38
|
-
none: false
|
39
|
-
type: :runtime
|
40
22
|
version_requirements: !ruby/object:Gem::Requirement
|
41
23
|
requirements:
|
42
|
-
- -
|
24
|
+
- - '>='
|
43
25
|
- !ruby/object:Gem::Version
|
44
|
-
version: 3.2
|
45
|
-
|
46
|
-
|
47
|
-
development.
|
26
|
+
version: '3.2'
|
27
|
+
description: Tension brings some sanity to Rails's CSS & JS organization for modern
|
28
|
+
front–end development.
|
48
29
|
email: piers@impossibly.org
|
49
30
|
executables: []
|
50
31
|
extensions: []
|
@@ -53,32 +34,32 @@ files:
|
|
53
34
|
- LICENSE
|
54
35
|
- README.md
|
55
36
|
- lib/tension.rb
|
56
|
-
- lib/tension/
|
37
|
+
- lib/tension/environment.rb
|
57
38
|
- lib/tension/railtie.rb
|
58
|
-
- lib/tension/
|
39
|
+
- lib/tension/tension_helper.rb
|
59
40
|
- tension.gemspec
|
60
41
|
homepage: https://github.com/piersadrian/tension
|
61
|
-
licenses:
|
42
|
+
licenses:
|
43
|
+
- MIT
|
44
|
+
metadata: {}
|
62
45
|
post_install_message:
|
63
46
|
rdoc_options: []
|
64
47
|
require_paths:
|
65
48
|
- lib
|
66
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
67
50
|
requirements:
|
68
|
-
- -
|
51
|
+
- - '>='
|
69
52
|
- !ruby/object:Gem::Version
|
70
53
|
version: '0'
|
71
|
-
none: false
|
72
54
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
55
|
requirements:
|
74
|
-
- -
|
56
|
+
- - '>='
|
75
57
|
- !ruby/object:Gem::Version
|
76
58
|
version: '0'
|
77
|
-
none: false
|
78
59
|
requirements: []
|
79
60
|
rubyforge_project:
|
80
|
-
rubygems_version:
|
61
|
+
rubygems_version: 2.0.2
|
81
62
|
signing_key:
|
82
|
-
specification_version:
|
63
|
+
specification_version: 4
|
83
64
|
summary: Tighten up Rails's asset pipeline for CSS & JS.
|
84
65
|
test_files: []
|
data/lib/tension/application.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
module Tension
|
2
|
-
class Application
|
3
|
-
|
4
|
-
class << self
|
5
|
-
|
6
|
-
# This method collects all asset paths for the asset pipeline to
|
7
|
-
# precompile. It's called from `config/application.rb` when determining
|
8
|
-
# which additional assets to include in the pipeline's precompilation
|
9
|
-
# process. Tension will assume that any subdirectories in your assets
|
10
|
-
# directory are module scopes. You can also explicitly set module scopes:
|
11
|
-
#
|
12
|
-
# Rails.application.config.tension_modules = %W( blog account )
|
13
|
-
#
|
14
|
-
# Tension::Application will then search for all javascripts and stylesheets
|
15
|
-
# one filesystem level deep in those scopes. The search paths become:
|
16
|
-
#
|
17
|
-
# app/assets/{javascripts,stylesheets}/*.{js,css}
|
18
|
-
# app/assets/{javascripts,stylesheets}/{blog,account}/**/*.{js,css}
|
19
|
-
#
|
20
|
-
# Any assets in these paths will be added to the pipeline and compiled.
|
21
|
-
|
22
|
-
def collect_assets
|
23
|
-
assets = %W(stylesheets javascripts).map do |type|
|
24
|
-
glob_within_asset_path( type ) + module_scopes.map do |scope|
|
25
|
-
glob_within_asset_path( type, scope )
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
assets.flatten
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def module_scopes
|
36
|
-
# find dirs in app/assets
|
37
|
-
end
|
38
|
-
|
39
|
-
# Loads the file paths within a given subdirectory of "app/assets/".
|
40
|
-
def glob_within_asset_path type, *path_parts
|
41
|
-
# Only recursively find children if a particular subdirectory of an
|
42
|
-
# asset `type` is given. That way we can specify WHICH subdirectories
|
43
|
-
# of a `type` have assets that matter.
|
44
|
-
path_parts << "**" if path_parts.present?
|
45
|
-
|
46
|
-
root_path = File.join(Rails.root, "app", "assets", type)
|
47
|
-
pattern = File.expand_path( File.join(*path_parts, "*.*"), root_path )
|
48
|
-
|
49
|
-
paths = Dir.glob( pattern ).map do |file_path|
|
50
|
-
# Remove extra, pre-compilation file extensions and any part of the
|
51
|
-
# filepath at or above the asset `type`.
|
52
|
-
file_path.gsub( file_path.match(/(\.css|\.js)(.*)/)[2], '' )
|
53
|
-
.gsub( root_path + "/", '' ) rescue nil
|
54
|
-
end
|
55
|
-
|
56
|
-
paths.compact
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
data/lib/tension/tagger.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
module Pipeline
|
2
|
-
class Builder
|
3
|
-
|
4
|
-
GLOBAL_ASSET_NAME = "application".freeze
|
5
|
-
SHARED_SUFFIX = "_common".freeze
|
6
|
-
ASSET_SPECIFICITY_ORDER = [ :action, :controller, :module ].freeze
|
7
|
-
|
8
|
-
# Determines which JS/CSS files should be included based on the current
|
9
|
-
# controller, action, and which files actually exist. If the current
|
10
|
-
# controller is "OrcaHealth::PagesController" and action is "products",
|
11
|
-
# this method (called with `type = :js`) will attempt to include
|
12
|
-
#
|
13
|
-
# + orca_health/pages/products.js
|
14
|
-
# + orca_health/pages_common.js
|
15
|
-
# + orca_health.js
|
16
|
-
#
|
17
|
-
# in that order. ONLY THE FIRST ASSET LOCATED WILL BE INCLUDED. Hence,
|
18
|
-
# you should always use Sprockets directives to include dependencies.
|
19
|
-
#
|
20
|
-
# Any files that don't exist will not be included in the page. Pass
|
21
|
-
# `{ except: :application }` to exclude `application.{js,css}`.
|
22
|
-
|
23
|
-
def self.asset_paths type, controller_path, action_name, options = {}
|
24
|
-
options[:except] = [ options[:except] ] unless options[:except].is_a? Array
|
25
|
-
|
26
|
-
# Check if the best asset's already been loaded and stored.
|
27
|
-
asset = known_asset_paths[ controller_path ].try(:fetch, action_name, nil).try(:fetch, type, nil)
|
28
|
-
|
29
|
-
if asset.nil?
|
30
|
-
path_components = controller_path.split("/")
|
31
|
-
controller_name = path_components.pop
|
32
|
-
module_path = path_components.join("/")
|
33
|
-
|
34
|
-
possible_paths = {
|
35
|
-
module: module_path,
|
36
|
-
controller: [ module_path, controller_name + SHARED_SUFFIX ].join("/"),
|
37
|
-
action: [ module_path, controller_name, action_name ].join("/")
|
38
|
-
}
|
39
|
-
|
40
|
-
# Find and store the best possible asset for this controller/action combo.
|
41
|
-
asset = most_specific_asset_path( type, possible_paths )
|
42
|
-
|
43
|
-
known_asset_paths[ controller_path ] ||= Hash.new
|
44
|
-
known_asset_paths[ controller_path ][ action_name ] ||= Hash.new
|
45
|
-
known_asset_paths[ controller_path ][ action_name ][ type ] = asset
|
46
|
-
end
|
47
|
-
|
48
|
-
assets = if options[:except].include? :application
|
49
|
-
[ asset ]
|
50
|
-
else
|
51
|
-
[ GLOBAL_ASSET_NAME, asset ]
|
52
|
-
end
|
53
|
-
|
54
|
-
assets.compact
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def self.known_asset_paths
|
61
|
-
@known_asset_paths ||= Hash.new
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.most_specific_asset_path filetype, paths
|
65
|
-
ASSET_SPECIFICITY_ORDER.each do |name|
|
66
|
-
path = paths[name]
|
67
|
-
|
68
|
-
# Using the Sprockets `#index` helps performance in production.
|
69
|
-
asset = if Rails.env.production?
|
70
|
-
Rails.application.assets.index.find_asset([ path, filetype ].join("."))
|
71
|
-
else
|
72
|
-
Rails.application.assets.find_asset([ path, filetype ].join("."))
|
73
|
-
end
|
74
|
-
|
75
|
-
# This loop is relatively expensive, so return the asset path as soon
|
76
|
-
# as possible rather than continue looping.
|
77
|
-
break path if asset.present?
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|