qti 2.9.3 → 2.9.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: 50c915910c02b2d309bb618d57fcc2e55b9b49a360197d39e984dfc10e7519cf
4
- data.tar.gz: 922c55c4ba997525d72029306e07926fe80136b4f819a8e89e017592ac657ae2
3
+ metadata.gz: e648510b781222e5d0e43ac7ba30ab1d252cf14360b38d28f03ec5231f053b6e
4
+ data.tar.gz: fb44120abe93da6c1237a188641d743724ce5db9c0c5a7bffe9853236d423f06
5
5
  SHA512:
6
- metadata.gz: 139239eb41bfbd250278d6ffc98fef5f0d41bbe82d7a3d2ac0e9901db1147ca21b674c7910bb4ce026f55d0acf8d39183d9b58f1a60c764557878f498f21a9aa
7
- data.tar.gz: 6b4cb2956564755c1e506ec6b3f87f5da062715fde6ce820fd9bdbde0f2f20997ac669640e16737e194c355478a67885fb5a45206c1ea7c3b421b2acb2fdaf5f
6
+ metadata.gz: 5d86e4792c5d904a667299bbc6f005105a064a8cf61bff5d5ca87e3d716fc08274a36804dbb1404c2a82bdd6264c039146614595edfad65f151606cb0f527588
7
+ data.tar.gz: 3ced8059b3d3fd86ce0604076e2f8b37a2b6820342ac102ef64b47abca8ac048675fec879ee5a60f113c104d4a9538d5150b43a55eedf90c1bf33aa31f807df7
@@ -9,20 +9,23 @@ module Qti
9
9
  item_prompt.split(CANVAS_REGEX).map.with_index do |stem_item, index|
10
10
  if canvas_fib_response_ids.include?(stem_item)
11
11
  # Strip the brackets before searching
12
- stem_blank(index, stem_item[1..-2])
12
+ value = stem_item[1..-2]
13
+ blank_id = blank_id(value)
14
+ blank_name = blank_value(blank_id) || value
15
+ stem_blank(index, blank_id, blank_name)
13
16
  else
14
17
  stem_text(index, stem_item)
15
18
  end
16
19
  end
17
20
  end
18
21
 
19
- def stem_blank(index, value)
22
+ def stem_blank(index, blank_id, blank_name)
20
23
  {
21
24
  id: "stem_#{index}",
22
25
  position: index + 1,
23
26
  type: 'blank',
24
- blank_id: blank_id(value),
25
- blank_name: value
27
+ blank_id: blank_id,
28
+ blank_name: blank_name
26
29
  }
27
30
  end
28
31
 
@@ -40,6 +43,11 @@ module Qti
40
43
  canvas_blank_id(stem_item)
41
44
  end
42
45
 
46
+ def blank_value(blank_id)
47
+ blank = canvas_fib_responses.find { |response| response[:id] == blank_id }
48
+ blank&.dig(:choices, 0, :item_body)
49
+ end
50
+
43
51
  def canvas_custom_fitb?
44
52
  @canvas_custom_fitb ||= BaseInteraction.canvas_custom_fitb?(@node)
45
53
  end
@@ -112,7 +112,10 @@ module Qti
112
112
 
113
113
  def qti_stem_item(index, stem_item)
114
114
  if stem_item.xpath('./xmlns:render_fib').present?
115
- stem_blank(index, stem_item.attributes['ident'].value)
115
+ blank_id = stem_item.attributes['ident'].value
116
+ blank_answer = answers.find { |answer| answer.identifier == blank_id }
117
+ blank_name = blank_answer&.item_body || blank_id
118
+ stem_blank(index, blank_id, blank_name)
116
119
  else
117
120
  stem_text(index, sanitize_content!(stem_item.children.text))
118
121
  end
@@ -4,6 +4,10 @@ module Qti
4
4
  class NonAssessmentTest < Qti::V2::Models::AssessmentTest
5
5
  include Qti::Models::ResourceGroup
6
6
 
7
+ QTIV2_TITLE_PATHS = [
8
+ "//*[local-name()='title' and namespace-uri()='http://ltsc.ieee.org/xsd/LOM']/*[local-name()='string']/text()"
9
+ ].freeze
10
+
7
11
  def assessment_items
8
12
  # Return the xml files we should be parsing
9
13
  @assessment_items ||= begin
@@ -21,6 +25,14 @@ module Qti
21
25
  href = xpath_with_single_check("//xmlns:resource[@identifier='#{dependencies.first}']/@href")
22
26
  remap_href_path(href)
23
27
  end
28
+
29
+ def title
30
+ @title ||= begin
31
+ QTIV2_TITLE_PATHS.map do |path|
32
+ xpath_with_single_check(path)&.content
33
+ end.compact.first
34
+ end || super
35
+ end
24
36
  end
25
37
  end
26
38
  end
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.9.3'.freeze
2
+ VERSION = '2.9.4'.freeze
3
3
  end
@@ -19,11 +19,11 @@
19
19
  </itemmetadata>
20
20
  <presentation>
21
21
  <material>
22
- <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Bird, bird, bird, bird is the [word]&lt;/p&gt;&lt;/div&gt;</mattext>
22
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Bird, bird, bird, bird is the [blank1]&lt;/p&gt;&lt;/div&gt;</mattext>
23
23
  </material>
24
- <response_lid ident="response_word">
24
+ <response_lid ident="response_blank1">
25
25
  <material>
26
- <mattext>word</mattext>
26
+ <mattext>blank1</mattext>
27
27
  </material>
28
28
  <render_choice>
29
29
  <response_label ident="3537">
@@ -7,6 +7,13 @@ identifier="non-assessment-item">
7
7
  <metadata>
8
8
  <schema>QTIv2.2 Package</schema>
9
9
  <schemaversion>1.0.0</schemaversion>
10
+ <lom xmlns="http://ltsc.ieee.org/xsd/LOM">
11
+ <general>
12
+ <title>
13
+ <string>1027TestTitle12</string>
14
+ </title>
15
+ </general>
16
+ </lom>
10
17
  </metadata>
11
18
  <organizations/>
12
19
  <resources>
@@ -12,11 +12,11 @@ describe Qti::V1::Models::Interactions::BaseFillBlankInteraction do
12
12
 
13
13
  context 'canvas_stem_items' do
14
14
  let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib_as_single.xml') }
15
- let(:simple_prompt) { 'fill in the [blank]' }
15
+ let(:simple_prompt) { 'fill in the [blank1]' }
16
16
  let(:simple_expected) do
17
17
  [
18
18
  { id: 'stem_0', position: 1, type: 'text', value: 'fill in the ' },
19
- { id: 'stem_1', position: 2, type: 'text', value: '[blank]' }
19
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_blank1', blank_name: 'word' }
20
20
  ]
21
21
  end
22
22
  let(:embedded_prompt) { '[[embedded] [groups]]' }
@@ -92,7 +92,7 @@ describe Qti::V1::Models::Interactions::BaseFillBlankInteraction do
92
92
  let(:expected_blanks) do
93
93
  [
94
94
  {
95
- id: 'response_word',
95
+ id: 'response_blank1',
96
96
  choices:
97
97
  [
98
98
  { id: '3537', item_body: 'word', position: 2 }
@@ -44,9 +44,9 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
44
44
  let(:expected_stem_items) do
45
45
  [
46
46
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Roses are ' },
47
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'color1' },
47
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'red' },
48
48
  { id: 'stem_2', position: 3, type: 'text', value: ', violets are ' },
49
- { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'color2' },
49
+ { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'blue' },
50
50
  { id: 'stem_4', position: 5, type: 'text', value: '.</p></div>' }
51
51
  ]
52
52
  end
@@ -47,7 +47,7 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
47
47
  let(:expected_stem_items) do
48
48
  [
49
49
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Chicago is in what state?</p></div>' },
50
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response1', blank_name: 'response1' }
50
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response1', blank_name: 'Illinois' }
51
51
  ]
52
52
  end
53
53
 
@@ -72,9 +72,9 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
72
72
  let(:expected_stem_items) do
73
73
  [
74
74
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p><span>Roses are ' },
75
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'color1' },
75
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_color1', blank_name: 'red' },
76
76
  { id: 'stem_2', position: 3, type: 'text', value: ', violets are ' },
77
- { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'color2' },
77
+ { id: 'stem_3', position: 4, type: 'blank', blank_id: 'response_color2', blank_name: 'blue' },
78
78
  { id: 'stem_4', position: 5, type: 'text', value: '</span></p></div>' }
79
79
  ]
80
80
  end
@@ -102,11 +102,11 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
102
102
  [
103
103
  { id: 'stem_0', position: 1, type: 'text', value: 'Fill-in-the blanks in this text from Richard III: ' },
104
104
  { id: 'stem_1', position: 2, type: 'text', value: 'Now is the ' },
105
- { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'FIB01' },
105
+ { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'Winter' },
106
106
  { id: 'stem_3', position: 4, type: 'text', value: ' of our discontent made glorious ' },
107
- { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'FIB02' },
107
+ { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'Summer' },
108
108
  { id: 'stem_5', position: 6, type: 'text', value: ' by these sons of ' },
109
- { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'FIB03' }
109
+ { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'York' }
110
110
  ]
111
111
  end
112
112
 
@@ -165,11 +165,11 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
165
165
  [
166
166
  { id: 'stem_0', position: 1, type: 'text', value: 'Fill-in-the blanks in this text from Richard III: ' },
167
167
  { id: 'stem_1', position: 2, type: 'text', value: 'Now is the ' },
168
- { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'FIB01' },
168
+ { id: 'stem_2', position: 3, type: 'blank', blank_id: 'FIB01', blank_name: 'Winter' },
169
169
  { id: 'stem_3', position: 4, type: 'text', value: ' of our discontent made glorious ' },
170
- { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'FIB02' },
170
+ { id: 'stem_4', position: 5, type: 'blank', blank_id: 'FIB02', blank_name: 'Summer' },
171
171
  { id: 'stem_5', position: 6, type: 'text', value: ' by these sons of ' },
172
- { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'FIB03' }
172
+ { id: 'stem_6', position: 7, type: 'blank', blank_id: 'FIB03', blank_name: 'York' }
173
173
  ]
174
174
  end
175
175
 
@@ -195,7 +195,7 @@ describe Qti::V1::Models::Interactions::FillBlankInteraction do
195
195
  let(:expected_stem_items) do
196
196
  [
197
197
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Bird, bird, bird, bird is the ' },
198
- { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_word', blank_name: 'word' },
198
+ { id: 'stem_1', position: 2, type: 'blank', blank_id: 'response_blank1', blank_name: 'word' },
199
199
  { id: 'stem_2', position: 3, type: 'text', value: '</p></div>' }
200
200
  ]
201
201
  end
@@ -11,11 +11,16 @@ describe Qti::V2::Models::NonAssessmentTest do
11
11
  it 'expects at least one assement item' do
12
12
  expect(loaded_class.assessment_items.count)
13
13
  end
14
+
15
+ it 'imports title' do
16
+ expect(loaded_class.title).to eq(title)
17
+ end
14
18
  end
15
19
 
16
20
  describe '2.2' do
17
21
  let(:path) { File.join(fixtures_path, 'no_assessment_xml', 'imsmanifest.xml') }
18
22
  let(:loaded_class) { described_class.from_path!(path) }
23
+ let(:title) { '1027TestTitle12' }
19
24
 
20
25
  include_examples 'loading_a_non-assessment'
21
26
  end
@@ -23,6 +28,7 @@ describe Qti::V2::Models::NonAssessmentTest do
23
28
  describe 'package_shared' do
24
29
  let(:path) { File.join(fixtures_path, 'package_shared', 'imsmanifest.xml') }
25
30
  let(:loaded_class) { described_class.from_path!(path) }
31
+ let(:title) { 'imsmanifest' }
26
32
 
27
33
  include_examples 'loading_a_non-assessment'
28
34
  end
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.9.3
4
+ version: 2.9.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: 2022-05-31 00:00:00.000000000 Z
15
+ date: 2022-08-25 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: actionview