qti 1.0.1 → 1.0.2

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
  SHA1:
3
- metadata.gz: 315234c90e8d65de3ac5b6b76442ee02a500cac7
4
- data.tar.gz: d7d9a5424e10690045b3565791b717af1f9e1086
3
+ metadata.gz: 0adc4925447bc8f267876ac0281d6db34b9b3835
4
+ data.tar.gz: ba17b261d862806bb52a55308355c9e9f6833c8a
5
5
  SHA512:
6
- metadata.gz: e7c2dbd53f2eb95fb284f81b3bc49b206ac7054613982436a28956b57d81b2261246378ff6685fa35acddaa9ee6a9c600f7ed6577f5f5ee63f5749595fe4c8bd
7
- data.tar.gz: 00faf5b236a8d229e157c9a9b432efa451f1589b3d3d81a65ec02ed1925837c2a77dd2f3d7820e66268f1125ce816ed7fe4634a187abd1b3554920ff9ba73702
6
+ metadata.gz: d948f1c7714d5d813b2b09e8716c5177204583a9e677024a8a8f24fdcb6f1f4c30821bcf8a30b2854f2ab5b4a989d2ea94b4ce7d06181b00317ddce185e1c089
7
+ data.tar.gz: f9dd17a0ef7b3be6c216fdf117a54ff26b90806da649b6cf432218bedfb1d813c1fe9f70e315b31cae856ec2e5e12815d810bfed25a0ff6ed5213933d6736ff3
data/lib/qti.rb CHANGED
@@ -50,6 +50,10 @@ module Qti
50
50
  def create_stimulus(stimulus_ref)
51
51
  @import.create_stimulus(stimulus_ref)
52
52
  end
53
+
54
+ def create_question_group(question_group_ref)
55
+ @import.create_question_group(question_group_ref)
56
+ end
53
57
  end
54
58
  end
55
59
 
@@ -77,6 +81,7 @@ require 'qti/v1/models/numerics/scoring_data'
77
81
  require 'qti/v1/models/numerics/scoring_node'
78
82
  require 'qti/v1/models/numerics/within_range'
79
83
  require 'qti/v1/models/stimulus_item'
84
+ require 'qti/v1/models/question_group'
80
85
 
81
86
  require 'qti/v2/models/base'
82
87
  require 'qti/v2/models/choices/simple_choice'
@@ -6,16 +6,18 @@ module Qti
6
6
  module Models
7
7
  class Assessment < Qti::V1::Models::Base
8
8
  include Qti::Models::AssessmentMetaBase
9
+ GROUP_ID = 'xmlns:section/xmlns:selection_ordering'.freeze
10
+
9
11
  def title
10
12
  @title ||= xpath_with_single_check('.//xmlns:assessment/@title')&.content || File.basename(@path, '.xml')
11
13
  end
12
14
 
13
15
  def assessment_items
14
- @doc.xpath('.//xmlns:item')
16
+ @doc.xpath("//*[self::#{GROUP_ID} or self::xmlns:item[not(ancestor::#{GROUP_ID})]]")
15
17
  end
16
18
 
17
19
  def create_assessment_item(assessment_item)
18
- return nil if stimulus?(assessment_item)
20
+ return nil if sub_section?(assessment_item)
19
21
  item = Qti::V1::Models::AssessmentItem.new(assessment_item, @package_root)
20
22
  item.manifest = manifest
21
23
  item
@@ -30,8 +32,17 @@ module Qti
30
32
  Qti::V1::Models::StimulusItem.new(stimulus_ref)
31
33
  end
32
34
 
35
+ def create_question_group(group_ref)
36
+ return nil unless question_group?(group_ref)
37
+ Qti::V1::Models::QuestionGroup.new(group_ref)
38
+ end
39
+
33
40
  private
34
41
 
42
+ def sub_section?(ref_node)
43
+ stimulus?(ref_node) || question_group?(ref_node)
44
+ end
45
+
35
46
  def stimulus?(ref_node)
36
47
  meta_node = ref_node.at_xpath(
37
48
  './/xmlns:qtimetadatafield[./xmlns:fieldlabel/text()="question_type"]'
@@ -40,6 +51,10 @@ module Qti
40
51
  type_node = meta_node.at_xpath('.//xmlns:fieldentry')
41
52
  type_node&.text() == 'text_only_question'
42
53
  end
54
+
55
+ def question_group?(ref_node)
56
+ ref_node.xpath("self::#{GROUP_ID}").present?
57
+ end
43
58
  end
44
59
  end
45
60
  end
@@ -0,0 +1,58 @@
1
+ require 'qti/v1/models/base'
2
+ require 'qti/v1/models/interactions'
3
+
4
+ module Qti
5
+ module V1
6
+ module Models
7
+ class QuestionGroup < Qti::V1::Models::Base
8
+ attr_reader :doc
9
+
10
+ def initialize(item, package_root = nil)
11
+ @doc = item
12
+ @path = item.document.url
13
+ self.package_root = package_root
14
+ end
15
+
16
+ def test_object
17
+ self
18
+ end
19
+
20
+ def assessment_item_refs
21
+ items
22
+ end
23
+
24
+ def create_assessment_item(assessment_item)
25
+ Qti::V1::Models::AssessmentItem.new(assessment_item)
26
+ end
27
+
28
+ def items
29
+ @doc.xpath('.//xmlns:item')
30
+ end
31
+
32
+ def selection
33
+ @doc.xpath('xmlns:selection_ordering/xmlns:selection')
34
+ end
35
+
36
+ def selection_number
37
+ selection&.xpath('xmlns:selection_number')&.text&.to_i
38
+ end
39
+
40
+ def points_per_item
41
+ selection.xpath('xmlns:selection_extension/xmlns:points_per_item')&.text&.to_f
42
+ end
43
+
44
+ def identifier
45
+ @identifier ||= @doc.attribute('ident').value
46
+ end
47
+
48
+ def title
49
+ @title ||= @doc.attribute('title').value
50
+ end
51
+
52
+ def group_item?(item)
53
+ item.xpath('../section').first&.dig('ident') == ident
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -6,7 +6,6 @@ module Qti
6
6
  @node = ref_node
7
7
  end
8
8
 
9
- # Not used yet
10
9
  def identifier
11
10
  @identifier ||= @node.attributes['ident']&.value
12
11
  end
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '1.0.1'.freeze
2
+ VERSION = '1.0.2'.freeze
3
3
  end
@@ -0,0 +1,513 @@
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="i1211c711ada74a559ee1b6c122358695" title="Question Groups">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <section ident="i4663897607358cfba8636ed6127b9466" title="Group 1 (1/4)">
12
+ <selection_ordering>
13
+ <selection>
14
+ <selection_number>1</selection_number>
15
+ <selection_extension>
16
+ <points_per_item>1.0</points_per_item>
17
+ </selection_extension>
18
+ </selection>
19
+ </selection_ordering>
20
+ <item ident="i09d4a5492a38a5b4d1533b8fdbdf7376" title="Question">
21
+ <itemmetadata>
22
+ <qtimetadata>
23
+ <qtimetadatafield>
24
+ <fieldlabel>question_type</fieldlabel>
25
+ <fieldentry>true_false_question</fieldentry>
26
+ </qtimetadatafield>
27
+ <qtimetadatafield>
28
+ <fieldlabel>points_possible</fieldlabel>
29
+ <fieldentry>1.0</fieldentry>
30
+ </qtimetadatafield>
31
+ <qtimetadatafield>
32
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
33
+ <fieldentry>i9723da38ef62213190d66c6e49c65b3b</fieldentry>
34
+ </qtimetadatafield>
35
+ </qtimetadata>
36
+ </itemmetadata>
37
+ <presentation>
38
+ <material>
39
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 1/4&lt;/p&gt;&lt;/div&gt;</mattext>
40
+ </material>
41
+ <response_lid ident="response1" rcardinality="Single">
42
+ <render_choice>
43
+ <response_label ident="6511">
44
+ <material>
45
+ <mattext texttype="text/plain">True</mattext>
46
+ </material>
47
+ </response_label>
48
+ <response_label ident="2200">
49
+ <material>
50
+ <mattext texttype="text/plain">False</mattext>
51
+ </material>
52
+ </response_label>
53
+ </render_choice>
54
+ </response_lid>
55
+ </presentation>
56
+ <resprocessing>
57
+ <outcomes>
58
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
59
+ </outcomes>
60
+ <respcondition continue="No">
61
+ <conditionvar>
62
+ <varequal respident="response1">6511</varequal>
63
+ </conditionvar>
64
+ <setvar action="Set" varname="SCORE">100</setvar>
65
+ </respcondition>
66
+ </resprocessing>
67
+ </item>
68
+ <item ident="i7b3409a814cecc1f8a3b1bcff5f0fcdf" title="Question">
69
+ <itemmetadata>
70
+ <qtimetadata>
71
+ <qtimetadatafield>
72
+ <fieldlabel>question_type</fieldlabel>
73
+ <fieldentry>true_false_question</fieldentry>
74
+ </qtimetadatafield>
75
+ <qtimetadatafield>
76
+ <fieldlabel>points_possible</fieldlabel>
77
+ <fieldentry>1.0</fieldentry>
78
+ </qtimetadatafield>
79
+ <qtimetadatafield>
80
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
81
+ <fieldentry>i5eea42a18e64c6285cc389e39c240f56</fieldentry>
82
+ </qtimetadatafield>
83
+ </qtimetadata>
84
+ </itemmetadata>
85
+ <presentation>
86
+ <material>
87
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 2/4&lt;/p&gt;&lt;/div&gt;</mattext>
88
+ </material>
89
+ <response_lid ident="response1" rcardinality="Single">
90
+ <render_choice>
91
+ <response_label ident="5079">
92
+ <material>
93
+ <mattext texttype="text/plain">True</mattext>
94
+ </material>
95
+ </response_label>
96
+ <response_label ident="7108">
97
+ <material>
98
+ <mattext texttype="text/plain">False</mattext>
99
+ </material>
100
+ </response_label>
101
+ </render_choice>
102
+ </response_lid>
103
+ </presentation>
104
+ <resprocessing>
105
+ <outcomes>
106
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
107
+ </outcomes>
108
+ <respcondition continue="No">
109
+ <conditionvar>
110
+ <varequal respident="response1">5079</varequal>
111
+ </conditionvar>
112
+ <setvar action="Set" varname="SCORE">100</setvar>
113
+ </respcondition>
114
+ </resprocessing>
115
+ </item>
116
+ <item ident="i8b91498a3f83d1e7f63ea209daa44f92" title="Question">
117
+ <itemmetadata>
118
+ <qtimetadata>
119
+ <qtimetadatafield>
120
+ <fieldlabel>question_type</fieldlabel>
121
+ <fieldentry>true_false_question</fieldentry>
122
+ </qtimetadatafield>
123
+ <qtimetadatafield>
124
+ <fieldlabel>points_possible</fieldlabel>
125
+ <fieldentry>1.0</fieldentry>
126
+ </qtimetadatafield>
127
+ <qtimetadatafield>
128
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
129
+ <fieldentry>i092db5ab1f15184bd27749507ccfcfc8</fieldentry>
130
+ </qtimetadatafield>
131
+ </qtimetadata>
132
+ </itemmetadata>
133
+ <presentation>
134
+ <material>
135
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 3/4&lt;/p&gt;&lt;/div&gt;</mattext>
136
+ </material>
137
+ <response_lid ident="response1" rcardinality="Single">
138
+ <render_choice>
139
+ <response_label ident="9867">
140
+ <material>
141
+ <mattext texttype="text/plain">True</mattext>
142
+ </material>
143
+ </response_label>
144
+ <response_label ident="6703">
145
+ <material>
146
+ <mattext texttype="text/plain">False</mattext>
147
+ </material>
148
+ </response_label>
149
+ </render_choice>
150
+ </response_lid>
151
+ </presentation>
152
+ <resprocessing>
153
+ <outcomes>
154
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
155
+ </outcomes>
156
+ <respcondition continue="No">
157
+ <conditionvar>
158
+ <varequal respident="response1">9867</varequal>
159
+ </conditionvar>
160
+ <setvar action="Set" varname="SCORE">100</setvar>
161
+ </respcondition>
162
+ </resprocessing>
163
+ </item>
164
+ <item ident="i23101ab8e035c3822816bde3ac848627" title="Question">
165
+ <itemmetadata>
166
+ <qtimetadata>
167
+ <qtimetadatafield>
168
+ <fieldlabel>question_type</fieldlabel>
169
+ <fieldentry>true_false_question</fieldentry>
170
+ </qtimetadatafield>
171
+ <qtimetadatafield>
172
+ <fieldlabel>points_possible</fieldlabel>
173
+ <fieldentry>1.0</fieldentry>
174
+ </qtimetadatafield>
175
+ <qtimetadatafield>
176
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
177
+ <fieldentry>i32386709fe3cc7f27cd9aa7ebdc8d878</fieldentry>
178
+ </qtimetadatafield>
179
+ </qtimetadata>
180
+ </itemmetadata>
181
+ <presentation>
182
+ <material>
183
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 4/4&lt;/p&gt;&lt;/div&gt;</mattext>
184
+ </material>
185
+ <response_lid ident="response1" rcardinality="Single">
186
+ <render_choice>
187
+ <response_label ident="7862">
188
+ <material>
189
+ <mattext texttype="text/plain">True</mattext>
190
+ </material>
191
+ </response_label>
192
+ <response_label ident="4572">
193
+ <material>
194
+ <mattext texttype="text/plain">False</mattext>
195
+ </material>
196
+ </response_label>
197
+ </render_choice>
198
+ </response_lid>
199
+ </presentation>
200
+ <resprocessing>
201
+ <outcomes>
202
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
203
+ </outcomes>
204
+ <respcondition continue="No">
205
+ <conditionvar>
206
+ <varequal respident="response1">7862</varequal>
207
+ </conditionvar>
208
+ <setvar action="Set" varname="SCORE">100</setvar>
209
+ </respcondition>
210
+ </resprocessing>
211
+ </item>
212
+ </section>
213
+ <section ident="i2bc6ea458219d4402c8eaf13743da117" title="Group 2(3/5)">
214
+ <selection_ordering>
215
+ <selection>
216
+ <selection_number>3</selection_number>
217
+ <selection_extension>
218
+ <points_per_item>1.0</points_per_item>
219
+ </selection_extension>
220
+ </selection>
221
+ </selection_ordering>
222
+ <item ident="i9445cbd17cc1951ea3a492f19780c4ab" title="Question">
223
+ <itemmetadata>
224
+ <qtimetadata>
225
+ <qtimetadatafield>
226
+ <fieldlabel>question_type</fieldlabel>
227
+ <fieldentry>true_false_question</fieldentry>
228
+ </qtimetadatafield>
229
+ <qtimetadatafield>
230
+ <fieldlabel>points_possible</fieldlabel>
231
+ <fieldentry>1.0</fieldentry>
232
+ </qtimetadatafield>
233
+ <qtimetadatafield>
234
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
235
+ <fieldentry>i02defad64797f500212aef1788fc6402</fieldentry>
236
+ </qtimetadatafield>
237
+ </qtimetadata>
238
+ </itemmetadata>
239
+ <presentation>
240
+ <material>
241
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 1/5&lt;/p&gt;&lt;/div&gt;</mattext>
242
+ </material>
243
+ <response_lid ident="response1" rcardinality="Single">
244
+ <render_choice>
245
+ <response_label ident="4869">
246
+ <material>
247
+ <mattext texttype="text/plain">True</mattext>
248
+ </material>
249
+ </response_label>
250
+ <response_label ident="9399">
251
+ <material>
252
+ <mattext texttype="text/plain">False</mattext>
253
+ </material>
254
+ </response_label>
255
+ </render_choice>
256
+ </response_lid>
257
+ </presentation>
258
+ <resprocessing>
259
+ <outcomes>
260
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
261
+ </outcomes>
262
+ <respcondition continue="No">
263
+ <conditionvar>
264
+ <varequal respident="response1">4869</varequal>
265
+ </conditionvar>
266
+ <setvar action="Set" varname="SCORE">100</setvar>
267
+ </respcondition>
268
+ </resprocessing>
269
+ </item>
270
+ <item ident="ied1dc8d08d9cfed5c4b648f8a6b36c85" title="Question">
271
+ <itemmetadata>
272
+ <qtimetadata>
273
+ <qtimetadatafield>
274
+ <fieldlabel>question_type</fieldlabel>
275
+ <fieldentry>true_false_question</fieldentry>
276
+ </qtimetadatafield>
277
+ <qtimetadatafield>
278
+ <fieldlabel>points_possible</fieldlabel>
279
+ <fieldentry>1.0</fieldentry>
280
+ </qtimetadatafield>
281
+ <qtimetadatafield>
282
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
283
+ <fieldentry>i53d707fc748efd4537558dab32010435</fieldentry>
284
+ </qtimetadatafield>
285
+ </qtimetadata>
286
+ </itemmetadata>
287
+ <presentation>
288
+ <material>
289
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 2/5&lt;/p&gt;&lt;/div&gt;</mattext>
290
+ </material>
291
+ <response_lid ident="response1" rcardinality="Single">
292
+ <render_choice>
293
+ <response_label ident="2900">
294
+ <material>
295
+ <mattext texttype="text/plain">True</mattext>
296
+ </material>
297
+ </response_label>
298
+ <response_label ident="2584">
299
+ <material>
300
+ <mattext texttype="text/plain">False</mattext>
301
+ </material>
302
+ </response_label>
303
+ </render_choice>
304
+ </response_lid>
305
+ </presentation>
306
+ <resprocessing>
307
+ <outcomes>
308
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
309
+ </outcomes>
310
+ <respcondition continue="No">
311
+ <conditionvar>
312
+ <varequal respident="response1">2900</varequal>
313
+ </conditionvar>
314
+ <setvar action="Set" varname="SCORE">100</setvar>
315
+ </respcondition>
316
+ </resprocessing>
317
+ </item>
318
+ <item ident="i693c1d28f9f52f632751e95c9c5a1005" title="Question">
319
+ <itemmetadata>
320
+ <qtimetadata>
321
+ <qtimetadatafield>
322
+ <fieldlabel>question_type</fieldlabel>
323
+ <fieldentry>true_false_question</fieldentry>
324
+ </qtimetadatafield>
325
+ <qtimetadatafield>
326
+ <fieldlabel>points_possible</fieldlabel>
327
+ <fieldentry>1.0</fieldentry>
328
+ </qtimetadatafield>
329
+ <qtimetadatafield>
330
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
331
+ <fieldentry>i9c6bcdec74319c5e85be9c688c5b15c8</fieldentry>
332
+ </qtimetadatafield>
333
+ </qtimetadata>
334
+ </itemmetadata>
335
+ <presentation>
336
+ <material>
337
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 3/5&lt;/p&gt;&lt;/div&gt;</mattext>
338
+ </material>
339
+ <response_lid ident="response1" rcardinality="Single">
340
+ <render_choice>
341
+ <response_label ident="580">
342
+ <material>
343
+ <mattext texttype="text/plain">True</mattext>
344
+ </material>
345
+ </response_label>
346
+ <response_label ident="969">
347
+ <material>
348
+ <mattext texttype="text/plain">False</mattext>
349
+ </material>
350
+ </response_label>
351
+ </render_choice>
352
+ </response_lid>
353
+ </presentation>
354
+ <resprocessing>
355
+ <outcomes>
356
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
357
+ </outcomes>
358
+ <respcondition continue="No">
359
+ <conditionvar>
360
+ <varequal respident="response1">580</varequal>
361
+ </conditionvar>
362
+ <setvar action="Set" varname="SCORE">100</setvar>
363
+ </respcondition>
364
+ </resprocessing>
365
+ </item>
366
+ <item ident="ie9f1ef431d9bc192456a83cac6b3ee72" title="Question">
367
+ <itemmetadata>
368
+ <qtimetadata>
369
+ <qtimetadatafield>
370
+ <fieldlabel>question_type</fieldlabel>
371
+ <fieldentry>true_false_question</fieldentry>
372
+ </qtimetadatafield>
373
+ <qtimetadatafield>
374
+ <fieldlabel>points_possible</fieldlabel>
375
+ <fieldentry>1.0</fieldentry>
376
+ </qtimetadatafield>
377
+ <qtimetadatafield>
378
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
379
+ <fieldentry>i1384c6a74b075209237d6dfb0e194087</fieldentry>
380
+ </qtimetadatafield>
381
+ </qtimetadata>
382
+ </itemmetadata>
383
+ <presentation>
384
+ <material>
385
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 4/5&lt;/p&gt;&lt;/div&gt;</mattext>
386
+ </material>
387
+ <response_lid ident="response1" rcardinality="Single">
388
+ <render_choice>
389
+ <response_label ident="9666">
390
+ <material>
391
+ <mattext texttype="text/plain">True</mattext>
392
+ </material>
393
+ </response_label>
394
+ <response_label ident="5166">
395
+ <material>
396
+ <mattext texttype="text/plain">False</mattext>
397
+ </material>
398
+ </response_label>
399
+ </render_choice>
400
+ </response_lid>
401
+ </presentation>
402
+ <resprocessing>
403
+ <outcomes>
404
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
405
+ </outcomes>
406
+ <respcondition continue="No">
407
+ <conditionvar>
408
+ <varequal respident="response1">9666</varequal>
409
+ </conditionvar>
410
+ <setvar action="Set" varname="SCORE">100</setvar>
411
+ </respcondition>
412
+ </resprocessing>
413
+ </item>
414
+ <item ident="id83a292a4d2fcf344c882d81d3ad7be3" title="Question">
415
+ <itemmetadata>
416
+ <qtimetadata>
417
+ <qtimetadatafield>
418
+ <fieldlabel>question_type</fieldlabel>
419
+ <fieldentry>true_false_question</fieldentry>
420
+ </qtimetadatafield>
421
+ <qtimetadatafield>
422
+ <fieldlabel>points_possible</fieldlabel>
423
+ <fieldentry>1.0</fieldentry>
424
+ </qtimetadatafield>
425
+ <qtimetadatafield>
426
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
427
+ <fieldentry>i6ae5ace5bd8eda3903af2f368d322e3d</fieldentry>
428
+ </qtimetadatafield>
429
+ </qtimetadata>
430
+ </itemmetadata>
431
+ <presentation>
432
+ <material>
433
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question 5/5&lt;/p&gt;&lt;/div&gt;</mattext>
434
+ </material>
435
+ <response_lid ident="response1" rcardinality="Single">
436
+ <render_choice>
437
+ <response_label ident="3495">
438
+ <material>
439
+ <mattext texttype="text/plain">True</mattext>
440
+ </material>
441
+ </response_label>
442
+ <response_label ident="2183">
443
+ <material>
444
+ <mattext texttype="text/plain">False</mattext>
445
+ </material>
446
+ </response_label>
447
+ </render_choice>
448
+ </response_lid>
449
+ </presentation>
450
+ <resprocessing>
451
+ <outcomes>
452
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
453
+ </outcomes>
454
+ <respcondition continue="No">
455
+ <conditionvar>
456
+ <varequal respident="response1">3495</varequal>
457
+ </conditionvar>
458
+ <setvar action="Set" varname="SCORE">100</setvar>
459
+ </respcondition>
460
+ </resprocessing>
461
+ </item>
462
+ </section>
463
+ <item ident="ie455d993e81d3ad7be3" title="Question">
464
+ <itemmetadata>
465
+ <qtimetadata>
466
+ <qtimetadatafield>
467
+ <fieldlabel>question_type</fieldlabel>
468
+ <fieldentry>true_false_question</fieldentry>
469
+ </qtimetadatafield>
470
+ <qtimetadatafield>
471
+ <fieldlabel>points_possible</fieldlabel>
472
+ <fieldentry>1.0</fieldentry>
473
+ </qtimetadatafield>
474
+ <qtimetadatafield>
475
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
476
+ <fieldentry>i6ae5ace5bd8eda3903af2f368d322e3d</fieldentry>
477
+ </qtimetadatafield>
478
+ </qtimetadata>
479
+ </itemmetadata>
480
+ <presentation>
481
+ <material>
482
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Question! 5&lt;/p&gt;&lt;/div&gt;</mattext>
483
+ </material>
484
+ <response_lid ident="response1" rcardinality="Single">
485
+ <render_choice>
486
+ <response_label ident="3495">
487
+ <material>
488
+ <mattext texttype="text/plain">True</mattext>
489
+ </material>
490
+ </response_label>
491
+ <response_label ident="2183">
492
+ <material>
493
+ <mattext texttype="text/plain">False</mattext>
494
+ </material>
495
+ </response_label>
496
+ </render_choice>
497
+ </response_lid>
498
+ </presentation>
499
+ <resprocessing>
500
+ <outcomes>
501
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
502
+ </outcomes>
503
+ <respcondition continue="No">
504
+ <conditionvar>
505
+ <varequal respident="response1">3495</varequal>
506
+ </conditionvar>
507
+ <setvar action="Set" varname="SCORE">100</setvar>
508
+ </respcondition>
509
+ </resprocessing>
510
+ </item>
511
+ </section>
512
+ </assessment>
513
+ </questestinterop>
@@ -208,4 +208,18 @@ describe Qti::V1::Models::Assessment do
208
208
  ).to be(Qti::V1::Models::StimulusItem)
209
209
  end
210
210
  end
211
+
212
+ describe 'question group items' do
213
+ let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
214
+ let(:test_object) { described_class.from_path!(file_path) }
215
+ let(:assessment_item_refs) { test_object.assessment_items }
216
+ let(:assessment_item_ref) { assessment_item_refs.first }
217
+ let(:file_path) { File.join(fixtures_path, 'question_group.xml') }
218
+
219
+ it 'methods behave as expected' do
220
+ expect(
221
+ test_object.create_assessment_item(assessment_item_ref)
222
+ ).to eq(nil)
223
+ end
224
+ end
211
225
  end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::QuestionGroup do
4
+ let(:file_path) { File.join('spec', 'fixtures', 'items_1.2', 'question_group.xml') }
5
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
6
+ let(:assessment_item_refs) { test_object.assessment_items }
7
+ let(:loaded_class) { described_class.new(assessment_item_refs.first) }
8
+
9
+ it 'configures a group correctly' do
10
+ expect(loaded_class.title).to eq('Group 1 (1/4)')
11
+ expect(loaded_class.identifier).to eq('i4663897607358cfba8636ed6127b9466')
12
+ expect(loaded_class.items.count).to eq(4)
13
+ expect(loaded_class.selection_number).to eq(1)
14
+ expect(loaded_class.points_per_item).to eq(1)
15
+ end
16
+ 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: 1.0.1
4
+ version: 1.0.2
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: 2018-08-13 00:00:00.000000000 Z
12
+ date: 2018-09-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -316,6 +316,7 @@ files:
316
316
  - lib/qti/v1/models/numerics/scoring_data.rb
317
317
  - lib/qti/v1/models/numerics/scoring_node.rb
318
318
  - lib/qti/v1/models/numerics/within_range.rb
319
+ - lib/qti/v1/models/question_group.rb
319
320
  - lib/qti/v1/models/scoring_data.rb
320
321
  - lib/qti/v1/models/stimulus_item.rb
321
322
  - lib/qti/v2/models/assessment_item.rb
@@ -373,6 +374,7 @@ files:
373
374
  - spec/fixtures/items_1.2/numeric_precision.xml
374
375
  - spec/fixtures/items_1.2/numeric_within_range.xml
375
376
  - spec/fixtures/items_1.2/ordering.xml
377
+ - spec/fixtures/items_1.2/question_group.xml
376
378
  - spec/fixtures/items_1.2/single_fib.xml
377
379
  - spec/fixtures/items_1.2/text.no.question.xml
378
380
  - spec/fixtures/items_1.2/true_false.xml
@@ -595,12 +597,9 @@ files:
595
597
  - spec/fixtures/tests/tests/rtest26.xml
596
598
  - spec/fixtures/tests/tests/rtest27.xml
597
599
  - spec/fixtures/unsupported_version/imsmanifest.xml
598
- - spec/gemfiles/nokogiri-1.6.gemfile.lock
599
- - spec/gemfiles/nokogiri-1.8.gemfile.lock
600
600
  - spec/gemfiles/rails-5.0.gemfile
601
601
  - spec/gemfiles/rails-5.1.gemfile
602
602
  - spec/gemfiles/rails-5.2.gemfile
603
- - spec/gemfiles/rails-5.2.gemfile.lock
604
603
  - spec/lib/qti/assessment_item_exporter_spec.rb
605
604
  - spec/lib/qti/exporter_spec.rb
606
605
  - spec/lib/qti/models/assessment_meta_spec.rb
@@ -626,6 +625,7 @@ files:
626
625
  - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
627
626
  - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
628
627
  - spec/lib/qti/v1/models/numerics/within_range_spec.rb
628
+ - spec/lib/qti/v1/models/question_group_spec.rb
629
629
  - spec/lib/qti/v1/models/stimulus_item_spec.rb
630
630
  - spec/lib/qti/v2/models/assessment_item_spec.rb
631
631
  - spec/lib/qti/v2/models/assessment_test_spec.rb
@@ -665,7 +665,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
665
665
  version: '0'
666
666
  requirements: []
667
667
  rubyforge_project:
668
- rubygems_version: 2.6.13
668
+ rubygems_version: 2.6.14
669
669
  signing_key:
670
670
  specification_version: 4
671
671
  summary: QTI 1.2 and 2.1 import and export models
@@ -704,6 +704,7 @@ test_files:
704
704
  - spec/fixtures/items_1.2/numeric_precision.xml
705
705
  - spec/fixtures/items_1.2/numeric_within_range.xml
706
706
  - spec/fixtures/items_1.2/ordering.xml
707
+ - spec/fixtures/items_1.2/question_group.xml
707
708
  - spec/fixtures/items_1.2/single_fib.xml
708
709
  - spec/fixtures/items_1.2/text.no.question.xml
709
710
  - spec/fixtures/items_1.2/true_false.xml
@@ -926,12 +927,9 @@ test_files:
926
927
  - spec/fixtures/tests/tests/rtest26.xml
927
928
  - spec/fixtures/tests/tests/rtest27.xml
928
929
  - spec/fixtures/unsupported_version/imsmanifest.xml
929
- - spec/gemfiles/nokogiri-1.6.gemfile.lock
930
- - spec/gemfiles/nokogiri-1.8.gemfile.lock
931
930
  - spec/gemfiles/rails-5.0.gemfile
932
931
  - spec/gemfiles/rails-5.1.gemfile
933
932
  - spec/gemfiles/rails-5.2.gemfile
934
- - spec/gemfiles/rails-5.2.gemfile.lock
935
933
  - spec/lib/qti/assessment_item_exporter_spec.rb
936
934
  - spec/lib/qti/exporter_spec.rb
937
935
  - spec/lib/qti/models/assessment_meta_spec.rb
@@ -957,6 +955,7 @@ test_files:
957
955
  - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
958
956
  - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
959
957
  - spec/lib/qti/v1/models/numerics/within_range_spec.rb
958
+ - spec/lib/qti/v1/models/question_group_spec.rb
960
959
  - spec/lib/qti/v1/models/stimulus_item_spec.rb
961
960
  - spec/lib/qti/v2/models/assessment_item_spec.rb
962
961
  - spec/lib/qti/v2/models/assessment_test_spec.rb
@@ -1,149 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- mathml2latex (0.1.1)
5
- activesupport (>= 4.2.9, < 5.2)
6
- nokogiri (>= 1.6.8)
7
- qti (0.9.12)
8
- actionview (>= 4.2.0)
9
- activesupport (>= 4.2.9, < 5.2)
10
- dry-struct (~> 0.2.1)
11
- dry-types (~> 0.12.0)
12
- mathml2latex (>= 0.1.0)
13
- nokogiri (>= 1.6.8, < 1.9)
14
- rubyzip (~> 1.2)
15
- sanitize (>= 4.2.0, < 5.0)
16
-
17
- GEM
18
- remote: https://rubygems.org/
19
- specs:
20
- actionview (5.1.5)
21
- activesupport (= 5.1.5)
22
- builder (~> 3.1)
23
- erubi (~> 1.4)
24
- rails-dom-testing (~> 2.0)
25
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
26
- activesupport (5.1.5)
27
- concurrent-ruby (~> 1.0, >= 1.0.2)
28
- i18n (~> 0.7)
29
- minitest (~> 5.1)
30
- tzinfo (~> 1.1)
31
- ast (2.4.0)
32
- builder (3.2.3)
33
- byebug (9.1.0)
34
- coderay (1.1.2)
35
- concurrent-ruby (1.0.5)
36
- crass (1.0.3)
37
- diff-lcs (1.3)
38
- docile (1.3.0)
39
- dry-configurable (0.7.0)
40
- concurrent-ruby (~> 1.0)
41
- dry-container (0.6.0)
42
- concurrent-ruby (~> 1.0)
43
- dry-configurable (~> 0.1, >= 0.1.3)
44
- dry-core (0.4.5)
45
- concurrent-ruby (~> 1.0)
46
- dry-equalizer (0.2.0)
47
- dry-logic (0.4.2)
48
- dry-container (~> 0.2, >= 0.2.6)
49
- dry-core (~> 0.2)
50
- dry-equalizer (~> 0.2)
51
- dry-struct (0.2.1)
52
- dry-configurable (~> 0.1)
53
- dry-equalizer (~> 0.2)
54
- dry-types (~> 0.9, >= 0.9.0)
55
- ice_nine (~> 0.11)
56
- dry-types (0.12.2)
57
- concurrent-ruby (~> 1.0)
58
- dry-configurable (~> 0.1)
59
- dry-container (~> 0.3)
60
- dry-core (~> 0.2, >= 0.2.1)
61
- dry-equalizer (~> 0.2)
62
- dry-logic (~> 0.4, >= 0.4.2)
63
- inflecto (~> 0.0.0, >= 0.0.2)
64
- erubi (1.7.1)
65
- i18n (0.9.5)
66
- concurrent-ruby (~> 1.0)
67
- ice_nine (0.11.2)
68
- inflecto (0.0.2)
69
- json (2.1.0)
70
- loofah (2.2.2)
71
- crass (~> 1.0.2)
72
- nokogiri (>= 1.5.9)
73
- method_source (0.9.0)
74
- mini_portile2 (2.1.0)
75
- minitest (5.11.3)
76
- nokogiri (1.6.8.1)
77
- mini_portile2 (~> 2.1.0)
78
- nokogumbo (1.5.0)
79
- nokogiri
80
- parallel (1.12.1)
81
- parser (2.5.0.5)
82
- ast (~> 2.4.0)
83
- powerpack (0.1.1)
84
- pry (0.11.3)
85
- coderay (~> 1.1.0)
86
- method_source (~> 0.9.0)
87
- rails-dom-testing (2.0.3)
88
- activesupport (>= 4.2.0)
89
- nokogiri (>= 1.6)
90
- rails-html-sanitizer (1.0.4)
91
- loofah (~> 2.2, >= 2.2.2)
92
- rainbow (2.2.2)
93
- rake
94
- rake (0.9.6)
95
- rspec (3.7.0)
96
- rspec-core (~> 3.7.0)
97
- rspec-expectations (~> 3.7.0)
98
- rspec-mocks (~> 3.7.0)
99
- rspec-core (3.7.1)
100
- rspec-support (~> 3.7.0)
101
- rspec-expectations (3.7.0)
102
- diff-lcs (>= 1.2.0, < 2.0)
103
- rspec-support (~> 3.7.0)
104
- rspec-mocks (3.7.0)
105
- diff-lcs (>= 1.2.0, < 2.0)
106
- rspec-support (~> 3.7.0)
107
- rspec-support (3.7.1)
108
- rubocop (0.50.0)
109
- parallel (~> 1.10)
110
- parser (>= 2.3.3.1, < 3.0)
111
- powerpack (~> 0.1)
112
- rainbow (>= 2.2.2, < 3.0)
113
- ruby-progressbar (~> 1.7)
114
- unicode-display_width (~> 1.0, >= 1.0.1)
115
- ruby-progressbar (1.9.0)
116
- rubyzip (1.2.1)
117
- sanitize (4.6.4)
118
- crass (~> 1.0.2)
119
- nokogiri (>= 1.4.4)
120
- nokogumbo (~> 1.4)
121
- simplecov (0.16.1)
122
- docile (~> 1.1)
123
- json (>= 1.8, < 3)
124
- simplecov-html (~> 0.10.0)
125
- simplecov-html (0.10.2)
126
- thread_safe (0.3.6)
127
- tzinfo (1.2.5)
128
- thread_safe (~> 0.1)
129
- unicode-display_width (1.3.0)
130
- wwtd (1.3.0)
131
-
132
- PLATFORMS
133
- ruby
134
-
135
- DEPENDENCIES
136
- bundler (~> 1.15)
137
- byebug (~> 9.0)
138
- nokogiri (~> 1.6.8)
139
- pry (~> 0)
140
- qti!
141
- rake (~> 0)
142
- rspec (~> 3.6)
143
- rspec-mocks (~> 3.6)
144
- rubocop (~> 0.50.0)
145
- simplecov (~> 0)
146
- wwtd (~> 1.3)
147
-
148
- BUNDLED WITH
149
- 1.16.1
@@ -1,149 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- mathml2latex (0.1.2)
5
- activesupport (>= 4.2.9, < 5.2)
6
- nokogiri (>= 1.6.8)
7
- qti (0.9.15)
8
- actionview (>= 4.2.0)
9
- activesupport (>= 4.2.9, < 5.2)
10
- dry-struct (~> 0.2.1)
11
- dry-types (~> 0.12.0)
12
- mathml2latex (>= 0.1.0)
13
- nokogiri (>= 1.6.8, < 1.9)
14
- rubyzip (~> 1.2)
15
- sanitize (>= 4.2.0, < 5.0)
16
-
17
- GEM
18
- remote: https://rubygems.org/
19
- specs:
20
- actionview (5.1.6)
21
- activesupport (= 5.1.6)
22
- builder (~> 3.1)
23
- erubi (~> 1.4)
24
- rails-dom-testing (~> 2.0)
25
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
26
- activesupport (5.1.6)
27
- concurrent-ruby (~> 1.0, >= 1.0.2)
28
- i18n (>= 0.7, < 2)
29
- minitest (~> 5.1)
30
- tzinfo (~> 1.1)
31
- ast (2.4.0)
32
- builder (3.2.3)
33
- byebug (9.1.0)
34
- coderay (1.1.2)
35
- concurrent-ruby (1.0.5)
36
- crass (1.0.4)
37
- diff-lcs (1.3)
38
- docile (1.3.0)
39
- dry-configurable (0.7.0)
40
- concurrent-ruby (~> 1.0)
41
- dry-container (0.6.0)
42
- concurrent-ruby (~> 1.0)
43
- dry-configurable (~> 0.1, >= 0.1.3)
44
- dry-core (0.4.5)
45
- concurrent-ruby (~> 1.0)
46
- dry-equalizer (0.2.0)
47
- dry-logic (0.4.2)
48
- dry-container (~> 0.2, >= 0.2.6)
49
- dry-core (~> 0.2)
50
- dry-equalizer (~> 0.2)
51
- dry-struct (0.2.1)
52
- dry-configurable (~> 0.1)
53
- dry-equalizer (~> 0.2)
54
- dry-types (~> 0.9, >= 0.9.0)
55
- ice_nine (~> 0.11)
56
- dry-types (0.12.2)
57
- concurrent-ruby (~> 1.0)
58
- dry-configurable (~> 0.1)
59
- dry-container (~> 0.3)
60
- dry-core (~> 0.2, >= 0.2.1)
61
- dry-equalizer (~> 0.2)
62
- dry-logic (~> 0.4, >= 0.4.2)
63
- inflecto (~> 0.0.0, >= 0.0.2)
64
- erubi (1.7.1)
65
- i18n (1.0.1)
66
- concurrent-ruby (~> 1.0)
67
- ice_nine (0.11.2)
68
- inflecto (0.0.2)
69
- json (2.1.0)
70
- loofah (2.2.2)
71
- crass (~> 1.0.2)
72
- nokogiri (>= 1.5.9)
73
- method_source (0.9.0)
74
- mini_portile2 (2.3.0)
75
- minitest (5.11.3)
76
- nokogiri (1.8.2)
77
- mini_portile2 (~> 2.3.0)
78
- nokogumbo (1.5.0)
79
- nokogiri
80
- parallel (1.12.1)
81
- parser (2.5.0.5)
82
- ast (~> 2.4.0)
83
- powerpack (0.1.1)
84
- pry (0.11.3)
85
- coderay (~> 1.1.0)
86
- method_source (~> 0.9.0)
87
- rails-dom-testing (2.0.3)
88
- activesupport (>= 4.2.0)
89
- nokogiri (>= 1.6)
90
- rails-html-sanitizer (1.0.4)
91
- loofah (~> 2.2, >= 2.2.2)
92
- rainbow (2.2.2)
93
- rake
94
- rake (0.9.6)
95
- rspec (3.7.0)
96
- rspec-core (~> 3.7.0)
97
- rspec-expectations (~> 3.7.0)
98
- rspec-mocks (~> 3.7.0)
99
- rspec-core (3.7.1)
100
- rspec-support (~> 3.7.0)
101
- rspec-expectations (3.7.0)
102
- diff-lcs (>= 1.2.0, < 2.0)
103
- rspec-support (~> 3.7.0)
104
- rspec-mocks (3.7.0)
105
- diff-lcs (>= 1.2.0, < 2.0)
106
- rspec-support (~> 3.7.0)
107
- rspec-support (3.7.1)
108
- rubocop (0.50.0)
109
- parallel (~> 1.10)
110
- parser (>= 2.3.3.1, < 3.0)
111
- powerpack (~> 0.1)
112
- rainbow (>= 2.2.2, < 3.0)
113
- ruby-progressbar (~> 1.7)
114
- unicode-display_width (~> 1.0, >= 1.0.1)
115
- ruby-progressbar (1.9.0)
116
- rubyzip (1.2.1)
117
- sanitize (4.6.4)
118
- crass (~> 1.0.2)
119
- nokogiri (>= 1.4.4)
120
- nokogumbo (~> 1.4)
121
- simplecov (0.16.1)
122
- docile (~> 1.1)
123
- json (>= 1.8, < 3)
124
- simplecov-html (~> 0.10.0)
125
- simplecov-html (0.10.2)
126
- thread_safe (0.3.6)
127
- tzinfo (1.2.5)
128
- thread_safe (~> 0.1)
129
- unicode-display_width (1.3.0)
130
- wwtd (1.3.0)
131
-
132
- PLATFORMS
133
- ruby
134
-
135
- DEPENDENCIES
136
- bundler (~> 1.15)
137
- byebug (~> 9.0)
138
- nokogiri (~> 1.8.1)
139
- pry (~> 0)
140
- qti!
141
- rake (~> 0)
142
- rspec (~> 3.6)
143
- rspec-mocks (~> 3.6)
144
- rubocop (~> 0.50.0)
145
- simplecov (~> 0)
146
- wwtd (~> 1.3)
147
-
148
- BUNDLED WITH
149
- 1.16.1
@@ -1,222 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- mathml2latex (1.0.0)
5
- activesupport (>= 5.0.7, < 5.3)
6
- nokogiri (>= 1.7.2)
7
- qti (1.0.0)
8
- actionview (>= 5.0.7, < 5.3)
9
- activesupport (>= 5.0.7, < 5.3)
10
- dry-struct (~> 0.2.1)
11
- dry-types (~> 0.12.0)
12
- mathml2latex (~> 1.0)
13
- nokogiri (~> 1.8)
14
- rubyzip (~> 1.2)
15
- sanitize (~> 4.6, >= 4.6.3)
16
-
17
- GEM
18
- remote: https://rubygems.org/
19
- specs:
20
- actioncable (5.2.1)
21
- actionpack (= 5.2.1)
22
- nio4r (~> 2.0)
23
- websocket-driver (>= 0.6.1)
24
- actionmailer (5.2.1)
25
- actionpack (= 5.2.1)
26
- actionview (= 5.2.1)
27
- activejob (= 5.2.1)
28
- mail (~> 2.5, >= 2.5.4)
29
- rails-dom-testing (~> 2.0)
30
- actionpack (5.2.1)
31
- actionview (= 5.2.1)
32
- activesupport (= 5.2.1)
33
- rack (~> 2.0)
34
- rack-test (>= 0.6.3)
35
- rails-dom-testing (~> 2.0)
36
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
37
- actionview (5.2.1)
38
- activesupport (= 5.2.1)
39
- builder (~> 3.1)
40
- erubi (~> 1.4)
41
- rails-dom-testing (~> 2.0)
42
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
43
- activejob (5.2.1)
44
- activesupport (= 5.2.1)
45
- globalid (>= 0.3.6)
46
- activemodel (5.2.1)
47
- activesupport (= 5.2.1)
48
- activerecord (5.2.1)
49
- activemodel (= 5.2.1)
50
- activesupport (= 5.2.1)
51
- arel (>= 9.0)
52
- activestorage (5.2.1)
53
- actionpack (= 5.2.1)
54
- activerecord (= 5.2.1)
55
- marcel (~> 0.3.1)
56
- activesupport (5.2.1)
57
- concurrent-ruby (~> 1.0, >= 1.0.2)
58
- i18n (>= 0.7, < 2)
59
- minitest (~> 5.1)
60
- tzinfo (~> 1.1)
61
- arel (9.0.0)
62
- ast (2.4.0)
63
- builder (3.2.3)
64
- byebug (9.1.0)
65
- coderay (1.1.2)
66
- concurrent-ruby (1.0.5)
67
- crass (1.0.4)
68
- diff-lcs (1.3)
69
- docile (1.3.1)
70
- dry-configurable (0.7.0)
71
- concurrent-ruby (~> 1.0)
72
- dry-container (0.6.0)
73
- concurrent-ruby (~> 1.0)
74
- dry-configurable (~> 0.1, >= 0.1.3)
75
- dry-core (0.4.7)
76
- concurrent-ruby (~> 1.0)
77
- dry-equalizer (0.2.1)
78
- dry-logic (0.4.2)
79
- dry-container (~> 0.2, >= 0.2.6)
80
- dry-core (~> 0.2)
81
- dry-equalizer (~> 0.2)
82
- dry-struct (0.2.1)
83
- dry-configurable (~> 0.1)
84
- dry-equalizer (~> 0.2)
85
- dry-types (~> 0.9, >= 0.9.0)
86
- ice_nine (~> 0.11)
87
- dry-types (0.12.3)
88
- concurrent-ruby (~> 1.0)
89
- dry-configurable (~> 0.1)
90
- dry-container (~> 0.3)
91
- dry-core (~> 0.2, >= 0.2.1)
92
- dry-equalizer (~> 0.2)
93
- dry-logic (~> 0.4, >= 0.4.2)
94
- inflecto (~> 0.0.0, >= 0.0.2)
95
- erubi (1.7.1)
96
- globalid (0.4.1)
97
- activesupport (>= 4.2.0)
98
- i18n (1.1.0)
99
- concurrent-ruby (~> 1.0)
100
- ice_nine (0.11.2)
101
- inflecto (0.0.2)
102
- json (2.1.0)
103
- loofah (2.2.2)
104
- crass (~> 1.0.2)
105
- nokogiri (>= 1.5.9)
106
- mail (2.7.0)
107
- mini_mime (>= 0.1.1)
108
- marcel (0.3.2)
109
- mimemagic (~> 0.3.2)
110
- method_source (0.9.0)
111
- mimemagic (0.3.2)
112
- mini_mime (1.0.0)
113
- mini_portile2 (2.3.0)
114
- minitest (5.11.3)
115
- nio4r (2.3.1)
116
- nokogiri (1.8.4)
117
- mini_portile2 (~> 2.3.0)
118
- nokogumbo (1.5.0)
119
- nokogiri
120
- parallel (1.12.1)
121
- parser (2.5.1.2)
122
- ast (~> 2.4.0)
123
- powerpack (0.1.2)
124
- pry (0.11.3)
125
- coderay (~> 1.1.0)
126
- method_source (~> 0.9.0)
127
- rack (2.0.5)
128
- rack-test (1.1.0)
129
- rack (>= 1.0, < 3)
130
- rails (5.2.1)
131
- actioncable (= 5.2.1)
132
- actionmailer (= 5.2.1)
133
- actionpack (= 5.2.1)
134
- actionview (= 5.2.1)
135
- activejob (= 5.2.1)
136
- activemodel (= 5.2.1)
137
- activerecord (= 5.2.1)
138
- activestorage (= 5.2.1)
139
- activesupport (= 5.2.1)
140
- bundler (>= 1.3.0)
141
- railties (= 5.2.1)
142
- sprockets-rails (>= 2.0.0)
143
- rails-dom-testing (2.0.3)
144
- activesupport (>= 4.2.0)
145
- nokogiri (>= 1.6)
146
- rails-html-sanitizer (1.0.4)
147
- loofah (~> 2.2, >= 2.2.2)
148
- railties (5.2.1)
149
- actionpack (= 5.2.1)
150
- activesupport (= 5.2.1)
151
- method_source
152
- rake (>= 0.8.7)
153
- thor (>= 0.19.0, < 2.0)
154
- rainbow (2.2.2)
155
- rake
156
- rake (0.9.6)
157
- rspec (3.8.0)
158
- rspec-core (~> 3.8.0)
159
- rspec-expectations (~> 3.8.0)
160
- rspec-mocks (~> 3.8.0)
161
- rspec-core (3.8.0)
162
- rspec-support (~> 3.8.0)
163
- rspec-expectations (3.8.1)
164
- diff-lcs (>= 1.2.0, < 2.0)
165
- rspec-support (~> 3.8.0)
166
- rspec-mocks (3.8.0)
167
- diff-lcs (>= 1.2.0, < 2.0)
168
- rspec-support (~> 3.8.0)
169
- rspec-support (3.8.0)
170
- rubocop (0.50.0)
171
- parallel (~> 1.10)
172
- parser (>= 2.3.3.1, < 3.0)
173
- powerpack (~> 0.1)
174
- rainbow (>= 2.2.2, < 3.0)
175
- ruby-progressbar (~> 1.7)
176
- unicode-display_width (~> 1.0, >= 1.0.1)
177
- ruby-progressbar (1.10.0)
178
- rubyzip (1.2.1)
179
- sanitize (4.6.6)
180
- crass (~> 1.0.2)
181
- nokogiri (>= 1.4.4)
182
- nokogumbo (~> 1.4)
183
- simplecov (0.16.1)
184
- docile (~> 1.1)
185
- json (>= 1.8, < 3)
186
- simplecov-html (~> 0.10.0)
187
- simplecov-html (0.10.2)
188
- sprockets (3.7.2)
189
- concurrent-ruby (~> 1.0)
190
- rack (> 1, < 3)
191
- sprockets-rails (3.2.1)
192
- actionpack (>= 4.0)
193
- activesupport (>= 4.0)
194
- sprockets (>= 3.0.0)
195
- thor (0.20.0)
196
- thread_safe (0.3.6)
197
- tzinfo (1.2.5)
198
- thread_safe (~> 0.1)
199
- unicode-display_width (1.4.0)
200
- websocket-driver (0.7.0)
201
- websocket-extensions (>= 0.1.0)
202
- websocket-extensions (0.1.3)
203
- wwtd (1.3.0)
204
-
205
- PLATFORMS
206
- ruby
207
-
208
- DEPENDENCIES
209
- bundler (~> 1.15)
210
- byebug (~> 9.0)
211
- pry (~> 0)
212
- qti!
213
- rails (~> 5.2.0)
214
- rake (~> 0)
215
- rspec (~> 3.6)
216
- rspec-mocks (~> 3.6)
217
- rubocop (~> 0.50.0)
218
- simplecov (~> 0)
219
- wwtd (~> 1.3)
220
-
221
- BUNDLED WITH
222
- 1.16.3