ims-lti 1.1.4 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1 -1
- data/lib/ims/lti.rb +14 -0
- data/lib/ims/lti/extensions/canvas.rb +31 -18
- data/lib/ims/lti/extensions/outcome_data.rb +4 -3
- data/lib/ims/lti/launch_params.rb +2 -2
- data/lib/ims/lti/outcome_request.rb +5 -8
- data/lib/ims/lti/tool_base.rb +22 -0
- data/lib/ims/lti/tool_config.rb +1 -1
- data/lib/ims/lti/tool_consumer.rb +3 -4
- data/lib/ims/lti/tool_provider.rb +2 -5
- metadata +15 -26
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f08cf8db456b71aa74d6c55cecb8e76dc5ae4ad7
|
4
|
+
data.tar.gz: 5f1a47d7a25c957228b9f2bc3038ee5d64bc5b30
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c79e28940abe36bec574f89263f3650948f8e60010061f9799f9c013129d97c13d388ed1eb708f1328a171578db374ccc435e49148849f6e08c6700c9d302728
|
7
|
+
data.tar.gz: 1ed5c8d404daaea3e46177bf5761812a5ae59becc7de4d8e44a736358ee4d991fd71259bfff6c739d05155bd6c8e930bbad104d0719a08a3a6a6a2b1698c9298
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ proxy for your application. For example:
|
|
24
24
|
# For a Rails 2.3 app:
|
25
25
|
require 'oauth/request_proxy/action_controller_request'
|
26
26
|
|
27
|
-
For further information see the [oauth-ruby](https://github.com/oauth/oauth-ruby) project.
|
27
|
+
For further information see the [oauth-ruby](https://github.com/oauth-xx/oauth-ruby) project.
|
28
28
|
|
29
29
|
## Usage
|
30
30
|
This readme won't cover the LTI standard, just how to use the library. It will be
|
data/lib/ims/lti.rb
CHANGED
@@ -33,6 +33,19 @@ module IMS # :nodoc:
|
|
33
33
|
class InvalidLTIConfigError < StandardError
|
34
34
|
end
|
35
35
|
|
36
|
+
# POST a signed oauth request with the given key/secret/data
|
37
|
+
def self.post_service_request(key, secret, url, content_type, body)
|
38
|
+
raise IMS::LTI::InvalidLTIConfigError, "" unless key && secret
|
39
|
+
|
40
|
+
consumer = OAuth::Consumer.new(key, secret)
|
41
|
+
token = OAuth::AccessToken.new(consumer)
|
42
|
+
token.post(
|
43
|
+
url,
|
44
|
+
body,
|
45
|
+
'Content-Type' => content_type
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
36
49
|
# Generates a unique identifier
|
37
50
|
def self.generate_identifier
|
38
51
|
UUID.new
|
@@ -43,6 +56,7 @@ end
|
|
43
56
|
require 'ims/lti/extensions'
|
44
57
|
require 'ims/lti/launch_params'
|
45
58
|
require 'ims/lti/request_validator'
|
59
|
+
require 'ims/lti/tool_base'
|
46
60
|
require 'ims/lti/tool_provider'
|
47
61
|
require 'ims/lti/tool_consumer'
|
48
62
|
require 'ims/lti/outcome_request'
|
@@ -28,34 +28,45 @@ module IMS::LTI
|
|
28
28
|
|
29
29
|
# Canvas extension defaults
|
30
30
|
# These properties will cascade down to any options that are configured
|
31
|
+
def set_canvas_ext_param(key, value)
|
32
|
+
set_ext_param(PLATFORM, key, value)
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_canvas_param(param_key)
|
36
|
+
get_ext_param PLATFORM, param_key
|
37
|
+
end
|
31
38
|
|
32
39
|
def canvas_privacy_public!()
|
33
|
-
|
40
|
+
set_canvas_ext_param(:privacy_level, 'public')
|
34
41
|
end
|
35
42
|
|
36
43
|
def canvas_privacy_name_only!()
|
37
|
-
|
44
|
+
set_canvas_ext_param(:privacy_level, 'name_only')
|
38
45
|
end
|
39
46
|
|
40
47
|
def canvas_privacy_anonymous!()
|
41
|
-
|
48
|
+
set_canvas_ext_param(:privacy_level, 'anonymous')
|
42
49
|
end
|
43
50
|
|
44
51
|
def canvas_domain!(domain)
|
45
|
-
|
52
|
+
set_canvas_ext_param(:domain, domain)
|
46
53
|
end
|
47
54
|
|
48
55
|
def canvas_text!(text)
|
49
|
-
|
56
|
+
set_canvas_ext_param(:text, text)
|
50
57
|
end
|
51
58
|
|
52
59
|
def canvas_icon_url!(icon_url)
|
53
|
-
|
60
|
+
set_canvas_ext_param(:icon_url, icon_url)
|
61
|
+
end
|
62
|
+
|
63
|
+
def canvas_tool_id!(tool_id)
|
64
|
+
set_canvas_ext_param(:tool_id, tool_id)
|
54
65
|
end
|
55
66
|
|
56
67
|
def canvas_selector_dimensions!(width, height)
|
57
|
-
|
58
|
-
|
68
|
+
set_canvas_ext_param(:selection_width, width)
|
69
|
+
set_canvas_ext_param(:selection_height, height)
|
59
70
|
end
|
60
71
|
|
61
72
|
# Canvas options
|
@@ -65,25 +76,25 @@ module IMS::LTI
|
|
65
76
|
# Enables homework submissions via the tool
|
66
77
|
# Valid properties are url, text, selection_width, selection_height, enabled
|
67
78
|
def canvas_homework_submission!(params = {})
|
68
|
-
|
79
|
+
set_canvas_ext_param(:homework_submission, params)
|
69
80
|
end
|
70
81
|
|
71
82
|
# Adds the tool to canvas' rich text editor
|
72
83
|
# Valid properties are url, icon_url, text, selection_width, selection_height, enabled
|
73
84
|
def canvas_editor_button!(params = {})
|
74
|
-
|
85
|
+
set_canvas_ext_param(:editor_button, params)
|
75
86
|
end
|
76
87
|
|
77
|
-
# Adds the tool to canvas'
|
78
|
-
# Valid properties are url,
|
88
|
+
# Adds the tool to canvas' resource selector
|
89
|
+
# Valid properties are url, text, selection_width, selection_height, enabled
|
79
90
|
def canvas_resource_selection!(params = {})
|
80
|
-
|
91
|
+
set_canvas_ext_param(:resource_selection, params)
|
81
92
|
end
|
82
93
|
|
83
94
|
# Adds the tool to account level navigation in canvas
|
84
95
|
# Valid properties are url, text, enabled
|
85
96
|
def canvas_account_navigation!(params = {})
|
86
|
-
|
97
|
+
set_canvas_ext_param(:account_navigation, params)
|
87
98
|
end
|
88
99
|
|
89
100
|
# Adds the tool to course level navigation in canvas
|
@@ -91,17 +102,19 @@ module IMS::LTI
|
|
91
102
|
# Visibility describes who will see the navigation element. Possible values are "admins", "members", and nil
|
92
103
|
# Default determines if it is on or off by default. Possible values are "admins", "members", and nil
|
93
104
|
def canvas_course_navigation!(params = {})
|
94
|
-
|
105
|
+
set_canvas_ext_param(:course_navigation, params)
|
95
106
|
end
|
96
107
|
|
97
108
|
# Adds the tool to user level navigation in canvas
|
98
109
|
# Valid properties are url, text, enabled
|
99
110
|
def canvas_user_navigation!(params = {})
|
100
|
-
|
111
|
+
set_canvas_ext_param(:user_navigation, params)
|
101
112
|
end
|
102
113
|
|
103
|
-
|
104
|
-
|
114
|
+
# Adds canvas environment configurations options
|
115
|
+
# Valid properties are launch_url, domain, test_launch_url, test_domain, beta_launch_url, beta_domain
|
116
|
+
def canvas_environments!(params = {})
|
117
|
+
set_canvas_ext_param(:environments, params)
|
105
118
|
end
|
106
119
|
end
|
107
120
|
end
|
@@ -70,12 +70,14 @@ module IMS::LTI
|
|
70
70
|
# POSTs the given score to the Tool Consumer with a replaceResult and
|
71
71
|
# adds the specified data. The data hash can have the keys "text", "cdata_text", or "url"
|
72
72
|
#
|
73
|
-
# If
|
73
|
+
# If both cdata_text and text are sent, cdata_text will be used
|
74
|
+
#
|
75
|
+
# If score is nil, the replace result XML will not contain a resultScore node
|
74
76
|
#
|
75
77
|
# Creates a new OutcomeRequest object and stores it in @outcome_requests
|
76
78
|
#
|
77
79
|
# @return [OutcomeResponse] the response from the Tool Consumer
|
78
|
-
def post_replace_result_with_data!(score, data={})
|
80
|
+
def post_replace_result_with_data!(score = nil, data={})
|
79
81
|
req = new_request
|
80
82
|
if data["cdata_text"]
|
81
83
|
req.outcome_cdata_text = data["cdata_text"]
|
@@ -85,7 +87,6 @@ module IMS::LTI
|
|
85
87
|
req.outcome_url = data["url"] if data["url"]
|
86
88
|
req.post_replace_result!(score)
|
87
89
|
end
|
88
|
-
|
89
90
|
end
|
90
91
|
|
91
92
|
module ToolConsumer
|
@@ -137,9 +137,9 @@ module IMS::LTI
|
|
137
137
|
params.each_pair do |key, val|
|
138
138
|
if LAUNCH_DATA_PARAMETERS.member?(key)
|
139
139
|
self.send("#{key}=", val)
|
140
|
-
elsif key =~
|
140
|
+
elsif key =~ /\Acustom_(.+)\Z/
|
141
141
|
@custom_params[$1] = val
|
142
|
-
elsif key =~
|
142
|
+
elsif key =~ /\Aext_(.+)\Z/
|
143
143
|
@ext_params[$1] = val
|
144
144
|
end
|
145
145
|
end
|
@@ -32,7 +32,7 @@ module IMS::LTI
|
|
32
32
|
# else
|
33
33
|
# # return an unsupported OutcomeResponse
|
34
34
|
# end
|
35
|
-
class OutcomeRequest
|
35
|
+
class OutcomeRequest < ToolBase
|
36
36
|
include IMS::LTI::Extensions::Base
|
37
37
|
|
38
38
|
REPLACE_REQUEST = 'replaceResult'
|
@@ -123,13 +123,10 @@ module IMS::LTI
|
|
123
123
|
def post_outcome_request
|
124
124
|
raise IMS::LTI::InvalidLTIConfigError, "" unless has_required_attributes?
|
125
125
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
generate_request_xml,
|
131
|
-
'Content-Type' => 'application/xml'
|
132
|
-
)
|
126
|
+
res = post_service_request(@lis_outcome_service_url,
|
127
|
+
'application/xml',
|
128
|
+
generate_request_xml)
|
129
|
+
|
133
130
|
@outcome_response = extend_outcome_response(OutcomeResponse.new)
|
134
131
|
@outcome_response.process_post_response(res)
|
135
132
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module IMS::LTI
|
2
|
+
class ToolBase
|
3
|
+
|
4
|
+
# OAuth credentials
|
5
|
+
attr_accessor :consumer_key, :consumer_secret
|
6
|
+
|
7
|
+
def initialize(consumer_key, consumer_secret)
|
8
|
+
@consumer_key = consumer_key
|
9
|
+
@consumer_secret = consumer_secret
|
10
|
+
end
|
11
|
+
|
12
|
+
# Convenience method for doing oauth signed requests to services that
|
13
|
+
# aren't supported by this library
|
14
|
+
def post_service_request(url, content_type, body)
|
15
|
+
IMS::LTI::post_service_request(@consumer_key,
|
16
|
+
@consumer_secret,
|
17
|
+
url,
|
18
|
+
content_type,
|
19
|
+
body)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/ims/lti/tool_config.rb
CHANGED
@@ -142,7 +142,7 @@ module IMS::LTI
|
|
142
142
|
"xsi:schemaLocation" => "http://www.imsglobal.org/xsd/imslticc_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0.xsd http://www.imsglobal.org/xsd/imsbasiclti_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0p1.xsd http://www.imsglobal.org/xsd/imslticm_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd http://www.imsglobal.org/xsd/imslticp_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd"
|
143
143
|
) do |blti_node|
|
144
144
|
|
145
|
-
%w{title description launch_url secure_launch_url}.each do |key|
|
145
|
+
%w{title description launch_url secure_launch_url icon secure_icon}.each do |key|
|
146
146
|
blti_node.blti key.to_sym, self.send(key) if self.send(key)
|
147
147
|
end
|
148
148
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module IMS::LTI
|
2
2
|
# Class for implementing an LTI Tool Consumer
|
3
|
-
class ToolConsumer
|
3
|
+
class ToolConsumer < ToolBase
|
4
4
|
include IMS::LTI::Extensions::Base
|
5
5
|
include IMS::LTI::LaunchParams
|
6
6
|
include IMS::LTI::RequestValidator
|
7
7
|
|
8
|
-
attr_accessor :
|
8
|
+
attr_accessor :launch_url, :timestamp, :nonce
|
9
9
|
|
10
10
|
# Create a new ToolConsumer
|
11
11
|
#
|
@@ -13,8 +13,7 @@ module IMS::LTI
|
|
13
13
|
# @param consumer_secret [String] The OAuth consumer secret
|
14
14
|
# @param params [Hash] Set the launch parameters as described in LaunchParams
|
15
15
|
def initialize(consumer_key, consumer_secret, params={})
|
16
|
-
|
17
|
-
@consumer_secret = consumer_secret
|
16
|
+
super(consumer_key, consumer_secret)
|
18
17
|
@custom_params = {}
|
19
18
|
@ext_params = {}
|
20
19
|
@non_spec_params = {}
|
@@ -33,13 +33,11 @@ module IMS::LTI
|
|
33
33
|
# # failed
|
34
34
|
# end
|
35
35
|
|
36
|
-
class ToolProvider
|
36
|
+
class ToolProvider < ToolBase
|
37
37
|
include IMS::LTI::Extensions::Base
|
38
38
|
include IMS::LTI::LaunchParams
|
39
39
|
include IMS::LTI::RequestValidator
|
40
40
|
|
41
|
-
# OAuth credentials
|
42
|
-
attr_accessor :consumer_key, :consumer_secret
|
43
41
|
# List of outcome requests made through this instance
|
44
42
|
attr_accessor :outcome_requests
|
45
43
|
# Message to be sent back to the ToolConsumer when the user returns
|
@@ -51,8 +49,7 @@ module IMS::LTI
|
|
51
49
|
# @param consumer_secret [String] The OAuth consumer secret
|
52
50
|
# @param params [Hash] Set the launch parameters as described in LaunchParams
|
53
51
|
def initialize(consumer_key, consumer_secret, params={})
|
54
|
-
|
55
|
-
@consumer_secret = consumer_secret
|
52
|
+
super(consumer_key, consumer_secret)
|
56
53
|
@custom_params = {}
|
57
54
|
@ext_params = {}
|
58
55
|
@non_spec_params = {}
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ims-lti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Instructure
|
@@ -14,23 +13,20 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: builder
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: oauth
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,49 +41,43 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: uuid
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: ruby-debug
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
description:
|
@@ -106,6 +95,7 @@ files:
|
|
106
95
|
- lib/ims/lti/outcome_request.rb
|
107
96
|
- lib/ims/lti/outcome_response.rb
|
108
97
|
- lib/ims/lti/request_validator.rb
|
98
|
+
- lib/ims/lti/tool_base.rb
|
109
99
|
- lib/ims/lti/tool_config.rb
|
110
100
|
- lib/ims/lti/tool_consumer.rb
|
111
101
|
- lib/ims/lti/tool_provider.rb
|
@@ -117,26 +107,25 @@ files:
|
|
117
107
|
homepage: http://github.com/instructure/ims-lti
|
118
108
|
licenses:
|
119
109
|
- MIT
|
110
|
+
metadata: {}
|
120
111
|
post_install_message:
|
121
112
|
rdoc_options: []
|
122
113
|
require_paths:
|
123
114
|
- lib
|
124
115
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
116
|
requirements:
|
127
|
-
- -
|
117
|
+
- - '>='
|
128
118
|
- !ruby/object:Gem::Version
|
129
119
|
version: '0'
|
130
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
121
|
requirements:
|
133
|
-
- -
|
122
|
+
- - '>='
|
134
123
|
- !ruby/object:Gem::Version
|
135
124
|
version: '0'
|
136
125
|
requirements: []
|
137
126
|
rubyforge_project:
|
138
|
-
rubygems_version:
|
127
|
+
rubygems_version: 2.0.14
|
139
128
|
signing_key:
|
140
|
-
specification_version:
|
129
|
+
specification_version: 4
|
141
130
|
summary: Ruby library for creating IMS LTI tool providers and consumers
|
142
131
|
test_files: []
|