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.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.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(&: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