class DepAnalyzer
Abstract class to analyze dependencies. Intended to be subclassed for a given dependency system (eg rubygems). Subclasses must implement deps, installed, and outdated at the very least.
Public Instance Methods
decorate()
click to toggle source
Allows your subclass to add extra fancy stuff to the graph when analysis is finished.
# File lib/dep_analyzer.rb, line 120 def decorate # nothing to do by default end
deps(port)
click to toggle source
Return the dependencies for a given port.
# File lib/dep_analyzer.rb, line 127 def deps port raise NotImplementedError, "subclass responsibility" end
installed()
click to toggle source
Return all installed items on the system.
# File lib/dep_analyzer.rb, line 134 def installed raise NotImplementedError, "subclass responsibility" end
outdated()
click to toggle source
Return all outdated items currently installed.
# File lib/dep_analyzer.rb, line 141 def outdated raise NotImplementedError, "subclass responsibility" end
run(argv = ARGV)
click to toggle source
Do the actual work.
# File lib/dep_analyzer.rb, line 148 def run(argv = ARGV) setup ports = {} installed.each do |port| ports[port] = nil end old = {} outdated.each do |port| old[port] = nil end all_ports = ports.keys ports.each_key do |port| deps = self.deps(port) # remove things that don't intersect with installed list deps -= (deps - all_ports) deps.each do |dep| g[port] << dep end ports[port] = deps end rect = g.rect blue = g.color "blue" purple = g.color "purple4" red = g.color "red" pink = g.fill_lightpink indies = ports.keys - ports.minvert.keys indies.each do |k| rect << g[k] blue << g[k] end old.each do |k,v| pink << g[k] if indies.include? k then purple << g[k] else red << g[k] end end decorate puts "Looks like you can nuke:\n\t#{indies.sort.join("\n\t")}" unless argv.empty? then argv.each do |pkg| hits = ports.transitive[pkg] sorted = ports.tsort.reverse topo = [pkg] + sorted.select { |o| hits.include? o } prune = ports.dup topo.each do |k| prune.delete(k) end topo -= prune.values.flatten.uniq puts topo.join(' ') end end g end
setup()
click to toggle source
Allows subclasses to do any preparation before the run.
# File lib/dep_analyzer.rb, line 219 def setup # nothing to do by default end