Class: Molinillo::Resolver::Resolution::UnwindDetails

Inherits:
Struct
  • Object
show all
Includes:
Comparable
Defined in:
lib/molinillo/resolution.rb,
lib/molinillo/resolution.rb

Overview

Details of the state to unwind to when a conflict occurs, and the cause of the unwind

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#conflicting_requirementsArray

the requirements that combined to cause the conflict

Returns:

  • (Array)

    the current value of conflicting_requirements



62
63
64
# File 'lib/molinillo/resolution.rb', line 62

def conflicting_requirements
  @conflicting_requirements
end

#requirement_treeArray

for the requirement we’re relaxing

Returns:

  • (Array)

    the current value of requirement_tree



62
63
64
# File 'lib/molinillo/resolution.rb', line 62

def requirement_tree
  @requirement_tree
end

#requirement_treesArray

for the conflict

Returns:

  • (Array)

    the current value of requirement_trees



62
63
64
# File 'lib/molinillo/resolution.rb', line 62

def requirement_trees
  @requirement_trees
end

#requirements_unwound_to_insteadArray

array of unwind requirements that were chosen over this unwind

Returns:

  • (Array)

    the current value of requirements_unwound_to_instead



62
63
64
# File 'lib/molinillo/resolution.rb', line 62

def requirements_unwound_to_instead
  @requirements_unwound_to_instead
end

#state_indexInteger

the index of the state to unwind to

Returns:

  • (Integer)

    the current value of state_index



62
63
64
# File 'lib/molinillo/resolution.rb', line 62

def state_index
  @state_index
end

#state_requirementObject

the requirement of the state we’re unwinding to

Returns:

  • (Object)

    the current value of state_requirement



62
63
64
# File 'lib/molinillo/resolution.rb', line 62

def state_requirement
  @state_requirement
end

Instance Method Details

#<=>(other) ⇒ Integer

We compare UnwindDetails when choosing which state to unwind to. If two options have the same state_index we prefer the one most removed from a requirement that caused the conflict. Both options would unwind to the same state, but a ‘grandparent` option will filter out fewer of its possibilities after doing so - where a state is both a `parent` and a `grandparent` to requirements that have caused a conflict this is the correct behaviour.

Parameters:

  • other (UnwindDetail)

    UnwindDetail to be compared

Returns:

  • (Integer)

    integer specifying ordering



83
84
85
86
87
88
89
90
91
# File 'lib/molinillo/resolution.rb', line 83

def <=>(other)
  if state_index > other.state_index
    1
  elsif state_index == other.state_index
    reversed_requirement_tree_index <=> other.reversed_requirement_tree_index
  else
    -1
  end
end

#all_requirementsArray

Returns array of all the requirements that led to the need for this unwind.

Returns:

  • (Array)

    array of all the requirements that led to the need for this unwind



126
127
128
# File 'lib/molinillo/resolution.rb', line 126

def all_requirements
  @all_requirements ||= requirement_trees.flatten(1)
end

#reversed_requirement_tree_indexInteger

Returns index of state requirement in reversed requirement tree (the conflicting requirement itself will be at position 0).

Returns:

  • (Integer)

    index of state requirement in reversed requirement tree (the conflicting requirement itself will be at position 0)



95
96
97
98
99
100
101
102
# File 'lib/molinillo/resolution.rb', line 95

def reversed_requirement_tree_index
  @reversed_requirement_tree_index ||=
    if state_requirement
      requirement_tree.reverse.index(state_requirement)
    else
      999_999
    end
end

#sub_dependencies_to_avoidArray

Returns array of sub-dependencies to avoid when choosing a new possibility for the state we’ve unwound to. Only relevant for non-primary unwinds.

Returns:

  • (Array)

    array of sub-dependencies to avoid when choosing a new possibility for the state we’ve unwound to. Only relevant for non-primary unwinds



116
117
118
119
120
121
122
# File 'lib/molinillo/resolution.rb', line 116

def sub_dependencies_to_avoid
  @requirements_to_avoid ||=
    requirement_trees.map do |tree|
      index = tree.index(state_requirement)
      tree[index + 1] if index
    end.compact
end

#unwinding_to_primary_requirement?Boolean

Returns where the requirement of the state we’re unwinding to directly caused the conflict. Note: in this case, it is impossible for the state we’re unwinding to to be a parent of any of the other conflicting requirements (or we would have circularity).

Returns:

  • (Boolean)

    where the requirement of the state we’re unwinding to directly caused the conflict. Note: in this case, it is impossible for the state we’re unwinding to to be a parent of any of the other conflicting requirements (or we would have circularity)



109
110
111
# File 'lib/molinillo/resolution.rb', line 109

def unwinding_to_primary_requirement?
  requirement_tree.last == state_requirement
end