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


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


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

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


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

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


120
121
122
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 120

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


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

def empty?
  cookbook_settings.inject(true) do |all_empty, files|
    all_empty && files.last.empty?
  end
end

#load_as(category, *path_glob) ⇒ Object


139
140
141
142
143
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 139

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


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

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


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

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


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

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


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

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