qti 2.18.1 → 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 +4 -4
- data/lib/qti/v1/models/assessment.rb +12 -2
- data/lib/qti/v1/models/bank_entry_item.rb +27 -0
- data/lib/qti/v2/models/assessment_test.rb +4 -0
- data/lib/qti/version.rb +1 -1
- data/lib/qti.rb +5 -0
- data/spec/fixtures/items_1.2/bank_entry_item.xml +14 -0
- data/spec/fixtures/test_qti_1.2_bank_entry_item/imsmanifest.xml +33 -0
- data/spec/fixtures/test_qti_1.2_bank_entry_item/quiz.xml +14 -0
- data/spec/lib/qti/v1/models/assessment_spec.rb +18 -0
- data/spec/lib/qti/v1/models/bank_entry_item_spec.rb +12 -0
- data/spec/lib/qti/v2/models/assessment_test_spec.rb +9 -0
- data/spec/lib/qti_spec.rb +20 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59b8ff402b8251fba645448e0c6159d73cbfbaa383d7a796c379136ba5b957bc
|
4
|
+
data.tar.gz: 9b3d848749f95e31dc095c0b3d8b6eddafdc4eb2eed7fc775b5c3d34a696e56e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
@@ -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
|
@@ -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
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>
|
@@ -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>
|
@@ -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
|
@@ -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.
|
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-
|
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
|
@@ -558,6 +560,8 @@ files:
|
|
558
560
|
- spec/fixtures/test_qti_1.2/image.png
|
559
561
|
- spec/fixtures/test_qti_1.2/imsmanifest.xml
|
560
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
|
561
565
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
|
562
566
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
|
563
567
|
- spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
|
@@ -675,6 +679,7 @@ files:
|
|
675
679
|
- spec/lib/qti/sanitizer_spec.rb
|
676
680
|
- spec/lib/qti/v1/models/assessment_item_spec.rb
|
677
681
|
- spec/lib/qti/v1/models/assessment_spec.rb
|
682
|
+
- spec/lib/qti/v1/models/bank_entry_item_spec.rb
|
678
683
|
- spec/lib/qti/v1/models/base_spec.rb
|
679
684
|
- spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
|
680
685
|
- spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
|
@@ -760,6 +765,7 @@ test_files:
|
|
760
765
|
- spec/fixtures/imsqti_2.2_package/images/sign.png
|
761
766
|
- spec/fixtures/imsqti_2.2_package/imsmanifest.xml
|
762
767
|
- spec/fixtures/interaction_checks_1.2.xml
|
768
|
+
- spec/fixtures/items_1.2/bank_entry_item.xml
|
763
769
|
- spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
|
764
770
|
- spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
|
765
771
|
- spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
|
@@ -926,6 +932,8 @@ test_files:
|
|
926
932
|
- spec/fixtures/test_qti_1.2/image.png
|
927
933
|
- spec/fixtures/test_qti_1.2/imsmanifest.xml
|
928
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
|
929
937
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
|
930
938
|
- spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
|
931
939
|
- spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
|
@@ -1043,6 +1051,7 @@ test_files:
|
|
1043
1051
|
- spec/lib/qti/sanitizer_spec.rb
|
1044
1052
|
- spec/lib/qti/v1/models/assessment_item_spec.rb
|
1045
1053
|
- spec/lib/qti/v1/models/assessment_spec.rb
|
1054
|
+
- spec/lib/qti/v1/models/bank_entry_item_spec.rb
|
1046
1055
|
- spec/lib/qti/v1/models/base_spec.rb
|
1047
1056
|
- spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
|
1048
1057
|
- spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
|