module ChefZero::CookbookData
Public Class Methods
metadata_from(directory, name, version, recipe_names)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 29 def self.metadata_from(directory, name, version, recipe_names) metadata = PretendCookbookMetadata.new(PretendCookbook.new(name, recipe_names)) # If both .rb and .json exist, read .rb # TODO if recipes has 3 recipes in it, and the Ruby/JSON has only one, should # the resulting recipe list have 1, or 3-4 recipes in it? if has_child(directory, 'metadata.rb') begin file = filename(directory, 'metadata.rb') || "(#{name}/metadata.rb)" metadata.instance_eval(read_file(directory, 'metadata.rb'), file) rescue ChefZero::Log.error("Error loading cookbook #{name}: #{$!}\n #{$!.backtrace.join("\n ")}") end elsif has_child(directory, 'metadata.json') metadata.from_json(read_file(directory, 'metadata.json')) end result = {} metadata.to_hash.each_pair do |key,value| result[key.to_sym] = value end result[:version] = version if version result end
to_hash(cookbook, name, version=nil)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 6 def self.to_hash(cookbook, name, version=nil) frozen = false if cookbook.has_key?(:frozen) frozen = cookbook[:frozen] cookbook = cookbook.dup cookbook.delete(:frozen) end result = files_from(cookbook) recipe_names = result[:recipes].map do |recipe| recipe_name = recipe[:name][0..-2] recipe_name == 'default' ? name : "#{name}::#{recipe_name}" end result[:metadata] = metadata_from(cookbook, name, version, recipe_names) result[:name] = "#{name}-#{result[:metadata][:version]}" result[:json_class] = 'Chef::CookbookVersion' result[:cookbook_name] = name result[:version] = result[:metadata][:version] result[:chef_type] = 'cookbook_version' result[:frozen?] = true if frozen result end
Private Class Methods
filename(directory, name)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 169 def self.filename(directory, name) if directory.respond_to?(:file_path) File.join(directory.file_path, name) else nil end end
files_from(directory)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 135 def self.files_from(directory) # TODO some support .rb only result = { :attributes => load_child_files(directory, 'attributes', false), :definitions => load_child_files(directory, 'definitions', false), :recipes => load_child_files(directory, 'recipes', false), :libraries => load_child_files(directory, 'libraries', false), :templates => load_child_files(directory, 'templates', true), :files => load_child_files(directory, 'files', true), :resources => load_child_files(directory, 'resources', true), :providers => load_child_files(directory, 'providers', true), :root_files => load_files(directory, false) } set_specificity(result[:templates]) set_specificity(result[:files]) result end
get_directory(directory, name)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 177 def self.get_directory(directory, name) if directory.is_a?(Hash) directory[name].is_a?(Hash) ? directory[name] : nil else result = directory.child(name) result.dir? ? result : nil end end
has_child(directory, name)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 153 def self.has_child(directory, name) if directory.is_a?(Hash) directory.has_key?(name) else directory.child(name).exists? end end
list(directory)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 186 def self.list(directory) if directory.is_a?(Hash) directory.keys else directory.children.map { |c| c.name } end end
load_child_files(parent, key, recursive)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 194 def self.load_child_files(parent, key, recursive) result = load_files(get_directory(parent, key), recursive) result.each do |file| file[:path] = "#{key}/#{file[:path]}" end result end
load_file(value, name)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 219 def self.load_file(value, name) [{ :name => name, :path => name, :checksum => Digest::MD5.hexdigest(value), :specificity => 'default' }] end
load_files(directory, recursive)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 202 def self.load_files(directory, recursive) result = [] if directory list(directory).each do |child_name| dir = get_directory(directory, child_name) if dir if recursive result += load_child_files(directory, child_name, recursive) end else result += load_file(read_file(directory, child_name), child_name) end end end result end
read_file(directory, name)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 161 def self.read_file(directory, name) if directory.is_a?(Hash) directory[name] else directory.child(name).read end end
set_specificity(files)
click to toggle source
# File lib/chef_zero/cookbook_data.rb, line 228 def self.set_specificity(files) files.each do |file| parts = file[:path].split('/') raise "Only directories are allowed directly under templates or files: #{file[:path]}" if parts.size == 2 file[:specificity] = parts[1] end end