qti 2.1.0 → 2.5.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.
Files changed (29) hide show
  1. checksums.yaml +5 -5
  2. data/lib/qti.rb +1 -0
  3. data/lib/qti/models/assessment_meta.rb +78 -3
  4. data/lib/qti/models/resource.rb +26 -2
  5. data/lib/qti/v1/models/assessment_item.rb +4 -0
  6. data/lib/qti/v1/models/interactions/base_fill_blank_interaction.rb +33 -1
  7. data/lib/qti/v1/models/interactions/canvas_multiple_dropdown.rb +2 -29
  8. data/lib/qti/v1/models/object_bank.rb +14 -0
  9. data/lib/qti/version.rb +1 -1
  10. data/spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml +244 -0
  11. data/spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  12. data/spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  13. data/spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml +39 -0
  14. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  15. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  16. data/spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml +39 -0
  17. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml +69 -0
  18. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml +99 -0
  19. data/spec/fixtures/with_banks/imsmanifest.xml +54 -0
  20. data/spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti +85 -0
  21. data/spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti +107 -0
  22. data/spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti +59 -0
  23. data/spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti +145 -0
  24. data/spec/lib/qti/models/assessment_meta_spec.rb +104 -2
  25. data/spec/lib/qti/models/resource_spec.rb +14 -0
  26. data/spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb +146 -0
  27. data/spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb +0 -27
  28. data/spec/lib/qti/v1/models/object_bank_spec.rb +39 -0
  29. metadata +36 -4
@@ -48,4 +48,18 @@ describe Qti::Models::Manifest do
48
48
  expect(assessment_test.assessment_items.first[:resource]).not_to eq(nil)
49
49
  end
50
50
  end
51
+
52
+ describe 'object banks' do
53
+ file = File.join(fixtures_path, 'with_banks/imsmanifest.xml')
54
+ manifest = described_class.from_path!(file)
55
+
56
+ it 'has associated content' do
57
+ expect(manifest.associated_content_list.count).to eq(4)
58
+ end
59
+
60
+ it 'loads objectbanks' do
61
+ expect(manifest.objectbanks.count).to eq(3)
62
+ expect(manifest.objectbanks.first).to be_kind_of(Qti::V1::Models::ObjectBank)
63
+ end
64
+ end
51
65
  end
@@ -0,0 +1,146 @@
1
+ describe Qti::V1::Models::Interactions::BaseFillBlankInteraction do
2
+ let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
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, test_object) }
6
+
7
+ shared_examples_for 'canvas_fib_responses' do
8
+ it 'returns the canvas_fib_responses' do
9
+ expect(loaded_class.canvas_fib_responses).to eq(expected_blanks)
10
+ end
11
+ end
12
+
13
+ context 'canvas_multiple_dropdowns.xml' do
14
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_dropdowns.xml') }
15
+ let(:expected_blanks) do
16
+ [
17
+ {
18
+ id: 'response_color1',
19
+ choices:
20
+ [
21
+ { id: '6548', position: 2, item_body: 'red' },
22
+ { id: '5550', position: 3, item_body: 'plaid' }
23
+ ]
24
+ },
25
+ {
26
+ id: 'response_color2',
27
+ choices:
28
+ [
29
+ { id: '6951', position: 2, item_body: 'blue' },
30
+ { id: '4500', position: 3, item_body: 'paisely' }
31
+ ]
32
+ }
33
+ ]
34
+ end
35
+
36
+ include_examples 'canvas_fib_responses'
37
+ end
38
+
39
+ context 'canvas_multiple_fib.xml' do
40
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib.xml') }
41
+ let(:expected_blanks) do
42
+ [
43
+ {
44
+ id: 'response_color1',
45
+ choices:
46
+ [
47
+ { id: '9799', item_body: 'red', position: 2 },
48
+ { id: '5231', item_body: 'Red', position: 3 }
49
+ ]
50
+ },
51
+ {
52
+ id: 'response_color2',
53
+ choices:
54
+ [
55
+ { id: '5939', item_body: 'blue', position: 2 },
56
+ { id: '6364', item_body: 'Blue', position: 3 }
57
+ ]
58
+ }
59
+ ]
60
+ end
61
+
62
+ include_examples 'canvas_fib_responses'
63
+ end
64
+
65
+ context 'canvas multiple fill in the blank questions with a single blank' do
66
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib_as_single.xml') }
67
+ let(:expected_blanks) do
68
+ [
69
+ {
70
+ id: 'response_word',
71
+ choices:
72
+ [
73
+ { id: '3537', item_body: 'word', position: 2 }
74
+ ]
75
+ }
76
+ ]
77
+ end
78
+
79
+ include_examples 'canvas_fib_responses'
80
+ end
81
+
82
+ context 'canvas multiple fill in the blank questions with a single blank' do
83
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib_extra_brackets.xml') }
84
+ let(:expected_blanks) do
85
+ [
86
+ {
87
+ id: 'response_1',
88
+ choices:
89
+ [
90
+ { id: '8464', item_body: 'A', position: 2 },
91
+ { id: '265', item_body: 'B', position: 3 },
92
+ { id: '3002', item_body: 'C', position: 4 },
93
+ { id: '1356', item_body: 'D', position: 5 },
94
+ { id: '5614', item_body: 'E', position: 6 }
95
+ ]
96
+ },
97
+ {
98
+ id: 'response_2',
99
+ choices:
100
+ [
101
+ { id: '4002', item_body: 'A', position: 2 },
102
+ { id: '8630', item_body: 'B', position: 3 },
103
+ { id: '7844', item_body: 'C', position: 4 },
104
+ { id: '3602', item_body: 'D', position: 5 },
105
+ { id: '9525', item_body: 'E', position: 6 }
106
+ ]
107
+ },
108
+ {
109
+ id: 'response_3',
110
+ choices:
111
+ [
112
+ { id: '8390', item_body: 'A', position: 2 },
113
+ { id: '8745', item_body: 'B', position: 3 },
114
+ { id: '3760', item_body: 'C', position: 4 },
115
+ { id: '7542', item_body: 'D', position: 5 },
116
+ { id: '1523', item_body: 'E', position: 6 }
117
+ ]
118
+ },
119
+ {
120
+ id: 'response_4',
121
+ choices:
122
+ [
123
+ { id: '3317', item_body: 'A', position: 2 },
124
+ { id: '6768', item_body: 'B', position: 3 },
125
+ { id: '5823', item_body: 'C', position: 4 },
126
+ { id: '2492', item_body: 'D', position: 5 },
127
+ { id: '4494', item_body: 'E', position: 6 }
128
+ ]
129
+ },
130
+ {
131
+ id: 'response_5',
132
+ choices:
133
+ [
134
+ { id: '6742', item_body: 'A', position: 2 },
135
+ { id: '794', item_body: 'B', position: 3 },
136
+ { id: '4259', item_body: 'C', position: 4 },
137
+ { id: '4851', item_body: 'D', position: 5 },
138
+ { id: '8574', item_body: 'E', position: 6 }
139
+ ]
140
+ }
141
+ ]
142
+ end
143
+
144
+ include_examples 'canvas_fib_responses'
145
+ end
146
+ end
@@ -10,12 +10,6 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
10
10
  end
11
11
  end
12
12
 
13
- shared_examples_for 'blanks' do
14
- it 'returns the blanks' do
15
- expect(loaded_class.blanks).to eq(expected_blanks)
16
- end
17
- end
18
-
19
13
  shared_examples_for 'answers' do
20
14
  it 'returns the answers' do
21
15
  expect(loaded_class.answers.count).to eq answer_count
@@ -47,26 +41,6 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
47
41
  { id: '6951', position: 2, item_body: 'blue' }
48
42
  ]
49
43
  end
50
- let(:expected_blanks) do
51
- [
52
- {
53
- id: 'response_color1',
54
- choices:
55
- [
56
- { id: '6548', position: 2, item_body: 'red' },
57
- { id: '5550', position: 3, item_body: 'plaid' }
58
- ]
59
- },
60
- {
61
- id: 'response_color2',
62
- choices:
63
- [
64
- { id: '6951', position: 2, item_body: 'blue' },
65
- { id: '4500', position: 3, item_body: 'paisely' }
66
- ]
67
- }
68
- ]
69
- end
70
44
  let(:expected_stem_items) do
71
45
  [
72
46
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Roses are ' },
@@ -97,7 +71,6 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
97
71
 
98
72
  include_examples 'shuffled?'
99
73
  include_examples 'answers'
100
- include_examples 'blanks'
101
74
  include_examples 'stem_items'
102
75
  include_examples 'scoring_data_structs'
103
76
  end
@@ -0,0 +1,39 @@
1
+ describe Qti::V1::Models::ObjectBank do
2
+ describe 'bank loading' do
3
+ [
4
+ 'gf3edf8167be16b3a65a00ca923132b07.xml.qti',
5
+ 'g195e078fb6e3c4054e38e5c9226287ba.xml.qti',
6
+ 'gab22de457404cb5cf022078f1e4da75e.xml.qti'
7
+ ].each do |bankfile|
8
+ file = File.join('spec', 'fixtures', 'with_banks', 'non_cc_assessments', bankfile)
9
+ context "File: #{file}" do
10
+ it 'parses the objectbank without error' do
11
+ expect do
12
+ bank = described_class.from_path!(file)
13
+ expect(bank.assessment_items) # at least one
14
+ end.not_to raise_error
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ describe '#title' do
21
+ it 'missing bank_title defaults to filename' do
22
+ allow(File).to receive(:read).and_return(<<~XML)
23
+ <?xml version="1.0" encoding="UTF-8"?>
24
+ <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">
25
+ <objectbank ident="gooblegobble12345">
26
+ <qtimetadata>
27
+ <qtimetadatafield>
28
+ <fieldlabel>not_a_bank_title</fieldlabel>
29
+ <fieldentry>A different metadata entry</fieldentry>
30
+ </qtimetadatafield>
31
+ </qtimetadata>
32
+ </objectbank>
33
+ </questestinterop>
34
+ XML
35
+ objectbank = described_class.new path: '/etc/FakeBank007.xml'
36
+ expect(objectbank.title).to eq 'FakeBank007'
37
+ end
38
+ end
39
+ 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.1.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannah Bottalla
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-11-12 00:00:00.000000000 Z
12
+ date: 2021-01-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionview
@@ -312,6 +312,7 @@ files:
312
312
  - lib/qti/v1/models/numerics/scoring_data.rb
313
313
  - lib/qti/v1/models/numerics/scoring_node.rb
314
314
  - lib/qti/v1/models/numerics/within_range.rb
315
+ - lib/qti/v1/models/object_bank.rb
315
316
  - lib/qti/v1/models/question_group.rb
316
317
  - lib/qti/v1/models/scoring_data.rb
317
318
  - lib/qti/v1/models/stimulus_item.rb
@@ -355,6 +356,7 @@ files:
355
356
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
356
357
  - spec/fixtures/items_1.2/canvas_multiple_fib.xml
357
358
  - spec/fixtures/items_1.2/canvas_multiple_fib_as_single.xml
359
+ - spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml
358
360
  - spec/fixtures/items_1.2/choice.xml
359
361
  - spec/fixtures/items_1.2/essay.xml
360
362
  - spec/fixtures/items_1.2/fib.xml
@@ -510,6 +512,12 @@ files:
510
512
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
511
513
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
512
514
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
515
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
516
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
517
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml
518
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
519
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
520
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml
513
521
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/assessment_meta.xml
514
522
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/i913965373124f56ca136e87deb040c03.xml
515
523
  - spec/fixtures/test_qti_1.2_multi/ife643a8a04b48b22acab95de6c01f1cc/assessment_meta.xml
@@ -598,6 +606,13 @@ files:
598
606
  - spec/fixtures/tests/tests/rtest26.xml
599
607
  - spec/fixtures/tests/tests/rtest27.xml
600
608
  - spec/fixtures/unsupported_version/imsmanifest.xml
609
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml
610
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml
611
+ - spec/fixtures/with_banks/imsmanifest.xml
612
+ - spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti
613
+ - spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti
614
+ - spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti
615
+ - spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti
601
616
  - spec/gemfiles/rails-5.1.gemfile
602
617
  - spec/gemfiles/rails-5.2.gemfile
603
618
  - spec/gemfiles/rails-6.0.gemfile
@@ -612,6 +627,7 @@ files:
612
627
  - spec/lib/qti/v1/models/assessment_spec.rb
613
628
  - spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
614
629
  - spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
630
+ - spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb
615
631
  - spec/lib/qti/v1/models/interactions/base_interaction_spec.rb
616
632
  - spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb
617
633
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
@@ -629,6 +645,7 @@ files:
629
645
  - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
630
646
  - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
631
647
  - spec/lib/qti/v1/models/numerics/within_range_spec.rb
648
+ - spec/lib/qti/v1/models/object_bank_spec.rb
632
649
  - spec/lib/qti/v1/models/question_group_spec.rb
633
650
  - spec/lib/qti/v1/models/stimulus_item_spec.rb
634
651
  - spec/lib/qti/v2/models/assessment_item_spec.rb
@@ -668,8 +685,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
668
685
  - !ruby/object:Gem::Version
669
686
  version: '0'
670
687
  requirements: []
671
- rubyforge_project:
672
- rubygems_version: 2.6.14.4
688
+ rubygems_version: 3.0.3
673
689
  signing_key:
674
690
  specification_version: 4
675
691
  summary: QTI 1.2 and 2.1 import and export models
@@ -692,6 +708,7 @@ test_files:
692
708
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
693
709
  - spec/fixtures/items_1.2/canvas_multiple_fib.xml
694
710
  - spec/fixtures/items_1.2/canvas_multiple_fib_as_single.xml
711
+ - spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml
695
712
  - spec/fixtures/items_1.2/choice.xml
696
713
  - spec/fixtures/items_1.2/essay.xml
697
714
  - spec/fixtures/items_1.2/fib.xml
@@ -847,6 +864,12 @@ test_files:
847
864
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
848
865
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
849
866
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
867
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
868
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
869
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml
870
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
871
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
872
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml
850
873
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/assessment_meta.xml
851
874
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/i913965373124f56ca136e87deb040c03.xml
852
875
  - spec/fixtures/test_qti_1.2_multi/ife643a8a04b48b22acab95de6c01f1cc/assessment_meta.xml
@@ -935,6 +958,13 @@ test_files:
935
958
  - spec/fixtures/tests/tests/rtest26.xml
936
959
  - spec/fixtures/tests/tests/rtest27.xml
937
960
  - spec/fixtures/unsupported_version/imsmanifest.xml
961
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml
962
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml
963
+ - spec/fixtures/with_banks/imsmanifest.xml
964
+ - spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti
965
+ - spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti
966
+ - spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti
967
+ - spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti
938
968
  - spec/gemfiles/rails-5.1.gemfile
939
969
  - spec/gemfiles/rails-5.2.gemfile
940
970
  - spec/gemfiles/rails-6.0.gemfile
@@ -949,6 +979,7 @@ test_files:
949
979
  - spec/lib/qti/v1/models/assessment_spec.rb
950
980
  - spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
951
981
  - spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
982
+ - spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb
952
983
  - spec/lib/qti/v1/models/interactions/base_interaction_spec.rb
953
984
  - spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb
954
985
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
@@ -966,6 +997,7 @@ test_files:
966
997
  - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
967
998
  - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
968
999
  - spec/lib/qti/v1/models/numerics/within_range_spec.rb
1000
+ - spec/lib/qti/v1/models/object_bank_spec.rb
969
1001
  - spec/lib/qti/v1/models/question_group_spec.rb
970
1002
  - spec/lib/qti/v1/models/stimulus_item_spec.rb
971
1003
  - spec/lib/qti/v2/models/assessment_item_spec.rb