class Chef::Knife::SubcommandLoader::HashedCommandLoader

Load a subcommand from a pre-computed path for the given command.

Constants

KEY

Attributes

manifest[RW]

Public Class Methods

new(chef_config_dir, plugin_manifest) click to toggle source
Calls superclass method Chef::Knife::SubcommandLoader::new
# File lib/chef/knife/core/hashed_command_loader.rb, line 31
def initialize(chef_config_dir, plugin_manifest)
  super(chef_config_dir)
  @manifest = plugin_manifest
end

Public Instance Methods

guess_category(args) click to toggle source
# File lib/chef/knife/core/hashed_command_loader.rb, line 36
def guess_category(args)
  category_words = positional_arguments(args)
  category_words.map! { |w| w.split("-") }.flatten!
  find_longest_key(manifest[KEY]["plugins_by_category"], category_words, " ")
end
list_commands(pref_category = nil) click to toggle source
# File lib/chef/knife/core/hashed_command_loader.rb, line 42
def list_commands(pref_category = nil)
  if pref_category || manifest[KEY]["plugins_by_category"].key?(pref_category)
    commands = { pref_category => manifest[KEY]["plugins_by_category"][pref_category] }
  else
    commands = manifest[KEY]["plugins_by_category"]
  end
  # If any of the specified plugins in the manifest don't have a valid path we will
  # eventually get an error and the user will need to rehash - instead, lets just
  # print out 1 error here telling them to rehash
  errors = {}
  commands.collect { |k, v| v }.flatten.each do |command|
    paths = manifest[KEY]["plugins_paths"][command]
    if paths && paths.is_a?(Array)
      # It is only an error if all the paths don't exist
      if paths.all? { |sc| !File.exist?(sc) }
        errors[command] = paths
      end
    end
  end
  if errors.empty?
    commands
  else
    Chef::Log.error "There are plugin files specified in the knife cache that cannot be found. Please run knife rehash to update the subcommands cache. If you see this error after rehashing delete the cache at #{Chef::Knife::SubcommandLoader.plugin_manifest_path}"
    Chef::Log.error "Missing files:\n\t#{errors.values.flatten.join("\n\t")}"
    {}
  end
end
load_command(args) click to toggle source
# File lib/chef/knife/core/hashed_command_loader.rb, line 74
def load_command(args)
  paths = manifest[KEY]["plugins_paths"][subcommand_for_args(args)]
  if paths.nil? || paths.empty? || (! paths.is_a? Array)
    false
  else
    paths.each do |sc|
      if File.exist?(sc)
        Kernel.load sc
      else
        return false
      end
    end
    true
  end
end
subcommand_files() click to toggle source
# File lib/chef/knife/core/hashed_command_loader.rb, line 70
def subcommand_files
  manifest[KEY]["plugins_paths"].values.flatten
end
subcommand_for_args(args) click to toggle source
# File lib/chef/knife/core/hashed_command_loader.rb, line 90
def subcommand_for_args(args)
  if manifest[KEY]["plugins_paths"].key?(args)
    args
  else
    find_longest_key(manifest[KEY]["plugins_paths"], args, "_")
  end
end