class Tataru::Compiler

compiler

Public Class Methods

new(dsl, extant_resources = {}, extant_dependencies = {}) click to toggle source
# File lib/tataru/compiler.rb, line 8
def initialize(dsl, extant_resources = {}, extant_dependencies = {})
  @dsl = dsl
  @extant = extant_resources
  @extant_dependencies = extant_dependencies
end

Public Instance Methods

deletables() click to toggle source
# File lib/tataru/compiler.rb, line 54
def deletables
  @extant.reject { |k, _| @dsl.resources.key? k }
end
generate_labels() click to toggle source
# File lib/tataru/compiler.rb, line 45
def generate_labels
  count = 0
  subroutines.values.map do |sub|
    arr = [sub.label, top_instructions.count + count]
    count += sub.body_instructions.count
    arr
  end.to_h
end
generate_step_order(order, steps) click to toggle source
# File lib/tataru/compiler.rb, line 81
def generate_step_order(order, steps)
  instructions = []
  order.each do |level|
    steps.each do |step|
      instructions += level.map do |item|
        subroutines["#{item}_#{step}"].call_instruction
      end
    end
  end
  instructions
end
generate_subroutines() click to toggle source
# File lib/tataru/compiler.rb, line 62
def generate_subroutines
  result = {}
  # set up resources for deletion
  deletables.each do |k, v|
    desc = Tataru.const_get(v).new
    rrep = Representations::ResourceRepresentation.new(k, desc, {})
    sp = SubPlanner.new(rrep, :delete)
    result.merge!(sp.subroutines)
  end

  # set up resources for updates or creates
  updatables.each do |k, rrep|
    action = @extant.key?(k) ? :update : :create
    sp = SubPlanner.new(rrep, action)
    result.merge!(sp.subroutines)
  end
  result
end
generate_top_instructions() click to toggle source
# File lib/tataru/compiler.rb, line 93
def generate_top_instructions
  order = Bunny::Tsort.tsort(@extant_dependencies.merge(@dsl.dep_graph))

  generate_step_order(order, %i[start check]) +
    generate_step_order(order.reverse, %i[commit finish])
end
instr_hash() click to toggle source
# File lib/tataru/compiler.rb, line 14
def instr_hash
  {
    init: {
      **InitHashCompiler.new(@dsl).result,
      labels: labels
    },
    instructions: top_instructions + subroutine_instructions
  }
end
labels() click to toggle source
# File lib/tataru/compiler.rb, line 24
def labels
  @labels ||= generate_labels
end
subroutine_instructions() click to toggle source
# File lib/tataru/compiler.rb, line 40
def subroutine_instructions
  @subroutine_instructions ||=
    subroutines.values.flat_map(&:body_instructions)
end
subroutines() click to toggle source
# File lib/tataru/compiler.rb, line 28
def subroutines
  @subroutines ||= generate_subroutines
end
top_instructions() click to toggle source
# File lib/tataru/compiler.rb, line 32
def top_instructions
  @top_instructions ||= [
    :init,
    *generate_top_instructions,
    :end
  ]
end
updatables() click to toggle source
# File lib/tataru/compiler.rb, line 58
def updatables
  @dsl.resources
end