ims-lti 1.1.6 → 1.1.7

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: f08cf8db456b71aa74d6c55cecb8e76dc5ae4ad7
4
- data.tar.gz: 5f1a47d7a25c957228b9f2bc3038ee5d64bc5b30
3
+ metadata.gz: 30c0efa0ce7f96bcb4ef189cfd60206dada68fa6
4
+ data.tar.gz: 1a788b9cef77da96a66b68426fb8ca3c5bbc29f8
5
5
  SHA512:
6
- metadata.gz: c79e28940abe36bec574f89263f3650948f8e60010061f9799f9c013129d97c13d388ed1eb708f1328a171578db374ccc435e49148849f6e08c6700c9d302728
7
- data.tar.gz: 1ed5c8d404daaea3e46177bf5761812a5ae59becc7de4d8e44a736358ee4d991fd71259bfff6c739d05155bd6c8e930bbad104d0719a08a3a6a6a2b1698c9298
6
+ metadata.gz: fe08421395b4c2de12200c3e981ea0e62a5dac27d6c505360605693b2da7fb7e1a64f48b665136edb1aaec0e1ee31f14c0ce35ac42ad9c3b71d1ed3f88782c6f
7
+ data.tar.gz: b795c096542903e7306631f97c4d441316db70e13edbec0413c9f3b3d2d8334db8e0bbb6d13488525aae62be65550ed41276e3ba5019fe24e2a3f01d4ac44e0c
data/Changelog CHANGED
@@ -1,3 +1,6 @@
1
+ 2015-01-09 Version 1.1.7
2
+ * Add support for new outcome extension resultTotalScore
3
+
1
4
  2013-04-24 Version 1.1.3
2
5
 
3
6
  * Corrected lti_version launch parameter
data/README.md CHANGED
@@ -16,7 +16,7 @@ To require the library in your project:
16
16
  To validate the OAuth signatures you need to require the appropriate request
17
17
  proxy for your application. For example:
18
18
 
19
- # For a Sinatra or a Rails 3 app:
19
+ # For a Sinatra or a Rails 3 or 4 app:
20
20
  require 'oauth/request_proxy/rack_request'
21
21
  # You also need to explicitly enable OAuth 1 support in the environment.rb or an initializer:
22
22
  OAUTH_10_SUPPORT = true
@@ -32,20 +32,20 @@ very helpful to read the [LTI documentation](http://www.imsglobal.org/lti/index.
32
32
 
33
33
  In LTI there are Tool Providers (TP) and Tool Consumers (TC), this library is
34
34
  useful for implementing both. Here is an overview of the communication process:
35
- [LTI 1.1 Introduction](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649680)
35
+ [LTI 1.1 Introduction](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560461)
36
36
 
37
37
  This library doesn't help you manage the consumer keys and secrets. The POST
38
38
  headers/parameters will contain the `oauth_consumer_key` and your app can use
39
39
  that to look up the appropriate `oauth_consumer_secret`.
40
40
 
41
41
  Your app will also need to manage the OAuth nonce to make sure the same nonce
42
- isn't used twice with the same timestamp. [Read the LTI documentation on OAuth](http://www.imsglobal.org/LTI/v1p1pd/ltiIMGv1p1pd.html#_Toc309649687).
42
+ isn't used twice with the same timestamp. [Read the LTI documentation on OAuth](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560468).
43
43
 
44
44
  ### Tool Provider
45
45
  As a TP your app will receive a POST request with a bunch of
46
- [LTI launch data](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649684)
46
+ [LTI launch data](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560465)
47
47
  and it will be signed with OAuth using a key/secret that both the TP and TC share.
48
- This is covered in the [LTI security model](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649685)
48
+ This is covered in the [LTI security model](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560466)
49
49
 
50
50
  Here is an example of a simple TP Sinatra app using this gem:
51
51
  [LTI Tool Provider](https://github.com/instructure/lti_tool_provider_example)
@@ -66,13 +66,13 @@ end
66
66
  ```
67
67
 
68
68
  Once your TP object is initialized and verified you can load your tool. All of the
69
- [launch data](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649684)
69
+ [launch data](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560465)
70
70
  is available in the TP object along with some convenience methods like `provider.username`
71
71
  which will try to find the name from the 3 potential name launch data attributes.
72
72
 
73
73
  #### Returning Results of a Quiz/Assignment
74
74
  If your TP provides some kind of assessment service you can write grades back to
75
- the TC. This is documented in the LTI docs [here](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649690).
75
+ the TC. This is documented in the LTI docs [here](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560471).
76
76
 
77
77
  You can check whether the TC is expecting a grade write-back:
78
78
 
@@ -105,8 +105,8 @@ You can see the error code documentation
105
105
 
106
106
  ### Tool Consumer
107
107
  As a Tool Consumer your app will POST an OAuth-signed launch requests to TPs with the necessary
108
- [LTI launch data](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649684).
109
- This is covered in the [LTI security model](http://www.imsglobal.org/lti/v1p1pd/ltiIMGv1p1pd.html#_Toc309649685)
108
+ [LTI launch data](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560465).
109
+ This is covered in the [LTI security model](http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560466)
110
110
 
111
111
  Here is an example of a simple TC Sinatra app using this gem:
112
112
  [LTI Tool Consumer](https://github.com/instructure/lti_tool_consumer_example)
@@ -67,6 +67,10 @@ module IMS::LTI
67
67
  accepted_outcome_types.member?("url")
68
68
  end
69
69
 
70
+ def accepts_outcome_result_total_score?
71
+ !!@ext_params["outcome_result_total_score_accepted"]
72
+ end
73
+
70
74
  # POSTs the given score to the Tool Consumer with a replaceResult and
71
75
  # adds the specified data. The data hash can have the keys "text", "cdata_text", or "url"
72
76
  #
@@ -77,6 +81,7 @@ module IMS::LTI
77
81
  # Creates a new OutcomeRequest object and stores it in @outcome_requests
78
82
  #
79
83
  # @return [OutcomeResponse] the response from the Tool Consumer
84
+ # @deprecated Use #post_extended_replace_result! instead
80
85
  def post_replace_result_with_data!(score = nil, data={})
81
86
  req = new_request
82
87
  if data["cdata_text"]
@@ -87,6 +92,29 @@ module IMS::LTI
87
92
  req.outcome_url = data["url"] if data["url"]
88
93
  req.post_replace_result!(score)
89
94
  end
95
+
96
+ # POSTs the given score to the Tool Consumer with a replaceResult and
97
+ # adds the specified data. The options hash can have the keys
98
+ # :text, :cdata_text, :url, :score, or :total_score
99
+ #
100
+ # If both cdata_text and text are sent, cdata_text will be used
101
+ # If both total_score and score are sent, total_score will be used
102
+ # If score is nil, the replace result XML will not contain a resultScore node
103
+ #
104
+ # Creates a new OutcomeRequest object and stores it in @outcome_requests
105
+ #
106
+ # @return [OutcomeResponse] the response from the Tool Consumer
107
+ def post_extended_replace_result!(options = {})
108
+ opts = {}
109
+ options.each {|k,v| opts[k.to_sym] = v}
110
+
111
+ req = new_request
112
+ req.outcome_cdata_text = opts[:cdata_text]
113
+ req.outcome_text = opts[:text]
114
+ req.outcome_url = opts[:url]
115
+ req.total_score = opts[:total_score]
116
+ req.post_replace_result!(opts[:score])
117
+ end
90
118
  end
91
119
 
92
120
  module ToolConsumer
@@ -123,26 +151,38 @@ module IMS::LTI
123
151
  include IMS::LTI::Extensions::ExtensionBase
124
152
  include Base
125
153
 
126
- attr_accessor :outcome_text, :outcome_url, :outcome_cdata_text
154
+ attr_accessor :outcome_text, :outcome_url, :outcome_cdata_text, :total_score
127
155
 
128
156
  def result_values(node)
129
157
  super
130
- if @outcome_text || @outcome_url || @outcome_cdata_text
158
+
159
+ if total_score
160
+ node.resultTotalScore do |res_total_score|
161
+ res_total_score.language "en" # 'en' represents the format of the number
162
+ res_total_score.textString total_score.to_s
163
+ end
164
+ end
165
+
166
+ if outcome_text || outcome_url || outcome_cdata_text
131
167
  node.resultData do |res_data|
132
- if @outcome_cdata_text
168
+ if outcome_cdata_text
133
169
  res_data.text {
134
- res_data.cdata! @outcome_cdata_text
170
+ res_data.cdata! outcome_cdata_text
135
171
  }
136
- elsif @outcome_text
137
- res_data.text @outcome_text
172
+ elsif outcome_text
173
+ res_data.text outcome_text
138
174
  end
139
- res_data.url @outcome_url if @outcome_url
175
+ res_data.url outcome_url if outcome_url
140
176
  end
141
177
  end
142
178
  end
143
179
 
180
+ def score
181
+ total_score ? nil : @score
182
+ end
183
+
144
184
  def has_result_data?
145
- !!@outcome_text || !!@outcome_url || super
185
+ !!outcome_text || !!outcome_url || !!outcome_cdata_text || !!total_score || super
146
186
  end
147
187
 
148
188
  def extention_process_xml(doc)
@@ -154,7 +154,7 @@ module IMS::LTI
154
154
  end
155
155
 
156
156
  def has_result_data?
157
- !!@score
157
+ !!score
158
158
  end
159
159
 
160
160
  def results(node)
@@ -166,10 +166,10 @@ module IMS::LTI
166
166
  end
167
167
 
168
168
  def result_values(node)
169
- if @score
169
+ if score
170
170
  node.resultScore do |res_score|
171
171
  res_score.language "en" # 'en' represents the format of the number
172
- res_score.textString @score.to_s
172
+ res_score.textString score.to_s
173
173
  end
174
174
  end
175
175
  end
@@ -182,7 +182,7 @@ module IMS::LTI
182
182
  builder = Builder::XmlMarkup.new #(:indent=>2)
183
183
  builder.instruct!
184
184
 
185
- builder.imsx_POXEnvelopeRequest("xmlns" => "http://www.imsglobal.org/lis/oms1p0/pox") do |env|
185
+ builder.imsx_POXEnvelopeRequest("xmlns" => "http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0") do |env|
186
186
  env.imsx_POXHeader do |header|
187
187
  header.imsx_POXRequestHeaderInfo do |info|
188
188
  info.imsx_version "V1.0"
@@ -125,7 +125,8 @@ module IMS::LTI
125
125
  builder = Builder::XmlMarkup.new
126
126
  builder.instruct!
127
127
 
128
- builder.imsx_POXEnvelopeResponse("xmlns" => "http://www.imsglobal.org/lis/oms1p0/pox") do |env|
128
+ # builder.imsx_POXEnvelopeResponse("xmlns" => "http://www.imsglobal.org/lis/oms1p0/pox") do |env|
129
+ builder.imsx_POXEnvelopeResponse("xmlns" => "http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0") do |env|
129
130
  env.imsx_POXHeader do |header|
130
131
  header.imsx_POXResponseHeaderInfo do |info|
131
132
  info.imsx_version "V1.0"
@@ -1,12 +1,19 @@
1
1
  module IMS::LTI
2
2
  class ToolBase
3
+ include IMS::LTI::Extensions::Base
4
+ include IMS::LTI::LaunchParams
5
+ include IMS::LTI::RequestValidator
3
6
 
4
7
  # OAuth credentials
5
8
  attr_accessor :consumer_key, :consumer_secret
6
9
 
7
- def initialize(consumer_key, consumer_secret)
10
+ def initialize(consumer_key, consumer_secret, params={})
8
11
  @consumer_key = consumer_key
9
12
  @consumer_secret = consumer_secret
13
+ @custom_params = {}
14
+ @ext_params = {}
15
+ @non_spec_params = {}
16
+ process_params(params)
10
17
  end
11
18
 
12
19
  # Convenience method for doing oauth signed requests to services that
@@ -1,10 +1,6 @@
1
1
  module IMS::LTI
2
2
  # Class for implementing an LTI Tool Consumer
3
3
  class ToolConsumer < ToolBase
4
- include IMS::LTI::Extensions::Base
5
- include IMS::LTI::LaunchParams
6
- include IMS::LTI::RequestValidator
7
-
8
4
  attr_accessor :launch_url, :timestamp, :nonce
9
5
 
10
6
  # Create a new ToolConsumer
@@ -13,12 +9,8 @@ module IMS::LTI
13
9
  # @param consumer_secret [String] The OAuth consumer secret
14
10
  # @param params [Hash] Set the launch parameters as described in LaunchParams
15
11
  def initialize(consumer_key, consumer_secret, params={})
16
- super(consumer_key, consumer_secret)
17
- @custom_params = {}
18
- @ext_params = {}
19
- @non_spec_params = {}
12
+ super(consumer_key, consumer_secret, params)
20
13
  @launch_url = params['launch_url']
21
- process_params(params)
22
14
  end
23
15
 
24
16
  def process_post_request(post_request)
@@ -34,10 +34,6 @@ module IMS::LTI
34
34
  # end
35
35
 
36
36
  class ToolProvider < ToolBase
37
- include IMS::LTI::Extensions::Base
38
- include IMS::LTI::LaunchParams
39
- include IMS::LTI::RequestValidator
40
-
41
37
  # List of outcome requests made through this instance
42
38
  attr_accessor :outcome_requests
43
39
  # Message to be sent back to the ToolConsumer when the user returns
@@ -49,12 +45,8 @@ module IMS::LTI
49
45
  # @param consumer_secret [String] The OAuth consumer secret
50
46
  # @param params [Hash] Set the launch parameters as described in LaunchParams
51
47
  def initialize(consumer_key, consumer_secret, params={})
52
- super(consumer_key, consumer_secret)
53
- @custom_params = {}
54
- @ext_params = {}
55
- @non_spec_params = {}
48
+ super(consumer_key, consumer_secret, params)
56
49
  @outcome_requests = []
57
- process_params(params)
58
50
  end
59
51
 
60
52
  # Check whether the Launch Parameters have a role
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ims-lti
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 1.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Instructure
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-24 00:00:00.000000000 Z
11
+ date: 2015-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: oauth
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.4.5
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.4.5
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: uuid
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ruby-debug
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  description:
@@ -87,10 +87,15 @@ extensions: []
87
87
  extra_rdoc_files:
88
88
  - LICENSE
89
89
  files:
90
+ - Changelog
91
+ - LICENSE
92
+ - README.md
93
+ - lib/ims.rb
94
+ - lib/ims/lti.rb
95
+ - lib/ims/lti/extensions.rb
90
96
  - lib/ims/lti/extensions/canvas.rb
91
97
  - lib/ims/lti/extensions/content.rb
92
98
  - lib/ims/lti/extensions/outcome_data.rb
93
- - lib/ims/lti/extensions.rb
94
99
  - lib/ims/lti/launch_params.rb
95
100
  - lib/ims/lti/outcome_request.rb
96
101
  - lib/ims/lti/outcome_response.rb
@@ -99,11 +104,6 @@ files:
99
104
  - lib/ims/lti/tool_config.rb
100
105
  - lib/ims/lti/tool_consumer.rb
101
106
  - lib/ims/lti/tool_provider.rb
102
- - lib/ims/lti.rb
103
- - lib/ims.rb
104
- - LICENSE
105
- - README.md
106
- - Changelog
107
107
  homepage: http://github.com/instructure/ims-lti
108
108
  licenses:
109
109
  - MIT
@@ -114,17 +114,17 @@ require_paths:
114
114
  - lib
115
115
  required_ruby_version: !ruby/object:Gem::Requirement
116
116
  requirements:
117
- - - '>='
117
+ - - ">="
118
118
  - !ruby/object:Gem::Version
119
119
  version: '0'
120
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
126
  rubyforge_project:
127
- rubygems_version: 2.0.14
127
+ rubygems_version: 2.2.2
128
128
  signing_key:
129
129
  specification_version: 4
130
130
  summary: Ruby library for creating IMS LTI tool providers and consumers