class KuberKit::Core::Dependencies::AbstractDependencyResolver

Constants

CircularDependencyError
DependencyNotFoundError

Public Instance Methods

dependency_batch_size() click to toggle source
# File lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb, line 72
def dependency_batch_size
  raise "This method should be overriden"
end
each_with_deps(item_names, &block) click to toggle source
# File lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb, line 8
def each_with_deps(item_names, &block)
  resolved_dependencies = []
  # Get first list of dependencies ready to resolve
  next_dependencies = get_next(item_names, limit: dependency_batch_size)

  # Call the block for each list of dependencies ready to resolve, then calculate the next list
  while (next_dependencies - resolved_dependencies).any?
    block.call(next_dependencies)
    resolved_dependencies += next_dependencies
    next_dependencies = get_next(item_names, resolved: resolved_dependencies, limit: dependency_batch_size)
  end

  (item_names - resolved_dependencies).each_slice(dependency_batch_size) do |group|
    block.call(group)
  end
end
get_all(item_names) click to toggle source
# File lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb, line 48
def get_all(item_names)
  deps = Array(item_names).map { |i| get_recursive_deps(i) }.flatten
  (deps + item_names).uniq
end
get_deps(item_name) click to toggle source
# File lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb, line 68
def get_deps(item_name)
  raise "This method should be overriden"
end
get_next(item_names, resolved: [], limit: nil) click to toggle source
# File lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb, line 32
def get_next(item_names, resolved: [], limit: nil)
  deps = Array(item_names).map { |i| get_recursive_deps(i) }.flatten.uniq

  # Find out which dependencies are ready to resolve,
  # they should not have unresolved personal dependencies
  ready_to_resolve = deps.select do |dep_name|
    unresolved_deps = get_deps(dep_name) - resolved
    unresolved_deps.empty?
  end
  unresolved_deps = ready_to_resolve - resolved
  unresolved_deps = unresolved_deps.take(limit) if limit
  unresolved_deps
end
get_recursive_deps(item_name, dependency_tree: []) click to toggle source
# File lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb, line 53
def get_recursive_deps(item_name, dependency_tree: [])
  deps = get_deps(item_name)

  if dependency_tree.include?(item_name)
    raise CircularDependencyError, "Circular dependency found for #{item_name}. Dependency tree: #{dependency_tree.inspect}"
  end

  child_deps = []
  deps.each do |i| 
    child_deps += get_recursive_deps(i, dependency_tree: dependency_tree + [item_name])
  end

  (deps + child_deps).uniq
end