qti 2.26.0 → 2.27.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 +4 -4
- data/lib/qti/sanitizer.rb +343 -1
- data/lib/qti/v1/models/stimulus_item.rb +19 -2
- data/lib/qti/v2/models/stimulus_item.rb +4 -0
- data/lib/qti/version.rb +1 -1
- data/spec/fixtures/items_1.2/stimulus.xml +4 -0
- data/spec/fixtures/items_1.2/stimulus_passage.xml +48 -0
- data/spec/lib/qti/v1/models/stimulus_item_spec.rb +20 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c3be9692650dc7d212b9bb3618b9926baebbad109aeadac7ddb4778c6be65e8
|
4
|
+
data.tar.gz: 3560522773a644fca6d88548c7494c6135858171a7c607fd4172b6d515c6b689
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9cc42e6a26a221f71501e96493dd29c57c880cbf77bd41c90988d14182f2a22c03cc79dbc81e64f3489cbb141126d9e65ec907fff802baea8258181ecacc04e6
|
7
|
+
data.tar.gz: 7f434b423b05eab7c0bbafb9443fa083d4b0226a15425eaf49246b9388d45d61cf040b542a0308433c613f989a1f0ceed31ade37bcdb242a6fba406405ace82a
|
data/lib/qti/sanitizer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
module Qti
|
2
|
+
# rubocop:disable Metrics/ClassLength
|
2
3
|
class Sanitizer
|
3
4
|
ELEMENTS_REMAP = {
|
4
5
|
'prompt' => 'div',
|
@@ -93,7 +94,347 @@ module Qti
|
|
93
94
|
allowfullscreen webkitallowfullscreen mozallowfullscreen
|
94
95
|
allow] + ALL_DATA_ATTR, # TODO: remove explicit allow with domain whitelist account setting
|
95
96
|
'a' => relaxed_config('a', ['target'] + ALL_DATA_ATTR),
|
96
|
-
'img' => relaxed_config('img', ALL_DATA_ATTR)
|
97
|
+
'img' => relaxed_config('img', ALL_DATA_ATTR),
|
98
|
+
# MathML
|
99
|
+
'annotation' => %w[href xref definitionURL encoding cd name src].freeze,
|
100
|
+
'annotation-xml' => %w[href xref definitionURL encoding cd name src].freeze,
|
101
|
+
'maction' => %w[href xref mathcolor mathbackground actiontype selection].freeze,
|
102
|
+
'maligngroup' => %w[href xref mathcolor mathbackground groupalign].freeze,
|
103
|
+
'malignmark' => %w[href xref mathcolor mathbackground edge].freeze,
|
104
|
+
'map' => ['name'].freeze,
|
105
|
+
'math' => %w[href
|
106
|
+
xref
|
107
|
+
display
|
108
|
+
maxwidth
|
109
|
+
overflow
|
110
|
+
altimg
|
111
|
+
altimg-width
|
112
|
+
altimg-height
|
113
|
+
altimg-valign
|
114
|
+
alttext
|
115
|
+
cdgroup
|
116
|
+
mathcolor
|
117
|
+
mathbackground
|
118
|
+
scriptlevel
|
119
|
+
displaystyle
|
120
|
+
scriptsizemultiplier
|
121
|
+
scriptminsize
|
122
|
+
infixlinebreakstyle
|
123
|
+
decimalpoint
|
124
|
+
mathvariant
|
125
|
+
mathsize
|
126
|
+
width
|
127
|
+
height
|
128
|
+
valign
|
129
|
+
form
|
130
|
+
fence
|
131
|
+
separator
|
132
|
+
lspace
|
133
|
+
rspace
|
134
|
+
stretchy
|
135
|
+
symmetric
|
136
|
+
maxsize
|
137
|
+
minsize
|
138
|
+
largeop
|
139
|
+
movablelimits
|
140
|
+
accent
|
141
|
+
linebreak
|
142
|
+
lineleading
|
143
|
+
linebreakstyle
|
144
|
+
linebreakmultchar
|
145
|
+
indentalign
|
146
|
+
indentshift
|
147
|
+
indenttarget
|
148
|
+
indentalignfirst
|
149
|
+
indentshiftfirst
|
150
|
+
indentalignlast
|
151
|
+
indentshiftlast
|
152
|
+
depth
|
153
|
+
lquote
|
154
|
+
rquote
|
155
|
+
linethickness
|
156
|
+
munalign
|
157
|
+
denomalign
|
158
|
+
bevelled
|
159
|
+
voffset
|
160
|
+
open
|
161
|
+
close
|
162
|
+
separators
|
163
|
+
notation
|
164
|
+
subscriptshift
|
165
|
+
superscriptshift
|
166
|
+
accentunder
|
167
|
+
align
|
168
|
+
rowalign
|
169
|
+
columnalign
|
170
|
+
groupalign
|
171
|
+
alignmentscope
|
172
|
+
columnwidth
|
173
|
+
rowspacing
|
174
|
+
columnspacing
|
175
|
+
rowlines
|
176
|
+
columnlines
|
177
|
+
frame
|
178
|
+
framespacing
|
179
|
+
equalrows
|
180
|
+
equalcolumns
|
181
|
+
side
|
182
|
+
minlabelspacing
|
183
|
+
rowspan
|
184
|
+
columnspan
|
185
|
+
edge
|
186
|
+
stackalign
|
187
|
+
charalign
|
188
|
+
charspacing
|
189
|
+
longdivstyle
|
190
|
+
position
|
191
|
+
shift
|
192
|
+
location
|
193
|
+
crossout
|
194
|
+
length
|
195
|
+
leftoverhang
|
196
|
+
rightoverhang
|
197
|
+
mslinethickness
|
198
|
+
selection
|
199
|
+
xmlns].freeze,
|
200
|
+
'menclose' => %w[href xref mathcolor mathbackground notation].freeze,
|
201
|
+
'merror' => %w[href xref mathcolor mathbackground].freeze,
|
202
|
+
'mfenced' => %w[href xref mathcolor mathbackground open close separators].freeze,
|
203
|
+
'mfrac' => %w[href
|
204
|
+
xref
|
205
|
+
mathcolor
|
206
|
+
mathbackground
|
207
|
+
linethickness
|
208
|
+
munalign
|
209
|
+
denomalign
|
210
|
+
bevelled].freeze,
|
211
|
+
'mglyph' => %w[href xref mathcolor mathbackground src alt width height valign].freeze,
|
212
|
+
'mi' => %w[href xref mathcolor mathbackground mathvariant mathsize].freeze,
|
213
|
+
'mlabeledtr' => %w[href xref mathcolor mathbackground].freeze,
|
214
|
+
'mlongdiv' => %w[href
|
215
|
+
xref
|
216
|
+
mathcolor
|
217
|
+
mathbackground
|
218
|
+
longdivstyle
|
219
|
+
align
|
220
|
+
stackalign
|
221
|
+
charalign
|
222
|
+
charspacing].freeze,
|
223
|
+
'mmultiscripts' => %w[href
|
224
|
+
xref
|
225
|
+
mathcolor
|
226
|
+
mathbackground
|
227
|
+
subscriptshift
|
228
|
+
superscriptshift].freeze,
|
229
|
+
'mn' => %w[href xref mathcolor mathbackground mathvariant mathsize].freeze,
|
230
|
+
'mo' => %w[href
|
231
|
+
xref
|
232
|
+
mathcolor
|
233
|
+
mathbackground
|
234
|
+
mathvariant
|
235
|
+
mathsize
|
236
|
+
form
|
237
|
+
fence
|
238
|
+
separator
|
239
|
+
lspace
|
240
|
+
rspace
|
241
|
+
stretchy
|
242
|
+
symmetric
|
243
|
+
maxsize
|
244
|
+
minsize
|
245
|
+
largeop
|
246
|
+
movablelimits
|
247
|
+
accent
|
248
|
+
linebreak
|
249
|
+
lineleading
|
250
|
+
linebreakstyle
|
251
|
+
linebreakmultchar
|
252
|
+
indentalign
|
253
|
+
indentshift
|
254
|
+
indenttarget
|
255
|
+
indentalignfirst
|
256
|
+
indentshiftfirst
|
257
|
+
indentalignlast
|
258
|
+
indentshiftlast].freeze,
|
259
|
+
'mover' => %w[href xref mathcolor mathbackground accent align].freeze,
|
260
|
+
'mpadded' => %w[href
|
261
|
+
xref
|
262
|
+
mathcolor
|
263
|
+
mathbackground
|
264
|
+
height
|
265
|
+
depth
|
266
|
+
width
|
267
|
+
lspace
|
268
|
+
voffset].freeze,
|
269
|
+
'mphantom' => %w[href xref mathcolor mathbackground].freeze,
|
270
|
+
'mprescripts' => %w[href xref mathcolor mathbackground].freeze,
|
271
|
+
'mroot' => %w[href xref mathcolor mathbackground].freeze,
|
272
|
+
'mrow' => %w[href xref mathcolor mathbackground].freeze,
|
273
|
+
'ms' => %w[href xref mathcolor mathbackground mathvariant mathsize lquote rquote].freeze,
|
274
|
+
'mscarries' => %w[href
|
275
|
+
xref
|
276
|
+
mathcolor
|
277
|
+
mathbackground
|
278
|
+
position
|
279
|
+
location
|
280
|
+
crossout
|
281
|
+
scriptsizemultiplier].freeze,
|
282
|
+
'mscarry' => %w[href xref mathcolor mathbackground location crossout].freeze,
|
283
|
+
'msgroup' => %w[href xref mathcolor mathbackground position shift].freeze,
|
284
|
+
'msline' => %w[href
|
285
|
+
xref
|
286
|
+
mathcolor
|
287
|
+
mathbackground
|
288
|
+
position
|
289
|
+
length
|
290
|
+
leftoverhang
|
291
|
+
rightoverhang
|
292
|
+
mslinethickness].freeze,
|
293
|
+
'mspace' => %w[href xref mathcolor mathbackground mathvariant mathsize].freeze,
|
294
|
+
'msqrt' => %w[href xref mathcolor mathbackground].freeze,
|
295
|
+
'msrow' => %w[href xref mathcolor mathbackground position].freeze,
|
296
|
+
'mstack' => %w[href
|
297
|
+
xref
|
298
|
+
mathcolor
|
299
|
+
mathbackground
|
300
|
+
align
|
301
|
+
stackalign
|
302
|
+
charalign
|
303
|
+
charspacing].freeze,
|
304
|
+
'mstyle' => %w[href
|
305
|
+
xref
|
306
|
+
mathcolor
|
307
|
+
mathbackground
|
308
|
+
scriptlevel
|
309
|
+
displaystyle
|
310
|
+
scriptsizemultiplier
|
311
|
+
scriptminsize
|
312
|
+
infixlinebreakstyle
|
313
|
+
decimalpoint
|
314
|
+
mathvariant
|
315
|
+
mathsize
|
316
|
+
width
|
317
|
+
height
|
318
|
+
valign
|
319
|
+
form
|
320
|
+
fence
|
321
|
+
separator
|
322
|
+
lspace
|
323
|
+
rspace
|
324
|
+
stretchy
|
325
|
+
symmetric
|
326
|
+
maxsize
|
327
|
+
minsize
|
328
|
+
largeop
|
329
|
+
movablelimits
|
330
|
+
accent
|
331
|
+
linebreak
|
332
|
+
lineleading
|
333
|
+
linebreakstyle
|
334
|
+
linebreakmultchar
|
335
|
+
indentalign
|
336
|
+
indentshift
|
337
|
+
indenttarget
|
338
|
+
indentalignfirst
|
339
|
+
indentshiftfirst
|
340
|
+
indentalignlast
|
341
|
+
indentshiftlast
|
342
|
+
depth
|
343
|
+
lquote
|
344
|
+
rquote
|
345
|
+
linethickness
|
346
|
+
munalign
|
347
|
+
denomalign
|
348
|
+
bevelled
|
349
|
+
voffset
|
350
|
+
open
|
351
|
+
close
|
352
|
+
separators
|
353
|
+
notation
|
354
|
+
subscriptshift
|
355
|
+
superscriptshift
|
356
|
+
accentunder
|
357
|
+
align
|
358
|
+
rowalign
|
359
|
+
columnalign
|
360
|
+
groupalign
|
361
|
+
alignmentscope
|
362
|
+
columnwidth
|
363
|
+
rowspacing
|
364
|
+
columnspacing
|
365
|
+
rowlines
|
366
|
+
columnlines
|
367
|
+
frame
|
368
|
+
framespacing
|
369
|
+
equalrows
|
370
|
+
equalcolumns
|
371
|
+
side
|
372
|
+
minlabelspacing
|
373
|
+
rowspan
|
374
|
+
columnspan
|
375
|
+
edge
|
376
|
+
stackalign
|
377
|
+
charalign
|
378
|
+
charspacing
|
379
|
+
longdivstyle
|
380
|
+
position
|
381
|
+
shift
|
382
|
+
location
|
383
|
+
crossout
|
384
|
+
length
|
385
|
+
leftoverhang
|
386
|
+
rightoverhang
|
387
|
+
mslinethickness
|
388
|
+
selection].freeze,
|
389
|
+
'msub' => %w[href xref mathcolor mathbackground subscriptshift].freeze,
|
390
|
+
'msubsup' => %w[href xref mathcolor mathbackground subscriptshift superscriptshift].freeze,
|
391
|
+
'msup' => %w[href xref mathcolor mathbackground superscriptshift].freeze,
|
392
|
+
'mtable' => %w[href
|
393
|
+
xref
|
394
|
+
mathcolor
|
395
|
+
mathbackground
|
396
|
+
align
|
397
|
+
rowalign
|
398
|
+
columnalign
|
399
|
+
groupalign
|
400
|
+
alignmentscope
|
401
|
+
columnwidth
|
402
|
+
width
|
403
|
+
rowspacing
|
404
|
+
columnspacing
|
405
|
+
rowlines
|
406
|
+
columnlines
|
407
|
+
frame
|
408
|
+
framespacing
|
409
|
+
equalrows
|
410
|
+
equalcolumns
|
411
|
+
displaystyle
|
412
|
+
side
|
413
|
+
minlabelspacing].freeze,
|
414
|
+
'mtd' => %w[href
|
415
|
+
xref
|
416
|
+
mathcolor
|
417
|
+
mathbackground
|
418
|
+
rowspan
|
419
|
+
columnspan
|
420
|
+
rowalign
|
421
|
+
columnalign
|
422
|
+
groupalign].freeze,
|
423
|
+
'mtext' => %w[href
|
424
|
+
xref
|
425
|
+
mathcolor
|
426
|
+
mathbackground
|
427
|
+
mathvariant
|
428
|
+
mathsize
|
429
|
+
width
|
430
|
+
height
|
431
|
+
depth
|
432
|
+
linebreak].freeze,
|
433
|
+
'mtr' => %w[href xref mathcolor mathbackground rowalign columnalign groupalign].freeze,
|
434
|
+
'munder' => %w[href xref mathcolor mathbackground accentunder align].freeze,
|
435
|
+
'munderover' => %w[href xref mathcolor mathbackground accent accentunder align].freeze,
|
436
|
+
'none' => %w[href xref mathcolor mathbackground].freeze,
|
437
|
+
'semantics' => %w[href xref definitionURL encoding].freeze
|
97
438
|
}
|
98
439
|
}.freeze
|
99
440
|
|
@@ -200,4 +541,5 @@ module Qti
|
|
200
541
|
node.unlink
|
201
542
|
end
|
202
543
|
end
|
544
|
+
# rubocop:enable Metrics/ClassLength
|
203
545
|
end
|
@@ -54,13 +54,30 @@ module Qti
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
def default_orientation
|
58
|
+
passage == 'true' ? 'top' : 'left'
|
59
|
+
end
|
60
|
+
|
57
61
|
def orientation
|
58
62
|
@orientation ||= begin
|
59
63
|
presentation = @node.at_xpath('.//xmlns:presentation')
|
60
|
-
return
|
61
|
-
|
64
|
+
return default_orientation if presentation.blank?
|
65
|
+
|
66
|
+
orientation_value = presentation.at_xpath('.//xmlns:material')&.attributes&.[]('orientation')&.value
|
67
|
+
orientation_value.presence || default_orientation
|
62
68
|
end
|
63
69
|
end
|
70
|
+
|
71
|
+
def passage_qti_metadata?
|
72
|
+
qti_metadata_children.children.any? { |node| node.text == 'passage' }
|
73
|
+
end
|
74
|
+
|
75
|
+
def passage
|
76
|
+
return false unless passage_qti_metadata?
|
77
|
+
|
78
|
+
passage_label = qti_metadata_children.children.find { |node| node.text == 'passage' }
|
79
|
+
passage_label&.next&.text.presence || false
|
80
|
+
end
|
64
81
|
end
|
65
82
|
end
|
66
83
|
end
|
data/lib/qti/version.rb
CHANGED
@@ -31,6 +31,10 @@
|
|
31
31
|
<fieldlabel>source_url</fieldlabel>
|
32
32
|
<fieldentry>https://sourceurl.com</fieldentry>
|
33
33
|
</qtimetadatafield>
|
34
|
+
<qtimetadatafield>
|
35
|
+
<fieldlabel>passage</fieldlabel>
|
36
|
+
<fieldentry>false</fieldentry>
|
37
|
+
</qtimetadatafield>
|
34
38
|
</qtimetadata>
|
35
39
|
</itemmetadata>
|
36
40
|
<presentation>
|
@@ -0,0 +1,48 @@
|
|
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="i1e5e0d6fba7342e63ae43afe9863070d" title="Quiz.text">
|
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="d74b47a4abeeed159e030bfecbcecea2" title="some title" instructions="some instructions">
|
12
|
+
<itemmetadata>
|
13
|
+
<qtimetadata>
|
14
|
+
<qtimetadatafield>
|
15
|
+
<fieldlabel>question_type</fieldlabel>
|
16
|
+
<fieldentry>text_only_question</fieldentry>
|
17
|
+
</qtimetadatafield>
|
18
|
+
<qtimetadatafield>
|
19
|
+
<fieldlabel>points_possible</fieldlabel>
|
20
|
+
<fieldentry>0.0</fieldentry>
|
21
|
+
</qtimetadatafield>
|
22
|
+
<qtimetadatafield>
|
23
|
+
<fieldlabel>original_answer_ids</fieldlabel>
|
24
|
+
<fieldentry/>
|
25
|
+
</qtimetadatafield>
|
26
|
+
<qtimetadatafield>
|
27
|
+
<fieldlabel>assessment_question_identifierref</fieldlabel>
|
28
|
+
<fieldentry>9f47365e112840d80a79a960b1b0b6a7</fieldentry>
|
29
|
+
</qtimetadatafield>
|
30
|
+
<qtimetadatafield>
|
31
|
+
<fieldlabel>source_url</fieldlabel>
|
32
|
+
<fieldentry>https://sourceurl.com</fieldentry>
|
33
|
+
</qtimetadatafield>
|
34
|
+
<qtimetadatafield>
|
35
|
+
<fieldlabel>passage</fieldlabel>
|
36
|
+
<fieldentry>true</fieldentry>
|
37
|
+
</qtimetadatafield>
|
38
|
+
</qtimetadata>
|
39
|
+
</itemmetadata>
|
40
|
+
<presentation>
|
41
|
+
<material orientation="top">
|
42
|
+
<mattext texttype="text/html"><p>passage content</p></mattext>
|
43
|
+
</material>
|
44
|
+
</presentation>
|
45
|
+
</item>
|
46
|
+
</section>
|
47
|
+
</assessment>
|
48
|
+
</questestinterop>
|
@@ -59,7 +59,24 @@ describe Qti::V1::Models::StimulusItem do
|
|
59
59
|
{
|
60
60
|
source_url: 'https://sourceurl.com',
|
61
61
|
instructions: 'some instructions',
|
62
|
-
orientation: 'top'
|
62
|
+
orientation: 'top',
|
63
|
+
passage: 'false'
|
64
|
+
}.each do |key, value|
|
65
|
+
it "returns the correct #{key}" do
|
66
|
+
expect(stimulus_item.send(key)).to eq(value)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when the passage item was generated by New Quizzes' do
|
72
|
+
let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'stimulus_passage.xml') }
|
73
|
+
let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
|
74
|
+
let(:stimulus_item) { test_object.create_stimulus(test_object.assessment_items.first) }
|
75
|
+
{
|
76
|
+
source_url: 'https://sourceurl.com',
|
77
|
+
instructions: 'some instructions',
|
78
|
+
orientation: 'top',
|
79
|
+
passage: 'true'
|
63
80
|
}.each do |key, value|
|
64
81
|
it "returns the correct #{key}" do
|
65
82
|
expect(stimulus_item.send(key)).to eq(value)
|
@@ -75,7 +92,8 @@ describe Qti::V1::Models::StimulusItem do
|
|
75
92
|
{
|
76
93
|
source_url: nil,
|
77
94
|
instructions: nil,
|
78
|
-
orientation: 'left'
|
95
|
+
orientation: 'left',
|
96
|
+
passage: false
|
79
97
|
}.each do |key, value|
|
80
98
|
it "returns the correct #{key}" do
|
81
99
|
expect(stimulus_item.send(key)).to eq(value)
|
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.
|
4
|
+
version: 2.27.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-03
|
15
|
+
date: 2025-04-03 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: actionview
|
@@ -423,6 +423,7 @@ files:
|
|
423
423
|
- spec/fixtures/items_1.2/question_group.xml
|
424
424
|
- spec/fixtures/items_1.2/single_fib.xml
|
425
425
|
- spec/fixtures/items_1.2/stimulus.xml
|
426
|
+
- spec/fixtures/items_1.2/stimulus_passage.xml
|
426
427
|
- spec/fixtures/items_1.2/stimulus_with_child_item.xml
|
427
428
|
- spec/fixtures/items_1.2/text.no.question.xml
|
428
429
|
- spec/fixtures/items_1.2/true_false.xml
|
@@ -806,6 +807,7 @@ test_files:
|
|
806
807
|
- spec/fixtures/items_1.2/question_group.xml
|
807
808
|
- spec/fixtures/items_1.2/single_fib.xml
|
808
809
|
- spec/fixtures/items_1.2/stimulus.xml
|
810
|
+
- spec/fixtures/items_1.2/stimulus_passage.xml
|
809
811
|
- spec/fixtures/items_1.2/stimulus_with_child_item.xml
|
810
812
|
- spec/fixtures/items_1.2/text.no.question.xml
|
811
813
|
- spec/fixtures/items_1.2/true_false.xml
|