Skip to content
Browse files

Tidy up framework initialization code to ensure that it doesn't add f…

…olders to the load path that it doesn't intend to require.

Work around mongrel swallowing LoadErrors to ensure that users get more helpful errors if active_resource is required but not missing.  [mislav] Closes #9743


git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7738 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent b196870 commit 41bfedeac273d83585d3cdb2f181ae1978d31adb @NZKoz NZKoz committed Oct 4, 2007
Showing with 64 additions and 10 deletions.
  1. +11 −10 railties/lib/initializer.rb
  2. +53 −0 railties/test/initializer_test.rb
View
21 railties/lib/initializer.rb
@@ -152,6 +152,9 @@ def set_autoload_paths
# ActionPack, ActionMailer, and ActiveResource) are loaded.
def require_frameworks
configuration.frameworks.each { |framework| require(framework.to_s) }
+ rescue LoadError => e
+ # re-raise because Mongrel would swallow it
+ raise e.to_s
end
# Add the load paths used by support functions such as the info controller
@@ -545,16 +548,14 @@ def builtin_directories
end
def framework_paths
- # TODO: Don't include dirs for frameworks that are not used
- %w(
- railties
- railties/lib
- actionpack/lib
- activesupport/lib
- activerecord/lib
- activeresource/lib
- actionmailer/lib
- ).map { |dir| "#{framework_root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
+ paths = %w(railties railties/lib activesupport/lib)
+ paths << 'actionpack/lib' if frameworks.include? :action_controller or frameworks.include? :action_view
+
+ [:active_record, :action_mailer, :active_resource, :action_web_service].each do |framework|
+ paths << "#{framework.to_s.gsub('_', '')}/lib" if frameworks.include? framework
+ end
+
+ paths.map { |dir| "#{framework_root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
end
private
View
53 railties/test/initializer_test.rb
@@ -82,3 +82,56 @@ def test_should_have_called_the_second_after_initialize_block
end
end
+
+uses_mocha 'framework paths' do
+ class ConfigurationFrameworkPathsTests < Test::Unit::TestCase
+ def setup
+ @config = Rails::Configuration.new
+ @config.frameworks.clear
+
+ File.stubs(:directory?).returns(true)
+ @config.stubs(:framework_root_path).returns('')
+ end
+
+ def test_minimal
+ expected = %w(
+ /railties
+ /railties/lib
+ /activesupport/lib
+ )
+ assert_equal expected, @config.framework_paths
+ end
+
+ def test_actioncontroller_or_actionview_add_actionpack
+ @config.frameworks << :action_controller
+ assert_framework_path '/actionpack/lib'
+
+ @config.frameworks = [:action_view]
+ assert_framework_path '/actionpack/lib'
+ end
+
+ def test_paths_for_ar_ares_and_mailer
+ [:active_record, :action_mailer, :active_resource, :action_web_service].each do |framework|
+ @config.frameworks = [framework]
+ assert_framework_path "/#{framework.to_s.gsub('_', '')}/lib"
+ end
+ end
+
+ def test_unknown_framework_raises_error
+ @config.frameworks << :action_foo
+ initializer = Rails::Initializer.new @config
+ initializer.expects(:require).raises(LoadError)
+
+ assert_raise RuntimeError do
+ initializer.send :require_frameworks
+ end
+ end
+
+ protected
+
+ def assert_framework_path(path)
+ assert @config.framework_paths.include?(path),
+ "<#{path.inspect}> not found among <#{@config.framework_paths.inspect}>"
+ end
+ end
+end

0 comments on commit 41bfede

Please sign in to comment.
Something went wrong with that request. Please try again.