From 19987b64af0d543a6292c3fd9b0b877f70eab306 Mon Sep 17 00:00:00 2001
From: Jeremy Kemper <jeremy@bitsweat.net>
Date: Sun, 30 Sep 2012 14:46:06 -0700
Subject: Asset manifest includes aliases for foo.js -> foo/index.js and vice
 versa. Bump Sprockets requirements from 2.1+ to 2.2+ and let it answer
 "should we compile this asset?" for us.

---
 actionpack/CHANGELOG.md                     | 14 +++++++++++++
 actionpack/actionpack.gemspec               |  2 +-
 actionpack/lib/sprockets/static_compiler.rb | 32 +++++++++++------------------
 railties/test/application/assets_test.rb    | 17 ++++++++++++++-
 4 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md
index 69937accf2..fe0c7c40d9 100644
--- a/actionpack/CHANGELOG.md
+++ b/actionpack/CHANGELOG.md
@@ -1,5 +1,19 @@
 ## Rails 3.2.9 (unreleased) ##
 
+*   Precompiled assets include aliases from foo.js to foo/index.js and vice versa.
+
+        # Precompiles phone-<digest>.css and aliases phone/index.css to phone.css.
+        config.assets.precompile = [ 'phone.css' ]
+
+        # Precompiles phone/index-<digest>.css and aliases phone.css to phone/index.css.
+        config.assets.precompile = [ 'phone/index.css' ]
+
+        # Both of these work with either precompile thanks to their aliases.
+        <%= stylesheet_link_tag 'phone', media: 'all' %>
+        <%= stylesheet_link_tag 'phone/index', media: 'all' %>
+
+    *Jeremy Kemper*
+
 *   `assert_template` is no more passing with what ever string that matches
     with the template name.
 
diff --git a/actionpack/actionpack.gemspec b/actionpack/actionpack.gemspec
index 3d67541557..002351696d 100644
--- a/actionpack/actionpack.gemspec
+++ b/actionpack/actionpack.gemspec
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
   s.add_dependency('rack',          '~> 1.4.0')
   s.add_dependency('rack-test',     '~> 0.6.1')
   s.add_dependency('journey',       '~> 1.0.4')
-  s.add_dependency('sprockets',     '~> 2.1')
+  s.add_dependency('sprockets',     '~> 2.2')
   s.add_dependency('erubis',        '~> 2.7.0')
 
   s.add_development_dependency('tzinfo', '~> 0.3.29')
diff --git a/actionpack/lib/sprockets/static_compiler.rb b/actionpack/lib/sprockets/static_compiler.rb
index 2e2db4b760..4341a27d5d 100644
--- a/actionpack/lib/sprockets/static_compiler.rb
+++ b/actionpack/lib/sprockets/static_compiler.rb
@@ -15,13 +15,11 @@ module Sprockets
 
     def compile
       manifest = {}
-      env.each_logical_path do |logical_path|
-        if File.basename(logical_path)[/[^\.]+/, 0] == 'index'
-          logical_path.sub!(/\/index\./, '.')
-        end
-        next unless compile_path?(logical_path)
+      env.each_logical_path(paths) do |logical_path|
         if asset = env.find_asset(logical_path)
-          manifest[logical_path] = write_asset(asset)
+          digest_path = write_asset(asset)
+          manifest[asset.logical_path] = digest_path
+          manifest[aliased_path_for(asset.logical_path)] = digest_path
         end
       end
       write_manifest(manifest) if @manifest
@@ -43,22 +41,16 @@ module Sprockets
       end
     end
 
-    def compile_path?(logical_path)
-      paths.each do |path|
-        case path
-        when Regexp
-          return true if path.match(logical_path)
-        when Proc
-          return true if path.call(logical_path)
-        else
-          return true if File.fnmatch(path.to_s, logical_path)
-        end
-      end
-      false
-    end
-
     def path_for(asset)
       @digest ? asset.digest_path : asset.logical_path
     end
+
+    def aliased_path_for(logical_path)
+      if File.basename(logical_path).start_with?('index')
+        logical_path.sub(/\/index([^\/]+)$/, '\1')
+      else
+        logical_path.sub(/\.([^\/]+)$/, '/index.\1')
+      end
+    end
   end
 end
diff --git a/railties/test/application/assets_test.rb b/railties/test/application/assets_test.rb
index 5a1df5d330..9e9702efb6 100644
--- a/railties/test/application/assets_test.rb
+++ b/railties/test/application/assets_test.rb
@@ -122,8 +122,23 @@ module ApplicationTests
       app_file "app/assets/javascripts/something/index.js.erb", "alert();"
 
       precompile!
-
       assert File.exists?("#{app_path}/public/assets/something.js")
+
+      assets = YAML.load_file("#{app_path}/public/assets/manifest.yml")
+      assert_not_nil assets['something/index.js'], "Expected something/index.js among #{assets.keys.inspect}"
+      assert_not_nil assets['something.js'], "Expected something.js among #{assets.keys.inspect}"
+    end
+
+    test "precompile something/index.js for directory containing index file" do
+      add_to_config "config.assets.precompile = [ 'something/index.js' ]"
+      app_file "app/assets/javascripts/something/index.js.erb", "alert();"
+
+      precompile!
+      assert File.exists?("#{app_path}/public/assets/something/index.js")
+
+      assets = YAML.load_file("#{app_path}/public/assets/manifest.yml")
+      assert_not_nil assets['something/index.js'], "Expected something/index.js among #{assets.keys.inspect}"
+      assert_not_nil assets['something.js'], "Expected something.js among #{assets.keys.inspect}"
     end
 
     test "asset pipeline should use a Sprockets::Index when config.assets.digest is true" do
-- 
cgit v1.2.3