qti 2.18.1 → 2.19.0

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