qti 2.27.0 → 2.29.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: 5c3be9692650dc7d212b9bb3618b9926baebbad109aeadac7ddb4778c6be65e8
4
- data.tar.gz: 3560522773a644fca6d88548c7494c6135858171a7c607fd4172b6d515c6b689
3
+ metadata.gz: 76e0ccb82cec45bc227f147d2b1d505b4117131e1aa6fbc166553efbbb4e248e
4
+ data.tar.gz: 180bb912b8a0d53b398ac62fab21922ae4da140817e86c27abb4783bd843f6ba
5
5
  SHA512:
6
- metadata.gz: 9cc42e6a26a221f71501e96493dd29c57c880cbf77bd41c90988d14182f2a22c03cc79dbc81e64f3489cbb141126d9e65ec907fff802baea8258181ecacc04e6
7
- data.tar.gz: 7f434b423b05eab7c0bbafb9443fa083d4b0226a15425eaf49246b9388d45d61cf040b542a0308433c613f989a1f0ceed31ade37bcdb242a6fba406405ace82a
6
+ metadata.gz: 8c51e5b108c05d11ec919a5118de0e9d5fdcfed4403defecc353f6d93bb083fb6f281db0fd74d1ff636fafda4982981b47ba618198068a933f5991ffac3ec923
7
+ data.tar.gz: 55a94df5be4713653c8db8965ada79ea5daee2f1c0c9fe69a92558be7f6a080e3136ee3f6dc5d193d6dc730b6d2235dabb07135ec1e6d19f6311cfe8675baba1
@@ -331,6 +331,14 @@ module Qti
331
331
  tag_under_quiz('hide_item_response_correctness_at')
332
332
  end
333
333
 
334
+ def disable_document_access
335
+ tag_under_quiz('disable_document_access')
336
+ end
337
+
338
+ def disable_document_access?
339
+ string_true?(disable_document_access)
340
+ end
341
+
334
342
  private
335
343
 
336
344
  def tag_under_quiz(tag)
@@ -367,6 +375,7 @@ module Qti
367
375
  :display_item_response_qualifier, :show_item_responses_at,
368
376
  :hide_item_responses_at, :display_item_response_correctness_qualifier,
369
377
  :show_item_response_correctness_at, :hide_item_response_correctness_at,
378
+ :disable_document_access?,
370
379
  to: :@canvas_meta_data, prefix: :canvas, allow_nil: true
371
380
 
372
381
  alias canvas_instructions canvas_description
@@ -105,6 +105,27 @@ module Qti
105
105
  end
106
106
  end
107
107
 
108
+ def case_sensitive
109
+ @case_sensitive ||= begin
110
+ if case_sensitive_metadata?
111
+ case_sensitive_metadata_label = qti_metadata_children.children.find do |node|
112
+ node.text == 'case_sensitive'
113
+ end
114
+ case_sensitive_metadata_label.next.text
115
+ end
116
+ end
117
+ end
118
+
119
+ def case_sensitive_metadata?
120
+ if @doc.at_xpath('.//xmlns:qtimetadata').present?
121
+ qti_metadata_children.children.find do |node|
122
+ node.text == 'case_sensitive'
123
+ end.present?
124
+ else
125
+ false
126
+ end
127
+ end
128
+
108
129
  def decvar_maxvalue
109
130
  @doc.at_xpath('.//xmlns:decvar/@maxvalue')&.value&.to_i ||
110
131
  @doc.at_xpath('.//xmlns:decvar/@defaultval')&.value&.to_i || 0
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.27.0'.freeze
2
+ VERSION = '2.29.0'.freeze
3
3
  end
@@ -0,0 +1,134 @@
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
+ <item ident="97b0baae152f137d14503e2a2125c4d0" title="NQ Fill in Multiple Blanks Case Sensitive">
4
+ <itemmetadata>
5
+ <qtimetadata>
6
+ <qtimetadatafield>
7
+ <fieldlabel>question_type</fieldlabel>
8
+ <fieldentry>fill_in_multiple_blanks_question</fieldentry>
9
+ </qtimetadatafield>
10
+ <qtimetadatafield>
11
+ <fieldlabel>points_possible</fieldlabel>
12
+ <fieldentry>1.0</fieldentry>
13
+ </qtimetadatafield>
14
+ <qtimetadatafield>
15
+ <fieldlabel>original_answer_ids</fieldlabel>
16
+ <fieldentry>["bafd8242-ecdb-4158-a6d3-4ff15e016cb8-0", "d719aee0-6ce0-462c-9c0d-be63ba8d3408-0", "ce47aaf6-c1dd-4db8-9a9f-7f5c131d8a90-0", "41dfd716-8fd9-466a-97fa-33d353e44b42-0", "41dfd716-8fd9-466a-97fa-33d353e44b42-1", "a053119f-6a61-4372-ac79-4b2a7de0232f-0"]</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
20
+ <fieldentry>eaeec2d07f83998ee7b317ffde86dbc0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>case_sensitive</fieldlabel>
24
+ <fieldentry>true</fieldentry>
25
+ </qtimetadatafield>
26
+ </qtimetadata>
27
+ </itemmetadata>
28
+ <presentation>
29
+ <material>
30
+ <mattext texttype="text/html">&lt;p&gt;Roses are [bafd8242-ecdb-4158-a6d3-4ff15e016cb8], [d719aee0-6ce0-462c-9c0d-be63ba8d3408], [ce47aaf6-c1dd-4db8-9a9f-7f5c131d8a90], [41dfd716-8fd9-466a-97fa-33d353e44b42], and [a053119f-6a61-4372-ac79-4b2a7de0232f].&lt;/p&gt;</mattext>
31
+ </material>
32
+ <response_lid ident="response_bafd8242-ecdb-4158-a6d3-4ff15e016cb8">
33
+ <material>
34
+ <mattext>red</mattext>
35
+ </material>
36
+ <render_choice>
37
+ <response_label ident="bafd8242-ecdb-4158-a6d3-4ff15e016cb8-0" scoring_algorithm='TextContainsAnswer' answer_type='openEntry'>
38
+ <material>
39
+ <mattext texttype="text/plain">red</mattext>
40
+ </material>
41
+ </response_label>
42
+ </render_choice>
43
+ </response_lid>
44
+ <response_lid ident="response_d719aee0-6ce0-462c-9c0d-be63ba8d3408">
45
+ <material>
46
+ <mattext>blue</mattext>
47
+ </material>
48
+ <render_choice>
49
+ <response_label ident="d719aee0-6ce0-462c-9c0d-be63ba8d3408-0" scoring_algorithm='TextCloseEnough' answer_type='openEntry' levenshtein_distance='1' ignore_case='true'>
50
+ <material>
51
+ <mattext texttype="text/plain">blue</mattext>
52
+ </material>
53
+ </response_label>
54
+ </render_choice>
55
+ </response_lid>
56
+ <response_lid ident="response_ce47aaf6-c1dd-4db8-9a9f-7f5c131d8a90">
57
+ <material>
58
+ <mattext>green</mattext>
59
+ </material>
60
+ <render_choice>
61
+ <response_label ident="ce47aaf6-c1dd-4db8-9a9f-7f5c131d8a90-0" scoring_algorithm='TextEquivalence' answer_type='openEntry'>
62
+ <material>
63
+ <mattext texttype="text/plain">green</mattext>
64
+ </material>
65
+ </response_label>
66
+ </render_choice>
67
+ </response_lid>
68
+ <response_lid ident="response_41dfd716-8fd9-466a-97fa-33d353e44b42">
69
+ <material>
70
+ <mattext>yellow</mattext>
71
+ </material>
72
+ <render_choice>
73
+ <response_label ident="41dfd716-8fd9-466a-97fa-33d353e44b42-0" scoring_algorithm='TextInChoices' answer_type='openEntry'>
74
+ <material>
75
+ <mattext texttype="text/plain">yellow</mattext>
76
+ </material>
77
+ </response_label>
78
+ <response_label ident="41dfd716-8fd9-466a-97fa-33d353e44b42-1" scoring_algorithm='TextInChoices' answer_type='openEntry'>
79
+ <material>
80
+ <mattext texttype="text/plain">teal</mattext>
81
+ </material>
82
+ </response_label>
83
+ </render_choice>
84
+ </response_lid>
85
+ <response_lid ident="response_a053119f-6a61-4372-ac79-4b2a7de0232f">
86
+ <material>
87
+ <mattext>^orange&lt;s&gt;$</mattext>
88
+ </material>
89
+ <render_choice>
90
+ <response_label ident="a053119f-6a61-4372-ac79-4b2a7de0232f-0" scoring_algorithm='TextRegex' answer_type='openEntry'>
91
+ <material>
92
+ <mattext texttype="text/plain">^orange&lt;s&gt;$</mattext>
93
+ </material>
94
+ </response_label>
95
+ </render_choice>
96
+ </response_lid>
97
+ </presentation>
98
+ <resprocessing>
99
+ <outcomes>
100
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
101
+ </outcomes>
102
+ <respcondition>
103
+ <conditionvar>
104
+ <varequal respident="response_bafd8242-ecdb-4158-a6d3-4ff15e016cb8">bafd8242-ecdb-4158-a6d3-4ff15e016cb8-0</varequal>
105
+ </conditionvar>
106
+ <setvar action="Add" varname="SCORE">20.00</setvar>
107
+ </respcondition>
108
+ <respcondition>
109
+ <conditionvar>
110
+ <varequal respident="response_d719aee0-6ce0-462c-9c0d-be63ba8d3408">d719aee0-6ce0-462c-9c0d-be63ba8d3408-0</varequal>
111
+ </conditionvar>
112
+ <setvar action="Add" varname="SCORE">20.00</setvar>
113
+ </respcondition>
114
+ <respcondition>
115
+ <conditionvar>
116
+ <varequal respident="response_ce47aaf6-c1dd-4db8-9a9f-7f5c131d8a90">ce47aaf6-c1dd-4db8-9a9f-7f5c131d8a90-0</varequal>
117
+ </conditionvar>
118
+ <setvar action="Add" varname="SCORE">20.00</setvar>
119
+ </respcondition>
120
+ <respcondition>
121
+ <conditionvar>
122
+ <varequal respident="response_41dfd716-8fd9-466a-97fa-33d353e44b42">41dfd716-8fd9-466a-97fa-33d353e44b42-0</varequal>
123
+ </conditionvar>
124
+ <setvar action="Add" varname="SCORE">20.00</setvar>
125
+ </respcondition>
126
+ <respcondition>
127
+ <conditionvar>
128
+ <varequal respident="response_a053119f-6a61-4372-ac79-4b2a7de0232f">a053119f-6a61-4372-ac79-4b2a7de0232f-0</varequal>
129
+ </conditionvar>
130
+ <setvar action="Add" varname="SCORE">20.00</setvar>
131
+ </respcondition>
132
+ </resprocessing>
133
+ </item>
134
+ </questestinterop>
@@ -33,6 +33,7 @@
33
33
  <one_time_results>false</one_time_results>
34
34
  <show_correct_answers_last_attempt>false</show_correct_answers_last_attempt>
35
35
  <allow_clear_mc_selection>true</allow_clear_mc_selection>
36
+ <disable_document_access>true</disable_document_access>
36
37
  <only_visible_to_overrides>false</only_visible_to_overrides>
37
38
  <module_locked>false</module_locked>
38
39
  <nq_ip_filter from="255.255.0.0" to="255.255.0.255"/>
@@ -57,6 +57,7 @@ context 'Canvas Assessment Meta Data' do
57
57
  .to eq(display_item_response_correctness_qualifier)
58
58
  expect(assessment.canvas_show_item_response_correctness_at).to eq(show_item_response_correctness_at)
59
59
  expect(assessment.canvas_hide_item_response_correctness_at).to eq(hide_item_response_correctness_at)
60
+ expect(assessment.canvas_disable_document_access?).to eq(disable_document_access)
60
61
  end
61
62
  end
62
63
 
@@ -112,6 +113,7 @@ context 'Canvas Assessment Meta Data' do
112
113
  let(:hide_item_responses_at) { nil }
113
114
  let(:show_item_response_correctness_at) { nil }
114
115
  let(:hide_item_response_correctness_at) { nil }
116
+ let(:disable_document_access) { false }
115
117
 
116
118
  include_examples('loads canvas meta data')
117
119
  end
@@ -173,6 +175,7 @@ context 'Canvas Assessment Meta Data' do
173
175
  let(:hide_item_responses_at) { '2024-07-21 11:59:00 UTC' }
174
176
  let(:show_item_response_correctness_at) { '2024-07-19 06:00:00 UTC' }
175
177
  let(:hide_item_response_correctness_at) { '2024-07-22 11:59:00 UTC' }
178
+ let(:disable_document_access) { true }
176
179
 
177
180
  include_examples('loads canvas meta data')
178
181
  end
@@ -229,6 +232,7 @@ context 'Canvas Assessment Meta Data' do
229
232
  let(:hide_item_responses_at) { nil }
230
233
  let(:show_item_response_correctness_at) { nil }
231
234
  let(:hide_item_response_correctness_at) { nil }
235
+ let(:disable_document_access) { false }
232
236
 
233
237
  include_examples('loads canvas meta data')
234
238
  end
@@ -285,6 +289,7 @@ context 'Canvas Assessment Meta Data' do
285
289
  let(:hide_item_responses_at) { nil }
286
290
  let(:show_item_response_correctness_at) { nil }
287
291
  let(:hide_item_response_correctness_at) { nil }
292
+ let(:disable_document_access) { false }
288
293
 
289
294
  include_examples('loads canvas meta data')
290
295
  end
@@ -135,6 +135,26 @@ describe Qti::V1::Models::AssessmentItem do
135
135
  end
136
136
  end
137
137
 
138
+ describe '#case_sensitive' do
139
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
140
+ let(:assessment_item_refs) { test_object.assessment_items }
141
+ let(:loaded_class) { described_class.new(assessment_item_refs) }
142
+
143
+ context 'when it does not contain case_sensitive metadata' do
144
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'nq_multiple_fib_scoring_algorithms.xml') }
145
+ it 'returns nil' do
146
+ expect(loaded_class.case_sensitive).to be_nil
147
+ end
148
+ end
149
+
150
+ context 'when it contains case_sensitive metadata' do
151
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'nq_multiple_fib_case_sensitive.xml') }
152
+ it 'returns the case_sensitive value' do
153
+ expect(loaded_class.case_sensitive).to eq 'true'
154
+ end
155
+ end
156
+ end
157
+
138
158
  describe '#scoring_data_structs' do
139
159
  it 'grabs the rcardinality and scoring data value' do
140
160
  struct = loaded_class.send(:scoring_data_structs)
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.27.0
4
+ version: 2.29.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: 2025-04-03 00:00:00.000000000 Z
15
+ date: 2026-07-24 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: actionview
@@ -410,6 +410,7 @@ files:
410
410
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
411
411
  - spec/fixtures/items_1.2/multiple_choice.xml
412
412
  - spec/fixtures/items_1.2/nq_multiple_fib_answer_types.xml
413
+ - spec/fixtures/items_1.2/nq_multiple_fib_case_sensitive.xml
413
414
  - spec/fixtures/items_1.2/nq_multiple_fib_scoring_algorithms.xml
414
415
  - spec/fixtures/items_1.2/numeric_exact_match.xml
415
416
  - spec/fixtures/items_1.2/numeric_margin_error.xml
@@ -743,7 +744,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
743
744
  - !ruby/object:Gem::Version
744
745
  version: '0'
745
746
  requirements: []
746
- rubygems_version: 3.4.10
747
+ rubygems_version: 3.5.22
747
748
  signing_key:
748
749
  specification_version: 4
749
750
  summary: QTI 1.2 and 2.1 import and export models
@@ -794,6 +795,7 @@ test_files:
794
795
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
795
796
  - spec/fixtures/items_1.2/multiple_choice.xml
796
797
  - spec/fixtures/items_1.2/nq_multiple_fib_answer_types.xml
798
+ - spec/fixtures/items_1.2/nq_multiple_fib_case_sensitive.xml
797
799
  - spec/fixtures/items_1.2/nq_multiple_fib_scoring_algorithms.xml
798
800
  - spec/fixtures/items_1.2/numeric_exact_match.xml
799
801
  - spec/fixtures/items_1.2/numeric_margin_error.xml