@@ -37,15 +37,15 @@ def for(dependencies, check = false, platforms = [nil])
3737
3838 specs_for_dep . first . dependencies . each do |d |
3939 next if d . type == :development
40- incomplete = true if d . name != "bundler" && lookup [ d . name ] . empty ?
40+ incomplete = true if d . name != "bundler" && lookup [ d . name ] . nil ?
4141 deps << [ d , dep [ 1 ] ]
4242 end
4343 else
4444 incomplete = true
4545 end
4646
4747 if incomplete && check
48- @incomplete_specs += lookup [ name ] . any? ? lookup [ name ] : [ LazySpecification . new ( name , nil , nil ) ]
48+ @incomplete_specs += lookup [ name ] || [ LazySpecification . new ( name , nil , nil ) ]
4949 end
5050 end
5151
@@ -64,7 +64,9 @@ def complete_platforms!(platforms)
6464 valid_platform = lookup . all? do |_ , specs |
6565 spec = specs . first
6666 matching_specs = spec . source . specs . search ( [ spec . name , spec . version ] )
67- platform_spec = GemHelpers . select_best_platform_match ( matching_specs , platform ) . find ( &:matches_current_metadata? )
67+ platform_spec = GemHelpers . select_best_platform_match ( matching_specs , platform ) . find do |s |
68+ s . matches_current_metadata? && valid_dependencies? ( s )
69+ end
6870
6971 if platform_spec
7072 new_specs << LazySpecification . from_spec ( platform_spec )
@@ -90,9 +92,20 @@ def complete_platforms!(platforms)
9092 platforms
9193 end
9294
95+ def validate_deps ( s )
96+ s . runtime_dependencies . each do |dep |
97+ next if dep . name == "bundler"
98+
99+ return :missing unless names . include? ( dep . name )
100+ return :invalid if none? { |spec | dep . matches_spec? ( spec ) }
101+ end
102+
103+ :valid
104+ end
105+
93106 def []( key )
94107 key = key . name if key . respond_to? ( :name )
95- lookup [ key ] . reverse
108+ lookup [ key ] & .reverse || [ ]
96109 end
97110
98111 def []=( key , value )
@@ -167,7 +180,7 @@ def delete_by_name(name)
167180 end
168181
169182 def what_required ( spec )
170- unless req = find { |s | s . dependencies . any? { |d | d . type == :runtime && d . name == spec . name } }
183+ unless req = find { |s | s . runtime_dependencies . any? { |d | d . name == spec . name } }
171184 return [ spec ]
172185 end
173186 what_required ( req ) << spec
@@ -193,8 +206,16 @@ def each(&b)
193206 sorted . each ( &b )
194207 end
195208
209+ def names
210+ lookup . keys
211+ end
212+
196213 private
197214
215+ def valid_dependencies? ( s )
216+ validate_deps ( s ) == :valid
217+ end
218+
198219 def sorted
199220 rake = @specs . find { |s | s . name == "rake" }
200221 begin
@@ -213,8 +234,9 @@ def extract_circular_gems(error)
213234
214235 def lookup
215236 @lookup ||= begin
216- lookup = Hash . new { | h , k | h [ k ] = [ ] }
237+ lookup = { }
217238 @specs . each do |s |
239+ lookup [ s . name ] ||= [ ]
218240 lookup [ s . name ] << s
219241 end
220242 lookup
@@ -228,6 +250,8 @@ def tsort_each_node
228250
229251 def specs_for_dependency ( dep , platform )
230252 specs_for_name = lookup [ dep . name ]
253+ return [ ] unless specs_for_name
254+
231255 matching_specs = if dep . force_ruby_platform
232256 GemHelpers . force_ruby_platform ( specs_for_name )
233257 else
@@ -240,7 +264,11 @@ def specs_for_dependency(dep, platform)
240264 def tsort_each_child ( s )
241265 s . dependencies . sort_by ( &:name ) . each do |d |
242266 next if d . type == :development
243- lookup [ d . name ] . each { |s2 | yield s2 }
267+
268+ specs_for_name = lookup [ d . name ]
269+ next unless specs_for_name
270+
271+ specs_for_name . each { |s2 | yield s2 }
244272 end
245273 end
246274 end
0 commit comments