mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
a7b90b7cdd
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6293 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
59 lines
No EOL
1.8 KiB
Ruby
59 lines
No EOL
1.8 KiB
Ruby
module Rails
|
|
module Plugin
|
|
class Locator
|
|
include Enumerable
|
|
attr_reader :initializer
|
|
|
|
def initialize(initializer)
|
|
@initializer = initializer
|
|
end
|
|
|
|
def plugins
|
|
located_plugins.select(&:enabled?).sort
|
|
end
|
|
|
|
def each(&block)
|
|
plugins.each(&block)
|
|
end
|
|
|
|
def plugin_names
|
|
plugins.map(&:name)
|
|
end
|
|
|
|
private
|
|
def located_plugins
|
|
raise "The `located_plugins' method must be defined by concrete subclasses of #{self.class}"
|
|
end
|
|
end
|
|
|
|
class FileSystemLocator < Locator
|
|
private
|
|
def located_plugins
|
|
initializer.configuration.plugin_paths.flatten.inject([]) do |plugins, path|
|
|
plugins.concat locate_plugins_under(path)
|
|
plugins
|
|
end.flatten
|
|
end
|
|
|
|
# This starts at the base path looking for directories that pass the plugin_path? test of the Plugin::Loader.
|
|
# Since plugins can be nested arbitrarily deep within an unspecified number of intermediary directories,
|
|
# this method runs recursively until it finds a plugin directory.
|
|
#
|
|
# e.g.
|
|
#
|
|
# locate_plugins_under('vendor/plugins/acts/acts_as_chunky_bacon')
|
|
# => 'acts_as_chunky_bacon'
|
|
def locate_plugins_under(base_path)
|
|
Dir.glob(File.join(base_path, '*')).inject([]) do |plugins, path|
|
|
plugin_loader = initializer.configuration.plugin_loader.new(initializer, path)
|
|
if plugin_loader.plugin_path? && plugin_loader.enabled?
|
|
plugins << plugin_loader
|
|
elsif File.directory?(path)
|
|
plugins.concat locate_plugins_under(path)
|
|
end
|
|
plugins
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |