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 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
Returns a new instance of SpecSet.
[View source]
10
11
12
|
# File 'lib/bundler/spec_set.rb', line 10
def initialize(specs)
@specs = specs
end
|
Instance Method Details
permalink
#<<(spec) ⇒ Object
[View source]
186
187
188
|
# File 'lib/bundler/spec_set.rb', line 186
def <<(spec)
@specs << spec
end
|
[View source]
80
81
82
83
|
# File 'lib/bundler/spec_set.rb', line 80
def [](key)
key = key.name if key.respond_to?(:name)
lookup[key]&.reverse || []
end
|
permalink
#[]=(key, value) ⇒ Object
[View source]
85
86
87
88
89
|
# File 'lib/bundler/spec_set.rb', line 85
def []=(key, value)
delete_by_name(key)
add_spec(value)
end
|
[View source]
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# File 'lib/bundler/spec_set.rb', line 50
def (platforms)
return platforms.concat([Gem::Platform::RUBY]).uniq if @specs.empty?
new_platforms = all_platforms.select do |platform|
next if platforms.include?(platform)
next unless GemHelpers.generic(platform) == Gem::Platform::RUBY
complete_platform(platform)
end
return platforms if new_platforms.empty?
platforms.concat(new_platforms)
less_specific_platform = new_platforms.find {|platform| platform != Gem::Platform::RUBY && Bundler.local_platform === platform && platform === Bundler.local_platform }
platforms.delete(Bundler.local_platform) if less_specific_platform
platforms
end
|
permalink
#delete(specs) ⇒ Object
[View source]
91
92
93
|
# File 'lib/bundler/spec_set.rb', line 91
def delete(specs)
Array(specs).each {|spec| remove_spec(spec) }
end
|
permalink
#delete_by_name(name) ⇒ Object
[View source]
167
168
169
170
171
172
173
|
# File 'lib/bundler/spec_set.rb', line 167
def delete_by_name(name)
@specs.reject! {|spec| spec.name == name }
@sorted&.reject! {|spec| spec.name == name }
return if @lookup.nil?
@lookup[name] = nil
end
|
permalink
#each(&b) ⇒ Object
[View source]
202
203
204
|
# File 'lib/bundler/spec_set.rb', line 202
def each(&b)
sorted.each(&b)
end
|
[View source]
198
199
200
|
# File 'lib/bundler/spec_set.rb', line 198
def empty?
@specs.empty?
end
|
[View source]
159
160
161
|
# File 'lib/bundler/spec_set.rb', line 159
def find_by_name_and_platform(name, platform)
@specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
end
|
permalink
#for(dependencies, platforms_or_legacy_check = [nil], legacy_platforms = [nil], skips: []) ⇒ Object
[View source]
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/bundler/spec_set.rb', line 14
def for(dependencies, platforms_or_legacy_check = [nil], legacy_platforms = [nil], skips: [])
platforms = if [true, false].include?(platforms_or_legacy_check)
Bundler::SharedHelpers.major_deprecation 2,
"SpecSet#for received a `check` parameter, but that's no longer used and deprecated. " \
"SpecSet#for always implicitly performs validation. Please remove this parameter",
print_caller_location: true
legacy_platforms
else
platforms_or_legacy_check
end
materialize_dependencies(dependencies, platforms, skips: skips)
@materializations.flat_map(&:specs).uniq
end
|
[View source]
124
125
126
127
128
129
130
131
|
# File 'lib/bundler/spec_set.rb', line 124
def incomplete_for_platform?(deps, platform)
return false if @specs.empty?
validation_set = self.class.new(@specs)
validation_set.for(deps, [platform])
validation_set.incomplete_specs.any?
end
|
permalink
#incomplete_specs ⇒ Object
[View source]
147
148
149
|
# File 'lib/bundler/spec_set.rb', line 147
def incomplete_specs
@materializations.flat_map(&:incomplete_specs)
end
|
permalink
#insecurely_materialized_specs ⇒ Object
[View source]
151
152
153
|
# File 'lib/bundler/spec_set.rb', line 151
def insecurely_materialized_specs
materialized_specs.select(&:insecurely_materialized?)
end
|
[View source]
190
191
192
|
# File 'lib/bundler/spec_set.rb', line 190
def length
@specs.length
end
|
permalink
#materialize(deps) ⇒ Object
[View source]
107
108
109
110
111
|
# File 'lib/bundler/spec_set.rb', line 107
def materialize(deps)
materialize_dependencies(deps)
SpecSet.new(materialized_specs)
end
|
Materialize for all the specs in the spec set, regardless of what platform they’re for
[View source]
115
116
117
118
119
120
121
122
|
# File 'lib/bundler/spec_set.rb', line 115
def materialized_for_all_platforms
@specs.map do |s|
next s unless s.is_a?(LazySpecification)
spec = s.materialize_for_cache
raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
spec
end
end
|
permalink
#missing_specs ⇒ Object
[View source]
139
140
141
|
# File 'lib/bundler/spec_set.rb', line 139
def missing_specs
@materializations.flat_map(&:completely_missing_specs)
end
|
permalink
#missing_specs_for(deps) ⇒ Object
[View source]
133
134
135
136
137
|
# File 'lib/bundler/spec_set.rb', line 133
def missing_specs_for(deps)
materialize_dependencies(deps)
missing_specs
end
|
[View source]
206
207
208
|
# File 'lib/bundler/spec_set.rb', line 206
def names
lookup.keys
end
|
[View source]
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/bundler/spec_set.rb', line 31
def normalize_platforms!(deps, platforms)
complete_platforms = (platforms)
complete_platforms.map do |platform|
next platform if platform == Gem::Platform::RUBY
begin
Integer(platform.version)
rescue ArgumentError, TypeError
next platform
end
less_specific_platform = Gem::Platform.new([platform.cpu, platform.os, nil])
next platform if incomplete_for_platform?(deps, less_specific_platform)
less_specific_platform
end.uniq
end
|
permalink
#partially_missing_specs ⇒ Object
[View source]
143
144
145
|
# File 'lib/bundler/spec_set.rb', line 143
def partially_missing_specs
@materializations.flat_map(&:partially_missing_specs)
end
|
[View source]
194
195
196
|
# File 'lib/bundler/spec_set.rb', line 194
def size
@specs.size
end
|
[View source]
95
96
97
|
# File 'lib/bundler/spec_set.rb', line 95
def sort!
self
end
|
permalink
#specs_with_additional_variants_from(other) ⇒ Object
[View source]
163
164
165
|
# File 'lib/bundler/spec_set.rb', line 163
def specs_with_additional_variants_from(other)
sorted | additional_variants_from(other)
end
|
[View source]
99
100
101
|
# File 'lib/bundler/spec_set.rb', line 99
def to_a
sorted.dup
end
|
[View source]
103
104
105
|
# File 'lib/bundler/spec_set.rb', line 103
def to_hash
lookup.dup
end
|
[View source]
214
215
216
|
# File 'lib/bundler/spec_set.rb', line 214
def to_s
map(&:full_name).to_s
end
|
permalink
#valid?(s) ⇒ Boolean
[View source]
210
211
212
|
# File 'lib/bundler/spec_set.rb', line 210
def valid?(s)
s.matches_current_metadata? && valid_dependencies?(s)
end
|
permalink
#validate_deps(s) ⇒ Object
[View source]
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/bundler/spec_set.rb', line 69
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
|
permalink
#version_for(name) ⇒ Object
[View source]
175
176
177
|
# File 'lib/bundler/spec_set.rb', line 175
def version_for(name)
self[name].first&.version
end
|
permalink
#what_required(spec) ⇒ Object
[View source]
179
180
181
182
183
184
|
# File 'lib/bundler/spec_set.rb', line 179
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
|