qti 2.9.0 → 2.9.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 795e15592723e240bf42bb23030ae237606cdb9c4191ce010bf241ae1d23d6f7
4
- data.tar.gz: ce7a0e634699b57c08ce425d247b928405b36de2dc98f34435dbf6e84e7e4551
3
+ metadata.gz: e648510b781222e5d0e43ac7ba30ab1d252cf14360b38d28f03ec5231f053b6e
4
+ data.tar.gz: fb44120abe93da6c1237a188641d743724ce5db9c0c5a7bffe9853236d423f06
5
5
  SHA512:
6
- metadata.gz: 2699fb585fa48d0ee298426ae9ecca58724f5298cc3422e0d5363acbffae04bc3e58502bd72e7cc7433571975cb0152c81887d743412678c4a79bc691dfde2e0
7
- data.tar.gz: 8b6bd0ac53d3c5783c7ebdea6d2cabe238b37ccb0365ae8ef045207a1d9d1493ebc48f4ae13371a4ecb872ca67fdbc8d9232e45c156e6c83e70b10fa311161db
6
+ metadata.gz: 5d86e4792c5d904a667299bbc6f005105a064a8cf61bff5d5ca87e3d716fc08274a36804dbb1404c2a82bdd6264c039146614595edfad65f151606cb0f527588
7
+ data.tar.gz: 3ced8059b3d3fd86ce0604076e2f8b37a2b6820342ac102ef64b47abca8ac048675fec879ee5a60f113c104d4a9538d5150b43a55eedf90c1bf33aa31f807df7
@@ -1,10 +1,12 @@
1
1
  module Qti
2
2
  module ContentPackaging
3
3
  class AssessmentItem < Dry::Struct
4
+ constructor_type :schema
5
+
4
6
  attribute :identifier, Types::Strict::String
5
7
  attribute :title, Types::Strict::String
6
8
  attribute :interaction, ContentPackaging::ChoiceInteraction
7
- attribute :response, Types::Strict::Array.of(String) | Types::Strict::String
9
+ attribute :response, Types::Strict::Array.of(Types::Strict::String) | Types::Strict::String
8
10
  end
9
11
  end
10
12
  end
@@ -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::Int
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::Int | Types::Coercible::Float
9
+ attribute :defaultValue, Types::Strict::String | Types::Coercible::Integer | Types::Coercible::Float
8
10
  end
9
11
  end
10
12
  end
@@ -9,20 +9,23 @@ module Qti
9
9
  item_prompt.split(CANVAS_REGEX).map.with_index do |stem_item, index|
10
10
  if canvas_fib_response_ids.include?(stem_item)
11
11
  # Strip the brackets before searching
12
- stem_blank(index, stem_item[1..-2])
12
+ value = stem_item[1..-2]
13
+ blank_id = blank_id(value)
14
+ blank_name = blank_value(blank_id) || value
15
+ stem_blank(index, blank_id, blank_name)
13
16
  else
14
17
  stem_text(index, stem_item)
15
18
  end
16
19
  end
17
20
  end
18
21
 
19
- def stem_blank(index, value)
22
+ def stem_blank(index, blank_id, blank_name)
20
23
  {
21
24
  id: "stem_#{index}",
22
25
  position: index + 1,
23
26
  type: 'blank',
24
- blank_id: blank_id(value),
25
- blank_name: value
27
+ blank_id: blank_id,
28
+ blank_name: blank_name
26
29
  }
27
30
  end
28
31
 
@@ -40,6 +43,11 @@ module Qti
40
43
  canvas_blank_id(stem_item)
41
44
  end
42
45
 
46
+ def blank_value(blank_id)
47
+ blank = canvas_fib_responses.find { |response| response[:id] == blank_id }
48
+ blank&.dig(:choices, 0, :item_body)
49
+ end
50
+
43
51
  def canvas_custom_fitb?
44
52
  @canvas_custom_fitb ||= BaseInteraction.canvas_custom_fitb?(@node)
45
53
  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').first[:linkrefid]
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.text
80
+ texttype: feedback&.[](:texttype),
81
+ feedback: feedback&.text
80
82
  }
81
83
  end
82
84
 
@@ -112,7 +112,10 @@ module Qti
112
112
 
113
113
  def qti_stem_item(index, stem_item)
114
114
  if stem_item.xpath('./xmlns:render_fib').present?
115
- stem_blank(index, stem_item.attributes['ident'].value)
115
+ blank_id = stem_item.attributes['ident'].value
116
+ blank_answer = answers.find { |answer| answer.identifier == blank_id }
117
+ blank_name = blank_answer&.item_body || blank_id
118
+ stem_blank(index, blank_id, blank_name)
116
119
  else
117
120
  stem_text(index, sanitize_content!(stem_item.children.text))
118
121
  end
@@ -4,6 +4,10 @@ module Qti
4
4
  class NonAssessmentTest < Qti::V2::Models::AssessmentTest
5
5
  include Qti::Models::ResourceGroup
6
6
 
7
+ QTIV2_TITLE_PATHS = [
8
+ "//*[local-name()='title' and namespace-uri()='http://ltsc.ieee.org/xsd/LOM']/*[local-name()='string']/text()"
9
+ ].freeze
10
+
7
11
  def assessment_items
8
12
  # Return the xml files we should be parsing
9
13
  @assessment_items ||= begin
@@ -21,6 +25,14 @@ module Qti
21
25
  href = xpath_with_single_check("//xmlns:resource[@identifier='#{dependencies.first}']/@href")
22
26
  remap_href_path(href)
23
27
  end
28
+
29
+ def title
30
+ @title ||= begin
31
+ QTIV2_TITLE_PATHS.map do |path|
32
+ xpath_with_single_check(path)&.content
33
+ end.compact.first
34
+ end || super
35
+ end
24
36
  end
25
37
  end
26
38
  end
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.9.0'.freeze
2
+ VERSION = '2.9.4'.freeze
3
3
  end
@@ -19,11 +19,11 @@
19
19
  </itemmetadata>
20
20
  <presentation>
21
21
  <material>
22
- <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Bird, bird, bird, bird is the [word]&lt;/p&gt;&lt;/div&gt;</mattext>
22
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Bird, bird, bird, bird is the [blank1]&lt;/p&gt;&lt;/div&gt;</mattext>
23
23
  </material>
24
- <response_lid ident="response_word">
24
+ <response_lid ident="response_blank1">
25
25
  <material>
26
- <mattext>word</mattext>
26
+ <mattext>blank1</mattext>
27
27
  </material>
28
28
  <render_choice>
29
29
  <response_label ident="3537">
@@ -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">&lt;div&gt;&lt;p&gt;Feedback Check&lt;/p&gt;&lt;/div&gt;</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">&lt;p&gt;General Feedback&lt;/p&gt;</mattext>
113
+ </material>
114
+ </flow_mat>
115
+ </itemfeedback>
116
+ <itemfeedback ident="correct_fb">
117
+ <flow_mat>
118
+ <material>
119
+ <mattext texttype="text/html">&lt;p&gt;General Correct Feedback&lt;/p&gt;</mattext>
120
+ </material>
121
+ </flow_mat>
122
+ </itemfeedback>
123
+ <itemfeedback ident="general_incorrect_fb">
124
+ <flow_mat>
125
+ <material>
126
+ <mattext texttype="text/html">&lt;p&gt;General Incorrect Feedback&lt;/p&gt;</mattext>
127
+ </material>
128
+ </flow_mat>
129
+ </itemfeedback>
130
+ <itemfeedback ident="5706_fb">
131
+ <flow_mat>
132
+ <material>
133
+ <mattext texttype="text/html">&lt;p&gt;Answer A Feedback&lt;/p&gt;</mattext>
134
+ </material>
135
+ </flow_mat>
136
+ </itemfeedback>
137
+ <itemfeedback ident="2408_fb">
138
+ <flow_mat>
139
+ <material>
140
+ <mattext texttype="text/html">&lt;p&gt;Answer B Feedback&lt;/p&gt;</mattext>
141
+ </material>
142
+ </flow_mat>
143
+ </itemfeedback>
144
+ <itemfeedback ident="621_fb">
145
+ <flow_mat>
146
+ <material>
147
+ <mattext texttype="text/html">&lt;p&gt;Answer C Feedback&lt;/p&gt;</mattext>
148
+ </material>
149
+ </flow_mat>
150
+ </itemfeedback>
151
+ <itemfeedback ident="7011_fb">
152
+ <flow_mat>
153
+ <material>
154
+ <mattext texttype="text/html">&lt;p&gt;Answer D Feedback&lt;/p&gt;</mattext>
155
+ </material>
156
+ </flow_mat>
157
+ </itemfeedback>
158
+ </item>
159
+ </section>
160
+ </assessment>
161
+ </questestinterop>
@@ -7,6 +7,13 @@ identifier="non-assessment-item">
7
7
  <metadata>
8
8
  <schema>QTIv2.2 Package</schema>
9
9
  <schemaversion>1.0.0</schemaversion>
10
+ <lom xmlns="http://ltsc.ieee.org/xsd/LOM">
11
+ <general>
12
+ <title>
13
+ <string>1027TestTitle12</string>
14
+ </title>
15
+ </general>
16
+ </lom>
10
17
  </metadata>
11
18
  <organizations/>
12
19
  <resources>
@@ -12,11 +12,11 @@ describe Qti::V1::Models::Interactions::BaseFillBlankInteraction do
12
12
 
13
13
  context 'canvas_stem_items' do
14
14
  let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib_as_single.xml') }
15
- let(:simple_prompt) { 'fill in the [blank]' }
15
+ let(:simple_prompt) { 'fill in the [blank1]' }
16
16
  let(:simple_expected) do
17
17
  [
18
18
  { id: 'stem_0', position: 1, type: 'text', value: 'fill in the ' },
19
- { id: 'stem_1', position: 2, type: 'text', value: '[blank]' }
19
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_blank1', blank_name: 'word' }
20
20
  ]
21
21
  end
22
22
  let(:embedded_prompt) { '[[embedded] [groups]]' }
@@ -92,7 +92,7 @@ describe Qti::V1::Models::Interactions::BaseFillBlankInteraction do
92
92
  let(:expected_blanks) do
93
93
  [
94
94
  {
95
- id: 'response_word',
95
+ id: 'response_blank1',
96
96
  choices:
97
97
  [
98
98
  { id: '3537', item_body: 'word', position: 2 }
@@ -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
@@ -44,9 +44,9 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
44
44
  let(:expected_stem_items) do
45
45
  [
46
46
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Roses are ' },
47
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'color1' },
47
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'red' },
48
48
  { id: 'stem_2', position: 3, type: 'text', value: ', violets are ' },
49
- { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'color2' },
49
+ { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'blue' },
50
50
  { id: 'stem_4', position: 5, type: 'text', value: '.</p></div>' }
51
51
  ]
52
52
  end
@@ -47,7 +47,7 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
47
47
  let(:expected_stem_items) do
48
48
  [
49
49
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Chicago is in what state?</p></div>' },
50
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response1', blank_name: 'response1' }
50
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response1', blank_name: 'Illinois' }
51
51
  ]
52
52
  end
53
53
 
@@ -72,9 +72,9 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
72
72
  let(:expected_stem_items) do
73
73
  [
74
74
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p><span>Roses are ' },
75
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'color1' },
75
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'red' },
76
76
  { id: 'stem_2', position: 3, type: 'text', value: ', violets are ' },
77
- { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'color2' },
77
+ { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'blue' },
78
78
  { id: 'stem_4', position: 5, type: 'text', value: '</span></p></div>' }
79
79
  ]
80
80
  end
@@ -102,11 +102,11 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
102
102
  [
103
103
  { id: 'stem_0', position: 1, type: 'text', value: 'Fill-in-the blanks in this text from Richard III: ' },
104
104
  { id: 'stem_1', position: 2, type: 'text', value: 'Now is the ' },
105
- { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'FIB01' },
105
+ { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'Winter' },
106
106
  { id: 'stem_3', position: 4, type: 'text', value: ' of our discontent made glorious ' },
107
- { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'FIB02' },
107
+ { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'Summer' },
108
108
  { id: 'stem_5', position: 6, type: 'text', value: ' by these sons of ' },
109
- { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'FIB03' }
109
+ { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'York' }
110
110
  ]
111
111
  end
112
112
 
@@ -165,11 +165,11 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
165
165
  [
166
166
  { id: 'stem_0', position: 1, type: 'text', value: 'Fill-in-the blanks in this text from Richard III: ' },
167
167
  { id: 'stem_1', position: 2, type: 'text', value: 'Now is the ' },
168
- { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'FIB01' },
168
+ { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'Winter' },
169
169
  { id: 'stem_3', position: 4, type: 'text', value: ' of our discontent made glorious ' },
170
- { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'FIB02' },
170
+ { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'Summer' },
171
171
  { id: 'stem_5', position: 6, type: 'text', value: ' by these sons of ' },
172
- { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'FIB03' }
172
+ { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'York' }
173
173
  ]
174
174
  end
175
175
 
@@ -195,7 +195,7 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
195
195
  let(:expected_stem_items) do
196
196
  [
197
197
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Bird, bird, bird, bird is the ' },
198
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_word', blank_name: 'word' },
198
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_blank1', blank_name: 'word' },
199
199
  { id: 'stem_2', position: 3, type: 'text', value: '</p></div>' }
200
200
  ]
201
201
  end
@@ -11,11 +11,16 @@ describe Qti::V2::Models::NonAssessmentTest do
11
11
  it 'expects at least one assement item' do
12
12
  expect(loaded_class.assessment_items.count)
13
13
  end
14
+
15
+ it 'imports title' do
16
+ expect(loaded_class.title).to eq(title)
17
+ end
14
18
  end
15
19
 
16
20
  describe '2.2' do
17
21
  let(:path) { File.join(fixtures_path, 'no_assessment_xml', 'imsmanifest.xml') }
18
22
  let(:loaded_class) { described_class.from_path!(path) }
23
+ let(:title) { '1027TestTitle12' }
19
24
 
20
25
  include_examples 'loading_a_non-assessment'
21
26
  end
@@ -23,6 +28,7 @@ describe Qti::V2::Models::NonAssessmentTest do
23
28
  describe 'package_shared' do
24
29
  let(:path) { File.join(fixtures_path, 'package_shared', 'imsmanifest.xml') }
25
30
  let(:loaded_class) { described_class.from_path!(path) }
31
+ let(:title) { 'imsmanifest' }
26
32
 
27
33
  include_examples 'loading_a_non-assessment'
28
34
  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.0
4
+ version: 2.9.4
5
5
  platform: ruby
6
6
  authors:
7
- - Hannah Bottalla
8
- - Robinson Rodríguez
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-03-30 00:00:00.000000000 Z
15
+ date: 2022-08-25 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.12.3
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.12.3
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.0.3
704
+ rubygems_version: 3.3.7
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