From 97875c1dfb24c06904d8df339f509e05d96c5324 Mon Sep 17 00:00:00 2001 From: Bracken Mosbacker Date: Mon, 15 Aug 2011 08:27:43 -0600 Subject: [PATCH] qti options hash refactor refs #55 Change-Id: I791f596eca1d236cef77282f8be3dcc24abd8a8b Reviewed-on: https://gerrit.instructure.com/5088 Tested-by: Hudson Reviewed-by: Brian Palmer --- lib/cc/importer/quiz_converter.rb | 4 ++-- vendor/plugins/qti_exporter/lib/qti_exporter.rb | 1 + .../lib/qti_exporter/assessment_item_converter.rb | 4 +++- .../lib/qti_exporter/assessment_test_converter.rb | 12 ++++++------ .../lib/qti_exporter/associate_interaction.rb | 6 +++--- .../plugins/qti_exporter/lib/qti_exporter/flavors.rb | 10 ++++++++++ vendor/plugins/qti_exporter/lib/qti_exporter/qti.rb | 12 ++++++------ .../qti_exporter/lib/qti_exporter/qti_exporter.rb | 4 ++-- .../lib/qti_converter/angel_cc_questions_spec.rb | 2 +- .../spec/lib/qti_converter/bb8_questions_spec.rb | 2 +- .../spec/lib/qti_converter/cengage_questions_spec.rb | 2 +- .../spec/lib/qti_converter/d2l_questions_spec.rb | 2 +- .../spec/lib/qti_converter/respondus_spec.rb | 2 +- .../spec/lib/qti_converter/vista_questions_spec.rb | 2 +- vendor/plugins/qti_exporter/spec/qti_helper.rb | 8 ++++---- 15 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 vendor/plugins/qti_exporter/lib/qti_exporter/flavors.rb diff --git a/lib/cc/importer/quiz_converter.rb b/lib/cc/importer/quiz_converter.rb index 57d023990f4..048c6752784 100644 --- a/lib/cc/importer/quiz_converter.rb +++ b/lib/cc/importer/quiz_converter.rb @@ -98,7 +98,7 @@ module CC::Importer questions = {} begin manifest_file = File.join(@dest_dir_2_1, Qti::QtiExporter::MANIFEST_FILE) - questions[:assessment_questions] = Qti.convert_questions(manifest_file) + questions[:assessment_questions] = Qti.convert_questions(manifest_file, :flavor => Qti::Flavors::CANVAS) rescue questions[:qti_error] = "#{$!}: #{$!.backtrace.join("\n")}" end @@ -110,7 +110,7 @@ module CC::Importer quizzes = {} begin manifest_file = File.join(@dest_dir_2_1, Qti::QtiExporter::MANIFEST_FILE) - quizzes[:assessments] = Qti.convert_assessments(manifest_file, false) + quizzes[:assessments] = Qti.convert_assessments(manifest_file, :flavor => Qti::Flavors::CANVAS) rescue quizzes[:qti_error] = "#{$!}: #{$!.backtrace.join("\n")}" end diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter.rb b/vendor/plugins/qti_exporter/lib/qti_exporter.rb index 8639e10c04d..b70c73ad005 100644 --- a/vendor/plugins/qti_exporter/lib/qti_exporter.rb +++ b/vendor/plugins/qti_exporter/lib/qti_exporter.rb @@ -4,6 +4,7 @@ module Qti end require 'canvas_migration' +require 'qti_exporter/flavors' require 'qti_exporter/qti' require 'qti_exporter/qti_plugin_validator' require 'qti_exporter/qti_exporter' diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_item_converter.rb b/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_item_converter.rb index 2ec4abc7d2c..ffa68110221 100644 --- a/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_item_converter.rb +++ b/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_item_converter.rb @@ -14,7 +14,9 @@ class AssessmentItemConverter @manifest_node = opts[:manifest_node] @migration_type = opts[:interaction_type] @doc = nil - + @flavor = opts[:flavor] + @opts = opts + if @manifest_node @base_dir = opts[:base_dir] @identifier = @manifest_node['identifier'] diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_test_converter.rb b/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_test_converter.rb index 895d2d74f44..45d05cb801c 100644 --- a/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_test_converter.rb +++ b/vendor/plugins/qti_exporter/lib/qti_exporter/assessment_test_converter.rb @@ -5,14 +5,14 @@ class AssessmentTestConverter attr_reader :base_dir, :identifier, :href, :interaction_type, :title, :quiz - def initialize(manifest_node, base_dir, is_webct=false, converted_questions = []) + def initialize(manifest_node, base_dir, opts={}) @log = Canvas::Migration::logger @manifest_node = manifest_node @base_dir = base_dir @href = File.join(@base_dir, @manifest_node['href']) - @is_webct = is_webct - @converted_questions = converted_questions - + @converted_questions = opts[:converted_questions] + @opts = opts + @quiz = { :questions=>[], :quiz_type=>nil, @@ -20,7 +20,7 @@ class AssessmentTestConverter } end - def create_instructure_quiz(converted_questions = []) + def create_instructure_quiz begin # Get manifest data if md = @manifest_node.at_css("instructureMetadata") @@ -188,7 +188,7 @@ class AssessmentTestConverter def convert_weight_to_points(weight) begin weight = weight.to_f - if @is_webct + if @opts[:flavor] == Qti::Flavors::WEBCT weight = weight * 100 end rescue diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter/associate_interaction.rb b/vendor/plugins/qti_exporter/lib/qti_exporter/associate_interaction.rb index feffd7391f7..d18fbf0867c 100644 --- a/vendor/plugins/qti_exporter/lib/qti_exporter/associate_interaction.rb +++ b/vendor/plugins/qti_exporter/lib/qti_exporter/associate_interaction.rb @@ -7,7 +7,7 @@ class AssociateInteraction < AssessmentItemConverter @question[:matches] = [] @question[:question_type] = 'matching_question' # to mark whether it's bb8/vista/respondus_matching if needed - @flavor = opts[:custom_type] + @custom_type = opts[:custom_type] end def parse_question_data @@ -18,10 +18,10 @@ class AssociateInteraction < AssessmentItemConverter check_for_meta_matches elsif node = @doc.at_css('matchInteraction') get_all_match_interaction(node) - elsif @flavor == 'respondus_matching' + elsif @custom_type == 'respondus_matching' get_respondus_answers get_respondus_matches - elsif @flavor == 'canvas_matching' + elsif @custom_type == 'canvas_matching' match_map = {} get_canvas_matches(match_map) get_canvas_answers(match_map) diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter/flavors.rb b/vendor/plugins/qti_exporter/lib/qti_exporter/flavors.rb new file mode 100644 index 00000000000..35a46d04bde --- /dev/null +++ b/vendor/plugins/qti_exporter/lib/qti_exporter/flavors.rb @@ -0,0 +1,10 @@ +module Qti + module Flavors + ANGEL = 'angel' + BBLEARN = 'bblearn' + CANVAS = 'canvas' + D2L = 'd2l' + RESPONDUS = 'respondus' + WEBCT = 'webct' + end +end \ No newline at end of file diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter/qti.rb b/vendor/plugins/qti_exporter/lib/qti_exporter/qti.rb index bdb944761ec..1149bdc2339 100644 --- a/vendor/plugins/qti_exporter/lib/qti_exporter/qti.rb +++ b/vendor/plugins/qti_exporter/lib/qti_exporter/qti.rb @@ -20,27 +20,27 @@ module Qti file_name end - def self.convert_questions(manifest_path) + def self.convert_questions(manifest_path, opts={}) questions = [] doc = Nokogiri::XML(open(manifest_path)) doc.css('manifest resources resource[type^=imsqti_item_xmlv2p]').each do |item| - q = AssessmentItemConverter::create_instructure_question(:manifest_node=>item, :base_dir=>File.dirname(manifest_path)) + q = AssessmentItemConverter::create_instructure_question(opts.merge(:manifest_node=>item, :base_dir=>File.dirname(manifest_path))) questions << q if q end questions end - def self.convert_assessments(manifest_path, is_webct=false, questions = []) + def self.convert_assessments(manifest_path, opts={}) assessments = [] doc = Nokogiri::XML(open(manifest_path)) doc.css('manifest resources resource[type=imsqti_assessment_xmlv2p1]').each do |item| - a = AssessmentTestConverter.new(item, File.dirname(manifest_path), is_webct, questions).create_instructure_quiz + a = AssessmentTestConverter.new(item, File.dirname(manifest_path), opts).create_instructure_quiz assessments << a if a end assessments end - def self.convert_xml(xml) + def self.convert_xml(xml, opts={}) assessments = nil questions = nil Dir.mktmpdir do |dirname| @@ -54,7 +54,7 @@ module Qti if $?.exitstatus == 0 manifest = File.join(dest_dir_2_1, "imsmanifest.xml") - questions = convert_questions(manifest) + questions = convert_questions(manifest, opts) assessments = convert_assessments(manifest) else raise "Error running python qti converter" diff --git a/vendor/plugins/qti_exporter/lib/qti_exporter/qti_exporter.rb b/vendor/plugins/qti_exporter/lib/qti_exporter/qti_exporter.rb index d67b797e036..9b0e50ca360 100644 --- a/vendor/plugins/qti_exporter/lib/qti_exporter/qti_exporter.rb +++ b/vendor/plugins/qti_exporter/lib/qti_exporter/qti_exporter.rb @@ -32,7 +32,7 @@ class QtiExporter < Canvas::Migrator end @course[:assessment_questions] = convert_questions - @course[:assessments] = convert_assessments(@course[:assessment_questions]) + @course[:assessments] = convert_assessments(@course[:assessment_questions][:assessment_questions]) @course[:file_map] = convert_files if settings[:apply_respondus_settings_file] @@ -107,7 +107,7 @@ class QtiExporter < Canvas::Migrator raise "The QTI must be converted to 2.1 before converting to JSON" unless @converted begin manifest_file = File.join(@dest_dir_2_1, MANIFEST_FILE) - @quizzes[:assessments] = Qti.convert_assessments(manifest_file, false, questions[:assessment_questions]) + @quizzes[:assessments] = Qti.convert_assessments(manifest_file, :questions => questions) rescue => e message = "Error processing assessment QTI data: #{$!}: #{$!.backtrace.join("\n")}" add_error "qti_assessments", message, @questions, e diff --git a/vendor/plugins/qti_exporter/spec/lib/qti_converter/angel_cc_questions_spec.rb b/vendor/plugins/qti_exporter/spec/lib/qti_converter/angel_cc_questions_spec.rb index f3ea48487b4..b989b2e6239 100644 --- a/vendor/plugins/qti_exporter/spec/lib/qti_converter/angel_cc_questions_spec.rb +++ b/vendor/plugins/qti_exporter/spec/lib/qti_converter/angel_cc_questions_spec.rb @@ -30,7 +30,7 @@ describe "Converting Angel CC QTI" do it "should convert the assessment into a quiz" do manifest_node=get_manifest_node('assessment', :quiz_type => 'Test') - a = Qti::AssessmentTestConverter.new(manifest_node, angel_question_dir, false) + a = Qti::AssessmentTestConverter.new(manifest_node, angel_question_dir) a.create_instructure_quiz a.quiz.should == AngelExpected::ASSESSMENT end diff --git a/vendor/plugins/qti_exporter/spec/lib/qti_converter/bb8_questions_spec.rb b/vendor/plugins/qti_exporter/spec/lib/qti_converter/bb8_questions_spec.rb index 1665a2c5d3b..efb72adc222 100644 --- a/vendor/plugins/qti_exporter/spec/lib/qti_converter/bb8_questions_spec.rb +++ b/vendor/plugins/qti_exporter/spec/lib/qti_converter/bb8_questions_spec.rb @@ -104,7 +104,7 @@ describe "Converting Blackboard 8 qti" do it "should convert the assessments into quizzes" do manifest_node=get_manifest_node('assessment', :quiz_type => 'Test') - a = Qti::AssessmentTestConverter.new(manifest_node, bb8_question_dir, false) + a = Qti::AssessmentTestConverter.new(manifest_node, bb8_question_dir) a.create_instructure_quiz a.quiz.should == BB8Expected::ASSESSMENT end diff --git a/vendor/plugins/qti_exporter/spec/lib/qti_converter/cengage_questions_spec.rb b/vendor/plugins/qti_exporter/spec/lib/qti_converter/cengage_questions_spec.rb index 3564856352b..261f1881e11 100644 --- a/vendor/plugins/qti_exporter/spec/lib/qti_converter/cengage_questions_spec.rb +++ b/vendor/plugins/qti_exporter/spec/lib/qti_converter/cengage_questions_spec.rb @@ -11,7 +11,7 @@ describe "Converting a cengage QTI" do it "should point a group to a question bank" do manifest_node=get_manifest_node('group_to_bank', :quiz_type => 'examination') - a = Qti::AssessmentTestConverter.new(manifest_node, cengage_question_dir, true) + a = Qti::AssessmentTestConverter.new(manifest_node, cengage_question_dir) a.create_instructure_quiz group = a.quiz[:questions].first group[:pick_count].should == 20 diff --git a/vendor/plugins/qti_exporter/spec/lib/qti_converter/d2l_questions_spec.rb b/vendor/plugins/qti_exporter/spec/lib/qti_converter/d2l_questions_spec.rb index 1b0aca44fd8..0703b21d595 100644 --- a/vendor/plugins/qti_exporter/spec/lib/qti_converter/d2l_questions_spec.rb +++ b/vendor/plugins/qti_exporter/spec/lib/qti_converter/d2l_questions_spec.rb @@ -27,7 +27,7 @@ describe "Converting D2L QTI" do it "should convert matching" do #pp get_question_hash(d2l_question_dir, 'matching', false) - hash = get_question_hash(d2l_question_dir, 'matching', false) + hash = get_question_hash(d2l_question_dir, 'matching', false, :flavor => 'd2l') matches = {} hash[:matches].each {|m| matches[m[:match_id]] = m[:text]} hash[:answers].each do |a| diff --git a/vendor/plugins/qti_exporter/spec/lib/qti_converter/respondus_spec.rb b/vendor/plugins/qti_exporter/spec/lib/qti_converter/respondus_spec.rb index b44561181c2..d0f1f566215 100644 --- a/vendor/plugins/qti_exporter/spec/lib/qti_converter/respondus_spec.rb +++ b/vendor/plugins/qti_exporter/spec/lib/qti_converter/respondus_spec.rb @@ -82,7 +82,7 @@ describe "Converting respondus QTI" do it "should convert the assessment into a quiz" do manifest_node=get_manifest_node('assessment', :quiz_type => 'Test') - a = Qti::AssessmentTestConverter.new(manifest_node, respondus_question_dir, false) + a = Qti::AssessmentTestConverter.new(manifest_node, respondus_question_dir) a.create_instructure_quiz a.quiz.should == RespondusExpected::ASSESSMENT end diff --git a/vendor/plugins/qti_exporter/spec/lib/qti_converter/vista_questions_spec.rb b/vendor/plugins/qti_exporter/spec/lib/qti_converter/vista_questions_spec.rb index fa10b66fd8d..5a7478009c5 100644 --- a/vendor/plugins/qti_exporter/spec/lib/qti_converter/vista_questions_spec.rb +++ b/vendor/plugins/qti_exporter/spec/lib/qti_converter/vista_questions_spec.rb @@ -73,7 +73,7 @@ describe "Converting Blackboard Vista qti" do it "should convert the assessments into quizzes" do manifest_node=get_manifest_node('assessment', :quiz_type => 'examination') - a = Qti::AssessmentTestConverter.new(manifest_node, vista_question_dir, true) + a = Qti::AssessmentTestConverter.new(manifest_node, vista_question_dir, :flavor=>Qti::Flavors::WEBCT) a.create_instructure_quiz a.quiz.should == VistaExpected::ASSESSMENT end diff --git a/vendor/plugins/qti_exporter/spec/qti_helper.rb b/vendor/plugins/qti_exporter/spec/qti_helper.rb index 3477695315f..d25c2f24ac3 100644 --- a/vendor/plugins/qti_exporter/spec/qti_helper.rb +++ b/vendor/plugins/qti_exporter/spec/qti_helper.rb @@ -14,15 +14,15 @@ end require 'qti_exporter' require 'pp' -def get_question_hash(dir, name, delete_answer_ids=true) - hash = get_quiz_data(dir, name).first.first +def get_question_hash(dir, name, delete_answer_ids=true, opts={}) + hash = get_quiz_data(dir, name, opts).first.first hash[:answers].each {|a|a.delete(:id)} if delete_answer_ids hash end -def get_quiz_data(dir, name) +def get_quiz_data(dir, name, opts={}) File.open(File.join(dir, '%s.xml' % name), 'r') do |file| - Qti.convert_xml(file.read) + Qti.convert_xml(file.read, opts) end end