class Quby::Compiler::Instance

Attributes

lookup_tables[R]

Public Class Methods

new(lookup_tables:) click to toggle source
# File lib/quby/compiler/instance.rb, line 6
def initialize(lookup_tables:)
  @lookup_tables = lookup_tables
end

Public Instance Methods

compile(key:, sourcecode:, seeds:, path: nil, last_update: nil, &block) click to toggle source
# File lib/quby/compiler/instance.rb, line 10
def compile(key:, sourcecode:, seeds:, path: nil, last_update: nil, &block)
  if block # defined in block for tests
    questionnaire = DSL.build(key, path: path, &block)
  else # sourcecode given as string
    tempfile = Tempfile.new([key, '.rb'])
    questionnaire = Entities::Questionnaire.new(key, last_update: last_update)
    Thread.current["quby-questionnaire-loading"] = Quby::Compiler::DSL::QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables)

    tempfile.puts "Thread.current['quby-questionnaire-loading'].instance_eval do"
    tempfile.puts sourcecode
    tempfile.puts "end"
    tempfile.flush

    load tempfile.path
    Thread.current['quby-questionnaire-loading'] = nil

    questionnaire.callback_after_dsl_enhance_on_questions
  end

  {
    outputs: {
      definition: Output.new(
        key: :definition,
        filename: "definition.rb",
        content: sourcecode,
      ),
      roqua: Output.new(
        key: :roqua,
        filename: "roqua.json",
        content: Outputs::RoquaSerializer.new(questionnaire).to_json,
      ),
      seeds: Output.new(
        key: :seeds,
        filename: "seeds.yml",
        content: YAML.dump(Outputs::SeedSerializer.new(questionnaire, seeds).generate),
      ),
      quby_frontend_v1: Output.new(
        key: :quby_frontend_v1,
        filename: "quby-frontend-v1.json",
        content: Outputs::QubyFrontendV1Serializer.new(questionnaire).to_json,
      ),
      quby_frontend_v2: Output.new(
        key: :quby_frontend_v2,
        filename: "quby-frontend-v2.json",
        content: Outputs::QubyFrontendV2Serializer.new(questionnaire).to_json,
      ),
    },
  }
ensure
  # We can only close and remove the file once serializers have finished.
  # The serializers need the file in order to grab the source for score blocks
  tempfile&.close
  tempfile&.unlink
end
validate(key:, sourcecode:) click to toggle source
# File lib/quby/compiler/instance.rb, line 65
def validate(key:, sourcecode:)
  definition = Entities::Definition.new(key: key, sourcecode: sourcecode, path: "validating '#{key}'", lookup_tables: lookup_tables)
  definition.valid?
  definition
end