Skip to content

Commit

Permalink
Merge plugin changes back to 1.2
Browse files Browse the repository at this point in the history
git-svn-id: http://svn-commit.rubyonrails.org/rails/branches/1-2-pre-release@5739 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information
NZKoz committed Dec 18, 2006
1 parent 0ae462a commit cda3d89
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 10 deletions.
2 changes: 2 additions & 0 deletions railties/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*

* Make config.plugins affect the load path and the dependencies system. Allows you to control plugin loading order, and keep disabled plugins off the load path. [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]
Expand Down
29 changes: 22 additions & 7 deletions railties/lib/initializer.rb
Expand Up @@ -48,7 +48,7 @@ def self.run(command = :process, configuration = Configuration.new)
# instance.
def initialize(configuration)
@configuration = configuration
@loaded_plugins = Set.new
@loaded_plugins = []
end

# Sequentially step through all of the available initialization routines,
Expand Down Expand Up @@ -176,9 +176,22 @@ def add_support_load_paths
# * 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 }
raise(LoadError, "Cannot find the plugin '#{name}'!") if path.nil?
load_plugin path
end
end
$LOAD_PATH.uniq!
end

Expand Down Expand Up @@ -345,7 +358,7 @@ def plugin_path?(path)
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.
Expand Down Expand Up @@ -374,6 +387,7 @@ def load_plugin(directory)
if has_lib
application_lib_index = $LOAD_PATH.index(File.join(RAILS_ROOT, "lib")) || 0
$LOAD_PATH.insert(application_lib_index + 1, lib_path)
Dependencies.load_paths << lib_path
end

# Allow plugins to reference the current configuration object
Expand Down Expand Up @@ -470,7 +484,9 @@ class Configuration
# 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
Expand Down Expand Up @@ -592,7 +608,6 @@ def default_load_paths
vendor
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }

paths.concat Dir["#{root_path}/vendor/plugins/*/lib/"]
paths.concat builtin_directories
end

Expand Down Expand Up @@ -642,7 +657,7 @@ def default_whiny_nils
end

def default_plugins
[]
nil
end

def default_plugin_paths
Expand Down
37 changes: 34 additions & 3 deletions railties/test/plugin_test.rb
Expand Up @@ -43,7 +43,7 @@ def test_find_plugins

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
Expand All @@ -66,10 +66,41 @@ def test_load_alternate_plugins
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

def test_raise_error_when_plugin_not_found
@init.configuration.plugins = %w(this_plugin_does_not_exist)
assert_raise(LoadError) { load_plugins(['default', 'alternate']) }
end

protected
def assert_loaded_plugins(plugins, path)
assert_equal Set.new(plugins), load_plugins(path)
def assert_loaded_plugins(plugins, paths)
assert_equal plugins.sort, load_plugins(paths).sort
end

def assert_plugin_load_order(plugins, paths)
assert_equal plugins, load_plugins(paths)
end

def load_plugins(*paths)
Expand Down

0 comments on commit cda3d89

Please sign in to comment.