qti 0.9.9 → 0.9.10

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: d8fb6165196a5601ea5d6bb415d14897246d6ef7
4
- data.tar.gz: a30a49e90c67b24c0762a01c76688520f1633f7b
3
+ metadata.gz: 543877ad6fc3d81d89acb84d3c65396ad46fb958
4
+ data.tar.gz: 778581e580f51411a495de65fa0495398726addb
5
5
  SHA512:
6
- metadata.gz: 4dfa4a3312e1a88ec6a37a5282aff21195a624348567ec92c5b9b4798ddfd06deeb6ad67a9b79547299b2b4abe27c602b2d1a74fe48c98af2e65a57802f58b9c
7
- data.tar.gz: 3f8f93715a6de83ced239389ff5a58bbbd322f93b1a9a2f53abf72616f922481befa180a08b2b970bae4aea8254b155bace0d16c36b2c34e043d5ae4103d59a0
6
+ metadata.gz: fb44dd009750099a8e01f9cd902a49b79f2cf68d046d2d9bdb82f551c38da6cfc03ec64f2a4f1fcc083b3d6c266ad1caec00307eaf076e1a09d71ca35c601055
7
+ data.tar.gz: a8ce44c0bf8982ab70e3b00868f58ee0ef46e766744d36b91805585ad13310765d07b283a966cef9d287c29dd50a1adae0c5b74a5b8164554be75c1ec841d489
@@ -28,9 +28,9 @@ module Qti
28
28
  end
29
29
 
30
30
  def qti_2_non_assessment_href
31
- item_path = @doc.at_xpath("//xmlns:resources/xmlns:resource[@type='imsqti_item_xmlv2p1']/@href")&.content ||
32
- @doc.at_xpath("//xmlns:resources/xmlns:resource[@type='imsqti_item_xmlv2p2']/@href")
33
- Qti::V2::Models::NonAssessmentTest.from_path!(@path, @package_root) if item_path
31
+ Qti::V2::Models::NonAssessmentTest.from_path!(@path, @package_root) if
32
+ xmlns_resource_count("[@type='imsqti_item_xmlv2p1']/@href") > 0 ||
33
+ xmlns_resource_count("[@type='imsqti_item_xmlv2p2']/@href") > 0
34
34
  end
35
35
 
36
36
  def unknown_type
@@ -42,6 +42,10 @@ module Qti
42
42
  def xmlns_resource(type)
43
43
  xpath_with_single_check("//xmlns:resources/xmlns:resource#{type}")&.content
44
44
  end
45
+
46
+ def xmlns_resource_count(type)
47
+ @doc.xpath("//xmlns:resources/xmlns:resource#{type}").count
48
+ end
45
49
  end
46
50
  end
47
51
  end
@@ -0,0 +1,87 @@
1
+ module Qti
2
+ module V1
3
+ module Models
4
+ module Interactions
5
+ class FormulaInteraction < BaseInteraction
6
+ # This will know if a class matches
7
+
8
+ def self.matches(node, parent)
9
+ return false unless node.at_xpath('.//xmlns:calculated').present?
10
+ new(node, parent)
11
+ end
12
+
13
+ def item_body
14
+ presentation = @node.at_xpath('.//xmlns:presentation')
15
+ mattext = presentation.at_xpath('.//xmlns:mattext')
16
+ inner_content = return_inner_content!(mattext)
17
+ sanitize_content!(inner_content)
18
+ end
19
+
20
+ def scoring_data_structs
21
+ solutions.map do |answer|
22
+ ScoringData.new(
23
+ answer[:output],
24
+ rcardinality,
25
+ {id: answer[:id]}
26
+ )
27
+ end
28
+ end
29
+
30
+ def solutions
31
+ node.xpath('.//xmlns:var_set').map do |anode|
32
+ {
33
+ id: anode.attributes['ident']&.value,
34
+ input: vars_at_node(anode),
35
+ output: anode.at_xpath('.//xmlns:answer').text
36
+ }
37
+ end
38
+ end
39
+
40
+ def variables
41
+ varlist = @node.at_xpath('.//xmlns:vars')
42
+ varlist.xpath('.//xmlns:var').map do |vnode|
43
+ {
44
+ name: vnode.attributes['name']&.value,
45
+ min: vnode.at_xpath('.//xmlns:min').text,
46
+ max: vnode.at_xpath('.//xmlns:max').text,
47
+ precision: vnode.attributes['scale']&.value
48
+ }
49
+ end
50
+ end
51
+
52
+ def answer_tolerance
53
+ @answer_tolernance ||= @node.at_xpath('.//xmlns:answer_tolerance').text
54
+ end
55
+
56
+ def margin_of_error
57
+ if answer_tolerance.ends_with? "%"
58
+ return {margin: answer_tolerance[0..-2], margin_type:'percent'}
59
+ end
60
+ {margin: answer_tolerance, margin_type:'absolute'}
61
+ end
62
+
63
+ def formula_decimal_places
64
+ @node.at_xpath('.//xmlns:formulas/@decimal_places')&.value
65
+ end
66
+
67
+ def formulas
68
+ node.xpath('.//xmlns:formula').map do |fnode|
69
+ fnode.text
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def vars_at_node(parent_node)
76
+ parent_node.xpath('.//xmlns:var').map do |vnode|
77
+ {
78
+ name: vnode.attributes['name']&.value,
79
+ value: vnode.text
80
+ }
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -22,11 +22,9 @@ module Qti
22
22
  end
23
23
 
24
24
  def hrefs
25
- if xpath_with_single_check("//xmlns:resource[@type='imsqti_item_xmlv2p1']/@href")&.value
26
- @doc.xpath("//xmlns:resource[@type='imsqti_item_xmlv2p1']/@href")
27
- else xpath_with_single_check("//xmlns:resource[@type='imsqti_item_xmlv2p2']/@href")&.value
28
- @doc.xpath("//xmlns:resource[@type='imsqti_item_xmlv2p2']/@href")
29
- end
25
+ nodes = @doc.xpath("//xmlns:resource[@type='imsqti_item_xmlv2p2']/@href")
26
+ return nodes if nodes.count >= 1
27
+ @doc.xpath("//xmlns:resource[@type='imsqti_item_xmlv2p1']/@href")
30
28
  end
31
29
  end
32
30
  end
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '0.9.9'.freeze
2
+ VERSION = '0.9.10'.freeze
3
3
  end
@@ -0,0 +1,86 @@
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
+ <item ident="id39adb107fd2d03971a2d4206c6550dc" title="Formula">
4
+ <itemmetadata>
5
+ <qtimetadata>
6
+ <qtimetadatafield>
7
+ <fieldlabel>question_type</fieldlabel>
8
+ <fieldentry>calculated_question</fieldentry>
9
+ </qtimetadatafield>
10
+ <qtimetadatafield>
11
+ <fieldlabel>points_possible</fieldlabel>
12
+ <fieldentry>1.0</fieldentry>
13
+ </qtimetadatafield>
14
+ <qtimetadatafield>
15
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
16
+ <fieldentry>i2c64259a331bc821bdcb2f326cf36631</fieldentry>
17
+ </qtimetadatafield>
18
+ </qtimetadata>
19
+ </itemmetadata>
20
+ <presentation>
21
+ <material>
22
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;What number is [x]&lt;/p&gt;&lt;/div&gt;</mattext>
23
+ </material>
24
+ <response_str ident="response1" rcardinality="Single">
25
+ <render_fib fibtype="Decimal">
26
+ <response_label ident="answer1"/>
27
+ </render_fib>
28
+ </response_str>
29
+ </presentation>
30
+ <resprocessing>
31
+ <outcomes>
32
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
33
+ </outcomes>
34
+ <respcondition title="correct">
35
+ <conditionvar>
36
+ <other/>
37
+ </conditionvar>
38
+ <setvar varname="SCORE" action="Set">100</setvar>
39
+ </respcondition>
40
+ <respcondition title="incorrect">
41
+ <conditionvar>
42
+ <not>
43
+ <other/>
44
+ </not>
45
+ </conditionvar>
46
+ <setvar varname="SCORE" action="Set">0</setvar>
47
+ </respcondition>
48
+ </resprocessing>
49
+ <itemproc_extension>
50
+ <calculated>
51
+ <answer_tolerance>0</answer_tolerance>
52
+ <formulas decimal_places="0">
53
+ <formula>x</formula>
54
+ </formulas>
55
+ <vars>
56
+ <var name="x" scale="0">
57
+ <min>1.0</min>
58
+ <max>10.0</max>
59
+ </var>
60
+ </vars>
61
+ <var_sets>
62
+ <var_set ident="3322">
63
+ <var name="x">9</var>
64
+ <answer>9.0</answer>
65
+ </var_set>
66
+ <var_set ident="415">
67
+ <var name="x">9</var>
68
+ <answer>9.0</answer>
69
+ </var_set>
70
+ <var_set ident="3782">
71
+ <var name="x">6</var>
72
+ <answer>6.0</answer>
73
+ </var_set>
74
+ <var_set ident="1100">
75
+ <var name="x">2</var>
76
+ <answer>2.0</answer>
77
+ </var_set>
78
+ <var_set ident="858">
79
+ <var name="x">3</var>
80
+ <answer>3.0</answer>
81
+ </var_set>
82
+ </var_sets>
83
+ </calculated>
84
+ </itemproc_extension>
85
+ </item>
86
+ </questestinterop>
@@ -0,0 +1,115 @@
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
+ <item ident="id39adb107fd2d03971a2d4206c6550dc" title="Question">
4
+ <itemmetadata>
5
+ <qtimetadata>
6
+ <qtimetadatafield>
7
+ <fieldlabel>question_type</fieldlabel>
8
+ <fieldentry>calculated_question</fieldentry>
9
+ </qtimetadatafield>
10
+ <qtimetadatafield>
11
+ <fieldlabel>points_possible</fieldlabel>
12
+ <fieldentry>1.0</fieldentry>
13
+ </qtimetadatafield>
14
+ <qtimetadatafield>
15
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
16
+ <fieldentry>i2c64259a331bc821bdcb2f326cf36631</fieldentry>
17
+ </qtimetadatafield>
18
+ </qtimetadata>
19
+ </itemmetadata>
20
+ <presentation>
21
+ <material>
22
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;[n][x] + [m][y]&lt;/p&gt;&lt;/div&gt;</mattext>
23
+ </material>
24
+ <response_str ident="response1" rcardinality="Single">
25
+ <render_fib fibtype="Decimal">
26
+ <response_label ident="answer1"/>
27
+ </render_fib>
28
+ </response_str>
29
+ </presentation>
30
+ <resprocessing>
31
+ <outcomes>
32
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
33
+ </outcomes>
34
+ <respcondition title="correct">
35
+ <conditionvar>
36
+ <other/>
37
+ </conditionvar>
38
+ <setvar varname="SCORE" action="Set">100</setvar>
39
+ </respcondition>
40
+ <respcondition title="incorrect">
41
+ <conditionvar>
42
+ <not>
43
+ <other/>
44
+ </not>
45
+ </conditionvar>
46
+ <setvar varname="SCORE" action="Set">0</setvar>
47
+ </respcondition>
48
+ </resprocessing>
49
+ <itemproc_extension>
50
+ <calculated>
51
+ <answer_tolerance>10%</answer_tolerance>
52
+ <formulas decimal_places="2">
53
+ <formula>x=n*x</formula>
54
+ <formula>y=m*y</formula>
55
+ <formula>x+y</formula>
56
+ </formulas>
57
+ <vars>
58
+ <var name="y" scale="2">
59
+ <min>1.0</min>
60
+ <max>10.0</max>
61
+ </var>
62
+ <var name="x" scale="2">
63
+ <min>1.0</min>
64
+ <max>10.0</max>
65
+ </var>
66
+ <var name="n" scale="2">
67
+ <min>1.0</min>
68
+ <max>10.0</max>
69
+ </var>
70
+ <var name="m" scale="2">
71
+ <min>1.0</min>
72
+ <max>10.0</max>
73
+ </var>
74
+ </vars>
75
+ <var_sets>
76
+ <var_set ident="8965">
77
+ <var name="y">4.70</var>
78
+ <var name="x">4.70</var>
79
+ <var name="n">8.94</var>
80
+ <var name="m">8.63</var>
81
+ <answer>82.58</answer>
82
+ </var_set>
83
+ <var_set ident="2716">
84
+ <var name="y">3.60</var>
85
+ <var name="x">1.84</var>
86
+ <var name="n">1.31</var>
87
+ <var name="m">5.92</var>
88
+ <answer>23.72</answer>
89
+ </var_set>
90
+ <var_set ident="549">
91
+ <var name="y">7.33</var>
92
+ <var name="x">4.30</var>
93
+ <var name="n">3.67</var>
94
+ <var name="m">3.27</var>
95
+ <answer>39.75</answer>
96
+ </var_set>
97
+ <var_set ident="3413">
98
+ <var name="y">6.95</var>
99
+ <var name="x">3.28</var>
100
+ <var name="n">3.42</var>
101
+ <var name="m">5.04</var>
102
+ <answer>46.25</answer>
103
+ </var_set>
104
+ <var_set ident="5">
105
+ <var name="y">8.88</var>
106
+ <var name="x">4.53</var>
107
+ <var name="n">4.04</var>
108
+ <var name="m">2.56</var>
109
+ <answer>41.03</answer>
110
+ </var_set>
111
+ </var_sets>
112
+ </calculated>
113
+ </itemproc_extension>
114
+ </item>
115
+ </questestinterop>
@@ -0,0 +1,120 @@
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
+ <item ident="ifc0ea9e9754f1393a4b8d2979a4a2ae7" title="Question">
4
+ <itemmetadata>
5
+ <qtimetadata>
6
+ <qtimetadatafield>
7
+ <fieldlabel>question_type</fieldlabel>
8
+ <fieldentry>calculated_question</fieldentry>
9
+ </qtimetadatafield>
10
+ <qtimetadatafield>
11
+ <fieldlabel>points_possible</fieldlabel>
12
+ <fieldentry>1.0</fieldentry>
13
+ </qtimetadatafield>
14
+ <qtimetadatafield>
15
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
16
+ <fieldentry>i6fc721d91a4fc5f997666939c90ae683</fieldentry>
17
+ </qtimetadatafield>
18
+ </qtimetadata>
19
+ </itemmetadata>
20
+ <presentation>
21
+ <material>
22
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;[x] + [y]&lt;/p&gt;&lt;/div&gt;</mattext>
23
+ </material>
24
+ <response_str ident="response1" rcardinality="Single">
25
+ <render_fib fibtype="Decimal">
26
+ <response_label ident="answer1"/>
27
+ </render_fib>
28
+ </response_str>
29
+ </presentation>
30
+ <resprocessing>
31
+ <outcomes>
32
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
33
+ </outcomes>
34
+ <respcondition title="correct">
35
+ <conditionvar>
36
+ <other/>
37
+ </conditionvar>
38
+ <setvar varname="SCORE" action="Set">100</setvar>
39
+ </respcondition>
40
+ <respcondition title="incorrect">
41
+ <conditionvar>
42
+ <not>
43
+ <other/>
44
+ </not>
45
+ </conditionvar>
46
+ <setvar varname="SCORE" action="Set">0</setvar>
47
+ </respcondition>
48
+ </resprocessing>
49
+ <itemproc_extension>
50
+ <calculated>
51
+ <answer_tolerance>0</answer_tolerance>
52
+ <formulas decimal_places="0">
53
+ <formula>x+y</formula>
54
+ </formulas>
55
+ <vars>
56
+ <var name="x" scale="0">
57
+ <min>1.0</min>
58
+ <max>10.0</max>
59
+ </var>
60
+ <var name="y" scale="0">
61
+ <min>1.0</min>
62
+ <max>10.0</max>
63
+ </var>
64
+ </vars>
65
+ <var_sets>
66
+ <var_set ident="163">
67
+ <var name="x">9</var>
68
+ <var name="y">7</var>
69
+ <answer>16.0</answer>
70
+ </var_set>
71
+ <var_set ident="965">
72
+ <var name="x">5</var>
73
+ <var name="y">2</var>
74
+ <answer>7.0</answer>
75
+ </var_set>
76
+ <var_set ident="8589">
77
+ <var name="x">5</var>
78
+ <var name="y">9</var>
79
+ <answer>14.0</answer>
80
+ </var_set>
81
+ <var_set ident="6087">
82
+ <var name="x">3</var>
83
+ <var name="y">2</var>
84
+ <answer>5.0</answer>
85
+ </var_set>
86
+ <var_set ident="8894">
87
+ <var name="x">2</var>
88
+ <var name="y">5</var>
89
+ <answer>7.0</answer>
90
+ </var_set>
91
+ <var_set ident="5184">
92
+ <var name="x">6</var>
93
+ <var name="y">8</var>
94
+ <answer>14.0</answer>
95
+ </var_set>
96
+ <var_set ident="8918">
97
+ <var name="x">3</var>
98
+ <var name="y">8</var>
99
+ <answer>11.0</answer>
100
+ </var_set>
101
+ <var_set ident="3332">
102
+ <var name="x">4</var>
103
+ <var name="y">3</var>
104
+ <answer>7.0</answer>
105
+ </var_set>
106
+ <var_set ident="7495">
107
+ <var name="x">10</var>
108
+ <var name="y">10</var>
109
+ <answer>20.0</answer>
110
+ </var_set>
111
+ <var_set ident="6307">
112
+ <var name="x">9</var>
113
+ <var name="y">4</var>
114
+ <answer>13.0</answer>
115
+ </var_set>
116
+ </var_sets>
117
+ </calculated>
118
+ </itemproc_extension>
119
+ </item>
120
+ </questestinterop>
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/imsqti_v2p1.xsd"
5
+ identifier="graphicOrder" title="Flying Home" adaptive="false" timeDependent="false">
6
+ <responseDeclaration identifier="RESPONSE" cardinality="ordered" baseType="identifier">
7
+ <correctResponse>
8
+ <value>A</value>
9
+ <value>D</value>
10
+ <value>C</value>
11
+ <value>B</value>
12
+ </correctResponse>
13
+ </responseDeclaration>
14
+ <outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
15
+ <itemBody>
16
+ <p>Lorna is flying back home to the UK. Ideally, she would like to fly in directly to her
17
+ home town of Glasgow. Edinburgh is her second choice and, if necessary, she could fly
18
+ into London and pick up an internal connecting flight. Although she has been offered a
19
+ cheap flight to Manchester it remains her least favourite option as connecting flights
20
+ to Glasgow are not very reliable from there.</p>
21
+ <graphicOrderInteraction responseIdentifier="RESPONSE">
22
+ <prompt>Mark the airports shown on the map according to Lorna's preferences.</prompt>
23
+ <object type="image/png" width="206" height="280" data="ukair.png">UK Map</object>
24
+ <hotspotChoice shape="circle" coords="77,115,8" identifier="A"/>
25
+ <hotspotChoice shape="circle" coords="118,184,8" identifier="B"/>
26
+ <hotspotChoice shape="circle" coords="150,235,8" identifier="C"/>
27
+ <hotspotChoice shape="circle" coords="96,114,8" identifier="D"/>
28
+ </graphicOrderInteraction>
29
+ </itemBody>
30
+ <responseProcessing
31
+ template="http://www.imsglobal.org/question/qti_v2p1/rptemplates/match_correct"/>
32
+ </assessmentItem>
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/imsqti_v2p1.xsd"
5
+ identifier="hotspot" title="UK Airports (Take 1)" adaptive="false" timeDependent="false">
6
+ <responseDeclaration identifier="RESPONSE" cardinality="single" baseType="identifier">
7
+ <correctResponse>
8
+ <value>A</value>
9
+ </correctResponse>
10
+ </responseDeclaration>
11
+ <outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
12
+ <itemBody>
13
+ <p>The picture illustrates four of the most popular destinations for air travellers arriving
14
+ in the United Kingdom: London, Manchester, Edinburgh and Glasgow.</p>
15
+ <hotspotInteraction responseIdentifier="RESPONSE" maxChoices="1">
16
+ <prompt>Which one is Glasgow?</prompt>
17
+ <object type="image/png" width="206" height="280" data="ukair.png">UK Map</object>
18
+ <hotspotChoice shape="circle" coords="77,115,8" identifier="A"/>
19
+ <hotspotChoice shape="circle" coords="118,184,8" identifier="B"/>
20
+ <hotspotChoice shape="circle" coords="150,235,8" identifier="C"/>
21
+ <hotspotChoice shape="circle" coords="96,114,8" identifier="D"/>
22
+ </hotspotInteraction>
23
+ </itemBody>
24
+ <responseProcessing
25
+ template="http://www.imsglobal.org/question/qti_v2p1/rptemplates/match_correct"/>
26
+ </assessmentItem>
@@ -0,0 +1,159 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
3
+ xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns:imsqti="http://www.imsglobal.org/xsd/imsqti_metadata_v2p1"
6
+ identifier="MANIFEST-85D76736-6D19-9DC0-7C0B-57C31A9FD391"
7
+ xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p1.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://www.imsglobal.org/xsd/imsqti_metadata_v2p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/imsqti_metadata_v2p1.xsd">
8
+ <metadata>
9
+ <schema>IMS Content</schema>
10
+ <schemaversion>1.1</schemaversion>
11
+ <imsmd:lom>
12
+ <imsmd:general>
13
+ <imsmd:identifier>package_shared</imsmd:identifier>
14
+ <imsmd:title>
15
+ <imsmd:langstring xml:lang="en">Shared Image Example</imsmd:langstring>
16
+ </imsmd:title>
17
+ <imsmd:language>en</imsmd:language>
18
+ <imsmd:description>
19
+ <imsmd:langstring xml:lang="en">This is an example Contentpackage containing a
20
+ number of QTI v2.1 items, it also demonstrates the use of a shared media
21
+ object</imsmd:langstring>
22
+ </imsmd:description>
23
+ </imsmd:general>
24
+ <imsmd:lifecycle>
25
+ <imsmd:version>
26
+ <imsmd:langstring xml:lang="en">1.0</imsmd:langstring>
27
+ </imsmd:version>
28
+ <imsmd:status>
29
+ <imsmd:source>
30
+ <imsmd:langstring xml:lang="en">LOMv1.0</imsmd:langstring>
31
+ </imsmd:source>
32
+ <imsmd:value>
33
+ <imsmd:langstring xml:lang="x-none">Final</imsmd:langstring>
34
+ </imsmd:value>
35
+ </imsmd:status>
36
+ </imsmd:lifecycle>
37
+ <imsmd:metametadata>
38
+ <imsmd:metadatascheme>LOMv1.0</imsmd:metadatascheme>
39
+ <imsmd:metadatascheme>QTIv2.1</imsmd:metadatascheme>
40
+ <imsmd:language>en</imsmd:language>
41
+ </imsmd:metametadata>
42
+ <imsmd:technical>
43
+ <imsmd:format>text/x-imsqti-item-xml</imsmd:format>
44
+ <imsmd:format>image/png</imsmd:format>
45
+ </imsmd:technical>
46
+ <imsmd:rights>
47
+ <imsmd:description>
48
+ <imsmd:langstring xml:lang="en">(c) 2004, IMS Global Learning Consortium;
49
+ individual questions may have their own copyright
50
+ statements.</imsmd:langstring>
51
+ </imsmd:description>
52
+ </imsmd:rights>
53
+ </imsmd:lom>
54
+ </metadata>
55
+ <organizations/>
56
+ <resources>
57
+ <resource identifier="RES-BCA84FC0-53F9-ABBD-C3FE-BDB5B825CA9E" type="imsqti_item_xmlv2p1"
58
+ href="example/graphic_order.xml">
59
+ <metadata>
60
+ <imsmd:lom>
61
+ <imsmd:general>
62
+ <imsmd:identifier>graphicOrder</imsmd:identifier>
63
+ <imsmd:title>
64
+ <imsmd:langstring xml:lang="en">Flying Home</imsmd:langstring>
65
+ </imsmd:title>
66
+ <imsmd:description>
67
+ <imsmd:langstring xml:lang="en">This example illustrates the
68
+ graphicOrderInteraction. The task is similar to Grand Prix of
69
+ Bahrain except that the choices are presented as hotspots on a
70
+ graphic image.</imsmd:langstring>
71
+ </imsmd:description>
72
+ </imsmd:general>
73
+ <imsmd:lifecycle>
74
+ <imsmd:version>
75
+ <imsmd:langstring xml:lang="en">1.0</imsmd:langstring>
76
+ </imsmd:version>
77
+ <imsmd:status>
78
+ <imsmd:source>
79
+ <imsmd:langstring xml:lang="x-none">LOMv1.0</imsmd:langstring>
80
+ </imsmd:source>
81
+ <imsmd:value>
82
+ <imsmd:langstring xml:lang="x-none">Draft</imsmd:langstring>
83
+ </imsmd:value>
84
+ </imsmd:status>
85
+ </imsmd:lifecycle>
86
+ <imsmd:technical>
87
+ <imsmd:format>text/x-imsqti-item-xml</imsmd:format>
88
+ </imsmd:technical>
89
+ </imsmd:lom>
90
+ <imsqti:qtiMetadata>
91
+ <imsqti:timeDependent>false</imsqti:timeDependent>
92
+ <imsqti:interactionType>graphicOrderInteraction</imsqti:interactionType>
93
+ <imsqti:feedbackType>none</imsqti:feedbackType>
94
+ <imsqti:solutionAvailable>true</imsqti:solutionAvailable>
95
+ </imsqti:qtiMetadata>
96
+ </metadata>
97
+ <file href="example/graphic_order.xml"/>
98
+ <dependency identifierref="images01"/>
99
+ </resource>
100
+ <resource identifier="RES-1CDACE46-DD7B-719F-0D4D-BDA579A862AB" type="imsqti_item_xmlv2p1"
101
+ href="example/hotspot.xml">
102
+ <metadata>
103
+ <imsmd:lom>
104
+ <imsmd:general>
105
+ <imsmd:identifier>hotspot</imsmd:identifier>
106
+ <imsmd:title>
107
+ <imsmd:langstring xml:lang="en">UK Airports (Take 1)</imsmd:langstring>
108
+ </imsmd:title>
109
+ <imsmd:description>
110
+ <imsmd:langstring xml:lang="en">This example illustrates the
111
+ hotspotInteraction.</imsmd:langstring>
112
+ </imsmd:description>
113
+ </imsmd:general>
114
+ <imsmd:lifecycle>
115
+ <imsmd:version>
116
+ <imsmd:langstring xml:lang="en">1.0</imsmd:langstring>
117
+ </imsmd:version>
118
+ <imsmd:status>
119
+ <imsmd:source>
120
+ <imsmd:langstring xml:lang="x-none">LOMv1.0</imsmd:langstring>
121
+ </imsmd:source>
122
+ <imsmd:value>
123
+ <imsmd:langstring xml:lang="x-none">Draft</imsmd:langstring>
124
+ </imsmd:value>
125
+ </imsmd:status>
126
+ </imsmd:lifecycle>
127
+ <imsmd:technical>
128
+ <imsmd:format>text/x-imsqti-item-xml</imsmd:format>
129
+ </imsmd:technical>
130
+ </imsmd:lom>
131
+ <imsqti:qtiMetadata>
132
+ <imsqti:timeDependent>false</imsqti:timeDependent>
133
+ <imsqti:interactionType>hotspotInteraction</imsqti:interactionType>
134
+ <imsqti:feedbackType>none</imsqti:feedbackType>
135
+ <imsqti:solutionAvailable>true</imsqti:solutionAvailable>
136
+ </imsqti:qtiMetadata>
137
+ </metadata>
138
+ <file href="example/hotspot.xml"/>
139
+ <dependency identifierref="images01"/>
140
+ </resource>
141
+ <resource identifier="images01" type="webcontent">
142
+ <metadata>
143
+ <imsmd:lom>
144
+ <imsmd:general>
145
+ <imsmd:description>
146
+ <imsmd:langstring xml:lang="en">Image of the United Kingdom with the
147
+ marked locations of Edinburgh, Glasgow, Heathrow and Manchester
148
+ airports.</imsmd:langstring>
149
+ </imsmd:description>
150
+ </imsmd:general>
151
+ <imsmd:technical>
152
+ <imsmd:format>image/png</imsmd:format>
153
+ </imsmd:technical>
154
+ </imsmd:lom>
155
+ </metadata>
156
+ <file href="examples/ukair.png"/>
157
+ </resource>
158
+ </resources>
159
+ </manifest>
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qti::V1::Models::Interactions::FormulaInteraction do
4
+ let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
5
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
6
+ let(:assessment_item_refs) { test_object.assessment_items }
7
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
8
+
9
+ shared_examples_for 'scoring_data_structs' do
10
+ it 'reads scoring_data_structs' do
11
+ expect(loaded_class.scoring_data_structs.map(&:id)).to eq(scoring_data_ids)
12
+ expect(loaded_class.scoring_data_structs.map(&:values)).to eq(scoring_data_values)
13
+ end
14
+ end
15
+
16
+ shared_examples_for 'reading_formulas' do
17
+ it 'reads formulas correctly' do
18
+ expect(loaded_class.formula_decimal_places).to eq(formula_decimal_places)
19
+ expect(loaded_class.formulas).to eq(formula_formulas)
20
+ end
21
+ end
22
+
23
+ shared_examples_for 'answer_tolerance' do
24
+ it 'reads answer_tolernace correctly' do
25
+ expect(loaded_class.answer_tolerance).to eq(answer_tolerance)
26
+ end
27
+
28
+ it 'generates do margin_of_error' do
29
+ expect(loaded_class.margin_of_error).to eq(margin_of_error)
30
+ end
31
+ end
32
+
33
+ shared_examples_for 'item_body' do
34
+ it 'returns correct title' do
35
+ expect(loaded_class.item_body).to eq(item_title)
36
+ end
37
+ end
38
+
39
+ shared_examples_for 'variables' do
40
+ it('returns the correct variable definitions') do
41
+ expect(loaded_class.variables).to eq(variables)
42
+ end
43
+ end
44
+
45
+ context 'Simple Formula' do
46
+ let(:file_path) { File.join(fixtures_path, 'formula.xml') }
47
+
48
+ let(:scoring_data_ids) { %w[3322 415 3782 1100 858] }
49
+ let(:scoring_data_values) { %w[9.0 9.0 6.0 2.0 3.0] }
50
+
51
+ let(:answer_tolerance) { '0' }
52
+ let(:margin_of_error) { { margin: '0', margin_type: 'absolute' } }
53
+ let(:formula_decimal_places) { '0' }
54
+ let(:formula_formulas) { ['x'] }
55
+
56
+ let(:item_title) {'<div><p>What number is [x]</p></div>'}
57
+
58
+ let(:variables) { [ { name: 'x', min: '1.0', max: '10.0', precision: '0' } ] }
59
+
60
+ include_examples 'scoring_data_structs'
61
+ include_examples 'reading_formulas'
62
+ include_examples 'answer_tolerance'
63
+ include_examples 'item_body'
64
+ include_examples 'variables'
65
+ end
66
+
67
+ context 'Multiple variable formula' do
68
+ let(:file_path) { File.join(fixtures_path, 'formula_mvar.xml') }
69
+
70
+ let(:scoring_data_ids) { %w[163 965 8589 6087 8894 5184 8918 3332 7495 6307] }
71
+ let(:scoring_data_values) { %w[16.0 7.0 14.0 5.0 7.0 14.0 11.0 7.0 20.0 13.0] }
72
+
73
+ let(:answer_tolerance) { '0' }
74
+ let(:margin_of_error) { { margin: '0', margin_type: 'absolute' } }
75
+ let(:formula_decimal_places) { '0' }
76
+ let(:formula_formulas) { ['x+y'] }
77
+
78
+ let(:item_title) {'<div><p>[x] + [y]</p></div>'}
79
+
80
+ let(:variables) { [ { name: 'x', min: '1.0', max: '10.0', precision: '0' },
81
+ { name: 'y', min: '1.0', max: '10.0', precision: '0' } ] }
82
+
83
+ include_examples 'scoring_data_structs'
84
+ include_examples 'answer_tolerance'
85
+ include_examples 'reading_formulas'
86
+ include_examples 'item_body'
87
+ include_examples 'variables'
88
+ end
89
+
90
+ context 'Multiple Formula Steps' do
91
+ let(:file_path) { File.join(fixtures_path, 'formula_mform.xml') }
92
+
93
+ let(:scoring_data_ids) { %w[8965 2716 549 3413 5] }
94
+ let(:scoring_data_values) { %w[82.58 23.72 39.75 46.25 41.03] }
95
+
96
+ let(:answer_tolerance) { '10%' }
97
+ let(:margin_of_error) { { margin: '10', margin_type: 'percent' } }
98
+ let(:formula_decimal_places) { '2' }
99
+ let(:formula_formulas) { ['x=n*x', 'y=m*y', 'x+y'] }
100
+
101
+ let(:item_title) {'<div><p>[n][x] + [m][y]</p></div>'}
102
+
103
+ let(:variables) { [ { name: 'y', min: '1.0', max: '10.0', precision: '2' },
104
+ { name: 'x', min: '1.0', max: '10.0', precision: '2' },
105
+ { name: 'n', min: '1.0', max: '10.0', precision: '2' },
106
+ { name: 'm', min: '1.0', max: '10.0', precision: '2' } ] }
107
+
108
+ include_examples 'scoring_data_structs'
109
+ include_examples 'answer_tolerance'
110
+ include_examples 'reading_formulas'
111
+ include_examples 'item_body'
112
+ include_examples 'variables'
113
+ end
114
+ end
@@ -2,16 +2,33 @@ require 'spec_helper'
2
2
 
3
3
  fixtures_path = File.join('spec', 'fixtures')
4
4
 
5
- describe Qti::V2::Models::NonAssessmentTest do
6
- let(:path) { File.join(fixtures_path, 'no_assessment_xml', 'imsmanifest.xml') }
7
- let(:loaded_class) { described_class.from_path!(path) }
8
5
 
9
- describe '2.2' do
10
- it 'loads an AssessmentTest XML file' do
6
+
7
+ describe Qti::V2::Models::NonAssessmentTest do
8
+ shared_examples_for 'loading_a_non-assessment' do
9
+ it 'loads an Non-AssessmentTest XML file' do
11
10
  expect do
12
11
  described_class.from_path!(path)
13
12
  end.to_not raise_error
14
13
  end
14
+
15
+ it 'expects at least one assement item' do
16
+ expect(loaded_class.assessment_items.count)
17
+ end
18
+ end
19
+
20
+ describe '2.2' do
21
+ let(:path) { File.join(fixtures_path, 'no_assessment_xml', 'imsmanifest.xml') }
22
+ let(:loaded_class) { described_class.from_path!(path) }
23
+
24
+ include_examples 'loading_a_non-assessment'
25
+ end
26
+
27
+ describe 'package_shared' do
28
+ let(:path) { File.join(fixtures_path, 'package_shared', 'imsmanifest.xml') }
29
+ let(:loaded_class) { described_class.from_path!(path) }
30
+
31
+ include_examples 'loading_a_non-assessment'
15
32
  end
16
33
 
17
34
  # describe '#stimulus_ref' do
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.9
4
+ version: 0.9.10
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-29 00:00:00.000000000 Z
12
+ date: 2018-03-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -285,6 +285,7 @@ files:
285
285
  - lib/qti/v1/models/interactions/base_interaction.rb
286
286
  - lib/qti/v1/models/interactions/choice_interaction.rb
287
287
  - lib/qti/v1/models/interactions/fill_blank_interaction.rb
288
+ - lib/qti/v1/models/interactions/formula_interaction.rb
288
289
  - lib/qti/v1/models/interactions/match_interaction.rb
289
290
  - lib/qti/v1/models/interactions/numeric_interaction.rb
290
291
  - lib/qti/v1/models/interactions/ordering_interaction.rb
@@ -323,6 +324,9 @@ files:
323
324
  - spec/fixtures/items_1.2/essay.xml
324
325
  - spec/fixtures/items_1.2/fib.xml
325
326
  - spec/fixtures/items_1.2/fib_str.xml
327
+ - spec/fixtures/items_1.2/formula.xml
328
+ - spec/fixtures/items_1.2/formula_mform.xml
329
+ - spec/fixtures/items_1.2/formula_mvar.xml
326
330
  - spec/fixtures/items_1.2/matching.xml
327
331
  - spec/fixtures/items_1.2/multiple_answer.xml
328
332
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
@@ -437,6 +441,10 @@ files:
437
441
  - spec/fixtures/items_2.2/upload_composite.xml
438
442
  - spec/fixtures/no_assessment_xml/choice.xml
439
443
  - spec/fixtures/no_assessment_xml/imsmanifest.xml
444
+ - spec/fixtures/package_shared/example/graphicOrder.xml
445
+ - spec/fixtures/package_shared/example/hotspot.xml
446
+ - spec/fixtures/package_shared/example/ukair.png
447
+ - spec/fixtures/package_shared/imsmanifest.xml
440
448
  - spec/fixtures/test_qti_1.2.zip
441
449
  - spec/fixtures/test_qti_1.2/contact info.png
442
450
  - spec/fixtures/test_qti_1.2/exam1/my_files/org0/images/image.png
@@ -531,7 +539,6 @@ files:
531
539
  - spec/fixtures/unsupported_version/imsmanifest.xml
532
540
  - spec/gemfiles/nokogiri-1.6.gemfile
533
541
  - spec/gemfiles/nokogiri-1.8.gemfile
534
- - spec/gemfiles/nokogiri-1.8.gemfile.lock
535
542
  - spec/gemfiles/rails-4.2.gemfile
536
543
  - spec/gemfiles/rails-5.0.gemfile
537
544
  - spec/gemfiles/rails-5.1.gemfile
@@ -548,6 +555,7 @@ files:
548
555
  - spec/lib/qti/v1/models/interactions/base_interaction_spec.rb
549
556
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
550
557
  - spec/lib/qti/v1/models/interactions/fill_blank_interaction_spec.rb
558
+ - spec/lib/qti/v1/models/interactions/formula_interaction_spec.rb
551
559
  - spec/lib/qti/v1/models/interactions/match_interaction_spec.rb
552
560
  - spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb
553
561
  - spec/lib/qti/v1/models/interactions/ordering_interaction_spec.rb
@@ -596,7 +604,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
596
604
  version: '0'
597
605
  requirements: []
598
606
  rubyforge_project:
599
- rubygems_version: 2.6.13
607
+ rubygems_version: 2.5.2.1
600
608
  signing_key:
601
609
  specification_version: 4
602
610
  summary: QTI 1.2 and 2.1 import and export models
@@ -606,6 +614,9 @@ test_files:
606
614
  - spec/fixtures/items_1.2/essay.xml
607
615
  - spec/fixtures/items_1.2/fib.xml
608
616
  - spec/fixtures/items_1.2/fib_str.xml
617
+ - spec/fixtures/items_1.2/formula.xml
618
+ - spec/fixtures/items_1.2/formula_mform.xml
619
+ - spec/fixtures/items_1.2/formula_mvar.xml
609
620
  - spec/fixtures/items_1.2/matching.xml
610
621
  - spec/fixtures/items_1.2/multiple_answer.xml
611
622
  - spec/fixtures/items_1.2/multiple_answer_canvas.xml
@@ -720,6 +731,10 @@ test_files:
720
731
  - spec/fixtures/items_2.2/upload_composite.xml
721
732
  - spec/fixtures/no_assessment_xml/choice.xml
722
733
  - spec/fixtures/no_assessment_xml/imsmanifest.xml
734
+ - spec/fixtures/package_shared/example/graphicOrder.xml
735
+ - spec/fixtures/package_shared/example/hotspot.xml
736
+ - spec/fixtures/package_shared/example/ukair.png
737
+ - spec/fixtures/package_shared/imsmanifest.xml
723
738
  - spec/fixtures/test_qti_1.2.zip
724
739
  - spec/fixtures/test_qti_1.2/contact info.png
725
740
  - spec/fixtures/test_qti_1.2/exam1/my_files/org0/images/image.png
@@ -814,7 +829,6 @@ test_files:
814
829
  - spec/fixtures/unsupported_version/imsmanifest.xml
815
830
  - spec/gemfiles/nokogiri-1.6.gemfile
816
831
  - spec/gemfiles/nokogiri-1.8.gemfile
817
- - spec/gemfiles/nokogiri-1.8.gemfile.lock
818
832
  - spec/gemfiles/rails-4.2.gemfile
819
833
  - spec/gemfiles/rails-5.0.gemfile
820
834
  - spec/gemfiles/rails-5.1.gemfile
@@ -831,6 +845,7 @@ test_files:
831
845
  - spec/lib/qti/v1/models/interactions/base_interaction_spec.rb
832
846
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
833
847
  - spec/lib/qti/v1/models/interactions/fill_blank_interaction_spec.rb
848
+ - spec/lib/qti/v1/models/interactions/formula_interaction_spec.rb
834
849
  - spec/lib/qti/v1/models/interactions/match_interaction_spec.rb
835
850
  - spec/lib/qti/v1/models/interactions/numeric_interaction_spec.rb
836
851
  - spec/lib/qti/v1/models/interactions/ordering_interaction_spec.rb
@@ -1,145 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- qti (0.9.9)
5
- actionview (>= 4.2.0)
6
- activesupport (>= 4.2.9, < 5.2)
7
- dry-struct (~> 0.2.1)
8
- dry-types (~> 0.12.0)
9
- nokogiri (>= 1.6.8, < 1.9)
10
- rubyzip (~> 1.2)
11
- sanitize (>= 4.2.0, < 5.0)
12
-
13
- GEM
14
- remote: https://rubygems.org/
15
- specs:
16
- actionview (5.1.4)
17
- activesupport (= 5.1.4)
18
- builder (~> 3.1)
19
- erubi (~> 1.4)
20
- rails-dom-testing (~> 2.0)
21
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
22
- activesupport (5.1.4)
23
- concurrent-ruby (~> 1.0, >= 1.0.2)
24
- i18n (~> 0.7)
25
- minitest (~> 5.1)
26
- tzinfo (~> 1.1)
27
- ast (2.3.0)
28
- builder (3.2.3)
29
- byebug (9.1.0)
30
- coderay (1.1.2)
31
- concurrent-ruby (1.0.5)
32
- crass (1.0.3)
33
- diff-lcs (1.3)
34
- docile (1.1.5)
35
- dry-configurable (0.7.0)
36
- concurrent-ruby (~> 1.0)
37
- dry-container (0.6.0)
38
- concurrent-ruby (~> 1.0)
39
- dry-configurable (~> 0.1, >= 0.1.3)
40
- dry-core (0.4.2)
41
- concurrent-ruby (~> 1.0)
42
- dry-equalizer (0.2.0)
43
- dry-logic (0.4.2)
44
- dry-container (~> 0.2, >= 0.2.6)
45
- dry-core (~> 0.2)
46
- dry-equalizer (~> 0.2)
47
- dry-struct (0.2.1)
48
- dry-configurable (~> 0.1)
49
- dry-equalizer (~> 0.2)
50
- dry-types (~> 0.9, >= 0.9.0)
51
- ice_nine (~> 0.11)
52
- dry-types (0.12.2)
53
- concurrent-ruby (~> 1.0)
54
- dry-configurable (~> 0.1)
55
- dry-container (~> 0.3)
56
- dry-core (~> 0.2, >= 0.2.1)
57
- dry-equalizer (~> 0.2)
58
- dry-logic (~> 0.4, >= 0.4.2)
59
- inflecto (~> 0.0.0, >= 0.0.2)
60
- erubi (1.7.0)
61
- i18n (0.9.1)
62
- concurrent-ruby (~> 1.0)
63
- ice_nine (0.11.2)
64
- inflecto (0.0.2)
65
- json (2.1.0)
66
- loofah (2.1.1)
67
- crass (~> 1.0.2)
68
- nokogiri (>= 1.5.9)
69
- method_source (0.9.0)
70
- mini_portile2 (2.3.0)
71
- minitest (5.10.3)
72
- nokogiri (1.8.1)
73
- mini_portile2 (~> 2.3.0)
74
- nokogumbo (1.4.13)
75
- nokogiri
76
- parallel (1.12.1)
77
- parser (2.4.0.2)
78
- ast (~> 2.3)
79
- powerpack (0.1.1)
80
- pry (0.11.3)
81
- coderay (~> 1.1.0)
82
- method_source (~> 0.9.0)
83
- rails-dom-testing (2.0.3)
84
- activesupport (>= 4.2.0)
85
- nokogiri (>= 1.6)
86
- rails-html-sanitizer (1.0.3)
87
- loofah (~> 2.0)
88
- rainbow (2.2.2)
89
- rake
90
- rake (0.9.6)
91
- rspec (3.7.0)
92
- rspec-core (~> 3.7.0)
93
- rspec-expectations (~> 3.7.0)
94
- rspec-mocks (~> 3.7.0)
95
- rspec-core (3.7.0)
96
- rspec-support (~> 3.7.0)
97
- rspec-expectations (3.7.0)
98
- diff-lcs (>= 1.2.0, < 2.0)
99
- rspec-support (~> 3.7.0)
100
- rspec-mocks (3.7.0)
101
- diff-lcs (>= 1.2.0, < 2.0)
102
- rspec-support (~> 3.7.0)
103
- rspec-support (3.7.0)
104
- rubocop (0.50.0)
105
- parallel (~> 1.10)
106
- parser (>= 2.3.3.1, < 3.0)
107
- powerpack (~> 0.1)
108
- rainbow (>= 2.2.2, < 3.0)
109
- ruby-progressbar (~> 1.7)
110
- unicode-display_width (~> 1.0, >= 1.0.1)
111
- ruby-progressbar (1.9.0)
112
- rubyzip (1.2.1)
113
- sanitize (4.5.0)
114
- crass (~> 1.0.2)
115
- nokogiri (>= 1.4.4)
116
- nokogumbo (~> 1.4.1)
117
- simplecov (0.15.1)
118
- docile (~> 1.1.0)
119
- json (>= 1.8, < 3)
120
- simplecov-html (~> 0.10.0)
121
- simplecov-html (0.10.2)
122
- thread_safe (0.3.6)
123
- tzinfo (1.2.4)
124
- thread_safe (~> 0.1)
125
- unicode-display_width (1.3.0)
126
- wwtd (1.3.0)
127
-
128
- PLATFORMS
129
- ruby
130
-
131
- DEPENDENCIES
132
- bundler (~> 1.15)
133
- byebug (~> 9.0)
134
- nokogiri (~> 1.8.1)
135
- pry (~> 0)
136
- qti!
137
- rake (~> 0)
138
- rspec (~> 3.6)
139
- rspec-mocks (~> 3.6)
140
- rubocop (~> 0.50.0)
141
- simplecov (~> 0)
142
- wwtd (~> 1.3)
143
-
144
- BUNDLED WITH
145
- 1.16.0