qti 2.9.0 → 2.9.4

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 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