qti 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- 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