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