qti 0.9.9 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
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