Class: Bundler::PubGrub::Incompatibility
- Inherits:
-
Object
- Object
- Bundler::PubGrub::Incompatibility
show all
- Defined in:
- lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb
Defined Under Namespace
Classes: ConflictCause, InvalidDependency, NoVersions
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
permalink
#initialize(terms, cause:, custom_explanation: nil) ⇒ Incompatibility
Returns a new instance of Incompatibility.
[View source]
16
17
18
19
20
21
22
23
24
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 16
def initialize(terms, cause:, custom_explanation: nil)
@cause = cause
@terms = cleanup_terms(terms)
@custom_explanation = custom_explanation
if cause == :dependency && @terms.length != 2
raise ArgumentError, "a dependency Incompatibility must have exactly two terms. Got #{@terms.inspect}"
end
end
|
Instance Attribute Details
Returns the value of attribute cause.
14
15
16
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 14
def cause
@cause
end
|
Returns the value of attribute terms.
14
15
16
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 14
def terms
@terms
end
|
Instance Method Details
permalink
#conflict? ⇒ Boolean
[View source]
39
40
41
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 39
def conflict?
ConflictCause === cause
end
|
permalink
#eql?(other) ⇒ Boolean
[View source]
30
31
32
33
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 30
def eql?(other)
cause.eql?(other.cause) &&
terms.eql?(other.terms)
end
|
permalink
#external_incompatibilities ⇒ Object
Returns all external incompatibilities in this incompatibility’s derivation graph
[View source]
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 45
def external_incompatibilities
if conflict?
[
cause.conflict,
cause.other
].flat_map(&:external_incompatibilities)
else
[this]
end
end
|
permalink
#failure? ⇒ Boolean
[View source]
35
36
37
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 35
def failure?
terms.empty? || (terms.length == 1 && Package.root?(terms[0].package) && terms[0].positive?)
end
|
[View source]
26
27
28
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 26
def hash
cause.hash ^ terms.hash
end
|
[View source]
111
112
113
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 111
def inspect
"#<#{self.class} #{to_s}>"
end
|
permalink
#pretty_print(q) ⇒ Object
[View source]
115
116
117
118
119
120
121
122
123
124
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 115
def pretty_print(q)
q.group 2, "#<#{self.class}", ">" do
q.breakable
q.text to_s
q.breakable
q.text " caused by "
q.pp @cause
end
end
|
[View source]
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
# File 'lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb', line 56
def to_s
return @custom_explanation if @custom_explanation
case cause
when :root
"(root dependency)"
when :dependency
"#{terms[0].to_s(allow_every: true)} depends on #{terms[1].invert}"
when Bundler::PubGrub::Incompatibility::InvalidDependency
"#{terms[0].to_s(allow_every: true)} depends on unknown package #{cause.package}"
when Bundler::PubGrub::Incompatibility::NoVersions
"no versions satisfy #{cause.constraint}"
when Bundler::PubGrub::Incompatibility::ConflictCause
if failure?
"version solving has failed"
elsif terms.length == 1
term = terms[0]
if term.positive?
if term.constraint.any?
"#{term.package} cannot be used"
else
"#{term.to_s(allow_every: true)} cannot be used"
end
else
"#{term.invert} is required"
end
else
if terms.all?(&:positive?)
if terms.length == 2
"#{terms[0].to_s(allow_every: true)} is incompatible with #{terms[1]}"
else
"one of #{terms.map(&:to_s).join(" or ")} must be false"
end
elsif terms.all?(&:negative?)
if terms.length == 2
"either #{terms[0].invert} or #{terms[1].invert}"
else
"one of #{terms.map(&:invert).join(" or ")} must be true";
end
else
positive = terms.select(&:positive?)
negative = terms.select(&:negative?).map(&:invert)
if positive.length == 1
"#{positive[0].to_s(allow_every: true)} requires #{negative.join(" or ")}"
else
"if #{positive.join(" and ")} then #{negative.join(" or ")}"
end
end
end
else
raise "unhandled cause: #{cause.inspect}"
end
end
|