Class: Chef::Cookbook::CookbookVersionLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/cookbook/cookbook_version_loader.rb

Constant Summary collapse

FILETYPES_SUBJECT_TO_IGNORE =
[ :attribute_filenames,
:definition_filenames,
:recipe_filenames,
:template_filenames,
:file_filenames,
:library_filenames,
:resource_filenames,
:provider_filenames]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, chefignore = nil) ⇒ CookbookVersionLoader

Returns a new instance of CookbookVersionLoader.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 25

def initialize(path, chefignore=nil)
  @cookbook_path = File.expand_path( path )
  @cookbook_name = File.basename( path )
  @chefignore = chefignore
  @metadata = Hash.new
  @relative_path = /#{Regexp.escape(@cookbook_path)}\/(.+)$/
  @cookbook_settings = {
    :attribute_filenames  => {},
    :definition_filenames => {},
    :recipe_filenames     => {},
    :template_filenames   => {},
    :file_filenames       => {},
    :library_filenames    => {},
    :resource_filenames   => {},
    :provider_filenames   => {},
    :root_filenames       => {}
  }

  @metadata_filenames = []
end

Instance Attribute Details

#cookbook_nameObject (readonly)

Returns the value of attribute cookbook_name.



21
22
23
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 21

def cookbook_name
  @cookbook_name
end

#cookbook_settingsObject (readonly)

Returns the value of attribute cookbook_settings.



22
23
24
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 22

def cookbook_settings
  @cookbook_settings
end

#metadata_filenamesObject (readonly)

Returns the value of attribute metadata_filenames.



23
24
25
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 23

def 
  @metadata_filenames
end

Instance Method Details

#apply_json_metadata(file) ⇒ Object



160
161
162
163
164
165
166
167
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 160

def (file)
  begin
    @metadata.from_json(IO.read(file))
  rescue JSON::ParserError
    Chef::Log.error("Couldn't parse cookbook metadata JSON for #@cookbook_name in " + file)
    raise
  end
end

#apply_ruby_metadata(file) ⇒ Object



151
152
153
154
155
156
157
158
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 151

def (file)
  begin
    @metadata.from_file(file)
  rescue JSON::ParserError
    Chef::Log.error("Error evaluating metadata.rb for #@cookbook_name in " + file)
    raise
  end
end

#chefignoreObject



118
119
120
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 118

def chefignore
  @chefignore ||= Chefignore.new(File.basename(@cookbook_path))
end

#cookbook_versionObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 71

def cookbook_version
  return nil if empty?

  Chef::CookbookVersion.new(@cookbook_name.to_sym).tap do |c|
    c.root_dir             = @cookbook_path
    c.attribute_filenames  = cookbook_settings[:attribute_filenames].values
    c.definition_filenames = cookbook_settings[:definition_filenames].values
    c.recipe_filenames     = cookbook_settings[:recipe_filenames].values
    c.template_filenames   = cookbook_settings[:template_filenames].values
    c.file_filenames       = cookbook_settings[:file_filenames].values
    c.library_filenames    = cookbook_settings[:library_filenames].values
    c.resource_filenames   = cookbook_settings[:resource_filenames].values
    c.provider_filenames   = cookbook_settings[:provider_filenames].values
    c.root_filenames       = cookbook_settings[:root_filenames].values
    c.   = @metadata_filenames
    c.             = (c)
  end
end

#empty?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 106

def empty?
  @cookbook_settings.values.all? { |files_hash| files_hash.empty? }
end

#load_as(category, *path_glob) ⇒ Object



137
138
139
140
141
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 137

def load_as(category, *path_glob)
  Dir[File.join(@cookbook_path, *path_glob)].each do |file|
    @cookbook_settings[category][file[@relative_path, 1]] = file
  end
end

#load_cookbooksObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 46

def load_cookbooks
  load_as(:attribute_filenames, 'attributes', '*.rb')
  load_as(:definition_filenames, 'definitions', '*.rb')
  load_as(:recipe_filenames, 'recipes', '*.rb')
  load_as(:library_filenames, 'libraries', '*.rb')
  load_recursively_as(:template_filenames, "templates", "*")
  load_recursively_as(:file_filenames, "files", "*")
  load_recursively_as(:resource_filenames, "resources", "*.rb")
  load_recursively_as(:provider_filenames, "providers", "*.rb")
  load_root_files

  remove_ignored_files

  if File.exists?(File.join(@cookbook_path, "metadata.rb"))
    @metadata_filenames << File.join(@cookbook_path, "metadata.rb")
  elsif File.exists?(File.join(@cookbook_path, "metadata.json"))
    @metadata_filenames << File.join(@cookbook_path, "metadata.json")
  end

  if empty?
    Chef::Log.warn "found a directory #{cookbook_name} in the cookbook path, but it contains no cookbook files. skipping."
  end
  @cookbook_settings
end

#load_recursively_as(category, category_dir, glob) ⇒ Object



129
130
131
132
133
134
135
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 129

def load_recursively_as(category, category_dir, glob)
  file_spec = File.join(@cookbook_path, category_dir, '**', glob)
  Dir.glob(file_spec, File::FNM_DOTMATCH).each do |file|
    next if File.directory?(file)
    @cookbook_settings[category][file[@relative_path, 1]] = file
  end
end

#load_root_filesObject



122
123
124
125
126
127
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 122

def load_root_files
  Dir.glob(File.join(@cookbook_path, '*'), File::FNM_DOTMATCH).each do |file|
    next if File.directory?(file)
    @cookbook_settings[:root_filenames][file[@relative_path, 1]] = file
  end
end

#merge!(other_cookbook_loader) ⇒ Object



110
111
112
113
114
115
116
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 110

def merge!(other_cookbook_loader)
  other_cookbook_settings = other_cookbook_loader.cookbook_settings
  @cookbook_settings.each do |file_type, file_list|
    file_list.merge!(other_cookbook_settings[file_type])
  end
  @metadata_filenames.concat(other_cookbook_loader.)
end

#metadata(cookbook_version) ⇒ Object

Generates the Cookbook::Metadata object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 91

def (cookbook_version)
  @metadata = Chef::Cookbook::Metadata.new(cookbook_version)
  @metadata_filenames.each do ||
    case 
    when /\.rb$/
      ()
    when /\.json$/
      ()
    else
      raise RuntimeError, "Invalid metadata file: #{} for cookbook: #{cookbook_version}"
    end
  end
  @metadata
end

#remove_ignored_filesObject



143
144
145
146
147
148
149
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 143

def remove_ignored_files
  @cookbook_settings.each_value do |file_list|
    file_list.reject! do |relative_path, full_path|
      chefignore.ignored?(relative_path)
    end
  end
end