canvas_qti_to_learnosity_converter 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 468fdb5c7e1f611d3a65e0295dbacd9ace2dd408
4
+ data.tar.gz: 9554d4b90d981fdef71f9e99416caac8734ef923
5
+ SHA512:
6
+ metadata.gz: eb1ef6a4b31b92179c36a67a7ab97710400c007f405cfbde8720201042469329f6c3d869b07569dbbf69e3f53b1e6f9b6cd9f1d2f9efc46c9cf80fbc30f14b33
7
+ data.tar.gz: 4fa5a5f4c12290a608f0688bfca1d27b40fd1dd247e8aa0163a9fe304aca654322394c3fac602b92b5a864cdb67ef392ad208eaec9a332fb8d7d329afc05612c
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ .byebug_history
11
+
12
+ # rspec failure tracking
13
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,659 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.4
3
+ Exclude:
4
+ - db/schema.rb
5
+ - config/initializers/devise.rb
6
+ - bin/*
7
+ - config.ru
8
+ - config/unicorn/*
9
+ - db/migrate/*
10
+ - spec/spec_helper.rb
11
+
12
+ Naming/AccessorMethodName:
13
+ Description: Check the naming of accessor methods for get_/set_.
14
+ Enabled: false
15
+
16
+ Style/Alias:
17
+ Description: 'Use alias_method instead of alias.'
18
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method'
19
+ Enabled: false
20
+
21
+ Style/ArrayJoin:
22
+ Description: 'Use Array#join instead of Array#*.'
23
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#array-join'
24
+ Enabled: false
25
+
26
+ Style/AsciiComments:
27
+ Description: 'Use only ascii symbols in comments.'
28
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments'
29
+ Enabled: false
30
+
31
+ Naming/AsciiIdentifiers:
32
+ Description: 'Use only ascii symbols in identifiers.'
33
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers'
34
+ Enabled: false
35
+
36
+ Style/Attr:
37
+ Description: 'Checks for uses of Module#attr.'
38
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr'
39
+ Enabled: false
40
+
41
+ Metrics/BlockNesting:
42
+ Description: 'Avoid excessive block nesting'
43
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count'
44
+ Enabled: false
45
+
46
+ Style/CaseEquality:
47
+ Description: 'Avoid explicit use of the case equality operator(===).'
48
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-case-equality'
49
+ Enabled: false
50
+
51
+ Style/CharacterLiteral:
52
+ Description: 'Checks for uses of character literals.'
53
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals'
54
+ Enabled: false
55
+
56
+ Style/ClassAndModuleChildren:
57
+ Description: 'Checks style of children classes and modules.'
58
+ Enabled: false
59
+ EnforcedStyle: nested
60
+
61
+ Metrics/ClassLength:
62
+ Description: 'Avoid classes longer than 100 lines of code.'
63
+ Enabled: false
64
+
65
+ Metrics/ModuleLength:
66
+ Description: 'Avoid modules longer than 100 lines of code.'
67
+ Enabled: false
68
+
69
+ Metrics/BlockLength:
70
+ Exclude:
71
+ - spec/**/**
72
+ - config/*
73
+ - lib/tasks/*
74
+ - Guardfile
75
+
76
+ Style/ClassVars:
77
+ Description: 'Avoid the use of class variables.'
78
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars'
79
+ Enabled: false
80
+
81
+ Style/CollectionMethods:
82
+ Enabled: true
83
+ PreferredMethods:
84
+ find: detect
85
+ inject: reduce
86
+ collect: map
87
+ find_all: select
88
+
89
+ Style/ColonMethodCall:
90
+ Description: 'Do not use :: for method call.'
91
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#double-colons'
92
+ Enabled: false
93
+
94
+ Style/CommentAnnotation:
95
+ Description: >-
96
+ Checks formatting of special comments
97
+ (TODO, FIXME, OPTIMIZE, HACK, REVIEW).
98
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#annotate-keywords'
99
+ Enabled: false
100
+
101
+ Metrics/AbcSize:
102
+ Description: >-
103
+ A calculated magnitude based on number of assignments,
104
+ branches, and conditions.
105
+ Enabled: false
106
+
107
+ Metrics/CyclomaticComplexity:
108
+ Description: >-
109
+ A complexity metric that is strongly correlated to the number
110
+ of test cases needed to validate a method.
111
+ Enabled: false
112
+
113
+ Rails/Delegate:
114
+ Description: 'Prefer delegate method for delegations.'
115
+ Enabled: false
116
+
117
+ Style/PreferredHashMethods:
118
+ Description: 'Checks for use of deprecated Hash methods.'
119
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-key'
120
+ Enabled: false
121
+
122
+ Style/Documentation:
123
+ Description: 'Document classes and non-namespace modules.'
124
+ Enabled: false
125
+
126
+ Layout/DotPosition:
127
+ Description: 'Checks the position of the dot in multi-line method calls.'
128
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains'
129
+ EnforcedStyle: trailing
130
+
131
+ Style/DoubleNegation:
132
+ Description: 'Checks for uses of double negation (!!).'
133
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-bang-bang'
134
+ Enabled: false
135
+
136
+ Style/EachWithObject:
137
+ Description: 'Prefer `each_with_object` over `inject` or `reduce`.'
138
+ Enabled: false
139
+
140
+ Style/EmptyLiteral:
141
+ Description: 'Prefer literals to Array.new/Hash.new/String.new.'
142
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#literal-array-hash'
143
+ Enabled: false
144
+
145
+ # Checks whether the source file has a utf-8 encoding comment or not
146
+ # AutoCorrectEncodingComment must match the regex
147
+ # /#.*coding\s?[:=]\s?(?:UTF|utf)-8/
148
+ Style/Encoding:
149
+ Enabled: false
150
+
151
+ Style/EvenOdd:
152
+ Description: 'Favor the use of Fixnum#even? && Fixnum#odd?'
153
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
154
+ Enabled: false
155
+
156
+ Layout/ExtraSpacing:
157
+ Description: 'Do not use unnecessary spacing.'
158
+ Enabled: true
159
+
160
+ Layout/EmptyLinesAroundClassBody:
161
+ Description: 'Do not allow extra lines around class body.'
162
+ Enabled: false
163
+
164
+ Layout/EmptyLinesAroundModuleBody:
165
+ Description: 'Do not allow extra lines around module body.'
166
+ Enabled: false
167
+
168
+ Style/BracesAroundHashParameters:
169
+ Enabled: false
170
+
171
+ Naming/FileName:
172
+ Description: 'Use snake_case for source file names.'
173
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files'
174
+ Enabled: false
175
+
176
+ Style/FrozenStringLiteralComment:
177
+ Description: >-
178
+ Add the frozen_string_literal comment to the top of files
179
+ to help transition from Ruby 2.3.0 to Ruby 3.0.
180
+ Enabled: false
181
+
182
+ Style/FlipFlop:
183
+ Description: 'Checks for flip flops'
184
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-flip-flops'
185
+ Enabled: false
186
+
187
+ Style/FormatString:
188
+ Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'
189
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf'
190
+ Enabled: false
191
+
192
+ Style/GlobalVars:
193
+ Description: 'Do not introduce global variables.'
194
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars'
195
+ Reference: 'http://www.zenspider.com/Languages/Ruby/QuickRef.html'
196
+ Enabled: false
197
+
198
+ Style/GuardClause:
199
+ Description: 'Check for conditionals that can be replaced with guard clauses'
200
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals'
201
+ Enabled: false
202
+
203
+ Style/IfUnlessModifier:
204
+ Description: >-
205
+ Favor modifier if/unless usage when you have a
206
+ single-line body.
207
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier'
208
+ Enabled: false
209
+
210
+ Style/IfWithSemicolon:
211
+ Description: 'Do not use if x; .... Use the ternary operator instead.'
212
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs'
213
+ Enabled: false
214
+
215
+ Style/InlineComment:
216
+ Description: 'Avoid inline comments.'
217
+ Enabled: false
218
+
219
+ Style/Lambda:
220
+ Description: 'Use the new lambda literal syntax for single-line blocks.'
221
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#lambda-multi-line'
222
+ Enabled: false
223
+
224
+ Style/LambdaCall:
225
+ Description: 'Use lambda.call(...) instead of lambda.(...).'
226
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc-call'
227
+ Enabled: false
228
+
229
+ Style/LineEndConcatenation:
230
+ Description: >-
231
+ Use \ instead of + or << to concatenate two string literals at
232
+ line end.
233
+ Enabled: false
234
+
235
+ Metrics/LineLength:
236
+ Description: 'Limit lines to 120 characters.'
237
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits'
238
+ Max: 120
239
+ Enabled: true
240
+ Exclude:
241
+ - Gemfile
242
+ - spec/support/webmock_requests.rb
243
+ - lib/tasks/*.rake
244
+
245
+ Metrics/MethodLength:
246
+ Description: 'Avoid methods longer than 10 lines of code.'
247
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
248
+ Enabled: false
249
+
250
+ Style/ModuleFunction:
251
+ Description: 'Checks for usage of `extend self` in modules.'
252
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#module-function'
253
+ Enabled: false
254
+
255
+ Layout/MultilineOperationIndentation:
256
+ Description: >-
257
+ Checks indentation of binary operations that span more than
258
+ one line.
259
+ Enabled: true
260
+ EnforcedStyle: indented
261
+
262
+ Style/MultilineBlockChain:
263
+ Description: 'Avoid multi-line chains of blocks.'
264
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks'
265
+ Enabled: false
266
+
267
+ Layout/MultilineMethodCallIndentation:
268
+ Description: >-
269
+ Checks indentation of method calls with the dot operator
270
+ that span more than one line.
271
+ Enabled: true
272
+ EnforcedStyle: indented
273
+
274
+ Style/NegatedIf:
275
+ Description: >-
276
+ Favor unless over if for negative conditions
277
+ (or control flow or).
278
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#unless-for-negatives'
279
+ Enabled: false
280
+
281
+ Style/NegatedWhile:
282
+ Description: 'Favor until over while for negative conditions.'
283
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#until-for-negatives'
284
+ Enabled: false
285
+
286
+ Style/Next:
287
+ Description: 'Use `next` to skip iteration instead of a condition at the end.'
288
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals'
289
+ Enabled: false
290
+
291
+ Style/NilComparison:
292
+ Description: 'Prefer x.nil? to x == nil.'
293
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
294
+ Enabled: false
295
+
296
+ Style/Not:
297
+ Description: 'Use ! instead of not.'
298
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bang-not-not'
299
+ Enabled: false
300
+
301
+ Style/NumericLiterals:
302
+ Description: >-
303
+ Add underscores to large numeric literals to improve their
304
+ readability.
305
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics'
306
+ Enabled: false
307
+
308
+ Style/NumericPredicate:
309
+ Description: >-
310
+ This cop checks for usage of comparison operators
311
+ (`==`, `!=`, `>`, `<`) to test numbers as
312
+ zero, nonzero, positive, or negative.
313
+ These can be replaced by their respective predicate methods.
314
+ The cop can also be configured to do the reverse.
315
+ StyleGuide: 'http://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/NumericPredicate'
316
+ Enabled: false
317
+
318
+ Style/OneLineConditional:
319
+ Description: >-
320
+ Favor the ternary operator(?:) over
321
+ if/then/else/end constructs.
322
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#ternary-operator'
323
+ Enabled: false
324
+
325
+ Naming/BinaryOperatorParameterName:
326
+ Description: 'When defining binary operators, name the argument other.'
327
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg'
328
+ Enabled: false
329
+
330
+ Metrics/ParameterLists:
331
+ Description: 'Avoid parameter lists longer than three or four parameters.'
332
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
333
+ Enabled: false
334
+
335
+ Style/PercentLiteralDelimiters:
336
+ Description: 'Use `%`-literal delimiters consistently'
337
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-literal-braces'
338
+ Enabled: false
339
+
340
+ Style/PerlBackrefs:
341
+ Description: 'Avoid Perl-style regex back references.'
342
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers'
343
+ Enabled: false
344
+
345
+ Naming/PredicateName:
346
+ Description: 'Check the names of predicate methods.'
347
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark'
348
+ NamePrefixBlacklist:
349
+ - is_
350
+ Exclude:
351
+ - spec/**/*
352
+
353
+ Style/Proc:
354
+ Description: 'Use proc instead of Proc.new.'
355
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc'
356
+ Enabled: false
357
+
358
+ Style/RaiseArgs:
359
+ Description: 'Checks the arguments passed to raise/fail.'
360
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#exception-class-messages'
361
+ Enabled: false
362
+
363
+ Style/RegexpLiteral:
364
+ Description: 'Use / or %r around regular expressions.'
365
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-r'
366
+ Enabled: false
367
+
368
+ Style/SelfAssignment:
369
+ Description: >-
370
+ Checks for places where self-assignment shorthand should have
371
+ been used.
372
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#self-assignment'
373
+ Enabled: false
374
+
375
+ Style/SingleLineBlockParams:
376
+ Description: 'Enforces the names of some block params.'
377
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#reduce-blocks'
378
+ Enabled: false
379
+
380
+ Style/SingleLineMethods:
381
+ Description: 'Avoid single-line methods.'
382
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-single-line-methods'
383
+ Enabled: false
384
+
385
+ Style/SignalException:
386
+ Description: 'Checks for proper usage of fail and raise.'
387
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#fail-method'
388
+ Enabled: false
389
+
390
+ Style/SpecialGlobalVars:
391
+ Description: 'Avoid Perl-style global variables.'
392
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms'
393
+ Enabled: false
394
+
395
+ Style/StringLiterals:
396
+ Description: 'Checks if uses of quotes match the configured preference.'
397
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-string-literals'
398
+ EnforcedStyle: double_quotes
399
+ Enabled: true
400
+
401
+ Style/TrailingCommaInArguments:
402
+ Description: 'Checks for trailing comma in argument lists.'
403
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
404
+ EnforcedStyleForMultiline: comma
405
+ Enabled: true
406
+
407
+ Style/TrailingCommaInArrayLiteral:
408
+ Description: 'Checks for trailing comma in array literals.'
409
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
410
+ EnforcedStyleForMultiline: comma
411
+ Enabled: true
412
+
413
+ Style/TrailingCommaInHashLiteral:
414
+ Description: 'Checks for trailing comma in hash literals.'
415
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
416
+ EnforcedStyleForMultiline: comma
417
+ Enabled: true
418
+
419
+ Style/TrivialAccessors:
420
+ Description: 'Prefer attr_* methods to trivial readers/writers.'
421
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family'
422
+ Enabled: false
423
+
424
+ Style/VariableInterpolation:
425
+ Description: >-
426
+ Don't interpolate global, instance and class variables
427
+ directly in strings.
428
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#curlies-interpolate'
429
+ Enabled: false
430
+
431
+ Style/WhenThen:
432
+ Description: 'Use when x then ... for one-line cases.'
433
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#one-line-cases'
434
+ Enabled: false
435
+
436
+ Style/WhileUntilModifier:
437
+ Description: >-
438
+ Favor modifier while/until usage when you have a
439
+ single-line body.
440
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#while-as-a-modifier'
441
+ Enabled: false
442
+
443
+ Style/WordArray:
444
+ Description: 'Use %w or %W for arrays of words.'
445
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-w'
446
+ Enabled: false
447
+
448
+ Style/SymbolArray:
449
+ Description: 'Use `%i` or `%I` for an array of symbols'
450
+ StyleGuide: 'http://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/SymbolArray'
451
+ Enabled: false
452
+
453
+ # Lint
454
+
455
+ Lint/AmbiguousOperator:
456
+ Description: >-
457
+ Checks for ambiguous operators in the first argument of a
458
+ method invocation without parentheses.
459
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-as-args'
460
+ Enabled: false
461
+
462
+ Lint/AmbiguousRegexpLiteral:
463
+ Description: >-
464
+ Checks for ambiguous regexp literals in the first argument of
465
+ a method invocation without parenthesis.
466
+ Enabled: false
467
+
468
+ Lint/AssignmentInCondition:
469
+ Description: "Don't use assignment in conditions."
470
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition'
471
+ Enabled: false
472
+
473
+ Lint/CircularArgumentReference:
474
+ Description: "Don't refer to the keyword argument in the default value."
475
+ Enabled: false
476
+
477
+ Layout/ConditionPosition:
478
+ Description: >-
479
+ Checks for condition placed in a confusing position relative to
480
+ the keyword.
481
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#same-line-condition'
482
+ Enabled: false
483
+
484
+ Lint/DeprecatedClassMethods:
485
+ Description: 'Check for deprecated class method calls.'
486
+ Enabled: false
487
+
488
+ Lint/DuplicatedKey:
489
+ Description: 'Check for duplicate keys in hash literals.'
490
+ Enabled: false
491
+
492
+ Lint/EachWithObjectArgument:
493
+ Description: 'Check for immutable argument given to each_with_object.'
494
+ Enabled: false
495
+
496
+ Lint/ElseLayout:
497
+ Description: 'Check for odd code arrangement in an else block.'
498
+ Enabled: false
499
+
500
+ Lint/FormatParameterMismatch:
501
+ Description: 'The number of parameters to format/sprint must match the fields.'
502
+ Enabled: false
503
+
504
+ Lint/HandleExceptions:
505
+ Description: "Don't suppress exception."
506
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions'
507
+ Enabled: false
508
+
509
+ Layout/InitialIndentation:
510
+ Description: >-
511
+ Checks the indentation of the first non-blank non-comment line in a file.
512
+ Enabled: false
513
+
514
+ Lint/LiteralInInterpolation:
515
+ Description: 'Checks for literals used in interpolation.'
516
+ Enabled: false
517
+
518
+ Lint/Loop:
519
+ Description: >-
520
+ Use Kernel#loop with break rather than begin/end/until or
521
+ begin/end/while for post-loop tests.
522
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#loop-with-break'
523
+ Enabled: false
524
+
525
+ Lint/NestedMethodDefinition:
526
+ Description: 'Do not use nested method definitions.'
527
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-methods'
528
+ Enabled: false
529
+
530
+ Lint/NonLocalExitFromIterator:
531
+ Description: 'Do not use return in iterator to cause non-local exit.'
532
+ Enabled: false
533
+
534
+ Lint/ParenthesesAsGroupedExpression:
535
+ Description: >-
536
+ Checks for method calls with a space before the opening
537
+ parenthesis.
538
+ StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces'
539
+ Enabled: false
540
+
541
+ Lint/RequireParentheses:
542
+ Description: >-
543
+ Use parentheses in the method call to avoid confusion
544
+ about precedence.
545
+ Enabled: false
546
+
547
+ Lint/UnderscorePrefixedVariableName:
548
+ Description: 'Do not use prefix `_` for a variable that is used.'
549
+ Enabled: false
550
+
551
+ Lint/Void:
552
+ Description: 'Possible use of operator/literal/variable in void context.'
553
+ Enabled: false
554
+
555
+ # Performance
556
+
557
+ Performance/CaseWhenSplat:
558
+ Description: >-
559
+ Place `when` conditions that use splat at the end
560
+ of the list of `when` branches.
561
+ Enabled: false
562
+
563
+ Performance/Count:
564
+ Description: >-
565
+ Use `count` instead of `select...size`, `reject...size`,
566
+ `select...count`, `reject...count`, `select...length`,
567
+ and `reject...length`.
568
+ Enabled: false
569
+
570
+ Performance/Detect:
571
+ Description: >-
572
+ Use `detect` instead of `select.first`, `find_all.first`,
573
+ `select.last`, and `find_all.last`.
574
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerabledetect-vs-enumerableselectfirst-code'
575
+ Enabled: false
576
+
577
+ Performance/FlatMap:
578
+ Description: >-
579
+ Use `Enumerable#flat_map`
580
+ instead of `Enumerable#map...Array#flatten(1)`
581
+ or `Enumberable#collect..Array#flatten(1)`
582
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablemaparrayflatten-vs-enumerableflat_map-code'
583
+ Enabled: false
584
+
585
+ Performance/ReverseEach:
586
+ Description: 'Use `reverse_each` instead of `reverse.each`.'
587
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablereverseeach-vs-enumerablereverse_each-code'
588
+ Enabled: false
589
+
590
+ Performance/Sample:
591
+ Description: >-
592
+ Use `sample` instead of `shuffle.first`,
593
+ `shuffle.last`, and `shuffle[Fixnum]`.
594
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'
595
+ Enabled: false
596
+
597
+ Performance/Size:
598
+ Description: >-
599
+ Use `size` instead of `count` for counting
600
+ the number of elements in `Array` and `Hash`.
601
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#arraycount-vs-arraysize-code'
602
+ Enabled: false
603
+
604
+ Performance/StringReplacement:
605
+ Description: >-
606
+ Use `tr` instead of `gsub` when you are replacing the same
607
+ number of characters. Use `delete` instead of `gsub` when
608
+ you are deleting characters.
609
+ Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringgsub-vs-stringtr-code'
610
+ Enabled: false
611
+
612
+ # Rails
613
+
614
+ Rails/ActionFilter:
615
+ Description: 'Enforces consistent use of action filter methods.'
616
+ Enabled: false
617
+
618
+ Rails/Date:
619
+ Description: >-
620
+ Checks the correct usage of date aware methods,
621
+ such as Date.today, Date.current etc.
622
+ Enabled: false
623
+
624
+ Rails/FindBy:
625
+ Description: 'Prefer find_by over where.first.'
626
+ Enabled: false
627
+
628
+ Rails/FindEach:
629
+ Description: 'Prefer all.find_each over all.find.'
630
+ Enabled: false
631
+
632
+ Rails/HasAndBelongsToMany:
633
+ Description: 'Prefer has_many :through to has_and_belongs_to_many.'
634
+ Enabled: false
635
+
636
+ Rails/Output:
637
+ Description: 'Checks for calls to puts, print, etc.'
638
+ Enabled: false
639
+
640
+ Rails/ReadWriteAttribute:
641
+ Description: >-
642
+ Checks for read_attribute(:attr) and
643
+ write_attribute(:attr, val).
644
+ Enabled: false
645
+
646
+ Rails/ScopeArgs:
647
+ Description: 'Checks the arguments of ActiveRecord scopes.'
648
+ Enabled: false
649
+
650
+ Rails/TimeZone:
651
+ Description: 'Checks the correct usage of time zone aware methods.'
652
+ StyleGuide: 'https://github.com/bbatsov/rails-style-guide#time'
653
+ Reference: 'http://danilenko.org/2012/7/6/rails_timezones'
654
+ Enabled: false
655
+
656
+ Rails/Validation:
657
+ Description: 'Use validates :attribute, hash of validations.'
658
+ Enabled: false
659
+
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.1
5
+ before_install: gem install bundler -v 1.16.0
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in canvas_qti_to_learnosity_converter.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ canvas_qti_to_learnosity_converter (0.1.4)
5
+ nokogiri
6
+ rubyzip
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ byebug (10.0.2)
12
+ diff-lcs (1.3)
13
+ mini_portile2 (2.3.0)
14
+ nokogiri (1.8.2)
15
+ mini_portile2 (~> 2.3.0)
16
+ rake (10.5.0)
17
+ rspec (3.7.0)
18
+ rspec-core (~> 3.7.0)
19
+ rspec-expectations (~> 3.7.0)
20
+ rspec-mocks (~> 3.7.0)
21
+ rspec-core (3.7.1)
22
+ rspec-support (~> 3.7.0)
23
+ rspec-expectations (3.7.0)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.7.0)
26
+ rspec-mocks (3.7.0)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.7.0)
29
+ rspec-support (3.7.1)
30
+ rubyzip (1.2.1)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ bundler (~> 1.16)
37
+ byebug
38
+ canvas_qti_to_learnosity_converter!
39
+ rake (~> 10.0)
40
+ rspec (~> 3.0)
41
+
42
+ BUNDLED WITH
43
+ 1.16.1
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Nick Benoit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # CanvasQtiToLearnosityConverter
2
+
3
+ This gem is designed to facilitate the conversion of canvas quizzes exported as
4
+ qti 1.2, to the learnosity json format. It currently has support for converting
5
+ a single qti file, or converting an entire imscc export of qti quizzes. Be
6
+ aware that the CanvasQtiToLearnosityConverter makes assumptions about the
7
+ format of the qti that canvas exports as of 4/23/18, and will be sensitive
8
+ to spec compliant changes to the way that canvas exports qti.
9
+
10
+
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'canvas_qti_to_learnosity_converter'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install canvas_qti_to_learnosity_converter
27
+
28
+ ## Usage
29
+
30
+ #### Convert entire imscc export
31
+
32
+ ```
33
+ # Convert All QTI Files in entire imscc
34
+ CanvasQtiToLearnosityConverter.convert_imscc_export(path)
35
+ # returns [
36
+ # {
37
+ # title: "Canvas Quiz Title",
38
+ # ident: "canvas_qti_export_id",
39
+ # items: [...converted_learnosity_questions... ]
40
+ # More information on learnosity question format: https://docs.learnosity.com/analytics/data/endpoints/itembank_endpoints#setQuestions
41
+ # }, ...
42
+ #]
43
+ ```
44
+
45
+ #### Convert single qti string
46
+
47
+ ```
48
+ # Convert single qti_string
49
+ CanvasQtiToLearnosityConverter.convert(qti_string)
50
+ # returns
51
+ # {
52
+ # title: "Canvas Quiz Title",
53
+ # ident: "canvas_qti_export_id",
54
+ # items: [...converted_learnosity_questions... ]
55
+ # More information on learnosity question format: https://docs.learnosity.com/analytics/data/endpoints/itembank_endpoints#setQuestions
56
+ # },
57
+ ```
58
+
59
+ ## Development
60
+
61
+ #### Specs
62
+
63
+ To run the tests
64
+ ```rake spec```
65
+
66
+ ## License
67
+
68
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "canvas_qti_to_learnosity_converter"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,38 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "canvas_qti_to_learnosity_converter/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "canvas_qti_to_learnosity_converter"
8
+ spec.version = CanvasQtiToLearnosityConverter::VERSION
9
+ spec.authors = ["Nick Benoit"]
10
+ spec.email = ["nick.benoit14@gmail.com"]
11
+
12
+ spec.summary = %q{Converts canvas qti to learnosity JSON}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ # if spec.respond_to?(:metadata)
19
+ # # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
20
+ # else
21
+ # raise "RubyGems 2.0 or newer is required to protect against " \
22
+ # "public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_development_dependency "bundler", "~> 1.16"
33
+ spec.add_development_dependency "byebug"
34
+ spec.add_development_dependency "rake", "~> 10.0"
35
+ spec.add_development_dependency "rspec", "~> 3.0"
36
+ spec.add_dependency "nokogiri"
37
+ spec.add_dependency "rubyzip"
38
+ end
@@ -0,0 +1,221 @@
1
+ require "nokogiri"
2
+ require "forwardable"
3
+ require "ostruct"
4
+ require "zip"
5
+
6
+ module CanvasQtiToLearnosityConverter
7
+ class CanvasQuestionTypeNotSupportedError < RuntimeError
8
+ end
9
+
10
+ class CanvasQtiQuiz
11
+ extend Forwardable
12
+ def_delegators :@xml, :css
13
+
14
+ def initialize(qti_string:)
15
+ @xml = Nokogiri.XML(qti_string, &:noblanks)
16
+ end
17
+ end
18
+
19
+ class CanvasQtiQuizQuestion
20
+ extend Forwardable
21
+ def_delegators :@xml, :css
22
+
23
+ def initialize(qti_string:)
24
+ @xml = Nokogiri.XML(qti_string, &:noblanks)
25
+ end
26
+ end
27
+
28
+ class LearnosityQuestion < OpenStruct
29
+ end
30
+
31
+ class MultipleChoiceLearnosityQuestion < LearnosityQuestion
32
+ end
33
+
34
+ class MultipleAnswersLearnosityQuestion < LearnosityQuestion
35
+ end
36
+
37
+ class Learnosityitem
38
+ end
39
+
40
+ class LearnosityActivity
41
+ end
42
+
43
+ LEARNOSITY_TYPE_MAP = {
44
+ "mcq" => MultipleChoiceLearnosityQuestion
45
+ }
46
+
47
+ def self.read_file(path)
48
+ file = File.new path
49
+ file.read
50
+ ensure
51
+ file.close
52
+ # Do we need to unlink?
53
+ end
54
+
55
+ def self.build_quiz_from_qti_string(qti_string)
56
+ CanvasQtiQuiz.new(qti_string: qti_string)
57
+ end
58
+
59
+ def self.build_quiz_from_file(path)
60
+ qti_file = File.new path
61
+ qti_string = qti_file.read
62
+ CanvasQtiQuiz.new(qti_string: qti_string)
63
+ ensure
64
+ qti_file.close
65
+ end
66
+
67
+ def self.build_item_from_file(path, item_type = nil)
68
+ file = File.new path
69
+ file_val = JSON.parse(file.read)
70
+ type = item_type || LEARNOSITY_TYPE_MAP[file_val["type"]]
71
+ type.new(file_val)
72
+ ensure
73
+ file.close
74
+ end
75
+
76
+ def self.extract_type(item)
77
+ item.css(%{ item > itemmetadata > qtimetadata >
78
+ qtimetadatafield > fieldlabel:contains("question_type")})
79
+ &.first&.next&.text&.to_sym
80
+ end
81
+
82
+ def self.extract_mattext(mattext_node)
83
+ mattext_node.content
84
+ end
85
+
86
+ def self.extract_stimulus(item)
87
+ mattext = item.css("item > presentation > material > mattext").first
88
+ extract_mattext(mattext)
89
+ end
90
+
91
+ def self.extract_multiple_choice_options(item)
92
+ choices = item.css("item > presentation > response_lid > render_choice > response_label")
93
+ choices.map do |choice|
94
+ ident = choice.attribute("ident").value
95
+ {
96
+ "value" => ident,
97
+ "label" => extract_mattext(choice.css("material > mattext").first),
98
+ }
99
+ end
100
+ end
101
+
102
+ def self.extract_response_id(item)
103
+ item.css("item > presentation > response_lid").attribute("ident").value
104
+ end
105
+
106
+ def self.extract_multiple_choice_validation(item)
107
+ resp_conditions = item.css("item > resprocessing > respcondition")
108
+ correct_condition = resp_conditions.select do |condition|
109
+ setvar = condition.css("setvar")
110
+ setvar.length === 1 && setvar.text === "100"
111
+ end.first
112
+
113
+
114
+ # TODO check for more than 1 element
115
+ correct_value = correct_condition.css("varequal").text
116
+ {
117
+ "scoring_type" => "exactMatch",
118
+ "valid_response" => {
119
+ "value" => [correct_value],
120
+ },
121
+ }
122
+ end
123
+
124
+ def self.extract_multiple_answers_validation(item)
125
+ correct_condition = item.css('item > resprocessing > respcondition[continue="No"] > conditionvar > and > varequal')
126
+ alt_responses = correct_condition.map(&:text)
127
+ {
128
+ "scoring_type" => "partialMatch",
129
+ "alt_responses" => alt_responses,
130
+ }
131
+ end
132
+
133
+ def self.convert_multiple_choice(item)
134
+ MultipleChoiceLearnosityQuestion.new({
135
+ stimulus: extract_stimulus(item),
136
+ options: extract_multiple_choice_options(item),
137
+ multiple_responses: false,
138
+ response_id: extract_response_id(item),
139
+ type: "mcq",
140
+ validation: extract_multiple_choice_validation(item),
141
+ })
142
+ end
143
+
144
+ def self.convert_multiple_answers(item)
145
+ MultipleAnswersLearnosityQuestion.new({
146
+ stimulus: extract_stimulus(item),
147
+ options: extract_multiple_choice_options(item),
148
+ multiple_responses: true,
149
+ response_id: extract_response_id(item),
150
+ type: "mcq",
151
+ validation: extract_multiple_answers_validation(item),
152
+ })
153
+ end
154
+
155
+ def self.convert_item(qti_quiz)
156
+ type = extract_type(qti_quiz)
157
+ case type
158
+ when :multiple_choice_question
159
+ convert_multiple_choice(qti_quiz)
160
+ when :true_false_question
161
+ convert_multiple_choice(qti_quiz)
162
+ when :multiple_answers_question
163
+ convert_multiple_answers(qti_quiz)
164
+ else
165
+ raise CanvasQuestionTypeNotSupportedError
166
+ end
167
+ end
168
+
169
+ def self.convert(qti)
170
+ quiz = CanvasQtiQuiz.new(qti_string: qti)
171
+ items = quiz.css("item").map do |item|
172
+ begin
173
+ quiz_item = CanvasQtiQuizQuestion.new(qti_string: item.to_html)
174
+ convert_item(quiz_item)
175
+ rescue CanvasQuestionTypeNotSupportedError
176
+ nil
177
+ end
178
+ end.compact
179
+
180
+ assessment = quiz.css("assessment")
181
+ {
182
+ title: assessment.attribute("title").value,
183
+ ident: assessment.attribute("ident").value,
184
+ items: items,
185
+ }
186
+ end
187
+
188
+ def self.convert_qti_file(path)
189
+ file = File.new(path)
190
+ qti_string = file.read
191
+ convert(qti_string)
192
+ ensure
193
+ file.close
194
+ file.unlink
195
+ end
196
+
197
+ def self.imscc_quiz_paths(parsed_manifest)
198
+ parsed_manifest.css("resources > resource[type='imsqti_xmlv1p2'] > file").
199
+ map { |entry| entry.attribute("href").value }
200
+ end
201
+
202
+ def self.to_native_types(activity)
203
+ clone = activity.clone
204
+ clone[:items] = activity[:items].map(&:to_h)
205
+ clone
206
+ end
207
+
208
+ def self.convert_imscc_export(path)
209
+ Zip::File.open(path) do |zip_file|
210
+ entry = zip_file.find_entry("imsmanifest.xml")
211
+ manifest = entry.get_input_stream.read
212
+ parsed_manifest = Nokogiri.XML(manifest, &:noblanks)
213
+ paths = imscc_quiz_paths(parsed_manifest)
214
+ result = paths.map do |qti_path|
215
+ qti = zip_file.find_entry(qti_path).get_input_stream.read
216
+ to_native_types(convert(qti))
217
+ end
218
+ result
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,3 @@
1
+ module CanvasQtiToLearnosityConverter
2
+ VERSION = "0.1.4"
3
+ end
@@ -0,0 +1,6 @@
1
+ require 'canvas_qti_to_learnosity_converter/version'
2
+ require 'canvas_qti_to_learnosity_converter/convert'
3
+
4
+ module CanvasQtiToLearnosityConverter
5
+ # Your code goes here...
6
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: canvas_qti_to_learnosity_converter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.4
5
+ platform: ruby
6
+ authors:
7
+ - Nick Benoit
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-04-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubyzip
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ - nick.benoit14@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".rubocop.yml"
107
+ - ".travis.yml"
108
+ - Gemfile
109
+ - Gemfile.lock
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - bin/console
114
+ - bin/setup
115
+ - canvas_qti_to_learnosity_converter.gemspec
116
+ - lib/canvas_qti_to_learnosity_converter.rb
117
+ - lib/canvas_qti_to_learnosity_converter/convert.rb
118
+ - lib/canvas_qti_to_learnosity_converter/version.rb
119
+ homepage: ''
120
+ licenses:
121
+ - MIT
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.6.11
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Converts canvas qti to learnosity JSON
143
+ test_files: []