class SqliteTestHook

This Hook allow to run Sqlite Worker from an ad-hoc program that receives .json files.

Public Instance Methods

command_line(filename) click to toggle source
# File lib/test_hook.rb, line 15
def command_line(filename)
  "runsql #{filename}"
end
compile_file_content(request) click to toggle source

Transform Mumuki Request into Docker file style

# File lib/test_hook.rb, line 20
def compile_file_content(request)
  parse_tests request.test
  student_code = parse_student_code "#{request.content&.strip}#{get_final_query}"
  {
      init:    "#{request.extra&.strip}",
      student: student_code,
      tests:   get_tests
  }.to_json
end
post_process_file(_file, result, status) click to toggle source

Transform Docker result into Response to Mumuki

# File lib/test_hook.rb, line 31
def post_process_file(_file, result, status)
  output = JSON.parse result
  case status
    when :passed
      expected, student = parse_output output
      framework.test expected, student
    when :failed
      [output['output'], status]
    else
      [output, status]
  end
end
tempfile_extension() click to toggle source
# File lib/test_hook.rb, line 11
def tempfile_extension
  '.json'
end

Protected Instance Methods

choose_left_right(diff, expected, student) click to toggle source
# File lib/test_hook.rb, line 64
def choose_left_right(diff, expected, student)
  expected = diff.left  unless diff.left.blank?
  student  = diff.right unless diff.right.blank?
  [expected, student]
end
diff(expected, student) click to toggle source

Make diff between expected and student dataset result and mark each line one according comparision

# File lib/test_hook.rb, line 56
def diff(expected, student)
  zipped = expected.zip(student).map do |expected_i, student_i|
    diff = Diffy::SplitDiff.new expected_i << "\n", student_i << "\n"
    choose_left_right(diff, expected_i, student_i).map { |e| post_process_diff e }
  end
  zipped.transpose.map { |dataset| post_process_datasets dataset }
end
framework() click to toggle source

Initialize Metatest Framework with Checker & Runner

# File lib/test_hook.rb, line 120
def framework
  Mumukit::Metatest::Framework.new checker: Sqlite::Checker.new,
                                   runner: Sqlite::MultipleExecutionsRunner.new
end
get_final_query() click to toggle source
# File lib/test_hook.rb, line 115
def get_final_query
  @tests.map{ |t| t.get_final_query.to_s }.reject(&:empty?).join
end
get_tests() click to toggle source
# File lib/test_hook.rb, line 111
def get_tests
  @tests.map(&:test_result)
end
parse_output(output) click to toggle source
# File lib/test_hook.rb, line 46
def parse_output(output)
  student  = output['student']
  expected = output['expected']
  expected.map!.with_index do |expect, i|
    @tests[i].choose_solution expect
  end
  diff(expected, student)
end
parse_student_code(code) click to toggle source
# File lib/test_hook.rb, line 96
def parse_student_code(code)
  code = code&.strip
  fail! 'message.failure.semicolon_ending' unless code&.end_with? ';'
  code
end
parse_tests(tests) click to toggle source

This method receives a list of test cases and transforms each one according it parser

# File lib/test_hook.rb, line 103
def parse_tests(tests)
  @tests = collect_tests(tests).map do |test|
    parser = parsers[test.type.to_sym].new
    parser.parse_test test
    parser
  end
end
post_process_datasets(datasets) click to toggle source

Transforms array datasets into hash with :id & :rows

# File lib/test_hook.rb, line 84
def post_process_datasets(datasets)
  datasets.map.with_index do |dataset, i|
    {
        id: i + 1,
        dataset: Sqlite::Dataset.new(dataset),
        table_name: @tests[i].table_name,
        show_query: @tests[i].show_query?,
        query: @tests[i].get_final_query
    }
  end
end
post_process_diff(data) click to toggle source

split lines grouping by diff mark & data content then append mark as dataset column & re join

# File lib/test_hook.rb, line 72
def post_process_diff(data)
  data.scan(/^(\s|-|\+)*(.+)/)
      .map { |mark, content| "#{proper_mark(mark)}#{content}" }
      .join("\n")
end
proper_mark(mark) click to toggle source
# File lib/test_hook.rb, line 78
def proper_mark(mark)
  mark = mark.to_s
  "#{mark}|" unless mark.blank?
end