mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Make config.plugins affect $LOAD_PATH and remove duplication from $LOAD_PATH [James Adam]
Closes #6581 Closes #6842 git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5720 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
d833645cd8
commit
39686e5370
3 changed files with 51 additions and 10 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Make config.plugins affect $LOAD_PATH, not just which init.rb files get required [James Adam]
|
||||
|
||||
* Don't generate a components directory in new Rails apps. [Jeremy Kemper]
|
||||
|
||||
* Fixed script/process/spawner to work properly with Mongrel including in -r (daemonize mode) [DHH]
|
||||
|
|
|
@ -48,7 +48,7 @@ module Rails
|
|||
# instance.
|
||||
def initialize(configuration)
|
||||
@configuration = configuration
|
||||
@loaded_plugins = Set.new
|
||||
@loaded_plugins = []
|
||||
end
|
||||
|
||||
# Sequentially step through all of the available initialization routines,
|
||||
|
@ -176,9 +176,21 @@ module Rails
|
|||
# * evaluate <tt>init.rb</tt> if present
|
||||
#
|
||||
# After all plugins are loaded, duplicates are removed from the load path.
|
||||
# Plugins are loaded in alphabetical order.
|
||||
# If an array of plugin names is specified in config.plugins, the plugins
|
||||
# will be loaded in that order. Otherwise, plugins are loaded in alphabetical
|
||||
# order.
|
||||
def load_plugins
|
||||
find_plugins(configuration.plugin_paths).sort.each { |path| load_plugin path }
|
||||
if configuration.plugins.nil?
|
||||
# a nil value implies we don't care about plugins; load 'em all in a reliable order
|
||||
find_plugins(configuration.plugin_paths).sort.each { |path| load_plugin path }
|
||||
elsif !configuration.plugins.empty?
|
||||
# we've specified a config.plugins array, so respect that order
|
||||
plugin_paths = find_plugins(configuration.plugin_paths)
|
||||
configuration.plugins.each do |name|
|
||||
path = plugin_paths.find { |p| File.basename(p) == name }
|
||||
load_plugin path
|
||||
end
|
||||
end
|
||||
$LOAD_PATH.uniq!
|
||||
end
|
||||
|
||||
|
@ -345,7 +357,7 @@ module Rails
|
|||
end
|
||||
|
||||
def plugin_enabled?(path)
|
||||
configuration.plugins.empty? || configuration.plugins.include?(File.basename(path))
|
||||
configuration.plugins.nil? || configuration.plugins.include?(File.basename(path))
|
||||
end
|
||||
|
||||
# Load the plugin at <tt>path</tt> unless already loaded.
|
||||
|
@ -364,7 +376,7 @@ module Rails
|
|||
# Catch nonexistent and empty plugins.
|
||||
raise LoadError, "No such plugin: #{directory}" unless plugin_path?(directory)
|
||||
|
||||
lib_path = File.join(directory, 'lib')
|
||||
lib_path = File.join(directory, 'lib', '')
|
||||
init_path = File.join(directory, 'init.rb')
|
||||
has_lib = File.directory?(lib_path)
|
||||
has_init = File.file?(init_path)
|
||||
|
@ -470,7 +482,9 @@ module Rails
|
|||
# any method of +nil+. Set to +false+ for the standard Ruby behavior.
|
||||
attr_accessor :whiny_nils
|
||||
|
||||
# The list of plugins to load. If this is set to <tt>[]</tt>, all plugins will be loaded.
|
||||
# The list of plugins to load. If this is set to <tt>nil</tt>, all plugins will
|
||||
# be loaded. If this is set to <tt>[]</tt>, no plugins will be loaded. Otherwise,
|
||||
# plugins will be loaded in the order specified.
|
||||
attr_accessor :plugins
|
||||
|
||||
# The path to the root of the plugins directory. By default, it is in
|
||||
|
@ -592,7 +606,6 @@ module Rails
|
|||
vendor
|
||||
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
|
||||
|
||||
paths.concat Dir["#{root_path}/vendor/plugins/*/lib/"]
|
||||
paths.concat builtin_directories
|
||||
end
|
||||
|
||||
|
@ -642,7 +655,7 @@ module Rails
|
|||
end
|
||||
|
||||
def default_plugins
|
||||
[]
|
||||
nil
|
||||
end
|
||||
|
||||
def default_plugin_paths
|
||||
|
|
|
@ -43,7 +43,7 @@ class PluginTest < Test::Unit::TestCase
|
|||
|
||||
def test_load_plugin
|
||||
stubby = "#{File.dirname(__FILE__)}/fixtures/plugins/default/stubby"
|
||||
expected = Set.new(['stubby'])
|
||||
expected = ['stubby']
|
||||
|
||||
assert @init.send(:load_plugin, stubby)
|
||||
assert_equal expected, @init.loaded_plugins
|
||||
|
@ -66,10 +66,36 @@ class PluginTest < Test::Unit::TestCase
|
|||
def test_load_plugins_from_two_sources
|
||||
assert_loaded_plugins %w(a stubby acts_as_chunky_bacon), ['default', 'alternate']
|
||||
end
|
||||
|
||||
def test_load_all_plugins_when_config_plugins_is_nil
|
||||
@init.configuration.plugins = nil
|
||||
assert_loaded_plugins %w(a stubby acts_as_chunky_bacon), ['default', 'alternate']
|
||||
end
|
||||
|
||||
def test_load_no_plugins_when_config_plugins_is_empty_array
|
||||
@init.configuration.plugins = []
|
||||
assert_loaded_plugins [], ['default', 'alternate']
|
||||
end
|
||||
|
||||
def test_load_only_selected_plugins
|
||||
plugins = %w(stubby a)
|
||||
@init.configuration.plugins = plugins
|
||||
assert_loaded_plugins plugins, ['default', 'alternate']
|
||||
end
|
||||
|
||||
def test_load_plugins_in_order
|
||||
plugins = %w(stubby acts_as_chunky_bacon a)
|
||||
@init.configuration.plugins = plugins
|
||||
assert_plugin_load_order plugins, ['default', 'alternate']
|
||||
end
|
||||
|
||||
protected
|
||||
def assert_loaded_plugins(plugins, path)
|
||||
assert_equal Set.new(plugins), load_plugins(path)
|
||||
assert_equal plugins.sort, load_plugins(path).sort
|
||||
end
|
||||
|
||||
def assert_plugin_load_order(plugins, path)
|
||||
assert_equal plugins, load_plugins(path)
|
||||
end
|
||||
|
||||
def load_plugins(*paths)
|
||||
|
|
Loading…
Reference in a new issue