Class: Chef::Knife::SubcommandLoader
- Defined in:
- lib/chef/knife/core/subcommand_loader.rb
Constant Summary collapse
- CHEF_FILE_IN_GEM =
/chef-[\d]+\.[\d]+\.[\d]+/
- CURRENT_CHEF_GEM =
/chef-#{Regexp.escape(Chef::VERSION)}/
Instance Attribute Summary collapse
-
#chef_config_dir ⇒ Object
readonly
Returns the value of attribute chef_config_dir.
-
#env ⇒ Object
readonly
Returns the value of attribute env.
Instance Method Summary collapse
- #find_subcommands_via_dirglob ⇒ Object
- #find_subcommands_via_rubygems ⇒ Object
-
#gem_and_builtin_subcommands ⇒ Object
Returns a Hash of paths to knife commands built-in to chef, or installed via gem.
-
#initialize(chef_config_dir, env = ENV) ⇒ SubcommandLoader
constructor
A new instance of SubcommandLoader.
-
#load_commands ⇒ Object
Load all the sub-commands.
-
#site_subcommands ⇒ Object
Returns an Array of paths to knife commands located in chef_config_dir/plugins/knife/ and ~/.chef/plugins/knife/.
- #subcommand_files ⇒ Object
Constructor Details
#initialize(chef_config_dir, env = ENV) ⇒ SubcommandLoader
Returns a new instance of SubcommandLoader.
30 31 32 33 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 30 def initialize(chef_config_dir, env=ENV) @chef_config_dir, @env = chef_config_dir, env @forced_activate = {} end |
Instance Attribute Details
#chef_config_dir ⇒ Object (readonly)
Returns the value of attribute chef_config_dir.
27 28 29 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 27 def chef_config_dir @chef_config_dir end |
#env ⇒ Object (readonly)
Returns the value of attribute env.
28 29 30 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 28 def env @env end |
Instance Method Details
#find_subcommands_via_dirglob ⇒ Object
77 78 79 80 81 82 83 84 85 86 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 77 def find_subcommands_via_dirglob # The "require paths" of the core knife subcommands bundled with chef files = Dir[File.('../../../knife/*.rb', __FILE__)] subcommand_files = {} files.each do |knife_file| rel_path = knife_file[/#{CHEF_ROOT}#{Regexp.escape(File::SEPARATOR)}(.*)\.rb/,1] subcommand_files[rel_path] = knife_file end subcommand_files end |
#find_subcommands_via_rubygems ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 88 def find_subcommands_via_rubygems files = Gem.find_files 'chef/knife/*.rb' files.reject! {|f| from_old_gem?(f) } subcommand_files = {} files.each do |file| rel_path = file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1] subcommand_files[rel_path] = file end subcommand_files.merge(find_subcommands_via_dirglob) end |
#gem_and_builtin_subcommands ⇒ Object
Returns a Hash of paths to knife commands built-in to chef, or installed via gem. If rubygems is not installed, falls back to globbing the knife directory. The Hash is of the form => “/absolute/path” – Note: the “right” way to load the plugins is to require the relative path, i.e.,
require 'chef/knife/command'
but we’re getting frustrated by bugs at every turn, and it’s slow besides. So subcommand loader has been modified to load the plugins by using Kernel.load with the absolute path.
65 66 67 68 69 70 71 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 65 def gem_and_builtin_subcommands # search all gems for chef/knife/*.rb require 'rubygems' find_subcommands_via_rubygems rescue LoadError find_subcommands_via_dirglob end |
#load_commands ⇒ Object
Load all the sub-commands
36 37 38 39 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 36 def load_commands subcommand_files.each { |subcommand| Kernel.load subcommand } true end |
#site_subcommands ⇒ Object
Returns an Array of paths to knife commands located in chef_config_dir/plugins/knife/ and ~/.chef/plugins/knife/
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 43 def site_subcommands user_specific_files = [] if chef_config_dir user_specific_files.concat Dir.glob(File.("plugins/knife/*.rb", chef_config_dir)) end # finally search ~/.chef/plugins/knife/*.rb user_specific_files.concat Dir.glob(File.join(env['HOME'], '.chef', 'plugins', 'knife', '*.rb')) if env['HOME'] user_specific_files end |
#subcommand_files ⇒ Object
73 74 75 |
# File 'lib/chef/knife/core/subcommand_loader.rb', line 73 def subcommand_files @subcommand_files ||= (gem_and_builtin_subcommands.values + site_subcommands).flatten.uniq end |