Class: Bundler::SpecSet
- Inherits:
-
Object
show all
- Includes:
- TSort, Enumerable
- Defined in:
- lib/bundler/spec_set.rb
Constant Summary
Constants included
from TSort
TSort::VERSION
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods included from TSort
#each_strongly_connected_component, each_strongly_connected_component, #each_strongly_connected_component_from, each_strongly_connected_component_from, #strongly_connected_components, strongly_connected_components, #tsort, tsort, #tsort_each, tsort_each
Constructor Details
#initialize(specs, incomplete_specs = []) ⇒ SpecSet
Returns a new instance of SpecSet.
12
13
14
15
|
# File 'lib/bundler/spec_set.rb', line 12
def initialize(specs, incomplete_specs = [])
@specs = specs
@incomplete_specs = incomplete_specs
end
|
Instance Attribute Details
#incomplete_specs ⇒ Object
Returns the value of attribute incomplete_specs.
10
11
12
|
# File 'lib/bundler/spec_set.rb', line 10
def incomplete_specs
@incomplete_specs
end
|
Instance Method Details
#-(other) ⇒ Object
168
169
170
|
# File 'lib/bundler/spec_set.rb', line 168
def -(other)
SpecSet.new(to_a - other.to_a)
end
|
#<<(spec) ⇒ Object
189
190
191
|
# File 'lib/bundler/spec_set.rb', line 189
def <<(spec)
@specs << spec
end
|
#[](key) ⇒ Object
106
107
108
109
|
# File 'lib/bundler/spec_set.rb', line 106
def [](key)
key = key.name if key.respond_to?(:name)
lookup[key]&.reverse || []
end
|
#[]=(key, value) ⇒ Object
111
112
113
114
115
|
# File 'lib/bundler/spec_set.rb', line 111
def []=(key, value)
@specs << value
@lookup = nil
@sorted = nil
end
|
55
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
|
# File 'lib/bundler/spec_set.rb', line 55
def complete_platforms!(platforms)
return platforms.concat([Gem::Platform::RUBY]).uniq if @specs.empty?
new_platforms = @specs.flat_map {|spec| spec.source.specs.search([spec.name, spec.version]).map(&:platform) }.uniq.select do |platform|
next if platforms.include?(platform)
next unless GemHelpers.generic(platform) == Gem::Platform::RUBY
new_specs = []
valid_platform = lookup.all? do |_, specs|
spec = specs.first
matching_specs = spec.source.specs.search([spec.name, spec.version])
platform_spec = GemHelpers.select_best_platform_match(matching_specs, platform).find do |s|
s.matches_current_metadata? && valid_dependencies?(s)
end
if platform_spec
new_specs << LazySpecification.from_spec(platform_spec)
true
else
false
end
end
next unless valid_platform
@specs.concat(new_specs.uniq)
end
return platforms if new_platforms.empty?
platforms.concat(new_platforms)
less_specific_platform = new_platforms.find {|platform| platform != Gem::Platform::RUBY && platform === Bundler.local_platform }
platforms.delete(Bundler.local_platform) if less_specific_platform
@sorted = nil
@lookup = nil
platforms
end
|
#delete(specs) ⇒ Object
117
118
119
120
121
|
# File 'lib/bundler/spec_set.rb', line 117
def delete(specs)
specs.each {|spec| @specs.delete(spec) }
@lookup = nil
@sorted = nil
end
|
#delete_by_name(name) ⇒ Object
176
177
178
179
180
|
# File 'lib/bundler/spec_set.rb', line 176
def delete_by_name(name)
@specs.reject! {|spec| spec.name == name }
@lookup = nil
@sorted = nil
end
|
#each(&b) ⇒ Object
205
206
207
|
# File 'lib/bundler/spec_set.rb', line 205
def each(&b)
sorted.each(&b)
end
|
#empty? ⇒ Boolean
201
202
203
|
# File 'lib/bundler/spec_set.rb', line 201
def empty?
@specs.empty?
end
|
172
173
174
|
# File 'lib/bundler/spec_set.rb', line 172
def find_by_name_and_platform(name, platform)
@specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
end
|
#for(dependencies, check = false, platforms = [nil]) ⇒ Object
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
# File 'lib/bundler/spec_set.rb', line 17
def for(dependencies, check = false, platforms = [nil])
handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h
deps = dependencies.product(platforms)
specs = []
loop do
break unless dep = deps.shift
name = dep[0].name
platform = dep[1]
incomplete = false
key = [name, platform]
next if handled.key?(key)
handled[key] = true
specs_for_dep = specs_for_dependency(*dep)
if specs_for_dep.any?
specs.concat(specs_for_dep)
specs_for_dep.first.dependencies.each do |d|
next if d.type == :development
incomplete = true if d.name != "bundler" && lookup[d.name].nil?
deps << [d, dep[1]]
end
else
incomplete = true
end
if incomplete && check
@incomplete_specs += lookup[name] || [LazySpecification.new(name, nil, nil)]
end
end
specs.uniq
end
|
154
155
156
157
158
159
160
161
162
|
# File 'lib/bundler/spec_set.rb', line 154
def incomplete_for_platform?(deps, platform)
return false if @specs.empty?
@incomplete_specs = []
self.for(deps, true, [platform])
@incomplete_specs.any?
end
|
#length ⇒ Object
193
194
195
|
# File 'lib/bundler/spec_set.rb', line 193
def length
@specs.length
end
|
#materialize(deps) ⇒ Object
135
136
137
138
139
|
# File 'lib/bundler/spec_set.rb', line 135
def materialize(deps)
materialized = self.for(deps, true)
SpecSet.new(materialized, incomplete_specs)
end
|
Materialize for all the specs in the spec set, regardless of what platform they’re for This is in contrast to how for does platform filtering (and specifically different from how ‘materialize` calls `for` only for the current platform)
144
145
146
147
148
149
150
151
152
|
# File 'lib/bundler/spec_set.rb', line 144
def materialized_for_all_platforms
@specs.map do |s|
next s unless s.is_a?(LazySpecification)
s.source.remote!
spec = s.materialize_for_installation
raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
spec
end
end
|
#missing_specs ⇒ Object
164
165
166
|
# File 'lib/bundler/spec_set.rb', line 164
def missing_specs
@specs.select {|s| s.is_a?(LazySpecification) }
end
|
#names ⇒ Object
209
210
211
|
# File 'lib/bundler/spec_set.rb', line 209
def names
lookup.keys
end
|
#size ⇒ Object
197
198
199
|
# File 'lib/bundler/spec_set.rb', line 197
def size
@specs.size
end
|
#sort! ⇒ Object
123
124
125
|
# File 'lib/bundler/spec_set.rb', line 123
def sort!
self
end
|
#to_a ⇒ Object
127
128
129
|
# File 'lib/bundler/spec_set.rb', line 127
def to_a
sorted.dup
end
|
#to_hash ⇒ Object
131
132
133
|
# File 'lib/bundler/spec_set.rb', line 131
def to_hash
lookup.dup
end
|
#validate_deps(s) ⇒ Object
95
96
97
98
99
100
101
102
103
104
|
# File 'lib/bundler/spec_set.rb', line 95
def validate_deps(s)
s.runtime_dependencies.each do |dep|
next if dep.name == "bundler"
return :missing unless names.include?(dep.name)
return :invalid if none? {|spec| dep.matches_spec?(spec) }
end
:valid
end
|
#what_required(spec) ⇒ Object
182
183
184
185
186
187
|
# File 'lib/bundler/spec_set.rb', line 182
def what_required(spec)
unless req = find {|s| s.runtime_dependencies.any? {|d| d.name == spec.name } }
return [spec]
end
what_required(req) << spec
end
|