class ChefCLI::Policyfile::IncludedPoliciesCookbookSource

Attributes

included_policy_location_specs[R]

A list of included policies

ui[RW]

UI object for output

Public Class Methods

new(included_policy_location_specs) { |self| ... } click to toggle source

Constructor

# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 46
def initialize(included_policy_location_specs)
  @included_policy_location_specs = included_policy_location_specs
  @ui = UI.new
  @preferred_cookbooks = []
  yield self if block_given?
end

Public Instance Methods

==(other) click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 71
def ==(other)
  other.is_a?(self.class) && other.included_policy_location_specs == included_policy_location_specs
end
check_for_conflicts!() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 57
def check_for_conflicts!
  source_options
  universe_graph
end
default_source_args() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 53
def default_source_args
  [:included_policies, []]
end
desc() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 94
def desc
  "included_policies()"
end
null?() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 90
def null?
  false
end
preferred_cookbooks() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 67
def preferred_cookbooks
  universe_graph.keys
end
preferred_source_for?(cookbook_name) click to toggle source

All are preferred here

# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 63
def preferred_source_for?(cookbook_name)
  universe_graph.include?(cookbook_name)
end
source_options_for(cookbook_name, cookbook_version) click to toggle source

Returns the metadata (path and version) for an individual cookbook

@return [Hash] metadata for a single cookbook version

# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 86
def source_options_for(cookbook_name, cookbook_version)
  source_options[cookbook_name][cookbook_version]
end
universe_graph() click to toggle source

Calls the slurp_metadata! helper once to calculate the @universe_graph and @cookbook_version_paths metadata. Returns the @universe_graph.

@return [Hash] universe_graph

# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 79
def universe_graph
  @universe_graph ||= build_universe
end

Private Instance Methods

build_source_options() click to toggle source

Collect all the source options

# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 132
def build_source_options
  included_policy_location_specs.inject({}) do |acc, policy_spec|
    lock = policy_spec.policyfile_lock
    lock.cookbook_locks.each do |(name, cookbook_lock)|
      version = cookbook_lock.version
      if acc[name]
        if acc[name][version]
          if acc[name][version] != cookbook_lock.source_options
            raise ConflictingCookbookSources.new("Conflicting sources provided for cookbook #{name}")
          end
        else
          raise ConflictingCookbookVersions.new("Multiple sources provided for cookbook #{name}")
        end
      else
        acc[name] = {}
        acc[name][version] = cookbook_lock.source_options
      end
    end
    acc
  end
end
build_universe() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 100
def build_universe
  included_policy_location_specs.inject({}) do |acc, policy_spec|
    lock = policy_spec.policyfile_lock
    cookbook_dependencies = lock.solution_dependencies.cookbook_dependencies
    cookbook_dependencies.each do |(cookbook, deps)|
      name = cookbook.name
      version = cookbook.version
      mapped_deps = deps.map do |dep|
        [dep[0], dep[1].to_s]
      end
      if acc[name]
        if acc[name][version]
          if acc[name][version] != mapped_deps
            raise ConflictingCookbookDependencies.new("Conflicting dependencies provided for cookbook #{name}")
          end
        else
          raise ConflictingCookbookVersions.new("Multiple versions provided for cookbook #{name}")
        end
      else
        acc[name] = {}
        acc[name][version] = mapped_deps
      end
    end
    acc
  end
end
source_options() click to toggle source
# File lib/chef-cli/policyfile/included_policies_cookbook_source.rb, line 127
def source_options
  @source_options ||= build_source_options
end