qti 2.9.0 → 2.9.2
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/qti/content_packaging/assessment_item.rb +2 -0
- data/lib/qti/content_packaging/assessment_test.rb +2 -0
- data/lib/qti/content_packaging/choice_interaction.rb +1 -1
- data/lib/qti/content_packaging/outcome_declaration.rb +3 -1
- data/lib/qti/v1/models/interactions/base_interaction.rb +6 -4
- data/lib/qti/version.rb +1 -1
- data/spec/fixtures/items_1.2/mc_feedback.xml +161 -0
- data/spec/lib/qti/v1/models/interactions/base_interaction_spec.rb +22 -0
- metadata +12 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2dc18241493cc73026c3aa2c51534c22d8b880b4e5405659b875e03354c4164
|
4
|
+
data.tar.gz: 19381b84fe5cff67721722d8329ad82399a7cd75bd1ae6a972b566b594b9ec97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbe4b4ea5336f9f76e219c5045f3182f9fa1ea18372dd796cb7ecb43bf4787633d1692e28d505c35231c62d6432c9691826fdda1cabdb3543afb991731dc8ebf
|
7
|
+
data.tar.gz: 18c96ba1be32ba9fdbdc90dc8678668395ac723f26c76283182f2e597318ab8844071c5908d5ea0638ad61e02362e8079a6da7d51c0c527abc283cdb0a2e4732
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Qti
|
2
2
|
module ContentPackaging
|
3
3
|
class AssessmentTest < Dry::Struct
|
4
|
+
constructor_type :schema
|
5
|
+
|
4
6
|
attribute :identifier, Types::Strict::String
|
5
7
|
attribute :title, Types::Strict::String
|
6
8
|
attribute :items, Types::Strict::Array.of(ContentPackaging::AssessmentItem)
|
@@ -5,7 +5,7 @@ module Qti
|
|
5
5
|
|
6
6
|
attribute :prompt, Types::Strict::String
|
7
7
|
attribute :shuffle, Types::Strict::Bool.default(false)
|
8
|
-
attribute :maxChoices, Types::Coercible::
|
8
|
+
attribute :maxChoices, Types::Coercible::Integer
|
9
9
|
attribute :choices, Types::Strict::Array.of(ContentPackaging::SimpleChoice)
|
10
10
|
end
|
11
11
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
module Qti
|
2
2
|
module ContentPackaging
|
3
3
|
class OutcomeDeclaration < Dry::Struct
|
4
|
+
constructor_type :schema
|
5
|
+
|
4
6
|
attribute :identifier, Types::Strict::String
|
5
7
|
attribute :baseType, Types::Strict::String
|
6
8
|
attribute :cardinality, Types::Strict::String
|
7
|
-
attribute :defaultValue, Types::Strict::String | Types::Coercible::
|
9
|
+
attribute :defaultValue, Types::Strict::String | Types::Coercible::Integer | Types::Coercible::Float
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -62,7 +62,7 @@ module Qti
|
|
62
62
|
'xmlns:displayfeedback/..'
|
63
63
|
answers = node.xpath(path).map do |entry|
|
64
64
|
answer_feedback_entry(entry)
|
65
|
-
end
|
65
|
+
end.compact
|
66
66
|
answers unless answers.empty?
|
67
67
|
end
|
68
68
|
|
@@ -70,13 +70,15 @@ module Qti
|
|
70
70
|
|
71
71
|
def answer_feedback_entry(entry)
|
72
72
|
ve = entry.xpath('.//xmlns:varequal').first
|
73
|
-
refid = entry.xpath('./xmlns:displayfeedback
|
73
|
+
refid = entry.xpath('./xmlns:displayfeedback[not (@linkrefid="correct_fb" or ' \
|
74
|
+
'@linkrefid="general_incorrect_fb" or @linkrefid="general_fb")]').first&.[](:linkrefid)
|
74
75
|
feedback = get_feedback(refid)
|
76
|
+
return nil unless feedback
|
75
77
|
{
|
76
78
|
response_id: ve[:respident],
|
77
79
|
response_value: ve.text,
|
78
|
-
texttype: feedback[:texttype
|
79
|
-
feedback: feedback
|
80
|
+
texttype: feedback&.[](:texttype),
|
81
|
+
feedback: feedback&.text
|
80
82
|
}
|
81
83
|
end
|
82
84
|
|
data/lib/qti/version.rb
CHANGED
@@ -0,0 +1,161 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
|
3
|
+
<assessment ident="gb343914ff50ec732bd9d38b16688e302" title="Feedback Check">
|
4
|
+
<qtimetadata>
|
5
|
+
<qtimetadatafield>
|
6
|
+
<fieldlabel>cc_maxattempts</fieldlabel>
|
7
|
+
<fieldentry>1</fieldentry>
|
8
|
+
</qtimetadatafield>
|
9
|
+
</qtimetadata>
|
10
|
+
<section ident="root_section">
|
11
|
+
<item ident="g5a997009fe86a353f1616f0c81746649" title="Question">
|
12
|
+
<itemmetadata>
|
13
|
+
<qtimetadata>
|
14
|
+
<qtimetadatafield>
|
15
|
+
<fieldlabel>question_type</fieldlabel>
|
16
|
+
<fieldentry>multiple_choice_question</fieldentry>
|
17
|
+
</qtimetadatafield>
|
18
|
+
<qtimetadatafield>
|
19
|
+
<fieldlabel>points_possible</fieldlabel>
|
20
|
+
<fieldentry>1.0</fieldentry>
|
21
|
+
</qtimetadatafield>
|
22
|
+
<qtimetadatafield>
|
23
|
+
<fieldlabel>original_answer_ids</fieldlabel>
|
24
|
+
<fieldentry>5706,2408,621,7011</fieldentry>
|
25
|
+
</qtimetadatafield>
|
26
|
+
<qtimetadatafield>
|
27
|
+
<fieldlabel>assessment_question_identifierref</fieldlabel>
|
28
|
+
<fieldentry>g71ef6570433d355e50f9dfc92e1268ff</fieldentry>
|
29
|
+
</qtimetadatafield>
|
30
|
+
</qtimetadata>
|
31
|
+
</itemmetadata>
|
32
|
+
<presentation>
|
33
|
+
<material>
|
34
|
+
<mattext texttype="text/html"><div><p>Feedback Check</p></div></mattext>
|
35
|
+
</material>
|
36
|
+
<response_lid ident="response1" rcardinality="Single">
|
37
|
+
<render_choice>
|
38
|
+
<response_label ident="5706">
|
39
|
+
<material>
|
40
|
+
<mattext texttype="text/plain">A</mattext>
|
41
|
+
</material>
|
42
|
+
</response_label>
|
43
|
+
<response_label ident="2408">
|
44
|
+
<material>
|
45
|
+
<mattext texttype="text/plain">B</mattext>
|
46
|
+
</material>
|
47
|
+
</response_label>
|
48
|
+
<response_label ident="621">
|
49
|
+
<material>
|
50
|
+
<mattext texttype="text/plain">C</mattext>
|
51
|
+
</material>
|
52
|
+
</response_label>
|
53
|
+
<response_label ident="7011">
|
54
|
+
<material>
|
55
|
+
<mattext texttype="text/plain">D</mattext>
|
56
|
+
</material>
|
57
|
+
</response_label>
|
58
|
+
</render_choice>
|
59
|
+
</response_lid>
|
60
|
+
</presentation>
|
61
|
+
<resprocessing>
|
62
|
+
<outcomes>
|
63
|
+
<decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
|
64
|
+
</outcomes>
|
65
|
+
<respcondition continue="Yes">
|
66
|
+
<conditionvar>
|
67
|
+
<other/>
|
68
|
+
</conditionvar>
|
69
|
+
<displayfeedback feedbacktype="Response" linkrefid="general_fb"/>
|
70
|
+
</respcondition>
|
71
|
+
<respcondition continue="Yes">
|
72
|
+
<conditionvar>
|
73
|
+
<varequal respident="response1">5706</varequal>
|
74
|
+
</conditionvar>
|
75
|
+
<displayfeedback feedbacktype="Response" linkrefid="5706_fb"/>
|
76
|
+
</respcondition>
|
77
|
+
<respcondition continue="Yes">
|
78
|
+
<conditionvar>
|
79
|
+
<varequal respident="response1">2408</varequal>
|
80
|
+
</conditionvar>
|
81
|
+
<displayfeedback feedbacktype="Response" linkrefid="2408_fb"/>
|
82
|
+
</respcondition>
|
83
|
+
<respcondition continue="Yes">
|
84
|
+
<conditionvar>
|
85
|
+
<varequal respident="response1">621</varequal>
|
86
|
+
</conditionvar>
|
87
|
+
<displayfeedback feedbacktype="Response" linkrefid="621_fb"/>
|
88
|
+
</respcondition>
|
89
|
+
<respcondition continue="Yes">
|
90
|
+
<conditionvar>
|
91
|
+
<varequal respident="response1">7011</varequal>
|
92
|
+
</conditionvar>
|
93
|
+
<displayfeedback feedbacktype="Response" linkrefid="7011_fb"/>
|
94
|
+
</respcondition>
|
95
|
+
<respcondition continue="No">
|
96
|
+
<conditionvar>
|
97
|
+
<varequal respident="response1">5706</varequal>
|
98
|
+
</conditionvar>
|
99
|
+
<setvar action="Set" varname="SCORE">100</setvar>
|
100
|
+
<displayfeedback feedbacktype="Response" linkrefid="correct_fb"/>
|
101
|
+
</respcondition>
|
102
|
+
<respcondition continue="Yes">
|
103
|
+
<conditionvar>
|
104
|
+
<other/>
|
105
|
+
</conditionvar>
|
106
|
+
<displayfeedback feedbacktype="Response" linkrefid="general_incorrect_fb"/>
|
107
|
+
</respcondition>
|
108
|
+
</resprocessing>
|
109
|
+
<itemfeedback ident="general_fb">
|
110
|
+
<flow_mat>
|
111
|
+
<material>
|
112
|
+
<mattext texttype="text/html"><p>General Feedback</p></mattext>
|
113
|
+
</material>
|
114
|
+
</flow_mat>
|
115
|
+
</itemfeedback>
|
116
|
+
<itemfeedback ident="correct_fb">
|
117
|
+
<flow_mat>
|
118
|
+
<material>
|
119
|
+
<mattext texttype="text/html"><p>General Correct Feedback</p></mattext>
|
120
|
+
</material>
|
121
|
+
</flow_mat>
|
122
|
+
</itemfeedback>
|
123
|
+
<itemfeedback ident="general_incorrect_fb">
|
124
|
+
<flow_mat>
|
125
|
+
<material>
|
126
|
+
<mattext texttype="text/html"><p>General Incorrect Feedback</p></mattext>
|
127
|
+
</material>
|
128
|
+
</flow_mat>
|
129
|
+
</itemfeedback>
|
130
|
+
<itemfeedback ident="5706_fb">
|
131
|
+
<flow_mat>
|
132
|
+
<material>
|
133
|
+
<mattext texttype="text/html"><p>Answer A Feedback</p></mattext>
|
134
|
+
</material>
|
135
|
+
</flow_mat>
|
136
|
+
</itemfeedback>
|
137
|
+
<itemfeedback ident="2408_fb">
|
138
|
+
<flow_mat>
|
139
|
+
<material>
|
140
|
+
<mattext texttype="text/html"><p>Answer B Feedback</p></mattext>
|
141
|
+
</material>
|
142
|
+
</flow_mat>
|
143
|
+
</itemfeedback>
|
144
|
+
<itemfeedback ident="621_fb">
|
145
|
+
<flow_mat>
|
146
|
+
<material>
|
147
|
+
<mattext texttype="text/html"><p>Answer C Feedback</p></mattext>
|
148
|
+
</material>
|
149
|
+
</flow_mat>
|
150
|
+
</itemfeedback>
|
151
|
+
<itemfeedback ident="7011_fb">
|
152
|
+
<flow_mat>
|
153
|
+
<material>
|
154
|
+
<mattext texttype="text/html"><p>Answer D Feedback</p></mattext>
|
155
|
+
</material>
|
156
|
+
</flow_mat>
|
157
|
+
</itemfeedback>
|
158
|
+
</item>
|
159
|
+
</section>
|
160
|
+
</assessment>
|
161
|
+
</questestinterop>
|
@@ -72,4 +72,26 @@ describe Qti::V1::Models::Interactions::BaseInteraction do
|
|
72
72
|
include_examples('item_level_feedback')
|
73
73
|
include_examples('answer_feedback')
|
74
74
|
end
|
75
|
+
|
76
|
+
context 'mc_feedback.xml' do
|
77
|
+
let(:file_path) { File.join(fixtures_path, 'mc_feedback.xml') }
|
78
|
+
let(:general_fb) { '<p>General Feedback</p>' }
|
79
|
+
let(:correct_fb) { '<p>General Correct Feedback</p>' }
|
80
|
+
let(:incorrect_fb) { '<p>General Incorrect Feedback</p>' }
|
81
|
+
let(:answer_fb) do
|
82
|
+
[
|
83
|
+
{ response_id: 'response1', response_value: '5706',
|
84
|
+
texttype: 'text/html', feedback: '<p>Answer A Feedback</p>' },
|
85
|
+
{ response_id: 'response1', response_value: '2408',
|
86
|
+
texttype: 'text/html', feedback: '<p>Answer B Feedback</p>' },
|
87
|
+
{ response_id: 'response1', response_value: '621',
|
88
|
+
texttype: 'text/html', feedback: '<p>Answer C Feedback</p>' },
|
89
|
+
{ response_id: 'response1', response_value: '7011',
|
90
|
+
texttype: 'text/html', feedback: '<p>Answer D Feedback</p>' }
|
91
|
+
]
|
92
|
+
end
|
93
|
+
|
94
|
+
include_examples('item_level_feedback')
|
95
|
+
include_examples('answer_feedback')
|
96
|
+
end
|
75
97
|
end
|
metadata
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.9.
|
4
|
+
version: 2.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
-
|
7
|
+
- Adrian Diaz
|
8
|
+
- Alex Slaughter
|
9
|
+
- James Logan
|
10
|
+
- Jorge Arteaga
|
11
|
+
- Stephen Kacsmark
|
9
12
|
autorequire:
|
10
13
|
bindir: bin
|
11
14
|
cert_chain: []
|
12
|
-
date: 2022-
|
15
|
+
date: 2022-05-09 00:00:00.000000000 Z
|
13
16
|
dependencies:
|
14
17
|
- !ruby/object:Gem::Dependency
|
15
18
|
name: actionview
|
@@ -71,14 +74,14 @@ dependencies:
|
|
71
74
|
requirements:
|
72
75
|
- - "~>"
|
73
76
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0.
|
77
|
+
version: 0.14.0
|
75
78
|
type: :runtime
|
76
79
|
prerelease: false
|
77
80
|
version_requirements: !ruby/object:Gem::Requirement
|
78
81
|
requirements:
|
79
82
|
- - "~>"
|
80
83
|
- !ruby/object:Gem::Version
|
81
|
-
version: 0.
|
84
|
+
version: 0.14.0
|
82
85
|
- !ruby/object:Gem::Dependency
|
83
86
|
name: mathml2latex
|
84
87
|
requirement: !ruby/object:Gem::Requirement
|
@@ -277,8 +280,6 @@ dependencies:
|
|
277
280
|
version: '1.4'
|
278
281
|
description:
|
279
282
|
email:
|
280
|
-
- hannah@instructure.com
|
281
|
-
- rrodriguez-bd@instructure.com
|
282
283
|
- quizzes@instructure.com
|
283
284
|
executables: []
|
284
285
|
extensions: []
|
@@ -382,6 +383,7 @@ files:
|
|
382
383
|
- spec/fixtures/items_1.2/item_no_title.xml
|
383
384
|
- spec/fixtures/items_1.2/matching.xml
|
384
385
|
- spec/fixtures/items_1.2/matching_feedback.xml
|
386
|
+
- spec/fixtures/items_1.2/mc_feedback.xml
|
385
387
|
- spec/fixtures/items_1.2/multiple_answer.xml
|
386
388
|
- spec/fixtures/items_1.2/multiple_answer_canvas.xml
|
387
389
|
- spec/fixtures/items_1.2/multiple_choice.xml
|
@@ -699,7 +701,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
699
701
|
- !ruby/object:Gem::Version
|
700
702
|
version: '0'
|
701
703
|
requirements: []
|
702
|
-
rubygems_version: 3.
|
704
|
+
rubygems_version: 3.1.6
|
703
705
|
signing_key:
|
704
706
|
specification_version: 4
|
705
707
|
summary: QTI 1.2 and 2.1 import and export models
|
@@ -734,6 +736,7 @@ test_files:
|
|
734
736
|
- spec/fixtures/items_1.2/item_no_title.xml
|
735
737
|
- spec/fixtures/items_1.2/matching.xml
|
736
738
|
- spec/fixtures/items_1.2/matching_feedback.xml
|
739
|
+
- spec/fixtures/items_1.2/mc_feedback.xml
|
737
740
|
- spec/fixtures/items_1.2/multiple_answer.xml
|
738
741
|
- spec/fixtures/items_1.2/multiple_answer_canvas.xml
|
739
742
|
- spec/fixtures/items_1.2/multiple_choice.xml
|