qti 1.0.1 → 1.0.2

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