diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb index 2129e10af823d..28e7ef947d51f 100644 --- a/railties/lib/rails/engine/configuration.rb +++ b/railties/lib/rails/engine/configuration.rb @@ -20,7 +20,7 @@ def paths paths.app.models "app/models", :eager_load => true paths.app.mailers "app/mailers", :eager_load => true paths.app.metals "app/metal", :eager_load => true - paths.app.views "app/views", :eager_load => true + paths.app.views "app/views" paths.lib "lib", :load_path => true paths.lib.tasks "lib/tasks", :glob => "**/*.rake" paths.config "config" diff --git a/railties/lib/rails/paths.rb b/railties/lib/rails/paths.rb index 55874813da9a2..1c9e3086314ff 100644 --- a/railties/lib/rails/paths.rb +++ b/railties/lib/rails/paths.rb @@ -3,6 +3,8 @@ module Rails module Paths module PathParent + attr_reader :children + def method_missing(id, *args) name = id.to_s @@ -37,15 +39,15 @@ def all_paths end def load_once - filter { |path| path.paths if path.load_once? } + filter_by(:load_once?) end def eager_load - filter { |path| path.paths if path.eager_load? } + filter_by(:eager_load?) end def load_paths - filter { |path| path.paths if path.load_path? } + filter_by(:load_path?) end def push(*) @@ -58,8 +60,16 @@ def push(*) protected - def filter(&block) - all_paths.map(&block).compact.flatten.uniq.select { |p| File.exists?(p) } + def filter_by(constraint) + all_paths.map do |path| + if path.send(constraint) + paths = path.paths + paths -= path.children.values.map { |p| p.send(constraint) ? [] : p.paths }.flatten + paths + else + [] + end + end.flatten.uniq.select { |p| File.exists?(p) } end end @@ -129,10 +139,12 @@ def load_path? def paths raise "You need to set a path root" unless @root.path + result = @paths.map do |p| path = File.expand_path(p, @root.path) @glob ? Dir[File.join(path, @glob)] : path end + result.flatten! result.uniq! result diff --git a/railties/test/application/paths_test.rb b/railties/test/application/paths_test.rb index 589e515d05776..5ab558c0263e1 100644 --- a/railties/test/application/paths_test.rb +++ b/railties/test/application/paths_test.rb @@ -71,6 +71,7 @@ def assert_not_in_load_path(*path) assert_in_load_path "lib" assert_in_load_path "vendor" + assert_not_in_load_path "app", "views" assert_not_in_load_path "app", "metal" assert_not_in_load_path "config" assert_not_in_load_path "config", "locales"