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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 336700103b4d3c146a3a14e388d0cc03b568aa7561401ffabede5cab0881559d
4
- data.tar.gz: 29a3213732a5377ba14d133c06a5e545c3f16c25e1e19200d9f4dd98e1b98792
3
+ metadata.gz: 59b8ff402b8251fba645448e0c6159d73cbfbaa383d7a796c379136ba5b957bc
4
+ data.tar.gz: 9b3d848749f95e31dc095c0b3d8b6eddafdc4eb2eed7fc775b5c3d34a696e56e
5
5
  SHA512:
6
- metadata.gz: e31d581b78da6e468e3a8c5d188310585981b42c2a581f66d9938861c2fcdc701f86d8cbc99c13f3eaf6977e191237deb9904d50bd83159e6b780ffd89005846
7
- data.tar.gz: 3ad4b4496777d9df2ef092ae2a9c9cbd7d19808c4939bbfdd63fdc1710faa85aeee2296c2209c8642fd15d9bf9ae417f5618f4858e13e4296075aaac65631c35
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
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.18.1'.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>
@@ -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.18.1
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-21 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
@@ -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