File: C:/Ruby27-x64/share/doc/ruby/html/Gem/Resolver/Molinillo/Resolver/Resolution.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>class Gem::Resolver::Molinillo::Resolver::Resolution - RDoc Documentation</title>
<script type="text/javascript">
var rdoc_rel_prefix = "../../../../";
var index_rel_prefix = "../../../../";
</script>
<script src="../../../../js/navigation.js" defer></script>
<script src="../../../../js/search.js" defer></script>
<script src="../../../../js/search_index.js" defer></script>
<script src="../../../../js/searcher.js" defer></script>
<script src="../../../../js/darkfish.js" defer></script>
<link href="../../../../css/fonts.css" rel="stylesheet">
<link href="../../../../css/rdoc.css" rel="stylesheet">
<body id="top" role="document" class="class">
<nav role="navigation">
<div id="project-navigation">
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
<h2>
<a href="../../../../index.html" rel="home">Home</a>
</h2>
<div id="table-of-contents-navigation">
<a href="../../../../table_of_contents.html#pages">Pages</a>
<a href="../../../../table_of_contents.html#classes">Classes</a>
<a href="../../../../table_of_contents.html#methods">Methods</a>
</div>
</div>
<div id="search-section" role="search" class="project-section initially-hidden">
<form action="#" method="get" accept-charset="utf-8">
<div id="search-field-wrapper">
<input id="search-field" role="combobox" aria-label="Search"
aria-autocomplete="list" aria-controls="search-results"
type="text" name="search" placeholder="Search" spellcheck="false"
title="Type to search, Up and Down to navigate, Enter to load">
</div>
<ul id="search-results" aria-label="Search Results"
aria-busy="false" aria-expanded="false"
aria-atomic="false" class="initially-hidden"></ul>
</form>
</div>
</div>
<div id="class-metadata">
<div id="parent-class-section" class="nav-section">
<h3>Parent</h3>
<p class="link"><a href="../../../../Object.html">Object</a>
</div>
<div id="includes-section" class="nav-section">
<h3>Included Modules</h3>
<ul class="link-list">
<li><a class="include" href="../Delegates/ResolutionState.html">Gem::Resolver::Molinillo::Delegates::ResolutionState</a>
<li><a class="include" href="../Delegates/SpecificationProvider.html">Gem::Resolver::Molinillo::Delegates::SpecificationProvider</a>
</ul>
</div>
<!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
<h3>Methods</h3>
<ul class="link-list" role="directory">
<li ><a href="#method-c-new">::new</a>
<li ><a href="#method-i-activate_spec">#activate_spec</a>
<li ><a href="#method-i-attempt_to_activate">#attempt_to_activate</a>
<li ><a href="#method-i-attempt_to_activate_existing_spec">#attempt_to_activate_existing_spec</a>
<li ><a href="#method-i-attempt_to_activate_new_spec">#attempt_to_activate_new_spec</a>
<li ><a href="#method-i-attempt_to_swap_possibility">#attempt_to_swap_possibility</a>
<li ><a href="#method-i-create_conflict">#create_conflict</a>
<li ><a href="#method-i-debug">#debug</a>
<li ><a href="#method-i-end_resolution">#end_resolution</a>
<li ><a href="#method-i-find_state_for">#find_state_for</a>
<li ><a href="#method-i-fixup_swapped_children">#fixup_swapped_children</a>
<li ><a href="#method-i-handle_missing_or_push_dependency_state">#handle_missing_or_push_dependency_state</a>
<li ><a href="#method-i-indicate_progress">#indicate_progress</a>
<li ><a href="#method-i-initial_state">#initial_state</a>
<li ><a href="#method-i-locked_requirement_named">#locked_requirement_named</a>
<li ><a href="#method-i-new_spec_satisfied-3F">#new_spec_satisfied?</a>
<li ><a href="#method-i-parent_of">#parent_of</a>
<li ><a href="#method-i-possibility">#possibility</a>
<li ><a href="#method-i-process_topmost_state">#process_topmost_state</a>
<li ><a href="#method-i-push_state_for_requirements">#push_state_for_requirements</a>
<li ><a href="#method-i-require_nested_dependencies_for">#require_nested_dependencies_for</a>
<li ><a href="#method-i-requirement_for_existing_name">#requirement_for_existing_name</a>
<li ><a href="#method-i-requirement_tree_for">#requirement_tree_for</a>
<li ><a href="#method-i-requirement_trees">#requirement_trees</a>
<li ><a href="#method-i-resolve">#resolve</a>
<li ><a href="#method-i-start_resolution">#start_resolution</a>
<li ><a href="#method-i-state">#state</a>
<li ><a href="#method-i-state_any-3F">#state_any?</a>
<li ><a href="#method-i-state_index_for_unwind">#state_index_for_unwind</a>
<li ><a href="#method-i-unwind_for_conflict">#unwind_for_conflict</a>
</ul>
</div>
</div>
</nav>
<main role="main" aria-labelledby="class-Gem::Resolver::Molinillo::Resolver::Resolution">
<h1 id="class-Gem::Resolver::Molinillo::Resolver::Resolution" class="class">
class Gem::Resolver::Molinillo::Resolver::Resolution
</h1>
<section class="description">
<p>A specific resolution from a given {Resolver}</p>
</section>
<section id="5Buntitled-5D" class="documentation-section">
<section class="constants-list">
<header>
<h3>Constants</h3>
</header>
<dl>
<dt id="Conflict">Conflict
<dd><p>A conflict that the resolution process encountered @attr [Object] requirement the requirement that immediately led to the conflict @attr [{<a href="Object">String,Nil=></a>}] requirements the requirements that caused the conflict @attr [Object, nil] existing the existing spec that was in conflict with</p>
<pre>the {#possibility}</pre>
<p>@attr [Object] possibility the spec that was unable to be activated due</p>
<pre class="ruby"><span class="ruby-identifier">to</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">conflict</span>
</pre>
<p>@attr [Object] locked_requirement the relevant locking requirement. @attr [Array<Array<Object>>] <a href="Resolution.html#method-i-requirement_trees"><code>requirement_trees</code></a> the different requirement</p>
<pre>trees that led to every requirement for the conflicting name.</pre>
<p>@attr [{String=>Object}] activated_by_name the already-activated specs.</p>
</dl>
</section>
<section class="attribute-method-details" class="method-section">
<header>
<h3>Attributes</h3>
</header>
<div id="attribute-i-base" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">base</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>@return [DependencyGraph] the base dependency graph to which</p>
<pre class="ruby"><span class="ruby-identifier">dependencies</span> <span class="ruby-identifier">should</span> <span class="ruby-identifier">be</span> <span class="ruby-string">'locked'</span>
</pre>
</div>
</div>
<div id="attribute-i-iteration_rate" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">iteration_rate</span><span
class="attribute-access-type">[RW]</span>
</div>
<div class="method-description">
<p>@return [Integer] the number of resolver iterations in between calls to</p>
<pre>{#resolver_ui}'s {UI#indicate_progress} method</pre>
</div>
</div>
<div id="attribute-i-original_requested" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">original_requested</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>@return [Array] the dependencies that were explicitly required</p>
</div>
</div>
<div id="attribute-i-resolver_ui" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">resolver_ui</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>@return [UI] the <a href="../UI.html"><code>UI</code></a> that knows how to communicate feedback about the</p>
<pre class="ruby"><span class="ruby-identifier">resolution</span> <span class="ruby-identifier">process</span> <span class="ruby-identifier">back</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">user</span>
</pre>
</div>
</div>
<div id="attribute-i-specification_provider" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">specification_provider</span><span
class="attribute-access-type">[R]</span>
</div>
<div class="method-description">
<p>@return [SpecificationProvider] the provider that knows about</p>
<pre>dependencies, requirements, specifications, versions, etc.</pre>
</div>
</div>
<div id="attribute-i-started_at" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">started_at</span><span
class="attribute-access-type">[RW]</span>
</div>
<div class="method-description">
<p>@return [Time] the time at which resolution began</p>
</div>
</div>
<div id="attribute-i-states" class="method-detail">
<div class="method-heading attribute-method-heading">
<span class="method-name">states</span><span
class="attribute-access-type">[RW]</span>
</div>
<div class="method-description">
<p>@return [Array<ResolutionState>] the stack of states for the resolution</p>
</div>
</div>
</section>
<section id="public-class-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Public Class Methods</h3>
</header>
<div id="method-c-new" class="method-detail ">
<div class="method-heading">
<span class="method-name">new</span><span
class="method-args">(specification_provider, resolver_ui, requested, base)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Initializes a new resolution. @param [SpecificationProvider] <a href="Resolution.html#attribute-i-specification_provider"><code>specification_provider</code></a></p>
<pre>see {#specification_provider}</pre>
<p>@param [UI] <a href="Resolution.html#attribute-i-resolver_ui"><code>resolver_ui</code></a> see {#resolver_ui} @param [Array] requested see {#original_requested} @param [DependencyGraph] base see {#base}</p>
<div class="method-source-code" id="new-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 48</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(<span class="ruby-identifier">specification_provider</span>, <span class="ruby-identifier">resolver_ui</span>, <span class="ruby-identifier">requested</span>, <span class="ruby-identifier">base</span>)
<span class="ruby-ivar">@specification_provider</span> = <span class="ruby-identifier">specification_provider</span>
<span class="ruby-ivar">@resolver_ui</span> = <span class="ruby-identifier">resolver_ui</span>
<span class="ruby-ivar">@original_requested</span> = <span class="ruby-identifier">requested</span>
<span class="ruby-ivar">@base</span> = <span class="ruby-identifier">base</span>
<span class="ruby-ivar">@states</span> = []
<span class="ruby-ivar">@iteration_counter</span> = <span class="ruby-value">0</span>
<span class="ruby-ivar">@parents_of</span> = <span class="ruby-constant">Hash</span>.<span class="ruby-identifier">new</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">h</span>, <span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">h</span>[<span class="ruby-identifier">k</span>] = [] }
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
<section id="public-instance-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Public Instance Methods</h3>
</header>
<div id="method-i-resolve" class="method-detail ">
<div class="method-heading">
<span class="method-name">resolve</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Resolves the {#original_requested} dependencies into a full dependency</p>
<pre class="ruby"><span class="ruby-identifier">graph</span>
</pre>
<p>@raise [ResolverError] if successful resolution is impossible @return [DependencyGraph] the dependency graph of successfully resolved</p>
<pre class="ruby"><span class="ruby-identifier">dependencies</span>
</pre>
<div class="method-source-code" id="resolve-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 63</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">resolve</span>
<span class="ruby-identifier">start_resolution</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">state</span>
<span class="ruby-keyword">break</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">any?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">requirement</span>
<span class="ruby-identifier">indicate_progress</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value">:pop_possibility_state</span>) <span class="ruby-comment"># DependencyState</span>
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Creating possibility state for #{requirement} (#{possibilities.count} remaining)"</span> }
<span class="ruby-identifier">state</span>.<span class="ruby-identifier">pop_possibility_state</span>.<span class="ruby-identifier">tap</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">s</span>
<span class="ruby-identifier">states</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">s</span>)
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">tag</span>(<span class="ruby-identifier">s</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">process_topmost_state</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">freeze</span>
<span class="ruby-keyword">ensure</span>
<span class="ruby-identifier">end_resolution</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
<section id="private-instance-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Private Instance Methods</h3>
</header>
<div id="method-i-activate_spec" class="method-detail ">
<div class="method-heading">
<span class="method-name">activate_spec</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Add the current {#possibility} to the dependency graph of the current {#state} @return [void]</p>
<div class="method-source-code" id="activate_spec-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 437</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">activate_spec</span>
<span class="ruby-identifier">conflicts</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Activated #{name} at #{possibility}"</span> }
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">set_payload</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">possibility</span>)
<span class="ruby-identifier">require_nested_dependencies_for</span>(<span class="ruby-identifier">possibility</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-attempt_to_activate" class="method-detail ">
<div class="method-heading">
<span class="method-name">attempt_to_activate</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Attempts to activate the current {#possibility} @return [void]</p>
<div class="method-source-code" id="attempt_to_activate-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 312</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">attempt_to_activate</span>
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-string">'Attempting to activate '</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">possibility</span>.<span class="ruby-identifier">to_s</span> }
<span class="ruby-identifier">existing_node</span> = <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertex_named</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">existing_node</span>.<span class="ruby-identifier">payload</span>
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Found existing spec (#{existing_node.payload})"</span> }
<span class="ruby-identifier">attempt_to_activate_existing_spec</span>(<span class="ruby-identifier">existing_node</span>)
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">attempt_to_activate_new_spec</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-attempt_to_activate_existing_spec" class="method-detail ">
<div class="method-heading">
<span class="method-name">attempt_to_activate_existing_spec</span><span
class="method-args">(existing_node)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Attempts to activate the current {#possibility} (given that it has already been activated) @return [void]</p>
<div class="method-source-code" id="attempt_to_activate_existing_spec-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 326</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">attempt_to_activate_existing_spec</span>(<span class="ruby-identifier">existing_node</span>)
<span class="ruby-identifier">existing_spec</span> = <span class="ruby-identifier">existing_node</span>.<span class="ruby-identifier">payload</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">requirement_satisfied_by?</span>(<span class="ruby-identifier">requirement</span>, <span class="ruby-identifier">activated</span>, <span class="ruby-identifier">existing_spec</span>)
<span class="ruby-identifier">new_requirements</span> = <span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">dup</span>
<span class="ruby-identifier">push_state_for_requirements</span>(<span class="ruby-identifier">new_requirements</span>, <span class="ruby-keyword">false</span>)
<span class="ruby-keyword">else</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">attempt_to_swap_possibility</span>
<span class="ruby-identifier">create_conflict</span>
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Unsatisfied by existing spec (#{existing_node.payload})"</span> }
<span class="ruby-identifier">unwind_for_conflict</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-attempt_to_activate_new_spec" class="method-detail ">
<div class="method-heading">
<span class="method-name">attempt_to_activate_new_spec</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Attempts to activate the current {#possibility} (given that it hasn't already been activated) @return [void]</p>
<div class="method-source-code" id="attempt_to_activate_new_spec-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 400</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">attempt_to_activate_new_spec</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">new_spec_satisfied?</span>
<span class="ruby-identifier">activate_spec</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">create_conflict</span>
<span class="ruby-identifier">unwind_for_conflict</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-attempt_to_swap_possibility" class="method-detail ">
<div class="method-heading">
<span class="method-name">attempt_to_swap_possibility</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Attempts to swp the current {#possibility} with the already-activated spec with the given name @return [Boolean] Whether the possibility was swapped into {#activated}</p>
<div class="method-source-code" id="attempt_to_swap_possibility-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 342</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">attempt_to_swap_possibility</span>
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">tag</span>(<span class="ruby-value">:swap</span>)
<span class="ruby-identifier">vertex</span> = <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertex_named</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">set_payload</span>(<span class="ruby-identifier">name</span>, <span class="ruby-identifier">possibility</span>)
<span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">requirements</span>.
<span class="ruby-identifier">all?</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">requirement_satisfied_by?</span>(<span class="ruby-identifier">r</span>, <span class="ruby-identifier">activated</span>, <span class="ruby-identifier">possibility</span>) } <span class="ruby-operator">||</span>
<span class="ruby-operator">!</span><span class="ruby-identifier">new_spec_satisfied?</span>
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">rewind_to</span>(<span class="ruby-value">:swap</span>)
<span class="ruby-keyword">return</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">fixup_swapped_children</span>(<span class="ruby-identifier">vertex</span>)
<span class="ruby-identifier">activate_spec</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-create_conflict" class="method-detail ">
<div class="method-heading">
<span class="method-name">create_conflict</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Conflict] a {Conflict} that reflects the failure to activate</p>
<pre>the {#possibility} in conjunction with the current {#state}</pre>
<div class="method-source-code" id="create_conflict-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 244</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">create_conflict</span>
<span class="ruby-identifier">vertex</span> = <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertex_named</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">locked_requirement</span> = <span class="ruby-identifier">locked_requirement_named</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">requirements</span> = {}
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">explicit_requirements</span>.<span class="ruby-identifier">empty?</span>
<span class="ruby-identifier">requirements</span>[<span class="ruby-identifier">name_for_explicit_dependency_source</span>] = <span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">explicit_requirements</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">requirements</span>[<span class="ruby-identifier">name_for_locking_dependency_source</span>] = [<span class="ruby-identifier">locked_requirement</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">locked_requirement</span>
<span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">incoming_edges</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">edge</span><span class="ruby-operator">|</span> (<span class="ruby-identifier">requirements</span>[<span class="ruby-identifier">edge</span>.<span class="ruby-identifier">origin</span>.<span class="ruby-identifier">payload</span>] <span class="ruby-operator">||=</span> []).<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">edge</span>.<span class="ruby-identifier">requirement</span>) }
<span class="ruby-identifier">activated_by_name</span> = {}
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">activated_by_name</span>[<span class="ruby-identifier">v</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">payload</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">payload</span> }
<span class="ruby-identifier">conflicts</span>[<span class="ruby-identifier">name</span>] = <span class="ruby-constant">Conflict</span>.<span class="ruby-identifier">new</span>(
<span class="ruby-identifier">requirement</span>,
<span class="ruby-identifier">requirements</span>,
<span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">payload</span>,
<span class="ruby-identifier">possibility</span>,
<span class="ruby-identifier">locked_requirement</span>,
<span class="ruby-identifier">requirement_trees</span>,
<span class="ruby-identifier">activated_by_name</span>
)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-debug" class="method-detail ">
<div class="method-heading">
<span class="method-name">debug</span><span
class="method-args">(depth = 0, &block)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Calls the {#resolver_ui}'s {UI#debug} method @param [Integer] depth the depth of the {#states} stack @param [Proc] block a block that yields a {#to_s} @return [void]</p>
<div class="method-source-code" id="debug-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 306</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">debug</span>(<span class="ruby-identifier">depth</span> = <span class="ruby-value">0</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span>)
<span class="ruby-identifier">resolver_ui</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-end_resolution" class="method-detail ">
<div class="method-heading">
<span class="method-name">end_resolution</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Ends the resolution process @return [void]</p>
<div class="method-source-code" id="end_resolution-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 114</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">end_resolution</span>
<span class="ruby-identifier">resolver_ui</span>.<span class="ruby-identifier">after_resolution</span>
<span class="ruby-identifier">debug</span> <span class="ruby-keyword">do</span>
<span class="ruby-node">"Finished resolution (#{@iteration_counter} steps) "</span> \
<span class="ruby-node">"(Took #{(ended_at = Time.now) - @started_at} seconds) (#{ended_at})"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">debug</span> { <span class="ruby-string">'Unactivated: '</span> <span class="ruby-operator">+</span> <span class="ruby-constant">Hash</span>[<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertices</span>.<span class="ruby-identifier">reject</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">_n</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">payload</span> }].<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">', '</span>) } <span class="ruby-keyword">if</span> <span class="ruby-identifier">state</span>
<span class="ruby-identifier">debug</span> { <span class="ruby-string">'Activated: '</span> <span class="ruby-operator">+</span> <span class="ruby-constant">Hash</span>[<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertices</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">_n</span>, <span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">payload</span> }].<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">', '</span>) } <span class="ruby-keyword">if</span> <span class="ruby-identifier">state</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-find_state_for" class="method-detail ">
<div class="method-heading">
<span class="method-name">find_state_for</span><span
class="method-args">(requirement)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [ResolutionState] the state whose `requirement` is the given</p>
<pre>`requirement`.</pre>
<div class="method-source-code" id="find_state_for-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 231</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">find_state_for</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">requirement</span>
<span class="ruby-identifier">states</span>.<span class="ruby-identifier">reverse_each</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">requirement</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">i</span>.<span class="ruby-identifier">requirement</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">i</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">DependencyState</span>) }
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-fixup_swapped_children" class="method-detail ">
<div class="method-heading">
<span class="method-name">fixup_swapped_children</span><span
class="method-args">(vertex)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Ensures there are no orphaned successors to the given {vertex}. @param [DependencyGraph::Vertex] vertex the vertex to fix up. @return [void]</p>
<div class="method-source-code" id="fixup_swapped_children-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 359</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">fixup_swapped_children</span>(<span class="ruby-identifier">vertex</span>) <span class="ruby-comment"># rubocop:disable Metrics/CyclomaticComplexity</span>
<span class="ruby-identifier">payload</span> = <span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">payload</span>
<span class="ruby-identifier">deps</span> = <span class="ruby-identifier">dependencies_for</span>(<span class="ruby-identifier">payload</span>).<span class="ruby-identifier">group_by</span>(<span class="ruby-operator">&</span><span class="ruby-identifier">method</span>(<span class="ruby-value">:name_for</span>))
<span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">outgoing_edges</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">outgoing_edge</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">requirement</span> = <span class="ruby-identifier">outgoing_edge</span>.<span class="ruby-identifier">requirement</span>
<span class="ruby-identifier">parent_index</span> = <span class="ruby-ivar">@parents_of</span>[<span class="ruby-identifier">requirement</span>].<span class="ruby-identifier">last</span>
<span class="ruby-identifier">succ</span> = <span class="ruby-identifier">outgoing_edge</span>.<span class="ruby-identifier">destination</span>
<span class="ruby-identifier">matching_deps</span> = <span class="ruby-constant">Array</span>(<span class="ruby-identifier">deps</span>[<span class="ruby-identifier">succ</span>.<span class="ruby-identifier">name</span>])
<span class="ruby-identifier">dep_matched</span> = <span class="ruby-identifier">matching_deps</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-comment"># only push the current index when it was originally required by the</span>
<span class="ruby-comment"># same named spec</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parent_index</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">states</span>[<span class="ruby-identifier">parent_index</span>].<span class="ruby-identifier">name</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">name</span>
<span class="ruby-ivar">@parents_of</span>[<span class="ruby-identifier">requirement</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">states</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">matching_deps</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">succ</span>.<span class="ruby-identifier">root?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">succ</span>.<span class="ruby-identifier">predecessors</span>.<span class="ruby-identifier">to_a</span> <span class="ruby-operator">==</span> [<span class="ruby-identifier">vertex</span>]
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Removing orphaned spec #{succ.name} after swapping #{name}"</span> }
<span class="ruby-identifier">succ</span>.<span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-ivar">@parents_of</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">r</span>) }
<span class="ruby-identifier">removed_names</span> = <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">detach_vertex_named</span>(<span class="ruby-identifier">succ</span>.<span class="ruby-identifier">name</span>).<span class="ruby-identifier">map</span>(<span class="ruby-operator">&</span><span class="ruby-value">:name</span>)
<span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">delete_if</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
<span class="ruby-comment"># the only removed vertices are those with no other requirements,</span>
<span class="ruby-comment"># so it's safe to delete only based upon name here</span>
<span class="ruby-identifier">removed_names</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">name_for</span>(<span class="ruby-identifier">r</span>))
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-operator">!</span><span class="ruby-identifier">dep_matched</span>
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Removing orphaned dependency #{requirement} after swapping #{name}"</span> }
<span class="ruby-comment"># also reset if we're removing the edge, but only if its parent has</span>
<span class="ruby-comment"># already been fixed up</span>
<span class="ruby-ivar">@parents_of</span>[<span class="ruby-identifier">requirement</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">states</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) <span class="ruby-keyword">if</span> <span class="ruby-ivar">@parents_of</span>[<span class="ruby-identifier">requirement</span>].<span class="ruby-identifier">empty?</span>
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">delete_edge</span>(<span class="ruby-identifier">outgoing_edge</span>)
<span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-handle_missing_or_push_dependency_state" class="method-detail ">
<div class="method-heading">
<span class="method-name">handle_missing_or_push_dependency_state</span><span
class="method-args">(state)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Pushes a new {DependencyState}. If the {#specification_provider} says to {SpecificationProvider#allow_missing?} that particular requirement, and there are no possibilities for that requirement, then `state` is not pushed, and the node in {#activated} is removed, and we continue resolving the remaining requirements. @param [DependencyState] state @return [void]</p>
<div class="method-source-code" id="handle_missing_or_push_dependency_state-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 484</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">handle_missing_or_push_dependency_state</span>(<span class="ruby-identifier">state</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">requirement</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">possibilities</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">allow_missing?</span>(<span class="ruby-identifier">state</span>.<span class="ruby-identifier">requirement</span>)
<span class="ruby-identifier">state</span>.<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">detach_vertex_named</span>(<span class="ruby-identifier">state</span>.<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">push_state_for_requirements</span>(<span class="ruby-identifier">state</span>.<span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">dup</span>, <span class="ruby-keyword">false</span>, <span class="ruby-identifier">state</span>.<span class="ruby-identifier">activated</span>)
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">states</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">state</span>).<span class="ruby-identifier">tap</span> { <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">tag</span>(<span class="ruby-identifier">state</span>) }
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-indicate_progress" class="method-detail ">
<div class="method-heading">
<span class="method-name">indicate_progress</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Indicates progress roughly once every second @return [void]</p>
<div class="method-source-code" id="indicate_progress-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 288</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">indicate_progress</span>
<span class="ruby-ivar">@iteration_counter</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
<span class="ruby-ivar">@progress_rate</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">resolver_ui</span>.<span class="ruby-identifier">progress_rate</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">iteration_rate</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-keyword">if</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">started_at</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@progress_rate</span>
<span class="ruby-keyword">self</span>.<span class="ruby-identifier">iteration_rate</span> = <span class="ruby-ivar">@iteration_counter</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">iteration_rate</span> <span class="ruby-operator">&&</span> (<span class="ruby-ivar">@iteration_counter</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">iteration_rate</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">resolver_ui</span>.<span class="ruby-identifier">indicate_progress</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-initial_state" class="method-detail ">
<div class="method-heading">
<span class="method-name">initial_state</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Creates the initial state for the resolution, based upon the {#requested} dependencies @return [DependencyState] the initial state for the resolution</p>
<div class="method-source-code" id="initial_state-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 159</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initial_state</span>
<span class="ruby-identifier">graph</span> = <span class="ruby-constant">DependencyGraph</span>.<span class="ruby-identifier">new</span>.<span class="ruby-identifier">tap</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dg</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">original_requested</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">dg</span>.<span class="ruby-identifier">add_vertex</span>(<span class="ruby-identifier">name_for</span>(<span class="ruby-identifier">r</span>), <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">true</span>).<span class="ruby-identifier">tap</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">v</span>.<span class="ruby-identifier">explicit_requirements</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">r</span> } }
<span class="ruby-identifier">dg</span>.<span class="ruby-identifier">tag</span>(<span class="ruby-value">:initial_state</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">requirements</span> = <span class="ruby-identifier">sort_dependencies</span>(<span class="ruby-identifier">original_requested</span>, <span class="ruby-identifier">graph</span>, {})
<span class="ruby-identifier">initial_requirement</span> = <span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-constant">DependencyState</span>.<span class="ruby-identifier">new</span>(
<span class="ruby-identifier">initial_requirement</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">name_for</span>(<span class="ruby-identifier">initial_requirement</span>),
<span class="ruby-identifier">requirements</span>,
<span class="ruby-identifier">graph</span>,
<span class="ruby-identifier">initial_requirement</span>,
<span class="ruby-identifier">initial_requirement</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">search_for</span>(<span class="ruby-identifier">initial_requirement</span>),
<span class="ruby-value">0</span>,
{}
)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-locked_requirement_named" class="method-detail ">
<div class="method-heading">
<span class="method-name">locked_requirement_named</span><span
class="method-args">(requirement_name)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@param [String] requirement_name the spec name to search for @return [Object] the locked spec named `requirement_name`, if one</p>
<pre>is found on {#base}</pre>
<div class="method-source-code" id="locked_requirement_named-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 429</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">locked_requirement_named</span>(<span class="ruby-identifier">requirement_name</span>)
<span class="ruby-identifier">vertex</span> = <span class="ruby-identifier">base</span>.<span class="ruby-identifier">vertex_named</span>(<span class="ruby-identifier">requirement_name</span>)
<span class="ruby-identifier">vertex</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">payload</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-new_spec_satisfied-3F" class="method-detail ">
<div class="method-heading">
<span class="method-name">new_spec_satisfied?</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Boolean] whether the current spec is satisfied as a new possibility.</p>
<div class="method-source-code" id="new_spec_satisfied-3F-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 411</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">new_spec_satisfied?</span>
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">requirement_satisfied_by?</span>(<span class="ruby-identifier">requirement</span>, <span class="ruby-identifier">activated</span>, <span class="ruby-identifier">possibility</span>)
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-string">'Unsatisfied by requested spec'</span> }
<span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">locked_requirement</span> = <span class="ruby-identifier">locked_requirement_named</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">locked_spec_satisfied</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">locked_requirement</span> <span class="ruby-operator">||</span>
<span class="ruby-identifier">requirement_satisfied_by?</span>(<span class="ruby-identifier">locked_requirement</span>, <span class="ruby-identifier">activated</span>, <span class="ruby-identifier">possibility</span>)
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-string">'Unsatisfied by locked spec'</span> } <span class="ruby-keyword">unless</span> <span class="ruby-identifier">locked_spec_satisfied</span>
<span class="ruby-identifier">locked_spec_satisfied</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parent_of" class="method-detail ">
<div class="method-heading">
<span class="method-name">parent_of</span><span
class="method-args">(requirement)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Object] the requirement that led to `requirement` being added</p>
<pre>to the list of requirements.</pre>
<div class="method-source-code" id="parent_of-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 215</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parent_of</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">requirement</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">index</span> = <span class="ruby-ivar">@parents_of</span>[<span class="ruby-identifier">requirement</span>].<span class="ruby-identifier">last</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">parent_state</span> = <span class="ruby-ivar">@states</span>[<span class="ruby-identifier">index</span>]
<span class="ruby-identifier">parent_state</span>.<span class="ruby-identifier">requirement</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-possibility" class="method-detail ">
<div class="method-heading">
<span class="method-name">possibility</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Object] the current possibility that the resolution is trying</p>
<pre class="ruby"><span class="ruby-identifier">to</span> <span class="ruby-identifier">activate</span>
</pre>
<div class="method-source-code" id="possibility-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 146</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">possibility</span>
<span class="ruby-identifier">possibilities</span>.<span class="ruby-identifier">last</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-process_topmost_state" class="method-detail ">
<div class="method-heading">
<span class="method-name">process_topmost_state</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Processes the topmost available {RequirementState} on the stack @return [void]</p>
<div class="method-source-code" id="process_topmost_state-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 135</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">process_topmost_state</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">possibility</span>
<span class="ruby-identifier">attempt_to_activate</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">create_conflict</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">PossibilityState</span>
<span class="ruby-identifier">unwind_for_conflict</span> <span class="ruby-keyword">until</span> <span class="ruby-identifier">possibility</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">DependencyState</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-push_state_for_requirements" class="method-detail ">
<div class="method-heading">
<span class="method-name">push_state_for_requirements</span><span
class="method-args">(new_requirements, requires_sort = true, new_activated = activated)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Pushes a new {DependencyState} that encapsulates both existing and new requirements @param [Array] new_requirements @return [void]</p>
<div class="method-source-code" id="push_state_for_requirements-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 465</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">push_state_for_requirements</span>(<span class="ruby-identifier">new_requirements</span>, <span class="ruby-identifier">requires_sort</span> = <span class="ruby-keyword">true</span>, <span class="ruby-identifier">new_activated</span> = <span class="ruby-identifier">activated</span>)
<span class="ruby-identifier">new_requirements</span> = <span class="ruby-identifier">sort_dependencies</span>(<span class="ruby-identifier">new_requirements</span>.<span class="ruby-identifier">uniq</span>, <span class="ruby-identifier">new_activated</span>, <span class="ruby-identifier">conflicts</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">requires_sort</span>
<span class="ruby-identifier">new_requirement</span> = <span class="ruby-identifier">new_requirements</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">new_name</span> = <span class="ruby-identifier">new_requirement</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">name_for</span>(<span class="ruby-identifier">new_requirement</span>) <span class="ruby-operator">:</span> <span class="ruby-string">''</span>.<span class="ruby-identifier">freeze</span>
<span class="ruby-identifier">possibilities</span> = <span class="ruby-identifier">new_requirement</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">search_for</span>(<span class="ruby-identifier">new_requirement</span>) <span class="ruby-operator">:</span> []
<span class="ruby-identifier">handle_missing_or_push_dependency_state</span> <span class="ruby-constant">DependencyState</span>.<span class="ruby-identifier">new</span>(
<span class="ruby-identifier">new_name</span>, <span class="ruby-identifier">new_requirements</span>, <span class="ruby-identifier">new_activated</span>,
<span class="ruby-identifier">new_requirement</span>, <span class="ruby-identifier">possibilities</span>, <span class="ruby-identifier">depth</span>, <span class="ruby-identifier">conflicts</span>.<span class="ruby-identifier">dup</span>
)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-require_nested_dependencies_for" class="method-detail ">
<div class="method-heading">
<span class="method-name">require_nested_dependencies_for</span><span
class="method-args">(activated_spec)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Requires the dependencies that the recently activated spec has @param [Object] activated_spec the specification that has just been</p>
<pre class="ruby"><span class="ruby-identifier">activated</span>
</pre>
<p>@return [void]</p>
<div class="method-source-code" id="require_nested_dependencies_for-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 448</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">require_nested_dependencies_for</span>(<span class="ruby-identifier">activated_spec</span>)
<span class="ruby-identifier">nested_dependencies</span> = <span class="ruby-identifier">dependencies_for</span>(<span class="ruby-identifier">activated_spec</span>)
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Requiring nested dependencies (#{nested_dependencies.join(', ')})"</span> }
<span class="ruby-identifier">nested_dependencies</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">add_child_vertex</span>(<span class="ruby-identifier">name_for</span>(<span class="ruby-identifier">d</span>), <span class="ruby-keyword">nil</span>, [<span class="ruby-identifier">name_for</span>(<span class="ruby-identifier">activated_spec</span>)], <span class="ruby-identifier">d</span>)
<span class="ruby-identifier">parent_index</span> = <span class="ruby-identifier">states</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
<span class="ruby-identifier">parents</span> = <span class="ruby-ivar">@parents_of</span>[<span class="ruby-identifier">d</span>]
<span class="ruby-identifier">parents</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">parent_index</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">parents</span>.<span class="ruby-identifier">empty?</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">push_state_for_requirements</span>(<span class="ruby-identifier">requirements</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">nested_dependencies</span>, <span class="ruby-operator">!</span><span class="ruby-identifier">nested_dependencies</span>.<span class="ruby-identifier">empty?</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-requirement_for_existing_name" class="method-detail ">
<div class="method-heading">
<span class="method-name">requirement_for_existing_name</span><span
class="method-args">(name)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Object] the requirement that led to a version of a possibility</p>
<pre>with the given name being activated.</pre>
<div class="method-source-code" id="requirement_for_existing_name-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 224</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">requirement_for_existing_name</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertex_named</span>(<span class="ruby-identifier">name</span>).<span class="ruby-identifier">payload</span>
<span class="ruby-identifier">states</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">name</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">name</span> }.<span class="ruby-identifier">requirement</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-requirement_tree_for" class="method-detail ">
<div class="method-heading">
<span class="method-name">requirement_tree_for</span><span
class="method-args">(requirement)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Array<Object>] the list of requirements that led to</p>
<pre>`requirement` being required.</pre>
<div class="method-source-code" id="requirement_tree_for-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 277</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">requirement_tree_for</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-identifier">tree</span> = []
<span class="ruby-keyword">while</span> <span class="ruby-identifier">requirement</span>
<span class="ruby-identifier">tree</span>.<span class="ruby-identifier">unshift</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-identifier">requirement</span> = <span class="ruby-identifier">parent_of</span>(<span class="ruby-identifier">requirement</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">tree</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-requirement_trees" class="method-detail ">
<div class="method-heading">
<span class="method-name">requirement_trees</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Array<Array<Object>>] The different requirement</p>
<pre>trees that led to every requirement for the current spec.</pre>
<div class="method-source-code" id="requirement_trees-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 270</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">requirement_trees</span>
<span class="ruby-identifier">vertex</span> = <span class="ruby-identifier">activated</span>.<span class="ruby-identifier">vertex_named</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">vertex</span>.<span class="ruby-identifier">requirements</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span> <span class="ruby-identifier">requirement_tree_for</span>(<span class="ruby-identifier">r</span>) }
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-start_resolution" class="method-detail ">
<div class="method-heading">
<span class="method-name">start_resolution</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Sets up the resolution process @return [void]</p>
<div class="method-source-code" id="start_resolution-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 103</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">start_resolution</span>
<span class="ruby-ivar">@started_at</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
<span class="ruby-identifier">handle_missing_or_push_dependency_state</span>(<span class="ruby-identifier">initial_state</span>)
<span class="ruby-identifier">debug</span> { <span class="ruby-node">"Starting resolution (#{@started_at})\nUser-requested dependencies: #{original_requested}"</span> }
<span class="ruby-identifier">resolver_ui</span>.<span class="ruby-identifier">before_resolution</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-state" class="method-detail ">
<div class="method-heading">
<span class="method-name">state</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [RequirementState] the current state the resolution is</p>
<pre class="ruby"><span class="ruby-identifier">operating</span> <span class="ruby-identifier">upon</span>
</pre>
<div class="method-source-code" id="state-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 152</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">state</span>
<span class="ruby-identifier">states</span>.<span class="ruby-identifier">last</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-state_any-3F" class="method-detail ">
<div class="method-heading">
<span class="method-name">state_any?</span><span
class="method-args">(state)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Boolean] whether or not the given state has any possibilities</p>
<pre>left.</pre>
<div class="method-source-code" id="state_any-3F-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 238</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">state_any?</span>(<span class="ruby-identifier">state</span>)
<span class="ruby-identifier">state</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">state</span>.<span class="ruby-identifier">possibilities</span>.<span class="ruby-identifier">any?</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-state_index_for_unwind" class="method-detail ">
<div class="method-heading">
<span class="method-name">state_index_for_unwind</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>@return [Integer] The index to which the resolution should unwind in the</p>
<pre>case of conflict.</pre>
<div class="method-source-code" id="state_index_for_unwind-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 194</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">state_index_for_unwind</span>
<span class="ruby-identifier">current_requirement</span> = <span class="ruby-identifier">requirement</span>
<span class="ruby-identifier">existing_requirement</span> = <span class="ruby-identifier">requirement_for_existing_name</span>(<span class="ruby-identifier">name</span>)
<span class="ruby-identifier">index</span> = <span class="ruby-value">-1</span>
[<span class="ruby-identifier">current_requirement</span>, <span class="ruby-identifier">existing_requirement</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
<span class="ruby-keyword">until</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">nil?</span>
<span class="ruby-identifier">current_state</span> = <span class="ruby-identifier">find_state_for</span>(<span class="ruby-identifier">r</span>)
<span class="ruby-keyword">if</span> <span class="ruby-identifier">state_any?</span>(<span class="ruby-identifier">current_state</span>)
<span class="ruby-identifier">current_index</span> = <span class="ruby-identifier">states</span>.<span class="ruby-identifier">index</span>(<span class="ruby-identifier">current_state</span>)
<span class="ruby-identifier">index</span> = <span class="ruby-identifier">current_index</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">current_index</span> <span class="ruby-operator">></span> <span class="ruby-identifier">index</span>
<span class="ruby-keyword">break</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">r</span> = <span class="ruby-identifier">parent_of</span>(<span class="ruby-identifier">r</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">index</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-unwind_for_conflict" class="method-detail ">
<div class="method-heading">
<span class="method-name">unwind_for_conflict</span><span
class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Unwinds the states stack because a conflict has been encountered @return [void]</p>
<div class="method-source-code" id="unwind_for_conflict-source">
<pre><span class="ruby-comment"># File lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb, line 180</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">unwind_for_conflict</span>
<span class="ruby-identifier">debug</span>(<span class="ruby-identifier">depth</span>) { <span class="ruby-node">"Unwinding for conflict: #{requirement} to #{state_index_for_unwind / 2}"</span> }
<span class="ruby-identifier">conflicts</span>.<span class="ruby-identifier">tap</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">c</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">sliced_states</span> = <span class="ruby-identifier">states</span>.<span class="ruby-identifier">slice!</span>((<span class="ruby-identifier">state_index_for_unwind</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>)<span class="ruby-operator">..</span><span class="ruby-value">-1</span>)
<span class="ruby-identifier">raise</span> <span class="ruby-constant">VersionConflict</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">c</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">state</span>
<span class="ruby-identifier">activated</span>.<span class="ruby-identifier">rewind_to</span>(<span class="ruby-identifier">sliced_states</span>.<span class="ruby-identifier">first</span> <span class="ruby-operator">||</span> <span class="ruby-value">:initial_state</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">sliced_states</span>
<span class="ruby-identifier">state</span>.<span class="ruby-identifier">conflicts</span> = <span class="ruby-identifier">c</span>
<span class="ruby-identifier">index</span> = <span class="ruby-identifier">states</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
<span class="ruby-ivar">@parents_of</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">_</span>, <span class="ruby-identifier">a</span><span class="ruby-operator">|</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">reject!</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">index</span> } }
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
</section>
</main>
<footer id="validator-badges" role="contentinfo">
<p><a href="https://validator.w3.org/check/referer">Validate</a>
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.2.1.1.
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>