qti 0.9.8 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/qti.rb +7 -0
  3. data/lib/qti/v1/models/interactions.rb +0 -1
  4. data/lib/qti/v1/models/interactions/numeric_interaction.rb +4 -14
  5. data/lib/qti/v1/models/numerics/exact_match.rb +43 -0
  6. data/lib/qti/v1/models/numerics/margin_error.rb +51 -0
  7. data/lib/qti/v1/models/numerics/precision.rb +65 -0
  8. data/lib/qti/v1/models/numerics/scoring_base.rb +29 -0
  9. data/lib/qti/v1/models/numerics/scoring_data.rb +26 -0
  10. data/lib/qti/v1/models/numerics/scoring_node.rb +29 -0
  11. data/lib/qti/v1/models/numerics/within_range.rb +36 -0
  12. data/lib/qti/version.rb +1 -1
  13. data/spec/fixtures/items_1.2/{numeric.xml → numeric_exact_match.xml} +0 -0
  14. data/spec/fixtures/items_1.2/numeric_margin_error.xml +58 -0
  15. data/spec/fixtures/items_1.2/numeric_precision.xml +58 -0
  16. data/spec/fixtures/items_1.2/numeric_within_range.xml +53 -0
  17. data/spec/gemfiles/nokogiri-1.8.gemfile.lock +35 -18
  18. data/spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb +92 -27
  19. data/spec/lib/qti/v1/models/numerics/exact_match_spec.rb +84 -0
  20. data/spec/lib/qti/v1/models/numerics/margin_error_spec.rb +80 -0
  21. data/spec/lib/qti/v1/models/numerics/precision_spec.rb +88 -0
  22. data/spec/lib/qti/v1/models/numerics/scoring_base_spec.rb +35 -0
  23. data/spec/lib/qti/v1/models/numerics/scoring_node_spec.rb +29 -0
  24. data/spec/lib/qti/v1/models/numerics/within_range_spec.rb +64 -0
  25. data/spec/spec_helper.rb +1 -0
  26. metadata +44 -17
  27. data/spec/gemfiles/nokogiri-1.6.gemfile.lock +0 -127
  28. data/spec/gemfiles/rails-4.2.gemfile.lock +0 -204
  29. data/spec/gemfiles/rails-5.0.gemfile.lock +0 -210
  30. data/spec/gemfiles/rails-5.1.gemfile.lock +0 -210
  31. data/spec/gemfiles/sanitize-4.2.gemfile.lock +0 -127
  32. data/spec/gemfiles/sanitize-4.5.gemfile.lock +0 -127
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::Numerics::Precision do
4
+ context '#scoring_data' do
5
+ # test case: 0.0123450 with 6 significant digits
6
+ let(:equal_node) do
7
+ double(
8
+ attributes: { 'respident' => double(value: 'response1') },
9
+ content: '0.012345'
10
+ )
11
+ end
12
+
13
+ let(:gt_node_value) { '0.01234495' }
14
+ let(:gt_node) do
15
+ double(
16
+ attributes: { 'respident' => double(value: 'response1') },
17
+ content: gt_node_value
18
+ )
19
+ end
20
+
21
+ let(:lte_node_value) { '0.01234505' }
22
+ let(:lte_node) do
23
+ double(
24
+ attributes: { 'respident' => double(value: 'response1') },
25
+ content: lte_node_value
26
+ )
27
+ end
28
+
29
+ let(:scoring_node) do
30
+ double(
31
+ equal_node: equal_node,
32
+ gt_node: gt_node,
33
+ lte_node: lte_node
34
+ )
35
+ end
36
+
37
+ subject { described_class.new(scoring_node) }
38
+
39
+ context 'missing node' do
40
+ context 'equal_node is missing' do
41
+ let(:equal_node) { nil }
42
+ it 'returns nil' do
43
+ expect(subject.scoring_data).to be_nil
44
+ end
45
+ end
46
+
47
+ context 'gt_node is missing' do
48
+ let(:gt_node) { nil }
49
+ it 'returns nil' do
50
+ expect(subject.scoring_data).to be_nil
51
+ end
52
+ end
53
+
54
+ context 'lte_node is missing' do
55
+ let(:lte_node) { nil }
56
+ it 'returns nil' do
57
+ expect(subject.scoring_data).to be_nil
58
+ end
59
+ end
60
+ end
61
+
62
+ it 'returns correct attributes' do
63
+ ret_val = subject.scoring_data
64
+ expect(ret_val.id).to eq('response1')
65
+ expect(ret_val.type).to eq('preciseResponse')
66
+ expect(ret_val.value).to eq('0.0123450')
67
+ expect(ret_val.precision).to eq('6')
68
+ expect(ret_val.precision_type).to eq('significantDigits')
69
+ end
70
+ end
71
+
72
+ context '#significant_digits' do
73
+ it 'returns correct number for leading zeros' do
74
+ expect(described_class.significant_digits('0.0000123')).
75
+ to eq(3)
76
+ end
77
+ it 'returns correct number for trailing zeros' do
78
+ expect(described_class.significant_digits('0.0000123000')).
79
+ to eq(3)
80
+ end
81
+ it 'returns correct number for zeros in the middle' do
82
+ expect(described_class.significant_digits('0.000012003')).
83
+ to eq(5)
84
+ expect(described_class.significant_digits('15.000012003')).
85
+ to eq(11)
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::Numerics::ScoringBase do
4
+ let(:scoring_node) { double }
5
+
6
+ subject { described_class.new(scoring_node) }
7
+
8
+ describe '#equal_node' do
9
+ it 'fetches equal_node' do
10
+ expect(scoring_node).to receive(:equal_node)
11
+ subject.equal_node
12
+ end
13
+ end
14
+
15
+ describe '#gte_node' do
16
+ it 'fetches gte_node' do
17
+ expect(scoring_node).to receive(:gte_node)
18
+ subject.gte_node
19
+ end
20
+ end
21
+
22
+ describe '#lte_node' do
23
+ it 'fetches lte_node' do
24
+ expect(scoring_node).to receive(:lte_node)
25
+ subject.lte_node
26
+ end
27
+ end
28
+
29
+ describe '#gt_node' do
30
+ it 'fetches gt_node' do
31
+ expect(scoring_node).to receive(:gt_node)
32
+ subject.gt_node
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::Numerics::ScoringNode do
4
+ context '#scoring_data' do
5
+ let(:node) { double }
6
+
7
+ subject { described_class.new(node) }
8
+
9
+ it 'expects node is queried with varequal' do
10
+ expect(node).to receive(:at_xpath).with('.//xmlns:varequal')
11
+ subject.equal_node
12
+ end
13
+
14
+ it 'expects node is queried with varequal' do
15
+ expect(node).to receive(:at_xpath).with('.//xmlns:vargte')
16
+ subject.gte_node
17
+ end
18
+
19
+ it 'expects node is queried with varequal' do
20
+ expect(node).to receive(:at_xpath).with('.//xmlns:varlte')
21
+ subject.lte_node
22
+ end
23
+
24
+ it 'expects node is queried with varequal' do
25
+ expect(node).to receive(:at_xpath).with('.//xmlns:vargt')
26
+ subject.gt_node
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::Numerics::WithinRange do
4
+ context '#scoring_data' do
5
+ let(:equal_node) { nil }
6
+
7
+ let(:gte_node_value) { '1.0' }
8
+ let(:gte_node) do
9
+ double(
10
+ attributes: { 'respident' => double(value: 'response1') },
11
+ content: gte_node_value
12
+ )
13
+ end
14
+
15
+ let(:lte_node_value) { '100.0' }
16
+ let(:lte_node) do
17
+ double(
18
+ attributes: { 'respident' => double(value: 'response1') },
19
+ content: lte_node_value
20
+ )
21
+ end
22
+
23
+ let(:scoring_node) do
24
+ double(
25
+ equal_node: equal_node,
26
+ gte_node: gte_node,
27
+ lte_node: lte_node
28
+ )
29
+ end
30
+
31
+ subject { described_class.new(scoring_node) }
32
+
33
+ context 'incompatible nodes' do
34
+ context 'equal_node presents' do
35
+ let(:equal_node) { double(content: '1234') }
36
+ it 'returns nil' do
37
+ expect(subject.scoring_data).to be_nil
38
+ end
39
+ end
40
+
41
+ context 'gte_node is missing' do
42
+ let(:gte_node) { nil }
43
+ it 'returns nil' do
44
+ expect(subject.scoring_data).to be_nil
45
+ end
46
+ end
47
+
48
+ context 'lte_node is missing' do
49
+ let(:lte_node) { nil }
50
+ it 'returns nil' do
51
+ expect(subject.scoring_data).to be_nil
52
+ end
53
+ end
54
+ end
55
+
56
+ it 'returns correct attributes' do
57
+ ret_val = subject.scoring_data
58
+ expect(ret_val.id).to eq('response1')
59
+ expect(ret_val.type).to eq('withinARange')
60
+ expect(ret_val.start).to eq('1.0')
61
+ expect(ret_val.end).to eq('100.0')
62
+ end
63
+ end
64
+ end
@@ -16,6 +16,7 @@ require 'byebug'
16
16
  require 'securerandom'
17
17
 
18
18
  Dir['./spec/support/**/*.rb'].each { |f| require f }
19
+ require 'action_view'
19
20
 
20
21
  RSpec.configure do |config|
21
22
  config.expect_with :rspec do |expectations|
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: 0.9.8
4
+ version: 0.9.9
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-01-03 00:00:00.000000000 Z
12
+ date: 2018-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -113,6 +113,20 @@ dependencies:
113
113
  - - "<"
114
114
  - !ruby/object:Gem::Version
115
115
  version: '5.0'
116
+ - !ruby/object:Gem::Dependency
117
+ name: actionview
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 4.2.0
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 4.2.0
116
130
  - !ruby/object:Gem::Dependency
117
131
  name: bundler
118
132
  requirement: !ruby/object:Gem::Requirement
@@ -275,6 +289,13 @@ files:
275
289
  - lib/qti/v1/models/interactions/numeric_interaction.rb
276
290
  - lib/qti/v1/models/interactions/ordering_interaction.rb
277
291
  - lib/qti/v1/models/interactions/string_interaction.rb
292
+ - lib/qti/v1/models/numerics/exact_match.rb
293
+ - lib/qti/v1/models/numerics/margin_error.rb
294
+ - lib/qti/v1/models/numerics/precision.rb
295
+ - lib/qti/v1/models/numerics/scoring_base.rb
296
+ - lib/qti/v1/models/numerics/scoring_data.rb
297
+ - lib/qti/v1/models/numerics/scoring_node.rb
298
+ - lib/qti/v1/models/numerics/within_range.rb
278
299
  - lib/qti/v1/models/scoring_data.rb
279
300
  - lib/qti/v2/models/assessment_item.rb
280
301
  - lib/qti/v2/models/assessment_test.rb
@@ -306,7 +327,10 @@ files:
306
327
  - spec/fixtures/items_1.2/multiple_answer.xml
307
328
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
308
329
  - spec/fixtures/items_1.2/multiple_choice.xml
309
- - spec/fixtures/items_1.2/numeric.xml
330
+ - spec/fixtures/items_1.2/numeric_exact_match.xml
331
+ - spec/fixtures/items_1.2/numeric_margin_error.xml
332
+ - spec/fixtures/items_1.2/numeric_precision.xml
333
+ - spec/fixtures/items_1.2/numeric_within_range.xml
310
334
  - spec/fixtures/items_1.2/ordering.xml
311
335
  - spec/fixtures/items_1.2/single_fib.xml
312
336
  - spec/fixtures/items_1.2/true_false.xml
@@ -506,19 +530,13 @@ files:
506
530
  - spec/fixtures/tests/tests/rtest27.xml
507
531
  - spec/fixtures/unsupported_version/imsmanifest.xml
508
532
  - spec/gemfiles/nokogiri-1.6.gemfile
509
- - spec/gemfiles/nokogiri-1.6.gemfile.lock
510
533
  - spec/gemfiles/nokogiri-1.8.gemfile
511
534
  - spec/gemfiles/nokogiri-1.8.gemfile.lock
512
535
  - spec/gemfiles/rails-4.2.gemfile
513
- - spec/gemfiles/rails-4.2.gemfile.lock
514
536
  - spec/gemfiles/rails-5.0.gemfile
515
- - spec/gemfiles/rails-5.0.gemfile.lock
516
537
  - spec/gemfiles/rails-5.1.gemfile
517
- - spec/gemfiles/rails-5.1.gemfile.lock
518
538
  - spec/gemfiles/sanitize-4.2.gemfile
519
- - spec/gemfiles/sanitize-4.2.gemfile.lock
520
539
  - spec/gemfiles/sanitize-4.5.gemfile
521
- - spec/gemfiles/sanitize-4.5.gemfile.lock
522
540
  - spec/lib/qti/assessment_item_exporter_spec.rb
523
541
  - spec/lib/qti/exporter_spec.rb
524
542
  - spec/lib/qti/models/base_spec.rb
@@ -534,6 +552,12 @@ files:
534
552
  - spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb
535
553
  - spec/lib/qti/v1/models/interactions/ordering_interaction_spec.rb
536
554
  - spec/lib/qti/v1/models/interactions/string_interaction_spec.rb
555
+ - spec/lib/qti/v1/models/numerics/exact_match_spec.rb
556
+ - spec/lib/qti/v1/models/numerics/margin_error_spec.rb
557
+ - spec/lib/qti/v1/models/numerics/precision_spec.rb
558
+ - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
559
+ - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
560
+ - spec/lib/qti/v1/models/numerics/within_range_spec.rb
537
561
  - spec/lib/qti/v2/models/assessment_item_spec.rb
538
562
  - spec/lib/qti/v2/models/assessment_test_spec.rb
539
563
  - spec/lib/qti/v2/models/choices/gap_match_choice_spec.rb
@@ -572,7 +596,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
572
596
  version: '0'
573
597
  requirements: []
574
598
  rubyforge_project:
575
- rubygems_version: 2.6.8
599
+ rubygems_version: 2.6.13
576
600
  signing_key:
577
601
  specification_version: 4
578
602
  summary: QTI 1.2 and 2.1 import and export models
@@ -586,7 +610,10 @@ test_files:
586
610
  - spec/fixtures/items_1.2/multiple_answer.xml
587
611
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
588
612
  - spec/fixtures/items_1.2/multiple_choice.xml
589
- - spec/fixtures/items_1.2/numeric.xml
613
+ - spec/fixtures/items_1.2/numeric_exact_match.xml
614
+ - spec/fixtures/items_1.2/numeric_margin_error.xml
615
+ - spec/fixtures/items_1.2/numeric_precision.xml
616
+ - spec/fixtures/items_1.2/numeric_within_range.xml
590
617
  - spec/fixtures/items_1.2/ordering.xml
591
618
  - spec/fixtures/items_1.2/single_fib.xml
592
619
  - spec/fixtures/items_1.2/true_false.xml
@@ -786,19 +813,13 @@ test_files:
786
813
  - spec/fixtures/tests/tests/rtest27.xml
787
814
  - spec/fixtures/unsupported_version/imsmanifest.xml
788
815
  - spec/gemfiles/nokogiri-1.6.gemfile
789
- - spec/gemfiles/nokogiri-1.6.gemfile.lock
790
816
  - spec/gemfiles/nokogiri-1.8.gemfile
791
817
  - spec/gemfiles/nokogiri-1.8.gemfile.lock
792
818
  - spec/gemfiles/rails-4.2.gemfile
793
- - spec/gemfiles/rails-4.2.gemfile.lock
794
819
  - spec/gemfiles/rails-5.0.gemfile
795
- - spec/gemfiles/rails-5.0.gemfile.lock
796
820
  - spec/gemfiles/rails-5.1.gemfile
797
- - spec/gemfiles/rails-5.1.gemfile.lock
798
821
  - spec/gemfiles/sanitize-4.2.gemfile
799
- - spec/gemfiles/sanitize-4.2.gemfile.lock
800
822
  - spec/gemfiles/sanitize-4.5.gemfile
801
- - spec/gemfiles/sanitize-4.5.gemfile.lock
802
823
  - spec/lib/qti/assessment_item_exporter_spec.rb
803
824
  - spec/lib/qti/exporter_spec.rb
804
825
  - spec/lib/qti/models/base_spec.rb
@@ -814,6 +835,12 @@ test_files:
814
835
  - spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb
815
836
  - spec/lib/qti/v1/models/interactions/ordering_interaction_spec.rb
816
837
  - spec/lib/qti/v1/models/interactions/string_interaction_spec.rb
838
+ - spec/lib/qti/v1/models/numerics/exact_match_spec.rb
839
+ - spec/lib/qti/v1/models/numerics/margin_error_spec.rb
840
+ - spec/lib/qti/v1/models/numerics/precision_spec.rb
841
+ - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
842
+ - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
843
+ - spec/lib/qti/v1/models/numerics/within_range_spec.rb
817
844
  - spec/lib/qti/v2/models/assessment_item_spec.rb
818
845
  - spec/lib/qti/v2/models/assessment_test_spec.rb
819
846
  - spec/lib/qti/v2/models/choices/gap_match_choice_spec.rb
@@ -1,127 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- qti (0.9.3)
5
- activesupport (>= 4.2.9, < 5.2)
6
- dry-struct (~> 0.2.1)
7
- dry-types (~> 0.12.0)
8
- nokogiri (>= 1.6.8, < 1.9)
9
- rubyzip (~> 1.2)
10
- sanitize (>= 4.2.0, < 5.0)
11
-
12
- GEM
13
- remote: https://rubygems.org/
14
- specs:
15
- activesupport (5.1.4)
16
- concurrent-ruby (~> 1.0, >= 1.0.2)
17
- i18n (~> 0.7)
18
- minitest (~> 5.1)
19
- tzinfo (~> 1.1)
20
- ast (2.3.0)
21
- byebug (9.1.0)
22
- coderay (1.1.2)
23
- concurrent-ruby (1.0.5)
24
- crass (1.0.2)
25
- diff-lcs (1.3)
26
- docile (1.1.5)
27
- dry-configurable (0.7.0)
28
- concurrent-ruby (~> 1.0)
29
- dry-container (0.6.0)
30
- concurrent-ruby (~> 1.0)
31
- dry-configurable (~> 0.1, >= 0.1.3)
32
- dry-core (0.3.4)
33
- concurrent-ruby (~> 1.0)
34
- dry-equalizer (0.2.0)
35
- dry-logic (0.4.2)
36
- dry-container (~> 0.2, >= 0.2.6)
37
- dry-core (~> 0.2)
38
- dry-equalizer (~> 0.2)
39
- dry-struct (0.2.1)
40
- dry-configurable (~> 0.1)
41
- dry-equalizer (~> 0.2)
42
- dry-types (~> 0.9, >= 0.9.0)
43
- ice_nine (~> 0.11)
44
- dry-types (0.12.0)
45
- concurrent-ruby (~> 1.0)
46
- dry-configurable (~> 0.1)
47
- dry-container (~> 0.3)
48
- dry-core (~> 0.2, >= 0.2.1)
49
- dry-equalizer (~> 0.2)
50
- dry-logic (~> 0.4, >= 0.4.2)
51
- inflecto (~> 0.0.0, >= 0.0.2)
52
- i18n (0.8.6)
53
- ice_nine (0.11.2)
54
- inflecto (0.0.2)
55
- json (2.1.0)
56
- method_source (0.9.0)
57
- mini_portile2 (2.1.0)
58
- minitest (5.10.3)
59
- nokogiri (1.6.8.1)
60
- mini_portile2 (~> 2.1.0)
61
- nokogumbo (1.4.13)
62
- nokogiri
63
- parallel (1.12.0)
64
- parser (2.4.0.0)
65
- ast (~> 2.2)
66
- powerpack (0.1.1)
67
- pry (0.11.1)
68
- coderay (~> 1.1.0)
69
- method_source (~> 0.9.0)
70
- rainbow (2.2.2)
71
- rake
72
- rake (0.9.6)
73
- rspec (3.6.0)
74
- rspec-core (~> 3.6.0)
75
- rspec-expectations (~> 3.6.0)
76
- rspec-mocks (~> 3.6.0)
77
- rspec-core (3.6.0)
78
- rspec-support (~> 3.6.0)
79
- rspec-expectations (3.6.0)
80
- diff-lcs (>= 1.2.0, < 2.0)
81
- rspec-support (~> 3.6.0)
82
- rspec-mocks (3.6.0)
83
- diff-lcs (>= 1.2.0, < 2.0)
84
- rspec-support (~> 3.6.0)
85
- rspec-support (3.6.0)
86
- rubocop (0.50.0)
87
- parallel (~> 1.10)
88
- parser (>= 2.3.3.1, < 3.0)
89
- powerpack (~> 0.1)
90
- rainbow (>= 2.2.2, < 3.0)
91
- ruby-progressbar (~> 1.7)
92
- unicode-display_width (~> 1.0, >= 1.0.1)
93
- ruby-progressbar (1.8.3)
94
- rubyzip (1.2.1)
95
- sanitize (4.5.0)
96
- crass (~> 1.0.2)
97
- nokogiri (>= 1.4.4)
98
- nokogumbo (~> 1.4.1)
99
- simplecov (0.15.1)
100
- docile (~> 1.1.0)
101
- json (>= 1.8, < 3)
102
- simplecov-html (~> 0.10.0)
103
- simplecov-html (0.10.2)
104
- thread_safe (0.3.6)
105
- tzinfo (1.2.3)
106
- thread_safe (~> 0.1)
107
- unicode-display_width (1.3.0)
108
- wwtd (1.3.0)
109
-
110
- PLATFORMS
111
- ruby
112
-
113
- DEPENDENCIES
114
- bundler (~> 1.15)
115
- byebug (~> 9.0)
116
- nokogiri (~> 1.6.8)
117
- pry (~> 0)
118
- qti!
119
- rake (~> 0)
120
- rspec (~> 3.6)
121
- rspec-mocks (~> 3.6)
122
- rubocop (~> 0.50.0)
123
- simplecov (~> 0)
124
- wwtd (~> 1.3)
125
-
126
- BUNDLED WITH
127
- 1.15.4