qti 2.9.3 → 2.9.4

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