Class: Berkshelf::Resolver
- Inherits:
-
Object
- Object
- Berkshelf::Resolver
- Extended by:
- Forwardable
- Defined in:
- lib/berkshelf/resolver.rb,
lib/berkshelf/resolver/graph.rb
Defined Under Namespace
Classes: Graph
Instance Attribute Summary collapse
- #berksfile ⇒ Berksfile readonly
-
#demands ⇒ Array<Dependency>
readonly
An array of dependencies that must be satisfied.
- #graph ⇒ Resolver::Graph readonly
Instance Method Summary collapse
-
#[](demand) ⇒ Dependency
(also: #get_demand)
Retrieve the given demand from the resolver.
-
#add_demand(demand) ⇒ Array<Dependency>
Add the given dependency to the collection of demands.
-
#add_explicit_dependencies(cookbook) ⇒ Hash
Add dependencies of a locally cached cookbook which will take precedence over anything found in the universe.
-
#demand_array ⇒ Array<String, String>
An array of arrays containing the name and constraint of each demand.
-
#has_demand?(demand) ⇒ Boolean
Check if the given demand has been added to the resolver.
-
#initialize(berksfile, demands = []) ⇒ Resolver
constructor
A new instance of Resolver.
-
#resolve ⇒ Array<Array<String, String, Dependency>>
Finds a solution for the currently added dependencies and their dependencies and returns an array of CachedCookbooks.
Constructor Details
#initialize(berksfile, demands = []) ⇒ Resolver
Returns a new instance of Resolver.
20 21 22 23 24 25 26 |
# File 'lib/berkshelf/resolver.rb', line 20 def initialize(berksfile, demands = []) @berksfile = berksfile @graph = Graph.new @demands = Array.new Array(demands).each { |demand| add_demand(demand) } end |
Instance Attribute Details
#berksfile ⇒ Berksfile (readonly)
8 9 10 |
# File 'lib/berkshelf/resolver.rb', line 8 def berksfile @berksfile end |
#demands ⇒ Array<Dependency> (readonly)
Returns an array of dependencies that must be satisfied.
15 16 17 |
# File 'lib/berkshelf/resolver.rb', line 15 def demands @demands end |
#graph ⇒ Resolver::Graph (readonly)
11 12 13 |
# File 'lib/berkshelf/resolver.rb', line 11 def graph @graph end |
Instance Method Details
#[](demand) ⇒ Dependency Also known as: get_demand
Retrieve the given demand from the resolver
92 93 94 95 |
# File 'lib/berkshelf/resolver.rb', line 92 def [](demand) name = demand.respond_to?(:name) ? demand.name : demand.to_s demands.find { |demand| demand.name == name } end |
#add_demand(demand) ⇒ Array<Dependency>
Add the given dependency to the collection of demands
36 37 38 39 40 41 42 |
# File 'lib/berkshelf/resolver.rb', line 36 def add_demand(demand) if has_demand?(demand) raise DuplicateDemand, "A demand named '#{demand.name}' is already present." end demands.push(demand) end |
#add_explicit_dependencies(cookbook) ⇒ Hash
Add dependencies of a locally cached cookbook which will take precedence over anything found in the universe.
50 51 52 |
# File 'lib/berkshelf/resolver.rb', line 50 def add_explicit_dependencies(cookbook) graph.populate_local(cookbook) end |
#demand_array ⇒ Array<String, String>
this is the format that Solve uses to determine a solution for the graph
An array of arrays containing the name and constraint of each demand
59 60 61 62 63 64 |
# File 'lib/berkshelf/resolver.rb', line 59 def demand_array demands.collect do |demand| constraint = demand.locked_version || demand.version_constraint [demand.name, constraint] end end |
#has_demand?(demand) ⇒ Boolean
Check if the given demand has been added to the resolver
102 103 104 |
# File 'lib/berkshelf/resolver.rb', line 102 def has_demand?(demand) !get_demand(demand).nil? end |
#resolve ⇒ Array<Array<String, String, Dependency>>
Finds a solution for the currently added dependencies and their dependencies and returns an array of CachedCookbooks.
72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/berkshelf/resolver.rb', line 72 def resolve graph.populate_store graph.populate(berksfile.sources) Solve.it!(graph, demand_array, ENV['DEBUG_RESOLVER'] ? { ui: Berkshelf.ui } : {}).collect do |name, version| dependency = get_demand(name) || Dependency.new(berksfile, name) dependency.locked_version = version dependency end rescue Solve::Errors::NoSolutionError raise NoSolutionError.new(demands) end |