module ChefZero::ChefData::CookbookData
Public Class Methods
metadata_from(directory, name, version, recipe_names)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 37 def metadata_from(directory, name, version, recipe_names) metadata = PretendCookbookMetadata.new(PretendCookbook.new(name, recipe_names)) # If both .rb and .json exist, read .json if has_child(directory, "metadata.json") metadata.from_json(read_file(directory, "metadata.json")) elsif 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 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/chef_data/cookbook_data.rb, line 12 def 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[:all_files].select do |file| file[:name].start_with?("recipes/") end.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/chef_data/cookbook_data.rb, line 89 def 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/chef_data/cookbook_data.rb, line 60 def files_from(directory) # TODO some support .rb only result = load_files(directory) set_specificity(result, :templates) set_specificity(result, :files) result = { all_files: result, } result end
get_directory(directory, name)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 97 def 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/chef_data/cookbook_data.rb, line 73 def 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/chef_data/cookbook_data.rb, line 106 def list(directory) if directory.is_a?(Hash) directory.keys else directory.children.map { |c| c.name } end end
load_child_files(parent, key, recursive, part)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 114 def load_child_files(parent, key, recursive, part) result = load_files(get_directory(parent, key), recursive, part) result.each do |file| file[:path] = "#{key}/#{file[:path]}" end result end
load_file(value, name, part = nil)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 140 def load_file(value, name, part = nil) specific_name = part ? "#{part}/#{name}" : name [{ :name => specific_name, :path => name, :checksum => Digest::MD5.hexdigest(value), :specificity => "default", }] end
load_files(directory, recursive = true, part = nil)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 122 def load_files(directory, recursive = true, part = nil) result = [] if directory list(directory).each do |child_name| dir = get_directory(directory, child_name) if dir child_part = child_name if part.nil? if recursive result += load_child_files(directory, child_name, recursive, child_part) end else result += load_file(read_file(directory, child_name), child_name, part) end end end result end
read_file(directory, name)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 81 def read_file(directory, name) if directory.is_a?(Hash) directory[name] else directory.child(name).read end end
set_specificity(files, type)
click to toggle source
# File lib/chef_zero/chef_data/cookbook_data.rb, line 150 def set_specificity(files, type) files.each do |file| next unless file[:name].split("/")[0] == type.to_s parts = file[:path].split("/") file[:specificity] = if parts.size == 2 "default" else parts[1] end end end