Class: Chef::Cookbook::CookbookVersionLoader
- 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
-
#cookbook_name ⇒ Object
readonly
Returns the value of attribute cookbook_name.
-
#cookbook_settings ⇒ Object
readonly
Returns the value of attribute cookbook_settings.
-
#metadata_filenames ⇒ Object
readonly
Returns the value of attribute metadata_filenames.
Instance Method Summary collapse
- #apply_json_metadata(file) ⇒ Object
- #apply_ruby_metadata(file) ⇒ Object
- #chefignore ⇒ Object
- #cookbook_version ⇒ Object
- #empty? ⇒ Boolean
-
#initialize(path, chefignore = nil) ⇒ CookbookVersionLoader
constructor
A new instance of CookbookVersionLoader.
- #load_as(category, *path_glob) ⇒ Object
- #load_cookbooks ⇒ Object
- #load_recursively_as(category, category_dir, glob) ⇒ Object
- #load_root_files ⇒ Object
- #merge!(other_cookbook_loader) ⇒ Object
-
#metadata(cookbook_version) ⇒ Object
Generates the Cookbook::Metadata object.
- #remove_ignored_files ⇒ Object
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.( 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_name ⇒ Object (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_settings ⇒ Object (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_filenames ⇒ Object (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 |
#chefignore ⇒ Object
120 121 122 |
# File 'lib/chef/cookbook/cookbook_version_loader.rb', line 120 def chefignore @chefignore ||= Chefignore.new(File.basename(@cookbook_path)) end |
#cookbook_version ⇒ Object
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_cookbooks ⇒ Object
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_files ⇒ Object
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_files ⇒ Object
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 |