class Chef::CookbookLoader

Attributes

cookbook_paths[R]
cookbooks_by_name[R]
merged_cookbooks[R]
metadata[R]

Public Class Methods

new(*repo_paths) click to toggle source
# File lib/chef/cookbook_loader.rb, line 41
def initialize(*repo_paths)
  repo_paths = repo_paths.flatten
  raise ArgumentError, "You must specify at least one cookbook repo path" if repo_paths.empty?
  @cookbooks_by_name = Mash.new
  @loaded_cookbooks = {}
  @metadata = Mash.new
  @cookbooks_paths = Hash.new {|h,k| h[k] = []} # for deprecation warnings
  @chefignores = {}
  @repo_paths = repo_paths.map do |repo_path|
    repo_path = File.expand_path(repo_path)
  end

  # Used to track which cookbooks appear in multiple places in the cookbook repos
  # and are merged in to a single cookbook by file shadowing. This behavior is
  # deprecated, so users of this class may issue warnings to the user by checking
  # this variable
  @merged_cookbooks = []
end

Public Instance Methods

[](cookbook) click to toggle source
# File lib/chef/cookbook_loader.rb, line 102
def [](cookbook)
  if @cookbooks_by_name.has_key?(cookbook.to_sym) or load_cookbook(cookbook.to_sym)
    @cookbooks_by_name[cookbook.to_sym]
  else
    raise Exceptions::CookbookNotFoundInRepo, "Cannot find a cookbook named #{cookbook.to_s}; did you forget to add metadata to a cookbook? (http://wiki.opscode.com/display/chef/Metadata)"
  end
end
Also aliased as: fetch
cookbook_exists?(cookbook_name)
Alias for: has_key?
cookbook_names() click to toggle source
# File lib/chef/cookbook_loader.rb, line 124
def cookbook_names
  @cookbooks_by_name.keys.sort
end
cookbooks()
Alias for: values
each() { |cname, cookbooks_by_name| ... } click to toggle source
# File lib/chef/cookbook_loader.rb, line 118
def each
  @cookbooks_by_name.keys.sort { |a,b| a.to_s <=> b.to_s }.each do |cname|
    yield(cname, @cookbooks_by_name[cname])
  end
end
fetch(cookbook)
Alias for: []
has_key?(cookbook_name) click to toggle source
# File lib/chef/cookbook_loader.rb, line 112
def has_key?(cookbook_name)
  not self[cookbook_name.to_sym].nil?
end
Also aliased as: cookbook_exists?, key?
key?(cookbook_name)
Alias for: has_key?
load_cookbook(cookbook_name, repo_paths=nil) click to toggle source
# File lib/chef/cookbook_loader.rb, line 75
def load_cookbook(cookbook_name, repo_paths=nil)
  repo_paths ||= @repo_paths
  repo_paths.each do |repo_path|
    @chefignores[repo_path] ||= Cookbook::Chefignore.new(repo_path)
    cookbook_path = File.join(repo_path, cookbook_name.to_s)
    next unless File.directory?(cookbook_path) and Dir[File.join(repo_path, "*")].include?(cookbook_path)
    loader = Cookbook::CookbookVersionLoader.new(cookbook_path, @chefignores[repo_path])
    loader.load_cookbooks
    next if loader.empty?
    cookbook_name = loader.cookbook_name
    @cookbooks_paths[cookbook_name] << cookbook_path # for deprecation warnings
    if @loaded_cookbooks.key?(cookbook_name)
      @merged_cookbooks << cookbook_name # for deprecation warnings
      @loaded_cookbooks[cookbook_name].merge!(loader)
    else
      @loaded_cookbooks[cookbook_name] = loader
    end
  end

  if @loaded_cookbooks.has_key?(cookbook_name)
    cookbook_version = @loaded_cookbooks[cookbook_name].cookbook_version
    @cookbooks_by_name[cookbook_name] = cookbook_version
    @metadata[cookbook_name] = cookbook_version.metadata
  end
  @cookbooks_by_name[cookbook_name]
end
load_cookbooks() click to toggle source
# File lib/chef/cookbook_loader.rb, line 66
def load_cookbooks
  @repo_paths.each do |repo_path|
    Dir[File.join(repo_path, "*")].each do |cookbook_path|
      load_cookbook(File.basename(cookbook_path), [repo_path])
    end
  end
  @cookbooks_by_name
end
merged_cookbook_paths() click to toggle source
# File lib/chef/cookbook_loader.rb, line 60
def merged_cookbook_paths # for deprecation warnings
  merged_cookbook_paths = {}
  @merged_cookbooks.each {|c| merged_cookbook_paths[c] = @cookbooks_paths[c]}
  merged_cookbook_paths
end
values() click to toggle source
# File lib/chef/cookbook_loader.rb, line 128
def values
  @cookbooks_by_name.values
end
Also aliased as: cookbooks