Class: Tisket::Manager

Inherits:
Object
  • Object
show all
Defined in:
lib/tisket/manager.rb

Instance Method Summary collapse

Constructor Details

#initialize(specs) ⇒ Manager

Returns a new instance of Manager.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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

Instance Method Details

#complete(id) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# 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) ⇒ Object



39
40
41
# File 'lib/tisket/manager.rb', line 39

def enqueue(ids)
  ids.map{|id| run_one(id) }.map(&:join)
end

#runObject



54
55
56
# File 'lib/tisket/manager.rb', line 54

def run
  enqueue(initial_set)
end

#run_one(id) ⇒ Object



43
44
45
46
47
48
49
50
51
52
# 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