36 lines
		
	
	
		
			772 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			772 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "hbc/topological_hash"
 | |
| 
 | |
| module Hbc
 | |
|   class CaskDependencies
 | |
|     attr_reader :cask, :graph, :sorted
 | |
| 
 | |
|     def initialize(cask)
 | |
|       @cask = cask
 | |
|       @graph = graph_dependencies
 | |
|       @sorted = sort
 | |
|     end
 | |
| 
 | |
|     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
 | |
|       }
 | |
| 
 | |
|       graphed = walk.call({}, @cask.depends_on.cask)
 | |
|       TopologicalHash[graphed]
 | |
|     end
 | |
| 
 | |
|     def sort
 | |
|       @graph.tsort
 | |
|     rescue TSort::Cyclic
 | |
|       raise CaskCyclicCaskDependencyError, @cask.token
 | |
|     end
 | |
|   end
 | |
| end
 | 
