| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | require "hbc/topological_hash" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | module Hbc | 
					
						
							|  |  |  |   class CaskDependencies | 
					
						
							|  |  |  |     attr_reader :cask, :graph, :sorted | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def initialize(cask) | 
					
						
							|  |  |  |       @cask = cask | 
					
						
							|  |  |  |       @graph = graph_dependencies | 
					
						
							|  |  |  |       @sorted = sort | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def graph_dependencies | 
					
						
							|  |  |  |       deps_in = ->(csk) { csk.depends_on ? csk.depends_on.cask || [] : [] } | 
					
						
							|  |  |  |       walk = lambda { |acc, deps| | 
					
						
							|  |  |  |         deps.each do |dep| | 
					
						
							|  |  |  |           next if acc.key?(dep) | 
					
						
							|  |  |  |           succs = deps_in.call Hbc.load(dep) | 
					
						
							|  |  |  |           acc[dep] = succs | 
					
						
							|  |  |  |           walk.call(acc, succs) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         acc | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       graphed = walk.call({}, @cask.depends_on.cask) | 
					
						
							|  |  |  |       TopologicalHash[graphed] | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def sort | 
					
						
							|  |  |  |       @graph.tsort | 
					
						
							|  |  |  |     rescue TSort::Cyclic | 
					
						
							|  |  |  |       raise CaskCyclicCaskDependencyError, @cask.token | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | end |