qti 2.17.0 → 2.19.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ecae7fca00b12644bc2942b43f7fe47c6b959823c6b4b3a92e70193529b064f
4
- data.tar.gz: b9c35c2873033a84e0b673b58e4859d434de0ea0052a4891b38e448de034759d
3
+ metadata.gz: 59b8ff402b8251fba645448e0c6159d73cbfbaa383d7a796c379136ba5b957bc
4
+ data.tar.gz: 9b3d848749f95e31dc095c0b3d8b6eddafdc4eb2eed7fc775b5c3d34a696e56e
5
5
  SHA512:
6
- metadata.gz: c7ec25c08693f1b467121f8d528859c99ff58d57ad9eb55d44fb31871210a6d04f0184517db425ce62509ab3ea00700ea6203e1d4ae3323de4b4eaad3577f0a1
7
- data.tar.gz: aa5a807baa86a4554c52a83c0d2c16c7421c82ef1bb5a4c680cfc1e2f4cb9c5bbcea79936d1bc02984fb0bb74d6c4b6d44a8d1bdc0b8d7f4272f49fc27249018
6
+ metadata.gz: 9487c787ace952ccb0771573bf7293c3797982c411f3c21af35bd57fca53b1a956cf593650aff155af2ea29471e59efa7586bf89a39cf9485396790d62ecc37e
7
+ data.tar.gz: c23ecddd40c5dc43e7078b66e569658fa34e25e5511d4999252b9e81cd0bc72ddb098fa64c1f99b6dcf5056ed38b40150b385e6ac6cfad8ca3a77081e9899490
@@ -15,11 +15,12 @@ module Qti
15
15
  end
16
16
 
17
17
  def assessment_items
18
- @doc.xpath("//*[self::#{GROUP_ID} or self::xmlns:item[not(ancestor::#{GROUP_ID})]]")
18
+ @doc.xpath("//*[self::#{GROUP_ID} or self::xmlns:item[not(ancestor::#{GROUP_ID})]" \
19
+ ' or self::xmlns:bankentry_item]')
19
20
  end
20
21
 
21
22
  def create_assessment_item(assessment_item)
22
- return nil if sub_section?(assessment_item)
23
+ return nil if sub_section?(assessment_item) || bank_entry_item?(assessment_item)
23
24
  item = Qti::V1::Models::AssessmentItem.new(assessment_item, @package_root, self)
24
25
  item.manifest = manifest
25
26
  item
@@ -39,6 +40,11 @@ module Qti
39
40
  Qti::V1::Models::QuestionGroup.new(group_ref)
40
41
  end
41
42
 
43
+ def create_bank_entry_item(bank_entry_item_ref)
44
+ return nil unless bank_entry_item?(bank_entry_item_ref)
45
+ Qti::V1::Models::BankEntryItem.new(bank_entry_item_ref)
46
+ end
47
+
42
48
  private
43
49
 
44
50
  def sub_section?(ref_node)
@@ -57,6 +63,10 @@ module Qti
57
63
  def question_group?(ref_node)
58
64
  ref_node.xpath("self::#{GROUP_ID}").present?
59
65
  end
66
+
67
+ def bank_entry_item?(ref_node)
68
+ ref_node.xpath('self::xmlns:bankentry_item').present?
69
+ end
60
70
  end
61
71
  end
62
72
  end
@@ -84,6 +84,27 @@ module Qti
84
84
  end
85
85
  end
86
86
 
87
+ def calculator_type
88
+ @calculator_type ||= begin
89
+ if calculator_type_metadata?
90
+ calculator_type_metadata_label = qti_metadata_children.children.find do |node|
91
+ node.text == 'calculator_type'
92
+ end
93
+ calculator_type_metadata_label.next.text
94
+ end
95
+ end
96
+ end
97
+
98
+ def calculator_type_metadata?
99
+ if @doc.at_xpath('.//xmlns:qtimetadata').present?
100
+ qti_metadata_children.children.find do |node|
101
+ node.text == 'calculator_type'
102
+ end.present?
103
+ else
104
+ false
105
+ end
106
+ end
107
+
87
108
  def decvar_maxvalue
88
109
  @doc.at_xpath('.//xmlns:decvar/@maxvalue')&.value&.to_i ||
89
110
  @doc.at_xpath('.//xmlns:decvar/@defaultval')&.value&.to_i || 0
@@ -0,0 +1,27 @@
1
+ module Qti
2
+ module V1
3
+ module Models
4
+ class BankEntryItem < Qti::V1::Models::Base
5
+ attr_reader :doc
6
+
7
+ def initialize(item, package_root = nil)
8
+ @doc = item
9
+ @path = item.document.url
10
+ self.package_root = package_root
11
+ end
12
+
13
+ def sourcebank_ref
14
+ @sourcebank_ref ||= @doc.attribute('sourcebank_ref').value
15
+ end
16
+
17
+ def item_ref
18
+ @item_ref ||= @doc.attribute('item_ref').value
19
+ end
20
+
21
+ def points_possible
22
+ @points_possible ||= @doc.attribute('points_possible')&.value || 1
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -40,6 +40,16 @@ module Qti
40
40
  @node.at_xpath('.//xmlns:render_choice/@shuffle')&.value.try(:downcase) == 'yes'
41
41
  end
42
42
 
43
+ def locked_choices
44
+ return [] unless shuffled?
45
+
46
+ @node.xpath('.//xmlns:response_label').filter_map.with_index do |answer_node, index|
47
+ is_locked = answer_node.attributes['lock']&.value&.downcase == 'yes'
48
+
49
+ is_locked ? index : nil
50
+ end
51
+ end
52
+
43
53
  def scoring_data_structs
44
54
  raise NotImplementedError
45
55
  end
@@ -44,6 +44,10 @@ module Qti
44
44
  def create_stimulus(stimulus_ref)
45
45
  Qti::V2::Models::StimulusItem.new(path: stimulus_ref, package_root: @package_root, html: true)
46
46
  end
47
+
48
+ def create_bank_entry_item(_bank_entry_item_ref = nil)
49
+ nil # we don't support this in QTI V2 yet
50
+ end
47
51
  end
48
52
  end
49
53
  end
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.17.0'.freeze
2
+ VERSION = '2.19.0'.freeze
3
3
  end
data/lib/qti.rb CHANGED
@@ -68,6 +68,10 @@ module Qti
68
68
  def create_question_group(question_group_ref)
69
69
  @import.create_question_group(question_group_ref)
70
70
  end
71
+
72
+ def create_bank_entry_item(bank_entry_item_ref)
73
+ @import.create_bank_entry_item(bank_entry_item_ref)
74
+ end
71
75
  end
72
76
 
73
77
  def self.configuration
@@ -117,6 +121,7 @@ require 'qti/v1/models/object_bank'
117
121
  require 'qti/v1/models/scoring_data'
118
122
  require 'qti/v1/models/stimulus_item'
119
123
  require 'qti/v1/models/question_group'
124
+ require 'qti/v1/models/bank_entry_item'
120
125
 
121
126
  require 'qti/v1/models/interactions/base_interaction'
122
127
  require 'qti/v1/models/interactions/choice_interaction'
@@ -0,0 +1,14 @@
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="i1211c711ada74a559ee1b6c122358695" title="Question Groups">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <bankentry_item sourcebank_ref="gafe7177102bee6759845b002c5de397c" item_ref="ge0c6b84f2afc834ec575718bbc1451ff" points_possible="2.0"/>
12
+ </section>
13
+ </assessment>
14
+ </questestinterop>
@@ -21,7 +21,7 @@
21
21
  </material>
22
22
  <response_lid ident="QUE_1004_RL" rcardinality="Single" rtiming="No">
23
23
  <render_choice shuffle="Yes">
24
- <response_label ident="QUE_1005_A1">
24
+ <response_label ident="QUE_1005_A1" lock="Yes">
25
25
  <material>
26
26
  <mattext texttype="text/html"><![CDATA[True]]></mattext>
27
27
  </material>
@@ -0,0 +1,90 @@
1
+ <?xml version="1.0" encoding="ISO-8859-1"?>
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 title="1.2 Import Quiz" ident="A1001">
4
+ <section title="Main" ident="S1002">
5
+ <item title="Grading - specific - 3 pt score" ident="QUE_1003">
6
+ <itemmetadata>
7
+ <qtimetadata>
8
+ <qtimetadatafield>
9
+ <fieldlabel>question_type</fieldlabel>
10
+ <fieldentry>true_false_question</fieldentry>
11
+ </qtimetadatafield>
12
+ <qtimetadatafield>
13
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
14
+ <fieldentry>iff205c7405d3b36bdca9b75b51198932</fieldentry>
15
+ </qtimetadatafield>
16
+ <qtimetadatafield>
17
+ <fieldlabel>calculator_type</fieldlabel>
18
+ <fieldentry>basic</fieldentry>
19
+ </qtimetadatafield>
20
+ </qtimetadata>
21
+ </itemmetadata>
22
+ <presentation>
23
+ <material>
24
+ <mattext texttype="text/html"><![CDATA[If I get a 3, I must have done something wrong. <img data-equation-content="sample equation" script="alert('bad')" align="bottom" alt="image.png" src="org0/images/image.png" border="0"/> <img script="alert('bad')" align="bottom" alt="image.png" src="org0/images/image.png" border="0"/>]]></mattext>
25
+ </material>
26
+ <response_lid ident="QUE_1004_RL" rcardinality="Single" rtiming="No">
27
+ <render_choice shuffle="Yes">
28
+ <response_label ident="QUE_1005_A1">
29
+ <material>
30
+ <mattext texttype="text/html"><![CDATA[True]]></mattext>
31
+ </material>
32
+ </response_label>
33
+ <response_label ident="QUE_1006_A2">
34
+ <material>
35
+ <mattext texttype="text/html"><![CDATA[False]]></mattext>
36
+ </material>
37
+ </response_label>
38
+ </render_choice>
39
+ </response_lid>
40
+ </presentation>
41
+ <resprocessing>
42
+ <outcomes>
43
+ <decvar vartype="Decimal" defaultval="0" varname="que_score"/>
44
+ </outcomes>
45
+ <respcondition>
46
+ <conditionvar>
47
+ <varequal respident="QUE_1004_RL">QUE_1005_A1</varequal>
48
+ </conditionvar>
49
+ <setvar varname="que_score" action="Add">0</setvar>
50
+ </respcondition>
51
+ <respcondition>
52
+ <conditionvar>
53
+ <varequal respident="QUE_1004_RL">QUE_1006_A2</varequal>
54
+ </conditionvar>
55
+ <setvar varname="que_score" action="Set">10.00</setvar>
56
+ <displayfeedback feedbacktype="Response" linkrefid="fb_QUE_1006_A2"/>
57
+ </respcondition>
58
+ </resprocessing>
59
+ <itemfeedback ident="general_fb">
60
+ <flow_mat>
61
+ <material>
62
+ <mattext texttype="text/html">&lt;p&gt;Neutral&lt;/p&gt;&lt;img script="alert('bad')" alt="image.png" src="org0/images/image.png"/&gt;</mattext>
63
+ </material>
64
+ </flow_mat>
65
+ </itemfeedback>
66
+ <itemfeedback ident="correct_fb">
67
+ <flow_mat>
68
+ <material>
69
+ <mattext texttype="text/html">&lt;p&gt;Correct&lt;/p&gt;&lt;img script="alert('bad')" alt="image.png" src="org0/images/image.png"/&gt;</mattext>
70
+ </material>
71
+ </flow_mat>
72
+ </itemfeedback>
73
+ <itemfeedback ident="general_incorrect_fb">
74
+ <flow_mat>
75
+ <material>
76
+ <mattext texttype="text/html">&lt;p&gt;Incorrect&lt;/p&gt;&lt;img script="alert('bad')" alt="image.png" src="org0/images/image.png"/&gt;</mattext>
77
+ </material>
78
+ </flow_mat>
79
+ </itemfeedback>
80
+ <itemfeedback ident="fb_QUE_1006_A2">
81
+ <flow_mat>
82
+ <material>
83
+ <mattext texttype="text/html">&lt;p&gt;Answer was Correct&lt;/p&gt;&lt;img script="alert('bad')" alt="image.png" src="org0/images/image.png"/&gt;</mattext>
84
+ </material>
85
+ </flow_mat>
86
+ </itemfeedback>
87
+ </item>
88
+ </section>
89
+ </assessment>
90
+ </questestinterop>
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0"?>
2
+ <manifest identifier="MANIFEST1" xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
3
+ xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p1.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">
6
+ <metadata>
7
+ <schema>IMS Content</schema>
8
+ <schemaversion>1.1.3</schemaversion>
9
+ <imsmd:lom>
10
+ <imsmd:general>
11
+ <imsmd:identifier>
12
+ <imsmd:langstring xml:lang="en-US">52BF3E44F087427782489C7DC5CAB5FD</imsmd:langstring>
13
+ </imsmd:identifier>
14
+ <imsmd:title>
15
+ <imsmd:langstring xml:lang="en-US">Quiz (Respondus IMS QTI export)</imsmd:langstring>
16
+ </imsmd:title>
17
+ </imsmd:general>
18
+ </imsmd:lom>
19
+ </metadata>
20
+ <organizations default="EXAM1">
21
+ <organization identifier="EXAM1" structure="hierarchical">
22
+ <title>default</title>
23
+ <item identifier="ITEM1" identifierref="RESOURCE1">
24
+ <title>Exam 1</title>
25
+ </item>
26
+ </organization>
27
+ </organizations>
28
+ <resources>
29
+ <resource identifier="RESOURCE1" type="imsqti_xmlv1p2" href="quiz.xml">
30
+ <file href="quiz.xml" />
31
+ </resource>
32
+ </resources>
33
+ </manifest>
@@ -0,0 +1,14 @@
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="i1211c711ada74a559ee1b6c122358695" title="Question Groups">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <bankentry_item sourcebank_ref="gafe7177102bee6759845b002c5de397c" item_ref="ge0c6b84f2afc834ec575718bbc1451ff"/>
12
+ </section>
13
+ </assessment>
14
+ </questestinterop>
@@ -115,6 +115,26 @@ describe Qti::V1::Models::AssessmentItem do
115
115
  end
116
116
  end
117
117
 
118
+ describe '#calculator_type' do
119
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
120
+ let(:assessment_item_refs) { test_object.assessment_items }
121
+ let(:loaded_class) { described_class.new(assessment_item_refs) }
122
+
123
+ context 'when it does not contain calculator_type metadata' do
124
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'true_false.xml') }
125
+ it 'returns nil' do
126
+ expect(loaded_class.calculator_type).to be_nil
127
+ end
128
+ end
129
+
130
+ context 'when it contains calculator_type metadata' do
131
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'true_false_with_calculator.xml') }
132
+ it 'returns the calculator_type value' do
133
+ expect(loaded_class.calculator_type).to eq 'basic'
134
+ end
135
+ end
136
+ end
137
+
118
138
  describe '#scoring_data_structs' do
119
139
  it 'grabs the rcardinality and scoring data value' do
120
140
  struct = loaded_class.send(:scoring_data_structs)
@@ -228,4 +228,22 @@ describe Qti::V1::Models::Assessment do
228
228
  ).to eq(nil)
229
229
  end
230
230
  end
231
+
232
+ describe 'bank entry items' do
233
+ let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
234
+ let(:test_object) { described_class.from_path!(file_path) }
235
+ let(:assessment_item_refs) { test_object.assessment_items }
236
+ let(:assessment_item_ref) { assessment_item_refs.first }
237
+ let(:file_path) { File.join(fixtures_path, 'bank_entry_item.xml') }
238
+
239
+ it 'methods behave as expected' do
240
+ expect(
241
+ test_object.create_assessment_item(assessment_item_ref)
242
+ ).to eq(nil)
243
+
244
+ expect(
245
+ test_object.create_bank_entry_item(assessment_item_ref).class
246
+ ).to be(Qti::V1::Models::BankEntryItem)
247
+ end
248
+ end
231
249
  end
@@ -0,0 +1,12 @@
1
+ describe Qti::V1::Models::BankEntryItem do
2
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'bank_entry_item.xml') }
3
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
4
+ let(:assessment_item_refs) { test_object.assessment_items }
5
+ let(:loaded_class) { described_class.new(assessment_item_refs.first) }
6
+
7
+ it 'configures a bank entry item correctly' do
8
+ expect(loaded_class.sourcebank_ref).to eq('gafe7177102bee6759845b002c5de397c')
9
+ expect(loaded_class.item_ref).to eq('ge0c6b84f2afc834ec575718bbc1451ff')
10
+ expect(loaded_class.points_possible).to eq('2.0')
11
+ end
12
+ end
@@ -10,6 +10,12 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
10
10
  end
11
11
  end
12
12
 
13
+ shared_examples_for 'locked_choices' do
14
+ it 'returns locked choices setting' do
15
+ expect(loaded_class.locked_choices).to eq locked_choices_value
16
+ end
17
+ end
18
+
13
19
  shared_examples_for 'answers' do
14
20
  it 'returns the answers' do
15
21
  expect(loaded_class.answers.count).to eq answer_choices_count
@@ -27,10 +33,12 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
27
33
  context 'multiple_choice.xml' do
28
34
  let(:file_path) { File.join(fixtures_path, 'multiple_choice.xml') }
29
35
  let(:shuffle_value) { false }
36
+ let(:locked_choices_value) { [] }
30
37
  let(:answer_choices_count) { 5 }
31
38
  let(:meta_type) { nil }
32
39
 
33
40
  include_examples 'shuffled?'
41
+ include_examples 'locked_choices'
34
42
  include_examples 'answers'
35
43
  include_examples 'meta_type'
36
44
  end
@@ -38,10 +46,12 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
38
46
  context 'true_false.xml' do
39
47
  let(:file_path) { File.join(fixtures_path, 'true_false.xml') }
40
48
  let(:shuffle_value) { true }
49
+ let(:locked_choices_value) { [0] }
41
50
  let(:answer_choices_count) { 2 }
42
51
  let(:meta_type) { 'true_false_question' }
43
52
 
44
53
  include_examples 'shuffled?'
54
+ include_examples 'locked_choices'
45
55
  include_examples 'answers'
46
56
  include_examples 'meta_type'
47
57
  end
@@ -49,17 +59,21 @@ describe Qti::V1::Models::Interactions::ChoiceInteraction do
49
59
  context 'multiple_answer.xml' do
50
60
  let(:file_path) { File.join(fixtures_path, 'multiple_answer.xml') }
51
61
  let(:shuffle_value) { false }
62
+ let(:locked_choices_value) { [] }
52
63
 
53
64
  include_examples 'shuffled?'
65
+ include_examples 'locked_choices'
54
66
  end
55
67
 
56
68
  context 'multiple_answer_canvas.xml' do
57
69
  let(:file_path) { File.join(fixtures_path, 'multiple_answer_canvas.xml') }
58
70
  let(:shuffle_value) { false }
71
+ let(:locked_choices_value) { [] }
59
72
  let(:answer_choices_count) { 4 }
60
73
  let(:meta_type) { 'multiple_answers_question' }
61
74
 
62
75
  include_examples 'shuffled?'
76
+ include_examples 'locked_choices'
63
77
  include_examples 'meta_type'
64
78
  end
65
79
 
@@ -77,6 +77,15 @@ describe Qti::V2::Models::AssessmentTest do
77
77
  end
78
78
  end
79
79
 
80
+ describe '#create_bank_entry_item' do
81
+ let(:path) { File.join(fixtures_path, 'test_qti_2.2', 'assessment.xml') }
82
+ let(:loaded_class) { described_class.from_path!(path) }
83
+
84
+ it 'returns nil' do
85
+ expect(loaded_class.create_bank_entry_item).to be_nil
86
+ end
87
+ end
88
+
80
89
  # describe '#create_stimulus' do
81
90
  # let(:path) { File.join(fixtures_path, 'test_qti_2.2', 'assessment.xml') }
82
91
  # let(:loaded_class) { described_class.from_path!(path) }
data/spec/lib/qti_spec.rb CHANGED
@@ -45,6 +45,26 @@ describe Qti::Importer do
45
45
  end
46
46
  end
47
47
 
48
+ describe '#create_bank_entry_item' do
49
+ context 'when given a bankentry_item object' do
50
+ let(:file_path) { File.join(fixtures_path, 'test_qti_1.2_bank_entry_item') }
51
+
52
+ it 'creates a bankentry_item instance' do
53
+ bank_entry_item = importer.create_bank_entry_item(importer.assessment_item_refs.first)
54
+ expect(bank_entry_item).to be_a(Qti::V1::Models::BankEntryItem)
55
+ end
56
+ end
57
+
58
+ context 'when given an object other than a bankentry_item' do
59
+ let(:file_path) { File.join(fixtures_path, 'test_qti_1.2') }
60
+
61
+ it 'returns nil' do
62
+ bank_entry_item = importer.create_bank_entry_item(importer.assessment_item_refs.first)
63
+ expect(bank_entry_item).to be_nil
64
+ end
65
+ end
66
+ end
67
+
48
68
  context 'canvas generated' do
49
69
  let(:file_path) { File.join(fixtures_path, 'test_qti_1.2_canvas') }
50
70
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qti
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.17.0
4
+ version: 2.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Diaz
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2023-07-10 00:00:00.000000000 Z
15
+ date: 2023-08-01 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: actionview
@@ -325,6 +325,7 @@ files:
325
325
  - lib/qti/sanitizer.rb
326
326
  - lib/qti/v1/models/assessment.rb
327
327
  - lib/qti/v1/models/assessment_item.rb
328
+ - lib/qti/v1/models/bank_entry_item.rb
328
329
  - lib/qti/v1/models/base.rb
329
330
  - lib/qti/v1/models/choices/fill_blank_choice.rb
330
331
  - lib/qti/v1/models/choices/logical_identifier_choice.rb
@@ -392,6 +393,7 @@ files:
392
393
  - spec/fixtures/imsqti_2.2_package/images/sign.png
393
394
  - spec/fixtures/imsqti_2.2_package/imsmanifest.xml
394
395
  - spec/fixtures/interaction_checks_1.2.xml
396
+ - spec/fixtures/items_1.2/bank_entry_item.xml
395
397
  - spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
396
398
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
397
399
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
@@ -428,6 +430,7 @@ files:
428
430
  - spec/fixtures/items_1.2/stimulus_with_child_item.xml
429
431
  - spec/fixtures/items_1.2/text.no.question.xml
430
432
  - spec/fixtures/items_1.2/true_false.xml
433
+ - spec/fixtures/items_1.2/true_false_with_calculator.xml
431
434
  - spec/fixtures/items_1.2/upload.xml
432
435
  - spec/fixtures/items_2.1/Example02-feedbackInline.xml
433
436
  - spec/fixtures/items_2.1/categorization.xml
@@ -557,6 +560,8 @@ files:
557
560
  - spec/fixtures/test_qti_1.2/image.png
558
561
  - spec/fixtures/test_qti_1.2/imsmanifest.xml
559
562
  - spec/fixtures/test_qti_1.2/quiz.xml
563
+ - spec/fixtures/test_qti_1.2_bank_entry_item/imsmanifest.xml
564
+ - spec/fixtures/test_qti_1.2_bank_entry_item/quiz.xml
560
565
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
561
566
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
562
567
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
@@ -674,6 +679,7 @@ files:
674
679
  - spec/lib/qti/sanitizer_spec.rb
675
680
  - spec/lib/qti/v1/models/assessment_item_spec.rb
676
681
  - spec/lib/qti/v1/models/assessment_spec.rb
682
+ - spec/lib/qti/v1/models/bank_entry_item_spec.rb
677
683
  - spec/lib/qti/v1/models/base_spec.rb
678
684
  - spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
679
685
  - spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
@@ -759,6 +765,7 @@ test_files:
759
765
  - spec/fixtures/imsqti_2.2_package/images/sign.png
760
766
  - spec/fixtures/imsqti_2.2_package/imsmanifest.xml
761
767
  - spec/fixtures/interaction_checks_1.2.xml
768
+ - spec/fixtures/items_1.2/bank_entry_item.xml
762
769
  - spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
763
770
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
764
771
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
@@ -795,6 +802,7 @@ test_files:
795
802
  - spec/fixtures/items_1.2/stimulus_with_child_item.xml
796
803
  - spec/fixtures/items_1.2/text.no.question.xml
797
804
  - spec/fixtures/items_1.2/true_false.xml
805
+ - spec/fixtures/items_1.2/true_false_with_calculator.xml
798
806
  - spec/fixtures/items_1.2/upload.xml
799
807
  - spec/fixtures/items_2.1/Example02-feedbackInline.xml
800
808
  - spec/fixtures/items_2.1/categorization.xml
@@ -924,6 +932,8 @@ test_files:
924
932
  - spec/fixtures/test_qti_1.2/image.png
925
933
  - spec/fixtures/test_qti_1.2/imsmanifest.xml
926
934
  - spec/fixtures/test_qti_1.2/quiz.xml
935
+ - spec/fixtures/test_qti_1.2_bank_entry_item/imsmanifest.xml
936
+ - spec/fixtures/test_qti_1.2_bank_entry_item/quiz.xml
927
937
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
928
938
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
929
939
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
@@ -1041,6 +1051,7 @@ test_files:
1041
1051
  - spec/lib/qti/sanitizer_spec.rb
1042
1052
  - spec/lib/qti/v1/models/assessment_item_spec.rb
1043
1053
  - spec/lib/qti/v1/models/assessment_spec.rb
1054
+ - spec/lib/qti/v1/models/bank_entry_item_spec.rb
1044
1055
  - spec/lib/qti/v1/models/base_spec.rb
1045
1056
  - spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
1046
1057
  - spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb