Class: KuberKit::Core::Dependencies::AbstractDependencyResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb

Constant Summary collapse

CircularDependencyError =
Class.new(KuberKit::Error)
DependencyNotFoundError =
Class.new(KuberKit::NotFoundError)

Instance Method Summary collapse

Instance Method Details

#dependency_batch_sizeObject



79
80
81
# File 'lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb', line 79

def dependency_batch_size
  raise "This method should be overriden"
end

#each_with_deps(item_names, &block) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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) ⇒ Object



48
49
50
51
# 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_all_deps(item_names) ⇒ Object



55
56
57
58
# File 'lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb', line 55

def get_all_deps(item_names)
  deps = Array(item_names).map { |i| get_recursive_deps(i) }.flatten
  deps.uniq
end

#get_deps(item_name) ⇒ Object



75
76
77
# File 'lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb', line 75

def get_deps(item_name)
  raise "This method should be overriden"
end

#get_next(item_names, resolved: [], limit: nil) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
# 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: []) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/kuber_kit/core/dependencies/abstract_dependency_resolver.rb', line 60

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