tension 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 69774653d546060ae567082eed766dec21e960e1
4
- data.tar.gz: b2010ae61c8cac4764b644747df83ec5424f2c4f
3
+ metadata.gz: 76c048b5004ade369c07e87cf54a73b3459f7151
4
+ data.tar.gz: e2494f1c0198761e2464ec130b2107ba05aa1ae4
5
5
  SHA512:
6
- metadata.gz: 54f20566dabb047d69083bad4f754cccffd35daddecfdf5ac6f0b7447d85063e2a65ec60dbb0851dfc1049035ba6b08468c9c913a57b021a3cf38af104d51de0
7
- data.tar.gz: 815605457bed700c1edaa25abba43fc10abd2415d653ede03515557b3cf0d553726315ba784fa3ea6e81f9018b8e8338b7d336da2947b90441eabe71ce016373
6
+ metadata.gz: 599a97dd6849f6a070d7d2cb1ac3a6c7da3e959a4046b9c6558995663fd6afe5a2d6d98138cd2aef8e89ce529ffec28c1ccf8bae42aa35e9da93d9bbd8ad4861
7
+ data.tar.gz: 4902abbd406722db8bd6c680630ce1285bbc6f7613dd20aeba5e12e01f4349c0fab1083394ce8839a2c4b4c0d8e422550b7c37635a702383035ea86b9954effd
@@ -0,0 +1,82 @@
1
+ module Tension
2
+ class AssetGroup
3
+
4
+ class << self
5
+ # Builds a valid routing Path.
6
+ def path_for(key, action = nil)
7
+ if key.match( path_regex )
8
+ return key
9
+
10
+ elsif key.include?("#")
11
+ key, action = key.split("#")
12
+ end
13
+
14
+ unless key.try(:match, controller_regex) && action.try(:match, action_regex)
15
+ raise ArgumentError, "[Tension] Couldn't build valid controller path!"
16
+ end
17
+
18
+ "#{ key }##{ action }"
19
+ end
20
+
21
+ # Matches strings like "blog/comments#show".
22
+ def path_regex
23
+ /([\w\/]+[^#])#(\w+)/
24
+ end
25
+
26
+ # Matches strings like "blog/comments".
27
+ def controller_regex
28
+ /([\w\/]+[^#])/
29
+ end
30
+
31
+ # Matches strings like "show".
32
+ def action_regex
33
+ /(\w+)/
34
+ end
35
+
36
+ def global_asset(type)
37
+ assets[ "application.#{type}" ]
38
+ end
39
+
40
+ def assets
41
+ Rails.application.assets
42
+ end
43
+ end
44
+
45
+
46
+ attr_reader :controller, :action
47
+
48
+ def initialize(key, action = nil)
49
+ @controller, @action = self.class.path_for( key, action ).split("#")
50
+ end
51
+
52
+ def css
53
+ best_asset( Tension::CSS )
54
+ end
55
+
56
+ def js
57
+ best_asset( Tension::JS )
58
+ end
59
+
60
+ def action_asset(type)
61
+ self.class.assets[ "#{controller}/#{action}.#{type}" ]
62
+ end
63
+
64
+ def controller_asset(type)
65
+ self.class.assets[ "#{controller}_common.#{type}" ]
66
+ end
67
+
68
+ private
69
+
70
+ def best_asset(type)
71
+ action_asset(type) || controller_asset(type) || self.class.global_asset(type)
72
+ end
73
+
74
+ def method_missing(method_sym, *args)
75
+ degree, type = method_sym.to_s.split("_")
76
+ asset_method = "#{degree}_asset"
77
+
78
+ respond_to?(asset_method) ? send(asset_method, type) : super
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,18 @@
1
+ require 'active_support/concern'
2
+
3
+ module Tension
4
+ module Controller
5
+ extend ActiveSupport::Concern
6
+
7
+ def action_assets
8
+ controller = request.symbolized_path_parameters[:controller]
9
+ action = request.symbolized_path_parameters[:action]
10
+
11
+ Tension::Environment.find( controller, action )
12
+ end
13
+
14
+ def assets
15
+ Tension::Environment
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,6 @@
1
1
  module Tension
2
2
 
3
- # Tension::Environment exposes `asset_paths`, which describes the assets that
3
+ # Tension::Environment exposes `assets`, which describes the assets that
4
4
  # can be automatically included in templates.
5
5
  #
6
6
  # It's used automatically on application load (see Tension::Railtie) to populate
@@ -11,144 +11,47 @@ module Tension
11
11
 
12
12
  class << self
13
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
- @asset_map = nil if Rails.env.development?
53
-
54
- @asset_map ||= begin
55
- map = Hash.new
56
- globals = Hash.new
57
-
58
- ASSET_TYPES.each do |type|
59
- # Find and store the global asset for this type.
60
- global_asset = valid_asset( "application.#{ type[:extension] }" )
61
- globals.store( type[:extension], global_asset )
62
- end
63
-
64
- # TODO: add support for looking up the tree...
65
- search_paths.each_pair do |controller_path, actions|
66
- 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
- unless map[ controller_path ].has_key?( action )
75
- map.fetch( controller_path ).store( action, Hash.new )
76
- end
77
-
78
- action_asset = valid_asset( "#{ [ controller_path, action ].join("/") }.#{ type[:extension] }" )
79
- map.fetch( controller_path )
80
- .fetch( action )
81
- .store( type[:extension], action_asset || common_asset )
82
- end
83
- end
84
-
85
- end
14
+ def [](key, action = nil)
15
+ fetch( AssetGroup.path_for(key, action) )
16
+ end
17
+ alias_method :find, :[]
86
18
 
87
- map
19
+ def eager_load!
20
+ configured_get_defaults.each do |default|
21
+ find( default[:controller], default[:action] )
88
22
  end
89
23
  end
90
24
 
91
- # All unique, existing asset paths.
92
- def asset_paths
93
- @asset_paths ||= Set.new.merge( extract_paths(asset_map) ).to_a
25
+ def assets
26
+ @assets ||= Hash.new
94
27
  end
95
28
 
96
-
97
29
  private
98
30
 
99
- # Recursively extracts all paths from the `asset_map`.
100
- def extract_paths hash
101
- paths = Array.new
102
-
103
- hash.each_pair do |key, value|
104
- if value.is_a?(Hash)
105
- paths.concat( extract_paths(value) )
106
- else
107
- paths << value.pathname.to_s
108
- end
109
- end
110
-
111
- paths
31
+ def fetch(path)
32
+ assets[path] || store(path)
112
33
  end
113
34
 
114
- # A hash of controller paths mapped to action names. These controller/action
115
- # pairs correspond to configured routes for which assets may be required.
116
- #
117
- # e.g. { "blog" => [ "index", "show" ],
118
- # "admin/blog" => [ "index", "show", "edit" ] }
119
- #
120
- def search_paths
121
- @search_paths ||= configured_route_defaults.reduce( Hash.new ) do |accum, route_default|
122
- accum[ route_default[:controller] ] ||= Array.new
123
- accum[ route_default[:controller] ].push( route_default[:action] )
124
-
125
- accum
126
- end
35
+ def store(path)
36
+ assets[path] = AssetGroup.new( path )
127
37
  end
128
38
 
129
39
  # Routing defaults (including controller path and action name) for all
130
40
  # configured GET routes.
131
41
  #
132
- def configured_route_defaults
133
- @configured_route_defaults ||= begin
42
+ def configured_get_defaults
43
+ @configured_get_defaults ||= begin
134
44
  get_routes = Rails.application.routes.routes.find_all do |route|
135
45
  route.verb.match("GET")
136
46
  end
137
47
 
138
- @configured_route_defaults = get_routes.map do |route|
48
+ @configured_get_defaults = get_routes.map do |route|
139
49
  route.defaults unless route.defaults.empty?
140
50
  end
141
51
 
142
- @configured_route_defaults.compact!
52
+ @configured_get_defaults.compact!
143
53
  end
144
54
  end
145
-
146
- # Returns: a real BundledAsset present in the Sprockets index, or nil
147
- # if no asset was found.
148
- #
149
- def valid_asset asset_path
150
- Rails.application.assets.find_asset( asset_path )
151
- end
152
55
  end
153
56
 
154
57
  end
@@ -0,0 +1,37 @@
1
+ require 'active_support/concern'
2
+
3
+ module Tension
4
+
5
+ # Helper is included in ActionView::Helpers so it can be called from
6
+ # templates and layouts.
7
+ module Helper
8
+ extend ActiveSupport::Concern
9
+
10
+ def best_stylesheet(*args)
11
+ asset_for( Tension::CSS, *args )
12
+ end
13
+
14
+ def best_javascript(*args)
15
+ asset_for( Tension::JS, *args )
16
+ end
17
+
18
+ private
19
+
20
+ def asset_for(type, *args)
21
+ controller = request.params[:controller]
22
+ action = request.params[:action]
23
+
24
+ asset = Tension::Environment.find( controller, action ).send( type )
25
+
26
+ include_method = case type.to_s
27
+ when "js"
28
+ :javascript_include_tag
29
+ when "css"
30
+ :stylesheet_link_tag
31
+ end
32
+
33
+ send( include_method, asset.logical_path, *args )
34
+ end
35
+ end
36
+
37
+ end
@@ -7,12 +7,15 @@ module Tension
7
7
  initializer "tension.add_assets_to_precompile_list" do |app|
8
8
  ActiveSupport.on_load :after_initialize do
9
9
 
10
- Rails.application.reload_routes!
11
- Tension.load_assets! unless Rails.env.development? or Rails.env.test?
10
+ if app.config.cache_classes
11
+ app.reload_routes!
12
+ Tension::Environment.eager_load!
13
+ end
12
14
 
13
- ActionView::Base.send(:include, Tension::TensionHelper)
15
+ ActionView::Base.send(:include, Tension::Helper)
16
+ ActionController::Base.send(:include, Tension::Controller)
14
17
 
15
- Rails.application.config.assets.precompile << lambda do |path, filename|
18
+ app.config.assets.precompile << lambda do |path, filename|
16
19
  Tension::Environment.asset_paths.include?( filename )
17
20
  end
18
21
 
@@ -1,3 +1,3 @@
1
1
  module Tension
2
- VERSION = "0.9.3".freeze
2
+ VERSION = "0.9.5".freeze
3
3
  end
data/lib/tension.rb CHANGED
@@ -1,9 +1,10 @@
1
+ require 'tension/asset_group'
2
+ require 'tension/controller'
3
+ require 'tension/helper'
1
4
  require 'tension/environment'
2
5
  require 'tension/railtie' if defined?(Rails)
3
- require 'tension/tension_helper'
4
6
 
5
7
  module Tension
6
- def self.load_assets!
7
- !!Tension::Environment.asset_map
8
- end
8
+ CSS = "css".freeze
9
+ JS = "js".freeze
9
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tension
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piers Mainwaring
@@ -34,9 +34,11 @@ files:
34
34
  - LICENSE
35
35
  - README.md
36
36
  - lib/tension.rb
37
+ - lib/tension/asset_group.rb
38
+ - lib/tension/controller.rb
37
39
  - lib/tension/environment.rb
40
+ - lib/tension/helper.rb
38
41
  - lib/tension/railtie.rb
39
- - lib/tension/tension_helper.rb
40
42
  - lib/tension/version.rb
41
43
  - tension.gemspec
42
44
  homepage: https://github.com/piersadrian/tension
@@ -1,27 +0,0 @@
1
- require 'active_support/concern'
2
-
3
- module Tension
4
-
5
- # Tagger is included in ActionView::Helpers so it can be called from
6
- # templates and layouts.
7
- module TensionHelper
8
- extend ActiveSupport::Concern
9
-
10
- def asset_for type, *args
11
- controller = request.params[:controller]
12
- action = request.params[:action]
13
-
14
- asset = Tension::Environment.asset_map[ controller ][ action ][ type.to_s ]
15
-
16
- include_method = case type
17
- when :js
18
- :javascript_include_tag
19
- when :css
20
- :stylesheet_link_tag
21
- end
22
-
23
- send( include_method, asset.logical_path, *args ) unless asset.nil?
24
- end
25
- end
26
-
27
- end