qti 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8a14dae0c3cb4764523cd5eab9c47b5cc3d8c356
4
- data.tar.gz: 76484ab80219fcd84ed4e15c5b9ab0ad6200fb45
2
+ SHA256:
3
+ metadata.gz: e9c8a7c338d0de60c7ef5d45f3acd6cc70d5dfc2c9a738744957b9ee7e5c48f7
4
+ data.tar.gz: ba4a37727dca4854d1b53592d0b4e541cedbb9ac95815483a8be3815ba1281b8
5
5
  SHA512:
6
- metadata.gz: 2a9fa91d5c0a6e5e1f85d052ebe0220ae24b30c4245a1697030ea1b827e56cf75f2cc4c1414dcaad04bdd8393fe90f877e33932d40a4d2f150c2b8594bf0b296
7
- data.tar.gz: f96a7d8d1b32a9a0c05e23a968a8332aac3d38299a29f83e4108ff6f8993c75e96871904096c650dd1f49b41eca2adf455ad360a281a06a4b81e5bad72f3eaeb
6
+ metadata.gz: 5ef6b0033fbc4c57593896aa1842d84c93eb9162867d9a6b93b0304427a5f20b17bf02f807ff8f9cab9664ae5bc228d36eceba0bd73017203b4caedb42a13058
7
+ data.tar.gz: b204d4aeb766718ab8187b0d96df30ae62778335a686ee63134b5828622db926978d10fbfcedcc55c5eeb96c3694830786e692be71f85f62cb30109f974cd29c
@@ -18,7 +18,7 @@ module Qti
18
18
  end
19
19
 
20
20
  def hide_results
21
- tag_under_quiz('hide_results')
21
+ nil_if_empty(tag_under_quiz('hide_results'))
22
22
  end
23
23
 
24
24
  def scoring_policy
@@ -125,6 +125,71 @@ module Qti
125
125
  @doc.xpath('//xmlns:quiz/xmlns:assignment/xmlns:quiz_identifierref')&.first&.content
126
126
  end
127
127
 
128
+ def lock_at
129
+ tag_under_quiz('lock_at')
130
+ end
131
+
132
+ def unlock_at
133
+ tag_under_quiz('unlock_at')
134
+ end
135
+
136
+ def due_at
137
+ tag_under_quiz('due_at')
138
+ end
139
+
140
+ def access_code
141
+ tag_under_quiz('access_code')
142
+ end
143
+
144
+ def ip_filter
145
+ tag_under_quiz('ip_filter')
146
+ end
147
+
148
+ def time_limit_raw
149
+ tag_under_quiz('time_limit')
150
+ end
151
+
152
+ def time_limit
153
+ return nil if time_limit_raw.nil?
154
+ time_limit_raw.to_i
155
+ end
156
+
157
+ def show_correct_answers_at
158
+ tag_under_quiz('show_correct_answers_at')
159
+ end
160
+
161
+ def hide_correct_answers_at
162
+ tag_under_quiz('hide_correct_answers_at')
163
+ end
164
+
165
+ def require_lockdown_browser
166
+ tag_under_quiz('require_lockdown_browser')
167
+ end
168
+
169
+ def require_lockdown_browser?
170
+ string_true?(require_lockdown_browser)
171
+ end
172
+
173
+ def require_lockdown_browser_for_results
174
+ tag_under_quiz('require_lockdown_browser_for_results')
175
+ end
176
+
177
+ def require_lockdown_browser_for_results?
178
+ string_true?(require_lockdown_browser_for_results)
179
+ end
180
+
181
+ def require_lockdown_browser_monitor
182
+ tag_under_quiz('require_lockdown_browser_monitor')
183
+ end
184
+
185
+ def require_lockdown_browser_monitor?
186
+ string_true?(require_lockdown_browser_monitor)
187
+ end
188
+
189
+ def lockdown_browser_monitor_data
190
+ nil_if_empty(tag_under_quiz('lockdown_browser_monitor_data'))
191
+ end
192
+
128
193
  private
129
194
 
130
195
  def tag_under_quiz(tag)
@@ -134,6 +199,11 @@ module Qti
134
199
  def string_true?(value)
135
200
  value&.casecmp('true')&.zero?
136
201
  end
202
+
203
+ def nil_if_empty(value)
204
+ return nil if value.to_s.empty?
205
+ value
206
+ end
137
207
  end
138
208
 
139
209
  module AssessmentMetaBase
@@ -143,7 +213,12 @@ module Qti
143
213
  :could_be_locked?, :allowed_attempts, :one_question_at_a_time?,
144
214
  :cant_go_back?, :available?, :one_time_results?,
145
215
  :show_correct_answers_attempt?, :only_visible_to_overrides?,
146
- :module_locked?,
216
+ :module_locked?, :access_code, :ip_filter, :time_limit,
217
+ :show_correct_answers_at, :hide_correct_answers_at,
218
+ :lock_at, :unlock_at, :due_at, :require_lockdown_browser?,
219
+ :require_lockdown_browser_for_results?,
220
+ :require_lockdown_browser_monitor?,
221
+ :lockdown_browser_monitor_data,
147
222
  to: :@canvas_meta_data, prefix: :canvas, allow_nil: true
148
223
 
149
224
  alias canvas_instructions canvas_description
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.1.0'.freeze
2
+ VERSION = '2.2.0'.freeze
3
3
  end
@@ -0,0 +1,76 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <quiz identifier="gba044ae1fc7cfd3dc413e0df695e0068" xmlns="http://canvas.instructure.com/xsd/cccv1p0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://canvas.instructure.com/xsd/cccv1p0 https://canvas.instructure.com/xsd/cccv1p0.xsd">
3
+ <title>asd09sdfaxsdflj</title>
4
+ <description>&lt;p&gt;dlkjfaflkjla3rlajl3lafd&lt;/p&gt;</description>
5
+ <lock_at>2020-07-10T04:59:59</lock_at>
6
+ <unlock_at>2020-04-16T05:00:00</unlock_at>
7
+ <due_at>2020-05-23T04:59:59</due_at>
8
+ <shuffle_answers>true</shuffle_answers>
9
+ <scoring_policy>keep_average</scoring_policy>
10
+ <hide_results></hide_results>
11
+ <quiz_type>assignment</quiz_type>
12
+ <points_possible/>
13
+ <require_lockdown_browser>false</require_lockdown_browser>
14
+ <require_lockdown_browser_for_results>false</require_lockdown_browser_for_results>
15
+ <require_lockdown_browser_monitor>false</require_lockdown_browser_monitor>
16
+ <lockdown_browser_monitor_data/>
17
+ <access_code>98aAlfmxtw#!£$s</access_code>
18
+ <ip_filter>192.168.217.1/24</ip_filter>
19
+ <show_correct_answers>true</show_correct_answers>
20
+ <show_correct_answers_at>2041-02-17 06:00:00 UTC</show_correct_answers_at>
21
+ <hide_correct_answers_at>2042-12-26 06:00:00 UTC</hide_correct_answers_at>
22
+ <anonymous_submissions>false</anonymous_submissions>
23
+ <could_be_locked>false</could_be_locked>
24
+ <time_limit>187</time_limit>
25
+ <allowed_attempts>52</allowed_attempts>
26
+ <one_question_at_a_time>true</one_question_at_a_time>
27
+ <cant_go_back>true</cant_go_back>
28
+ <available>false</available>
29
+ <one_time_results>false</one_time_results>
30
+ <show_correct_answers_last_attempt>false</show_correct_answers_last_attempt>
31
+ <only_visible_to_overrides>false</only_visible_to_overrides>
32
+ <module_locked>false</module_locked>
33
+ <assignment identifier="g390e22b33353b658bb23abbce000414f">
34
+ <title>asd09sdfaxsdflj</title>
35
+ <due_at>2020-05-23T04:59:59</due_at>
36
+ <lock_at>2020-07-10T04:59:59</lock_at>
37
+ <unlock_at>2020-04-16T05:00:00</unlock_at>
38
+ <module_locked>false</module_locked>
39
+ <all_day_date>2020-05-22</all_day_date>
40
+ <workflow_state>unpublished</workflow_state>
41
+ <assignment_overrides>
42
+ </assignment_overrides>
43
+ <quiz_identifierref>gba044ae1fc7cfd3dc413e0df695e0068</quiz_identifierref>
44
+ <allowed_extensions></allowed_extensions>
45
+ <has_group_category>false</has_group_category>
46
+ <grading_type>points</grading_type>
47
+ <all_day>true</all_day>
48
+ <submission_types>online_quiz</submission_types>
49
+ <position>11</position>
50
+ <turnitin_enabled>false</turnitin_enabled>
51
+ <vericite_enabled>false</vericite_enabled>
52
+ <peer_review_count>0</peer_review_count>
53
+ <peer_reviews>false</peer_reviews>
54
+ <automatic_peer_reviews>false</automatic_peer_reviews>
55
+ <anonymous_peer_reviews>false</anonymous_peer_reviews>
56
+ <grade_group_students_individually>false</grade_group_students_individually>
57
+ <freeze_on_copy>false</freeze_on_copy>
58
+ <omit_from_final_grade>false</omit_from_final_grade>
59
+ <intra_group_peer_reviews>false</intra_group_peer_reviews>
60
+ <only_visible_to_overrides>false</only_visible_to_overrides>
61
+ <post_to_sis>false</post_to_sis>
62
+ <moderated_grading>false</moderated_grading>
63
+ <grader_count>0</grader_count>
64
+ <grader_comments_visible_to_graders>true</grader_comments_visible_to_graders>
65
+ <anonymous_grading>false</anonymous_grading>
66
+ <graders_anonymous_to_graders>false</graders_anonymous_to_graders>
67
+ <grader_names_visible_to_final_grader>true</grader_names_visible_to_final_grader>
68
+ <anonymous_instructor_annotations>false</anonymous_instructor_annotations>
69
+ <post_policy>
70
+ <post_manually>false</post_manually>
71
+ </post_policy>
72
+ </assignment>
73
+ <assignment_group_identifierref>g242d42956e923734daedb8192227c3c9</assignment_group_identifierref>
74
+ <assignment_overrides>
75
+ </assignment_overrides>
76
+ </quiz>
@@ -0,0 +1,17 @@
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="gba044ae1fc7cfd3dc413e0df695e0068" title="asd09sdfaxsdflj">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>qmd_timelimit</fieldlabel>
7
+ <fieldentry>187</fieldentry>
8
+ </qtimetadatafield>
9
+ <qtimetadatafield>
10
+ <fieldlabel>cc_maxattempts</fieldlabel>
11
+ <fieldentry>52</fieldentry>
12
+ </qtimetadatafield>
13
+ </qtimetadata>
14
+ <section ident="root_section">
15
+ </section>
16
+ </assessment>
17
+ </questestinterop>
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <manifest identifier="g9dc5fd873c331ef5143dfe20c719a3f3" xmlns="http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1" xmlns:lom="http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource" xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p1.xsd http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lomresource_v1p0.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p2.xsd">
3
+ <metadata>
4
+ <schema>IMS Content</schema>
5
+ <schemaversion>1.1.3</schemaversion>
6
+ <imsmd:lom>
7
+ <imsmd:general>
8
+ <imsmd:title>
9
+ <imsmd:string>QTI Quiz Export for course "QO"</imsmd:string>
10
+ </imsmd:title>
11
+ </imsmd:general>
12
+ <imsmd:lifeCycle>
13
+ <imsmd:contribute>
14
+ <imsmd:date>
15
+ <imsmd:dateTime>2020-05-01</imsmd:dateTime>
16
+ </imsmd:date>
17
+ </imsmd:contribute>
18
+ </imsmd:lifeCycle>
19
+ <imsmd:rights>
20
+ <imsmd:copyrightAndOtherRestrictions>
21
+ <imsmd:value>yes</imsmd:value>
22
+ </imsmd:copyrightAndOtherRestrictions>
23
+ <imsmd:description>
24
+ <imsmd:string>Private (Copyrighted) - http://en.wikipedia.org/wiki/Copyright</imsmd:string>
25
+ </imsmd:description>
26
+ </imsmd:rights>
27
+ </imsmd:lom>
28
+ </metadata>
29
+ <organizations/>
30
+ <resources>
31
+ <resource identifier="gba044ae1fc7cfd3dc413e0df695e0068" type="imsqti_xmlv1p2">
32
+ <file href="gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml"/>
33
+ <dependency identifierref="gd7fc181aed26406e7e3e9c5c8c475128"/>
34
+ </resource>
35
+ <resource identifier="gd7fc181aed26406e7e3e9c5c8c475128" type="associatedcontent/imscc_xmlv1p1/learning-application-resource" href="gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml">
36
+ <file href="gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml"/>
37
+ </resource>
38
+ </resources>
39
+ </manifest>
@@ -4,7 +4,7 @@ context 'Canvas Assessment Meta Data' do
4
4
  let(:assessment) { Qti::Importer.new(file_path).test_object }
5
5
 
6
6
  shared_examples 'loads canvas meta data' do
7
- it 'creates a vaild assessment' do
7
+ it 'creates a valid assessment' do
8
8
  expect(assessment).to be_kind_of(assessment_type)
9
9
  expect(assessment.canvas_title).to eq(title)
10
10
  expect(assessment.canvas_description).to eq(instructions)
@@ -21,6 +21,18 @@ context 'Canvas Assessment Meta Data' do
21
21
  expect(assessment.canvas_one_time_results?).to eq(one_time_results)
22
22
  expect(assessment.canvas_scoring_policy).to eq(scoring_policy)
23
23
  expect(assessment.canvas_shuffle_answers?).to eq(shuffle_answers)
24
+ expect(assessment.canvas_lock_at).to eq(lock_at)
25
+ expect(assessment.canvas_unlock_at).to eq(unlock_at)
26
+ expect(assessment.canvas_due_at).to eq(due_at)
27
+ expect(assessment.canvas_access_code).to eq(access_code)
28
+ expect(assessment.canvas_ip_filter).to eq(ip_filter)
29
+ expect(assessment.canvas_time_limit).to eq(time_limit)
30
+ expect(assessment.canvas_show_correct_answers_at).to eq(show_answers_at)
31
+ expect(assessment.canvas_hide_correct_answers_at).to eq(hide_answers_at)
32
+ expect(assessment.canvas_require_lockdown_browser?).to eq(rlb)
33
+ expect(assessment.canvas_require_lockdown_browser_for_results?).to eq(rlb_results)
34
+ expect(assessment.canvas_require_lockdown_browser_monitor?).to eq(rlb_monitor)
35
+ expect(assessment.canvas_lockdown_browser_monitor_data).to eq(lb_monitor_data)
24
36
  end
25
37
  end
26
38
 
@@ -41,6 +53,51 @@ context 'Canvas Assessment Meta Data' do
41
53
  let(:one_time_results) { false }
42
54
  let(:scoring_policy) { 'keep_highest' }
43
55
  let(:shuffle_answers) { false }
56
+ let(:lock_at) { nil }
57
+ let(:unlock_at) { nil }
58
+ let(:due_at) { nil }
59
+ let(:access_code) { nil }
60
+ let(:ip_filter) { nil }
61
+ let(:time_limit) { nil }
62
+ let(:show_answers_at) { nil }
63
+ let(:hide_answers_at) { nil }
64
+ let(:rlb) { false }
65
+ let(:rlb_results) { false }
66
+ let(:rlb_monitor) { false }
67
+ let(:lb_monitor_data) { nil }
68
+
69
+ include_examples('loads canvas meta data')
70
+ end
71
+
72
+ describe 'in a QTI 1.2 container with extended fields' do
73
+ let(:qti_file) { 'test_qti_1.2_canvas_extended' }
74
+ let(:assessment_type) { Qti::V1::Models::Assessment }
75
+ let(:title) { 'asd09sdfaxsdflj' }
76
+ let(:instructions) { '<p>dlkjfaflkjla3rlajl3lafd</p>' }
77
+ let(:points_possible) { 0.0 }
78
+ let(:oqaat) { true }
79
+ let(:allowed_attempts) { 52 }
80
+ let(:hide_results) { nil }
81
+ let(:quiz_type) { 'assignment' }
82
+ let('anon_submissions') { false }
83
+ let(:could_be_locked) { false }
84
+ let(:nobacktracking) { true }
85
+ let(:available) { false }
86
+ let(:one_time_results) { false }
87
+ let(:scoring_policy) { 'keep_average' }
88
+ let(:shuffle_answers) { true }
89
+ let(:lock_at) { '2020-07-10T04:59:59' }
90
+ let(:unlock_at) { '2020-04-16T05:00:00' }
91
+ let(:due_at) { '2020-05-23T04:59:59' }
92
+ let(:access_code) { '98aAlfmxtw#!£$s' }
93
+ let(:ip_filter) { '192.168.217.1/24' }
94
+ let(:time_limit) { 187 }
95
+ let(:show_answers_at) { '2041-02-17 06:00:00 UTC' }
96
+ let(:hide_answers_at) { '2042-12-26 06:00:00 UTC' }
97
+ let(:rlb) { false }
98
+ let(:rlb_results) { false }
99
+ let(:rlb_monitor) { false }
100
+ let(:lb_monitor_data) { nil }
44
101
 
45
102
  include_examples('loads canvas meta data')
46
103
  end
@@ -53,7 +110,7 @@ context 'Canvas Assessment Meta Data' do
53
110
  let(:points_possible) { 1.0 }
54
111
  let(:oqaat) { false }
55
112
  let(:allowed_attempts) { 1 }
56
- let(:hide_results) { '' }
113
+ let(:hide_results) { nil }
57
114
  let(:quiz_type) { 'assignment' }
58
115
  let('anon_submissions') { false }
59
116
  let(:could_be_locked) { false }
@@ -62,6 +119,18 @@ context 'Canvas Assessment Meta Data' do
62
119
  let(:one_time_results) { false }
63
120
  let(:scoring_policy) { 'keep_highest' }
64
121
  let(:shuffle_answers) { false }
122
+ let(:lock_at) { nil }
123
+ let(:unlock_at) { nil }
124
+ let(:due_at) { nil }
125
+ let(:access_code) { nil }
126
+ let(:ip_filter) { nil }
127
+ let(:time_limit) { nil }
128
+ let(:show_answers_at) { nil }
129
+ let(:hide_answers_at) { nil }
130
+ let(:rlb) { false }
131
+ let(:rlb_results) { false }
132
+ let(:rlb_monitor) { false }
133
+ let(:lb_monitor_data) { nil }
65
134
 
66
135
  include_examples('loads canvas meta data')
67
136
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qti
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannah Bottalla
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-11-12 00:00:00.000000000 Z
12
+ date: 2020-05-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionview
@@ -510,6 +510,9 @@ files:
510
510
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
511
511
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
512
512
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
513
+ - spec/fixtures/test_qti_1.2_canvas_extended/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
514
+ - spec/fixtures/test_qti_1.2_canvas_extended/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
515
+ - spec/fixtures/test_qti_1.2_canvas_extended/imsmanifest.xml
513
516
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/assessment_meta.xml
514
517
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/i913965373124f56ca136e87deb040c03.xml
515
518
  - spec/fixtures/test_qti_1.2_multi/ife643a8a04b48b22acab95de6c01f1cc/assessment_meta.xml
@@ -668,8 +671,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
668
671
  - !ruby/object:Gem::Version
669
672
  version: '0'
670
673
  requirements: []
671
- rubyforge_project:
672
- rubygems_version: 2.6.14.4
674
+ rubygems_version: 3.0.4
673
675
  signing_key:
674
676
  specification_version: 4
675
677
  summary: QTI 1.2 and 2.1 import and export models
@@ -847,6 +849,9 @@ test_files:
847
849
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
848
850
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
849
851
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
852
+ - spec/fixtures/test_qti_1.2_canvas_extended/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
853
+ - spec/fixtures/test_qti_1.2_canvas_extended/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
854
+ - spec/fixtures/test_qti_1.2_canvas_extended/imsmanifest.xml
850
855
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/assessment_meta.xml
851
856
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/i913965373124f56ca136e87deb040c03.xml
852
857
  - spec/fixtures/test_qti_1.2_multi/ife643a8a04b48b22acab95de6c01f1cc/assessment_meta.xml