canvas_qti_to_learnosity_converter 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/canvas_qti_to_learnosity_converter/convert.rb +27 -24
- data/lib/canvas_qti_to_learnosity_converter/questions/calculated.rb +75 -0
- data/lib/canvas_qti_to_learnosity_converter/questions/numerical.rb +0 -1
- data/lib/canvas_qti_to_learnosity_converter/questions/question.rb +10 -0
- data/lib/canvas_qti_to_learnosity_converter/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e102ffcbd4d59f3fb3e466bdfada0f614ed1ae8438e2e63322454d1585203f7
|
4
|
+
data.tar.gz: 8f52c78fc0e604827e947095e4ca12ed2a1da248a2d97fa9ca18721da255e0c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96621e2221a06448c6a351cee7f460ef5067c470cc84102b9b2e37bab8d8d6e77c9ee81ca006d7336cffb42ac4d1972b3a957eb2e31f8f7f8fd2b3125ffc8d70
|
7
|
+
data.tar.gz: e184a67f1c709ed6189bb2d7fe8aee3484d03a2f0a8ee25747fed902c3fbe78f62634f4f2aa878976624e70c5f97eef551e49dc7300981f4ba19a4b7b982ec69
|
@@ -13,6 +13,7 @@ require "canvas_qti_to_learnosity_converter/questions/essay"
|
|
13
13
|
require "canvas_qti_to_learnosity_converter/questions/file_upload"
|
14
14
|
require "canvas_qti_to_learnosity_converter/questions/text_only"
|
15
15
|
require "canvas_qti_to_learnosity_converter/questions/numerical"
|
16
|
+
require "canvas_qti_to_learnosity_converter/questions/calculated"
|
16
17
|
|
17
18
|
module CanvasQtiToLearnosityConverter
|
18
19
|
FEATURE_TYPES = [ :text_only_question ]
|
@@ -28,6 +29,21 @@ module CanvasQtiToLearnosityConverter
|
|
28
29
|
:file_upload_question,
|
29
30
|
]
|
30
31
|
|
32
|
+
TYPE_MAP = {
|
33
|
+
multiple_choice_question: MultipleChoiceQuestion,
|
34
|
+
true_false_question: MultipleChoiceQuestion,
|
35
|
+
multiple_answers_question: MultipleAnswersQuestion,
|
36
|
+
short_answer_question: ShortAnswerQuestion,
|
37
|
+
fill_in_multiple_blanks_question: FillTheBlanksQuestion,
|
38
|
+
multiple_dropdowns_question: MultipleDropdownsQuestion,
|
39
|
+
matching_question: MatchingQuestion,
|
40
|
+
essay_question: EssayQuestion,
|
41
|
+
file_upload_question: FileUploadQuestion,
|
42
|
+
text_only_question: TextOnlyQuestion,
|
43
|
+
numerical_question: NumericalQuestion,
|
44
|
+
calculated_question: CalculatedQuestion,
|
45
|
+
}
|
46
|
+
|
31
47
|
class CanvasQuestionTypeNotSupportedError < RuntimeError
|
32
48
|
end
|
33
49
|
|
@@ -85,29 +101,10 @@ module CanvasQtiToLearnosityConverter
|
|
85
101
|
learnosity_type = "question"
|
86
102
|
end
|
87
103
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
MultipleChoiceQuestion.new(xml)
|
93
|
-
when :multiple_answers_question
|
94
|
-
MultipleAnswersQuestion.new(xml)
|
95
|
-
when :short_answer_question
|
96
|
-
ShortAnswerQuestion.new(xml)
|
97
|
-
when :fill_in_multiple_blanks_question
|
98
|
-
FillTheBlanksQuestion.new(xml)
|
99
|
-
when :multiple_dropdowns_question
|
100
|
-
MultipleDropdownsQuestion.new(xml)
|
101
|
-
when :matching_question
|
102
|
-
MatchingQuestion.new(xml)
|
103
|
-
when :essay_question
|
104
|
-
EssayQuestion.new(xml)
|
105
|
-
when :file_upload_question
|
106
|
-
FileUploadQuestion.new(xml)
|
107
|
-
when :text_only_question
|
108
|
-
TextOnlyQuestion.new(xml)
|
109
|
-
when :numerical_question
|
110
|
-
NumericalQuestion.new(xml)
|
104
|
+
question_class = TYPE_MAP[type]
|
105
|
+
|
106
|
+
if question_class
|
107
|
+
question = question_class.new(xml)
|
111
108
|
else
|
112
109
|
raise CanvasQuestionTypeNotSupportedError
|
113
110
|
end
|
@@ -131,7 +128,13 @@ module CanvasQtiToLearnosityConverter
|
|
131
128
|
begin
|
132
129
|
learnosity_type, quiz_item = convert_item(qti_string: item.to_html)
|
133
130
|
|
134
|
-
|
131
|
+
item = {
|
132
|
+
type: learnosity_type,
|
133
|
+
data: quiz_item.to_learnosity,
|
134
|
+
dynamic_content_data: quiz_item.dynamic_content_data()
|
135
|
+
}
|
136
|
+
|
137
|
+
items.push(item)
|
135
138
|
path = [items.count - 1, :data]
|
136
139
|
|
137
140
|
quiz_item.add_learnosity_assets(assets[ident], path)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require "canvas_qti_to_learnosity_converter/questions/template_question"
|
2
|
+
|
3
|
+
module CanvasQtiToLearnosityConverter
|
4
|
+
class CalculatedQuestion < TemplateQuestion
|
5
|
+
def to_learnosity
|
6
|
+
{
|
7
|
+
type: "clozeformula",
|
8
|
+
is_math: true,
|
9
|
+
stimulus: extract_stimulus(),
|
10
|
+
template: "{{response}}",
|
11
|
+
validation: extract_validation(),
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def extract_stimulus()
|
16
|
+
template = get_template()
|
17
|
+
extract_template_values(template).each.with_index do |var_name, index|
|
18
|
+
template.sub!("[#{var_name}]", "{{var:val#{index}}}")
|
19
|
+
end
|
20
|
+
|
21
|
+
template
|
22
|
+
end
|
23
|
+
|
24
|
+
def extract_validation()
|
25
|
+
pm = @xml.css("item > itemproc_extension > calculated > answer_tolerance")
|
26
|
+
.first.text
|
27
|
+
|
28
|
+
{
|
29
|
+
"scoring_type" => "exactMatch",
|
30
|
+
"valid_response" => {
|
31
|
+
"value" => [[{
|
32
|
+
"method" => "equivValue",
|
33
|
+
"value" => "{{var:answer}}\\pm#{pm}"
|
34
|
+
}]]
|
35
|
+
}
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_learnosity_assets(assets, path)
|
40
|
+
learnosity = to_learnosity
|
41
|
+
CanvasQtiToLearnosityConverter.add_files_to_assets(
|
42
|
+
assets,
|
43
|
+
path + [:stimulus],
|
44
|
+
learnosity[:stimulus]
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def dynamic_content_data()
|
49
|
+
values = extract_dynamic_content_data()
|
50
|
+
|
51
|
+
columns = (0...(values.first.count - 1)).map{ |x| "val#{x}" }
|
52
|
+
columns.push("answer")
|
53
|
+
|
54
|
+
rows = Hash[values.map.with_index do |row, index|
|
55
|
+
[make_identifier(), { values: row, index: index }]
|
56
|
+
end]
|
57
|
+
|
58
|
+
{ cols: columns, rows: rows }
|
59
|
+
end
|
60
|
+
|
61
|
+
def extract_dynamic_content_data()
|
62
|
+
template = get_template()
|
63
|
+
vars = extract_template_values(template).map do |var_name|
|
64
|
+
@xml.css(%{item > itemproc_extension > calculated > var_sets >
|
65
|
+
var_set > var[name="#{var_name}"]}).map { |node| node.text }
|
66
|
+
end
|
67
|
+
|
68
|
+
answers = @xml.css("item > itemproc_extension var_sets answer").map do |node|
|
69
|
+
node.text
|
70
|
+
end
|
71
|
+
|
72
|
+
vars.push(answers).transpose
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -24,7 +24,6 @@ module CanvasQtiToLearnosityConverter
|
|
24
24
|
end
|
25
25
|
|
26
26
|
answer_bounds = response_mins.zip(response_maxs).map do |bounds|
|
27
|
-
puts bounds.inspect
|
28
27
|
# Get the precision by counting the number of places after the decimal
|
29
28
|
precision = [
|
30
29
|
bounds.first.split(".").last.length,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
|
1
3
|
module CanvasQtiToLearnosityConverter
|
2
4
|
class QuizQuestion
|
3
5
|
extend Forwardable
|
@@ -15,5 +17,13 @@ module CanvasQtiToLearnosityConverter
|
|
15
17
|
def extract_mattext(mattext_node)
|
16
18
|
mattext_node.content
|
17
19
|
end
|
20
|
+
|
21
|
+
def make_identifier()
|
22
|
+
SecureRandom.uuid
|
23
|
+
end
|
24
|
+
|
25
|
+
def dynamic_content_data()
|
26
|
+
{}
|
27
|
+
end
|
18
28
|
end
|
19
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_qti_to_learnosity_converter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Atomic Jolt
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-08-
|
12
|
+
date: 2018-08-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- canvas_qti_to_learnosity_converter.gemspec
|
116
116
|
- lib/canvas_qti_to_learnosity_converter.rb
|
117
117
|
- lib/canvas_qti_to_learnosity_converter/convert.rb
|
118
|
+
- lib/canvas_qti_to_learnosity_converter/questions/calculated.rb
|
118
119
|
- lib/canvas_qti_to_learnosity_converter/questions/essay.rb
|
119
120
|
- lib/canvas_qti_to_learnosity_converter/questions/file_upload.rb
|
120
121
|
- lib/canvas_qti_to_learnosity_converter/questions/fill_the_blanks.rb
|