class Tisket::Manager
Public Class Methods
new(specs)
click to toggle source
# File lib/tisket/manager.rb, line 8 def initialize(specs) specs = YAML.load(specs) if specs.is_a?(String) specs = convert_specs(specs) self.backward_deps = {} self.forward_deps = Hash.new{|h,k| h[k] = Set.new } self.initial_set = Set.new specs.each do |id,spec| if spec && (deps = spec.delete(:_requires)) && !deps.empty? deps.each{|d| forward_deps[d] << id } backward_deps[id] = deps else initial_set << id end end self.specs = specs end
Public Instance Methods
complete(id)
click to toggle source
# File lib/tisket/manager.rb, line 28 def complete(id) puts "completing #{id}" next_tasks = Set.new forward_deps[id].each do |dep| bw = backward_deps[dep] bw.delete(id) next_tasks << dep if bw.empty? end enqueue(next_tasks) end
enqueue(ids)
click to toggle source
# File lib/tisket/manager.rb, line 39 def enqueue(ids) ids.map{|id| run_one(id) }.map(&:join) end
run()
click to toggle source
# File lib/tisket/manager.rb, line 54 def run enqueue(initial_set) end
run_one(id)
click to toggle source
# File lib/tisket/manager.rb, line 43 def run_one(id) puts "running #{id}" spec = (specs[id] ? specs[id].dup : {}) task = Object.const_get( spec.delete(:_class) || camelize(id.to_s) ).new(self, id: id, **spec) th = Thread.new{ task.run } th.run th end
Protected Instance Methods
camelize(snake_case)
click to toggle source
# File lib/tisket/manager.rb, line 77 def camelize(snake_case) snake_case.scan(/[^_]+_?/).map{|s| s.chomp('_') }.map(&:capitalize).join end
convert_specs(node)
click to toggle source
# File lib/tisket/manager.rb, line 60 def convert_specs(node) case node when Hash # Some YAML parsers - including Psych 2 - don't have builtin support for # sets :( if !node.empty? && node.values.all?(&:nil?) Set.new(node.keys.map(&:to_sym)) else node.inject({}){|h,(k,v)| h.update(k.to_sym => convert_specs(v)) } end when Array node.map{|a| convert_specs(a) } else node end end