class Bundler::Plugin::Index
Attributes
Public Class Methods
# File bundler/plugin/index.rb, line 25 def initialize @plugin_paths = {} @commands = {} @sources = {} @hooks = {} @load_paths = {} begin load_index(global_index_file, true) rescue GenericSystemCallError # no need to fail when on a read-only FS, for example nil end load_index(local_index_file) if SharedHelpers.in_bundle? end
Public Instance Methods
Fetch the name of plugin handling the command
# File bundler/plugin/index.rb, line 110 def command_plugin(command) @commands[command] end
Path where the global index file is stored
# File bundler/plugin/index.rb, line 92 def global_index_file Plugin.global_root.join("index") end
Returns the list of plugin names handling the passed event
# File bundler/plugin/index.rb, line 135 def hook_plugins(event) @hooks[event] || [] end
Path of default index file
# File bundler/plugin/index.rb, line 87 def index_file Plugin.root.join("index") end
# File bundler/plugin/index.rb, line 114 def installed?(name) @plugin_paths[name] end
# File bundler/plugin/index.rb, line 118 def installed_plugins @plugin_paths.keys end
# File bundler/plugin/index.rb, line 105 def load_paths(name) @load_paths[name] end
Path where the local index file is stored
# File bundler/plugin/index.rb, line 97 def local_index_file Plugin.local_root.join("index") end
# File bundler/plugin/index.rb, line 122 def plugin_commands(plugin) @commands.find_all {|_, n| n == plugin }.map(&:first) end
# File bundler/plugin/index.rb, line 101 def plugin_path(name) Pathname.new @plugin_paths[name] end
This function is to be called when a new plugin is installed. This function shall add the functions of the plugin to existing maps and also the name to source location.
@param [String] name of the plugin to be registered @param [String] path where the plugin is installed @param [Array<String>] load_paths
for the plugin @param [Array<String>] commands that are handled by the plugin @param [Array<String>] sources that are handled by the plugin
# File bundler/plugin/index.rb, line 50 def register_plugin(name, path, load_paths, commands, sources, hooks) old_commands = @commands.dup common = commands & @commands.keys raise CommandConflict.new(name, common) unless common.empty? commands.each {|c| @commands[c] = name } common = sources & @sources.keys raise SourceConflict.new(name, common) unless common.empty? sources.each {|k| @sources[k] = name } hooks.each do |event| event_hooks = (@hooks[event] ||= []) << name event_hooks.uniq! end @plugin_paths[name] = path @load_paths[name] = load_paths save_index rescue StandardError @commands = old_commands raise end
# File bundler/plugin/index.rb, line 126 def source?(source) @sources.key? source end
# File bundler/plugin/index.rb, line 130 def source_plugin(name) @sources[name] end
# File bundler/plugin/index.rb, line 74 def unregister_plugin(name) @commands.delete_if {|_, v| v == name } @sources.delete_if {|_, v| v == name } @hooks.each do |hook, names| names.delete(name) @hooks.delete(hook) if names.empty? end @plugin_paths.delete(name) @load_paths.delete(name) save_index end
Private Instance Methods
Reads the index file from the directory and initializes the instance variables.
It skips the sources if the second param is true @param [Pathname] index file path @param [Boolean] is the index file global index
# File bundler/plugin/index.rb, line 147 def load_index(index_file, global = false) SharedHelpers.filesystem_access(index_file, :read) do |index_f| valid_file = index_f&.exist? && !index_f.size.zero? break unless valid_file data = index_f.read require_relative "../yaml_serializer" index = YAMLSerializer.load(data) @commands.merge!(index["commands"]) @hooks.merge!(index["hooks"]) @load_paths.merge!(index["load_paths"]) @plugin_paths.merge!(index["plugin_paths"]) @sources.merge!(index["sources"]) unless global end end
Should be called when any of the instance variables change. Stores the instance variables in YAML format. (The instance variables are supposed to be only String key value pairs)
# File bundler/plugin/index.rb, line 168 def save_index index = { "commands" => @commands, "hooks" => @hooks, "load_paths" => @load_paths, "plugin_paths" => @plugin_paths, "sources" => @sources, } require_relative "../yaml_serializer" SharedHelpers.filesystem_access(index_file) do |index_f| FileUtils.mkdir_p(index_f.dirname) File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) } end end