qti 2.15.2 → 2.15.4

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: 8cf47da54509068528926ad9f4ef3275d70206130a19e13cd5f28f113a5f0f8c
4
- data.tar.gz: 9b61ac2909cbf749e759c85f83fc340c51342caddceece2f806b3316f661845c
3
+ metadata.gz: f4084fe51b2f6fe08be8575473463acf9654f015d2e314ac7dc5b0cc66bbc7a0
4
+ data.tar.gz: 7aef361ec589ca5656e4bb6c0850593e3a0014e1b5e59c06a3f84cc762ca4b49
5
5
  SHA512:
6
- metadata.gz: 23ad71858fb02cc517255ae56613d606c8385a1b057b9fdac99381ac767ef8ca883e65a3d12a1d3e61b12289499addd91edd366b7364778cfe9b8914615475f5
7
- data.tar.gz: 97b98fc845357d06405d8882140e59c79cd18e58522bfa11411b78649577e808620b693118dd91cfec141371525000a9fbf16a7aa4765309034a9cf116bce594
6
+ metadata.gz: fccaad1a37691535248d7f2f6c8f587c9cbf319f4db2abd918f682e4a78a9a8351ab3b42e75a2e78f38557babbd437de049bcfb8c4d6b8aea8ed3a407a6355ab
7
+ data.tar.gz: 31746c6c8de63f0d854a329b9932245c36b19fb32dbb0e1183d8ff20f04c2ca2f93bf4fd63192083c8cbdd67e749bc46c9cc07fc4b50809ba0d4015f56bf8a5e
@@ -44,7 +44,8 @@ module Qti
44
44
 
45
45
  def blank_value(blank_id)
46
46
  blank = canvas_fib_responses.find { |response| response[:id] == blank_id }
47
- blank&.dig(:choices, 0, :item_body)
47
+ correct_choice = blank[:choices].find { |c| c[:id] == correct_choice_id(blank) }
48
+ (correct_choice || {})[:item_body] || blank&.dig(:choices, 0, :item_body)
48
49
  end
49
50
 
50
51
  def canvas_custom_fitb?
@@ -81,6 +82,11 @@ module Qti
81
82
 
82
83
  private
83
84
 
85
+ def correct_choice_id(blank)
86
+ node.xpath('.//xmlns:resprocessing/xmlns:respcondition/xmlns:conditionvar/xmlns:varequal')
87
+ .find { |varequal| varequal.attribute('respident').value == blank[:id] }&.text
88
+ end
89
+
84
90
  def canvas_blank_choice(bnode, index)
85
91
  bnode_id = bnode[:ident]
86
92
  choice = {
@@ -16,14 +16,19 @@ module Qti
16
16
  'marginOfError',
17
17
  equal_node.content.to_f.to_s,
18
18
  margin,
19
- 'absolute'
19
+ margin_type
20
20
  )
21
21
  end
22
22
 
23
23
  private
24
24
 
25
25
  def margin
26
- (equal_node.content.to_f - gte_node.content.to_f).to_s
26
+ equal_node.attributes['margin']&.value ||
27
+ (equal_node.content.to_f - gte_node.content.to_f).to_s
28
+ end
29
+
30
+ def margin_type
31
+ equal_node.attributes['margintype']&.value || 'absolute'
27
32
  end
28
33
 
29
34
  def valid?
@@ -18,16 +18,20 @@ module Qti
18
18
  'preciseResponse',
19
19
  value,
20
20
  precision.to_s,
21
- 'significantDigits'
21
+ precision_type
22
22
  )
23
23
  end
24
24
 
25
25
  def value
26
26
  fval = equal_node.content.to_f
27
- number_with_precision(fval, precision: precision, significant: true)
27
+ number_with_precision(fval, precision: precision, significant: precision_type == 'significantDigits')
28
28
  end
29
29
 
30
30
  def precision
31
+ overridden_precision = equal_node.attributes['precision']&.value
32
+
33
+ return overridden_precision.to_i if overridden_precision.present?
34
+
31
35
  sig = [
32
36
  Precision.significant_digits(gt_node.content),
33
37
  Precision.significant_digits(lte_node.content)
@@ -35,6 +39,10 @@ module Qti
35
39
  sig - 1
36
40
  end
37
41
 
42
+ def precision_type
43
+ equal_node.attributes['precisiontype']&.value || 'significantDigits'
44
+ end
45
+
38
46
  def self.significant_digits(number_s)
39
47
  sig = 0
40
48
  zeros = 0
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.15.2'.freeze
2
+ VERSION = '2.15.4'.freeze
3
3
  end
@@ -0,0 +1,91 @@
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="g4b927ea0ad2ea69259ee815b178a3960" title="cquiz">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="g60299365b800253608e32dc6c5126474" title="Question">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>multiple_dropdowns_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>1.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>original_answer_ids</fieldlabel>
24
+ <fieldentry>2050,7690,3670,6742</fieldentry>
25
+ </qtimetadatafield>
26
+ <qtimetadatafield>
27
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
28
+ <fieldentry>g0b6144ee2e26b58f221679802a238f36</fieldentry>
29
+ </qtimetadatafield>
30
+ </qtimetadata>
31
+ </itemmetadata>
32
+ <presentation>
33
+ <material>
34
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;[y] [x] is&lt;/p&gt;&lt;/div&gt;</mattext>
35
+ </material>
36
+ <response_lid ident="response_x">
37
+ <material>
38
+ <mattext>x</mattext>
39
+ </material>
40
+ <render_choice>
41
+ <response_label ident="2050">
42
+ <material>
43
+ <mattext texttype="text/plain">a</mattext>
44
+ </material>
45
+ </response_label>
46
+ <response_label ident="7690">
47
+ <material>
48
+ <mattext texttype="text/plain">b</mattext>
49
+ </material>
50
+ </response_label>
51
+ </render_choice>
52
+ </response_lid>
53
+ <response_lid ident="response_y">
54
+ <material>
55
+ <mattext>y</mattext>
56
+ </material>
57
+ <render_choice>
58
+ <response_label ident="3670">
59
+ <material>
60
+ <mattext texttype="text/plain">c</mattext>
61
+ </material>
62
+ </response_label>
63
+ <response_label ident="6742">
64
+ <material>
65
+ <mattext texttype="text/plain">d</mattext>
66
+ </material>
67
+ </response_label>
68
+ </render_choice>
69
+ </response_lid>
70
+ </presentation>
71
+ <resprocessing>
72
+ <outcomes>
73
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
74
+ </outcomes>
75
+ <respcondition>
76
+ <conditionvar>
77
+ <varequal respident="response_x">2050</varequal>
78
+ </conditionvar>
79
+ <setvar varname="SCORE" action="Add">50.00</setvar>
80
+ </respcondition>
81
+ <respcondition>
82
+ <conditionvar>
83
+ <varequal respident="response_y">6742</varequal>
84
+ </conditionvar>
85
+ <setvar varname="SCORE" action="Add">50.00</setvar>
86
+ </respcondition>
87
+ </resprocessing>
88
+ </item>
89
+ </section>
90
+ </assessment>
91
+ </questestinterop>
@@ -0,0 +1,58 @@
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="i3c06f375b6b24a39925dc6a213421021" title="Quiz1.Margin.Error">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="i028a5c60d8ce9dc63df3afefa2e9d01e" title="Question">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>numerical_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>1.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
24
+ <fieldentry>i874908082e9dce80647f2771296ca69c</fieldentry>
25
+ </qtimetadatafield>
26
+ </qtimetadata>
27
+ </itemmetadata>
28
+ <presentation>
29
+ <material>
30
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;QQ1.margin error&lt;/p&gt;&lt;/div&gt;</mattext>
31
+ </material>
32
+ <response_str ident="response1" rcardinality="Single">
33
+ <render_fib fibtype="Decimal">
34
+ <response_label ident="answer1"/>
35
+ </render_fib>
36
+ </response_str>
37
+ </presentation>
38
+ <resprocessing>
39
+ <outcomes>
40
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
41
+ </outcomes>
42
+ <respcondition continue="No">
43
+ <conditionvar>
44
+ <or>
45
+ <varequal respident="response1" margintype="percent" margin="20.0">200.0</varequal>
46
+ <and>
47
+ <vargte respident="response1">160.0</vargte>
48
+ <varlte respident="response1">240.0</varlte>
49
+ </and>
50
+ </or>
51
+ </conditionvar>
52
+ <setvar action="Set" varname="SCORE">100</setvar>
53
+ </respcondition>
54
+ </resprocessing>
55
+ </item>
56
+ </section>
57
+ </assessment>
58
+ </questestinterop>
@@ -0,0 +1,58 @@
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="id2b817165c302c0c57416146dc94ce47" title="Quiz1.precision">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="i3ac3c6ccf4dd3dce4d5b5a5721edd5d5" title="Question">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>numerical_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>1.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
24
+ <fieldentry>i792f29a40533189006a3bd7ffee3c857</fieldentry>
25
+ </qtimetadatafield>
26
+ </qtimetadata>
27
+ </itemmetadata>
28
+ <presentation>
29
+ <material>
30
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;QQ1.presision ss&lt;/p&gt;&lt;/div&gt;</mattext>
31
+ </material>
32
+ <response_str ident="response1" rcardinality="Single">
33
+ <render_fib fibtype="Decimal">
34
+ <response_label ident="answer1"/>
35
+ </render_fib>
36
+ </response_str>
37
+ </presentation>
38
+ <resprocessing>
39
+ <outcomes>
40
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
41
+ </outcomes>
42
+ <respcondition continue="No">
43
+ <conditionvar>
44
+ <or>
45
+ <varequal respident="response1" precisiontype="decimals" precision="4">100.1234</varequal>
46
+ <and>
47
+ <vargt respident="response1">999.995</vargt>
48
+ <varlte respident="response1">1000.005</varlte>
49
+ </and>
50
+ </or>
51
+ </conditionvar>
52
+ <setvar action="Set" varname="SCORE">100</setvar>
53
+ </respcondition>
54
+ </resprocessing>
55
+ </item>
56
+ </section>
57
+ </assessment>
58
+ </questestinterop>
@@ -74,4 +74,15 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
74
74
  include_examples 'stem_items'
75
75
  include_examples 'scoring_data_structs'
76
76
  end
77
+
78
+ context 'canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml' do
79
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml') }
80
+
81
+ it 'returns the scoring_data_structs with item_body values and ids of the correct choice' do
82
+ expect(loaded_class.scoring_data_structs.first[:values][:id]).to eq('2050')
83
+ expect(loaded_class.scoring_data_structs.first[:values][:item_body]).to eq('a')
84
+ expect(loaded_class.scoring_data_structs.second[:values][:id]).to eq('6742')
85
+ expect(loaded_class.scoring_data_structs.second[:values][:item_body]).to eq('d')
86
+ end
87
+ end
77
88
  end
@@ -65,6 +65,21 @@ describe Qti::V1::Models::Interactions::NumericInteraction do
65
65
  expect(loaded_class.item_body).to eq '<div><p>QQ1.margin error</p></div>'
66
66
  end
67
67
  end
68
+
69
+ context 'with explicit margin and margin_type' do
70
+ let(:xml_file_name) { 'numeric_margin_error_percent.xml' }
71
+ context 'the first item in numeric_margin_error.xml' do
72
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
73
+ let(:answer_count) { 1 }
74
+
75
+ include_examples 'scoring_data_structs',
76
+ id: %w[response1],
77
+ type: %w[marginOfError],
78
+ value: %w[200.0],
79
+ margin: %w[20.0],
80
+ margin_type: %w[percent]
81
+ end
82
+ end
68
83
  end
69
84
 
70
85
  context 'precision' do
@@ -87,6 +102,22 @@ describe Qti::V1::Models::Interactions::NumericInteraction do
87
102
  expect(loaded_class.item_body).to eq '<div><p>QQ1.presision ss</p></div>'
88
103
  end
89
104
  end
105
+
106
+ context 'with explicit precision and precision_type' do
107
+ let(:xml_file_name) { 'numeric_precision_decimals.xml' }
108
+
109
+ context 'the first item in numeric_precision_decimals.xml' do
110
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
111
+ let(:answer_count) { 1 }
112
+
113
+ include_examples 'scoring_data_structs',
114
+ id: %w[response1],
115
+ type: %w[preciseResponse],
116
+ value: %w[100.1234],
117
+ precision: %w[4],
118
+ precision_type: %w[decimals]
119
+ end
120
+ end
90
121
  end
91
122
 
92
123
  context 'wthin range' do
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.15.2
4
+ version: 2.15.4
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-05-31 00:00:00.000000000 Z
15
+ date: 2023-06-27 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: actionview
@@ -392,6 +392,7 @@ files:
392
392
  - spec/fixtures/interaction_checks_1.2.xml
393
393
  - spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
394
394
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
395
+ - spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
395
396
  - spec/fixtures/items_1.2/canvas_multiple_fib.xml
396
397
  - spec/fixtures/items_1.2/canvas_multiple_fib_as_single.xml
397
398
  - spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml
@@ -412,7 +413,9 @@ files:
412
413
  - spec/fixtures/items_1.2/multiple_choice.xml
413
414
  - spec/fixtures/items_1.2/numeric_exact_match.xml
414
415
  - spec/fixtures/items_1.2/numeric_margin_error.xml
416
+ - spec/fixtures/items_1.2/numeric_margin_error_percent.xml
415
417
  - spec/fixtures/items_1.2/numeric_precision.xml
418
+ - spec/fixtures/items_1.2/numeric_precision_decimals.xml
416
419
  - spec/fixtures/items_1.2/numeric_within_range.xml
417
420
  - spec/fixtures/items_1.2/ordering.xml
418
421
  - spec/fixtures/items_1.2/question_group.xml
@@ -752,6 +755,7 @@ test_files:
752
755
  - spec/fixtures/interaction_checks_1.2.xml
753
756
  - spec/fixtures/items_1.2/canvas_multiple_dropdown.xml
754
757
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
758
+ - spec/fixtures/items_1.2/canvas_multiple_dropdowns_correct_choice_is_not_the_first.xml
755
759
  - spec/fixtures/items_1.2/canvas_multiple_fib.xml
756
760
  - spec/fixtures/items_1.2/canvas_multiple_fib_as_single.xml
757
761
  - spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml
@@ -772,7 +776,9 @@ test_files:
772
776
  - spec/fixtures/items_1.2/multiple_choice.xml
773
777
  - spec/fixtures/items_1.2/numeric_exact_match.xml
774
778
  - spec/fixtures/items_1.2/numeric_margin_error.xml
779
+ - spec/fixtures/items_1.2/numeric_margin_error_percent.xml
775
780
  - spec/fixtures/items_1.2/numeric_precision.xml
781
+ - spec/fixtures/items_1.2/numeric_precision_decimals.xml
776
782
  - spec/fixtures/items_1.2/numeric_within_range.xml
777
783
  - spec/fixtures/items_1.2/ordering.xml
778
784
  - spec/fixtures/items_1.2/question_group.xml