Class: Chef::CookbookLoader

Inherits:
Object show all
Includes:
Enumerable
Defined in:
lib/chef/cookbook_loader.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*repo_paths) ⇒ CookbookLoader

Returns a new instance of CookbookLoader.

Raises:

  • (ArgumentError)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 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

Instance Attribute Details

#cookbook_pathsObject (readonly)

Returns the value of attribute cookbook_paths.



36
37
38
# File 'lib/chef/cookbook_loader.rb', line 36

def cookbook_paths
  @cookbook_paths
end

#cookbooks_by_nameObject (readonly)

Returns the value of attribute cookbooks_by_name.



34
35
36
# File 'lib/chef/cookbook_loader.rb', line 34

def cookbooks_by_name
  @cookbooks_by_name
end

#merged_cookbooksObject (readonly)

Returns the value of attribute merged_cookbooks.



35
36
37
# File 'lib/chef/cookbook_loader.rb', line 35

def merged_cookbooks
  @merged_cookbooks
end

#metadataObject (readonly)

Returns the value of attribute metadata.



37
38
39
# File 'lib/chef/cookbook_loader.rb', line 37

def 
  @metadata
end

Instance Method Details

#[](cookbook) ⇒ Object Also known as: fetch



102
103
104
105
106
107
108
# 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

#cookbook_namesObject



124
125
126
# File 'lib/chef/cookbook_loader.rb', line 124

def cookbook_names
  @cookbooks_by_name.keys.sort
end

#eachObject



118
119
120
121
122
# 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

#has_key?(cookbook_name) ⇒ Boolean Also known as: cookbook_exists?, key?

Returns:

  • (Boolean)


112
113
114
# File 'lib/chef/cookbook_loader.rb', line 112

def has_key?(cookbook_name)
  not self[cookbook_name.to_sym].nil?
end

#load_cookbook(cookbook_name, repo_paths = nil) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# 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.
  end
  @cookbooks_by_name[cookbook_name]
end

#load_cookbooksObject



66
67
68
69
70
71
72
73
# 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_pathsObject

for deprecation warnings



60
61
62
63
64
# 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

#valuesObject Also known as: cookbooks



128
129
130
# File 'lib/chef/cookbook_loader.rb', line 128

def values
  @cookbooks_by_name.values
end