qti 0.9.6 → 0.9.7

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
2
  SHA1:
3
- metadata.gz: 2f8a13e1d1f49ef977d0e9fcffca98899e0b59d5
4
- data.tar.gz: cebe7aac11f9e878f87fc05a398ecb32a1043406
3
+ metadata.gz: 1aabd1fcd54402b41afeebc7bc69be6c86390a52
4
+ data.tar.gz: c2bed919eed81aeba3b0cb8f753c79f5d0f68be6
5
5
  SHA512:
6
- metadata.gz: 28eaf16eb8cb13ea332e08c51b6a8e0a7e5bfd70a28c6e1fdf0fbe7d0e4ffba0944b0e0ae941b52c14524b4bea904b6b9534af7c82dffad7432f5c456a94192a
7
- data.tar.gz: 548f9d865e9e0a44443bea2c3e8d6a8777d491eb46b553f0393984bfb92da051b96b936f1ff1aa8b799abc35d1ef8eb5a2445505b8e48abfe6977a612291ac87
6
+ metadata.gz: afeb012f7304d7952fe6f615eb8ddc74ab202f18ea9dcf012a3180d7b5ddbdd73c034eea72887c77382b49cc33d2bd558b6bfc209faa44d4d0fcf4ac2a7c16a6
7
+ data.tar.gz: 2ebe901bb7779a0cd972b54ad7108f59847361e47ae6c8964ba96dd10a707686174cfc719adf0ded99d0e5324a733442fee69b9a1a0ac91c4c1a4ca8123345ed
@@ -7,7 +7,8 @@ module Qti
7
7
  def self.matches(node, parent)
8
8
  return false if node.xpath('.//xmlns:other').present?
9
9
  matches = node.xpath('.//xmlns:render_fib')
10
- return false if matches.empty?
10
+ return false if matches.empty? ||
11
+ matches.first.attributes['fibtype']&.value == 'Decimal'
11
12
  new(node, parent)
12
13
  end
13
14
 
@@ -0,0 +1,51 @@
1
+ module Qti
2
+ module V1
3
+ module Models
4
+ module Interactions
5
+ class NumericInteraction < BaseInteraction
6
+ # This will know if a class matches
7
+ def self.matches(node, parent)
8
+ first_match = node.at_xpath('.//xmlns:render_fib')
9
+ return false unless first_match && first_match.attributes['fibtype']&.value == 'Decimal'
10
+ # exclude types other than "Exact response"
11
+ return false unless node.at_xpath('.//xmlns:varequal').present?
12
+ return false if node.xpath('.//xmlns:render_fib').count > 1
13
+ new(node, parent)
14
+ end
15
+
16
+ def item_body
17
+ @item_body ||= begin
18
+ node = @node.dup
19
+ presentation = node.at_xpath('.//xmlns:presentation')
20
+ mattext = presentation.at_xpath('.//xmlns:mattext')
21
+ inner_content = return_inner_content!(mattext)
22
+ sanitize_content!(inner_content)
23
+ end
24
+ end
25
+
26
+ def answers
27
+ @answers ||= answer_nodes.map do |node|
28
+ V1::Models::Choices::FillBlankChoice.new(node, self)
29
+ end
30
+ end
31
+
32
+ def scoring_data_structs
33
+ answer_nodes.map do |value_node|
34
+ ScoringData.new(
35
+ value_node.content,
36
+ nil,
37
+ id: value_node.attributes['respident']&.value
38
+ )
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def answer_nodes
45
+ @node.xpath('.//xmlns:varequal')
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '0.9.6'.freeze
2
+ VERSION = '0.9.7'.freeze
3
3
  end
@@ -0,0 +1,89 @@
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="i98661073a66c6b2567c8f9b1a22c2988" title="Quiz1.1">
4
+ <section ident="root_section">
5
+ <item ident="ia63b6a115fa68a555398a58626a62f81" title="Question1">
6
+ <presentation>
7
+ <material>
8
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;question 1&lt;/p&gt;&lt;/div&gt;</mattext>
9
+ </material>
10
+ <response_str ident="response1" rcardinality="Single">
11
+ <render_fib fibtype="Decimal">
12
+ <response_label ident="answer1"/>
13
+ </render_fib>
14
+ </response_str>
15
+ </presentation>
16
+ <resprocessing>
17
+ <outcomes>
18
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
19
+ </outcomes>
20
+ <respcondition continue="No">
21
+ <conditionvar>
22
+ <or>
23
+ <varequal respident="response1">1234.0</varequal>
24
+ <and>
25
+ <vargte respident="response1">1234.0</vargte>
26
+ <varlte respident="response1">1234.0</varlte>
27
+ </and>
28
+ </or>
29
+ </conditionvar>
30
+ <setvar action="Set" varname="SCORE">100</setvar>
31
+ </respcondition>
32
+ </resprocessing>
33
+ </item>
34
+ <item ident="i62e978ad510f5b51f61e1073df6357df" title="Question2">
35
+ <presentation>
36
+ <material>
37
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;question 2&lt;/p&gt;&lt;/div&gt;</mattext>
38
+ </material>
39
+ <response_str ident="response1" rcardinality="Single">
40
+ <render_fib fibtype="Decimal">
41
+ <response_label ident="answer1"/>
42
+ </render_fib>
43
+ </response_str>
44
+ </presentation>
45
+ <resprocessing>
46
+ <outcomes>
47
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
48
+ </outcomes>
49
+ <respcondition continue="No">
50
+ <conditionvar>
51
+ <or>
52
+ <varequal respident="response1">4321.0</varequal>
53
+ <and>
54
+ <vargte respident="response1">4321.0</vargte>
55
+ <varlte respident="response1">4321.0</varlte>
56
+ </and>
57
+ </or>
58
+ </conditionvar>
59
+ <setvar action="Set" varname="SCORE">100</setvar>
60
+ </respcondition>
61
+ <respcondition continue="No">
62
+ <conditionvar>
63
+ <or>
64
+ <varequal respident="response1">1234.0</varequal>
65
+ <and>
66
+ <vargte respident="response1">1234.0</vargte>
67
+ <varlte respident="response1">1234.0</varlte>
68
+ </and>
69
+ </or>
70
+ </conditionvar>
71
+ <setvar action="Set" varname="SCORE">100</setvar>
72
+ </respcondition>
73
+ <respcondition continue="No">
74
+ <conditionvar>
75
+ <or>
76
+ <varequal respident="response1">1111.0</varequal>
77
+ <and>
78
+ <vargte respident="response1">1111.0</vargte>
79
+ <varlte respident="response1">1111.0</varlte>
80
+ </and>
81
+ </or>
82
+ </conditionvar>
83
+ <setvar action="Set" varname="SCORE">100</setvar>
84
+ </respcondition>
85
+ </resprocessing>
86
+ </item>
87
+ </section>
88
+ </assessment>
89
+ </questestinterop>
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- qti (0.9.5)
4
+ qti (0.9.7)
5
5
  activesupport (>= 4.2.9, < 5.2)
6
6
  dry-struct (~> 0.2.1)
7
7
  dry-types (~> 0.12.0)
@@ -29,7 +29,7 @@ GEM
29
29
  dry-container (0.6.0)
30
30
  concurrent-ruby (~> 1.0)
31
31
  dry-configurable (~> 0.1, >= 0.1.3)
32
- dry-core (0.4.1)
32
+ dry-core (0.4.2)
33
33
  concurrent-ruby (~> 1.0)
34
34
  dry-equalizer (0.2.0)
35
35
  dry-logic (0.4.2)
@@ -61,29 +61,29 @@ GEM
61
61
  mini_portile2 (~> 2.3.0)
62
62
  nokogumbo (1.4.13)
63
63
  nokogiri
64
- parallel (1.12.0)
65
- parser (2.4.0.0)
66
- ast (~> 2.2)
64
+ parallel (1.12.1)
65
+ parser (2.4.0.2)
66
+ ast (~> 2.3)
67
67
  powerpack (0.1.1)
68
- pry (0.11.1)
68
+ pry (0.11.3)
69
69
  coderay (~> 1.1.0)
70
70
  method_source (~> 0.9.0)
71
71
  rainbow (2.2.2)
72
72
  rake
73
73
  rake (0.9.6)
74
- rspec (3.6.0)
75
- rspec-core (~> 3.6.0)
76
- rspec-expectations (~> 3.6.0)
77
- rspec-mocks (~> 3.6.0)
78
- rspec-core (3.6.0)
79
- rspec-support (~> 3.6.0)
80
- rspec-expectations (3.6.0)
74
+ rspec (3.7.0)
75
+ rspec-core (~> 3.7.0)
76
+ rspec-expectations (~> 3.7.0)
77
+ rspec-mocks (~> 3.7.0)
78
+ rspec-core (3.7.0)
79
+ rspec-support (~> 3.7.0)
80
+ rspec-expectations (3.7.0)
81
81
  diff-lcs (>= 1.2.0, < 2.0)
82
- rspec-support (~> 3.6.0)
83
- rspec-mocks (3.6.0)
82
+ rspec-support (~> 3.7.0)
83
+ rspec-mocks (3.7.0)
84
84
  diff-lcs (>= 1.2.0, < 2.0)
85
- rspec-support (~> 3.6.0)
86
- rspec-support (3.6.0)
85
+ rspec-support (~> 3.7.0)
86
+ rspec-support (3.7.0)
87
87
  rubocop (0.50.0)
88
88
  parallel (~> 1.10)
89
89
  parser (>= 2.3.3.1, < 3.0)
@@ -91,7 +91,7 @@ GEM
91
91
  rainbow (>= 2.2.2, < 3.0)
92
92
  ruby-progressbar (~> 1.7)
93
93
  unicode-display_width (~> 1.0, >= 1.0.1)
94
- ruby-progressbar (1.8.3)
94
+ ruby-progressbar (1.9.0)
95
95
  rubyzip (1.2.1)
96
96
  sanitize (4.5.0)
97
97
  crass (~> 1.0.2)
@@ -125,4 +125,4 @@ DEPENDENCIES
125
125
  wwtd (~> 1.3)
126
126
 
127
127
  BUNDLED WITH
128
- 1.15.4
128
+ 1.16.0
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::Interactions::NumericInteraction do
4
+ let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
5
+ let(:file_path) { File.join(fixtures_path, 'numeric.xml') }
6
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
7
+ let(:assessment_item_refs) { test_object.assessment_items }
8
+
9
+ shared_examples_for 'answers' do
10
+ it 'returns the answers' do
11
+ expect(loaded_class.answers.count).to eq answer_count
12
+ expect(loaded_class.answers.first).to be_an_instance_of(Qti::V1::Models::Choices::FillBlankChoice)
13
+ end
14
+ end
15
+
16
+ shared_examples_for 'scoring_data_structs' do
17
+ it 'returns the scoring_data_structs' do
18
+ expect(loaded_class.scoring_data_structs.map(&:id)).to eq(scoring_data_ids)
19
+ expect(loaded_class.scoring_data_structs.map(&:values)).to eq(scoring_data_values)
20
+ end
21
+ end
22
+
23
+ context 'the first item in numeric.xml' do
24
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
25
+ let(:scoring_data_ids) { %w[response1] }
26
+ let(:scoring_data_values) { %w[1234.0] }
27
+ let(:answer_count) { 1 }
28
+
29
+ include_examples 'answers'
30
+ include_examples 'scoring_data_structs'
31
+ end
32
+
33
+ context 'the second item in numeric.xml' do
34
+ let(:loaded_class) { described_class.new(assessment_item_refs[1], test_object) }
35
+ let(:scoring_data_ids) { %w[response1 response1 response1] }
36
+ let(:scoring_data_values) { %w[4321.0 1234.0 1111.0] }
37
+ let(:answer_count) { 3 }
38
+
39
+ include_examples 'answers'
40
+ include_examples 'scoring_data_structs'
41
+ end
42
+
43
+ context '#item_body' do
44
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
45
+ it 'returns right title' do
46
+ expect(loaded_class.item_body).to eq '<div><p>question 1</p></div>'
47
+ end
48
+ end
49
+ 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: 0.9.6
4
+ version: 0.9.7
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: 2017-12-14 00:00:00.000000000 Z
12
+ date: 2018-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -272,6 +272,7 @@ files:
272
272
  - lib/qti/v1/models/interactions/choice_interaction.rb
273
273
  - lib/qti/v1/models/interactions/fill_blank_interaction.rb
274
274
  - lib/qti/v1/models/interactions/match_interaction.rb
275
+ - lib/qti/v1/models/interactions/numeric_interaction.rb
275
276
  - lib/qti/v1/models/interactions/ordering_interaction.rb
276
277
  - lib/qti/v1/models/interactions/string_interaction.rb
277
278
  - lib/qti/v1/models/scoring_data.rb
@@ -304,6 +305,7 @@ files:
304
305
  - spec/fixtures/items_1.2/multiple_answer.xml
305
306
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
306
307
  - spec/fixtures/items_1.2/multiple_choice.xml
308
+ - spec/fixtures/items_1.2/numeric.xml
307
309
  - spec/fixtures/items_1.2/ordering.xml
308
310
  - spec/fixtures/items_1.2/single_fib.xml
309
311
  - spec/fixtures/items_1.2/true_false.xml
@@ -503,19 +505,13 @@ files:
503
505
  - spec/fixtures/tests/tests/rtest27.xml
504
506
  - spec/fixtures/unsupported_version/imsmanifest.xml
505
507
  - spec/gemfiles/nokogiri-1.6.gemfile
506
- - spec/gemfiles/nokogiri-1.6.gemfile.lock
507
508
  - spec/gemfiles/nokogiri-1.8.gemfile
508
509
  - spec/gemfiles/nokogiri-1.8.gemfile.lock
509
510
  - spec/gemfiles/rails-4.2.gemfile
510
- - spec/gemfiles/rails-4.2.gemfile.lock
511
511
  - spec/gemfiles/rails-5.0.gemfile
512
- - spec/gemfiles/rails-5.0.gemfile.lock
513
512
  - spec/gemfiles/rails-5.1.gemfile
514
- - spec/gemfiles/rails-5.1.gemfile.lock
515
513
  - spec/gemfiles/sanitize-4.2.gemfile
516
- - spec/gemfiles/sanitize-4.2.gemfile.lock
517
514
  - spec/gemfiles/sanitize-4.5.gemfile
518
- - spec/gemfiles/sanitize-4.5.gemfile.lock
519
515
  - spec/lib/qti/assessment_item_exporter_spec.rb
520
516
  - spec/lib/qti/exporter_spec.rb
521
517
  - spec/lib/qti/models/base_spec.rb
@@ -528,6 +524,7 @@ files:
528
524
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
529
525
  - spec/lib/qti/v1/models/interactions/fill_blank_interaction_spec.rb
530
526
  - spec/lib/qti/v1/models/interactions/match_interaction_spec.rb
527
+ - spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb
531
528
  - spec/lib/qti/v1/models/interactions/ordering_interaction_spec.rb
532
529
  - spec/lib/qti/v1/models/interactions/string_interaction_spec.rb
533
530
  - spec/lib/qti/v2/models/assessment_item_spec.rb
@@ -568,7 +565,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
568
565
  version: '0'
569
566
  requirements: []
570
567
  rubyforge_project:
571
- rubygems_version: 2.6.8
568
+ rubygems_version: 2.6.13
572
569
  signing_key:
573
570
  specification_version: 4
574
571
  summary: QTI 1.2 and 2.1 import and export models
@@ -581,6 +578,7 @@ test_files:
581
578
  - spec/fixtures/items_1.2/multiple_answer.xml
582
579
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
583
580
  - spec/fixtures/items_1.2/multiple_choice.xml
581
+ - spec/fixtures/items_1.2/numeric.xml
584
582
  - spec/fixtures/items_1.2/ordering.xml
585
583
  - spec/fixtures/items_1.2/single_fib.xml
586
584
  - spec/fixtures/items_1.2/true_false.xml
@@ -780,19 +778,13 @@ test_files:
780
778
  - spec/fixtures/tests/tests/rtest27.xml
781
779
  - spec/fixtures/unsupported_version/imsmanifest.xml
782
780
  - spec/gemfiles/nokogiri-1.6.gemfile
783
- - spec/gemfiles/nokogiri-1.6.gemfile.lock
784
781
  - spec/gemfiles/nokogiri-1.8.gemfile
785
782
  - spec/gemfiles/nokogiri-1.8.gemfile.lock
786
783
  - spec/gemfiles/rails-4.2.gemfile
787
- - spec/gemfiles/rails-4.2.gemfile.lock
788
784
  - spec/gemfiles/rails-5.0.gemfile
789
- - spec/gemfiles/rails-5.0.gemfile.lock
790
785
  - spec/gemfiles/rails-5.1.gemfile
791
- - spec/gemfiles/rails-5.1.gemfile.lock
792
786
  - spec/gemfiles/sanitize-4.2.gemfile
793
- - spec/gemfiles/sanitize-4.2.gemfile.lock
794
787
  - spec/gemfiles/sanitize-4.5.gemfile
795
- - spec/gemfiles/sanitize-4.5.gemfile.lock
796
788
  - spec/lib/qti/assessment_item_exporter_spec.rb
797
789
  - spec/lib/qti/exporter_spec.rb
798
790
  - spec/lib/qti/models/base_spec.rb
@@ -805,6 +797,7 @@ test_files:
805
797
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
806
798
  - spec/lib/qti/v1/models/interactions/fill_blank_interaction_spec.rb
807
799
  - spec/lib/qti/v1/models/interactions/match_interaction_spec.rb
800
+ - spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb
808
801
  - spec/lib/qti/v1/models/interactions/ordering_interaction_spec.rb
809
802
  - spec/lib/qti/v1/models/interactions/string_interaction_spec.rb
810
803
  - spec/lib/qti/v2/models/assessment_item_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