ims-lti 2.0.0.beta.20 → 2.0.0.beta.21
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 +4 -4
- data/README.md +2 -0
- data/lib/ims/lti/models.rb +4 -0
- data/lib/ims/lti/models/content_item_container.rb +14 -0
- data/lib/ims/lti/models/content_item_placement.rb +18 -0
- data/lib/ims/lti/models/content_items.rb +7 -0
- data/lib/ims/lti/models/content_items/content_item.rb +25 -0
- data/lib/ims/lti/models/content_items/file_item.rb +7 -0
- data/lib/ims/lti/models/content_items/lti_link.rb +7 -0
- data/lib/ims/lti/models/image.rb +7 -0
- data/lib/ims/lti/models/lti_model.rb +14 -5
- data/lib/ims/lti/models/messages.rb +3 -0
- data/lib/ims/lti/models/messages/basic_lti_launch_request.rb +1 -1
- data/lib/ims/lti/models/messages/content_item_selection.rb +25 -0
- data/lib/ims/lti/models/messages/content_item_selection_request.rb +26 -0
- data/lib/ims/lti/models/messages/message.rb +17 -6
- data/lib/ims/lti/models/messages/registration_request.rb +1 -1
- data/lib/ims/lti/models/messages/request_message.rb +12 -0
- data/lib/ims/lti/models/tool_setting_container.rb +1 -1
- metadata +16 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9efa243962781962b68c7d0fff8fd999ced4968
|
4
|
+
data.tar.gz: 5c219ef0195c7dcb97540f97500bf176a2307445
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8137fa5cd4f7170773094e8b533c79701a97ef58555a84f9b033c5998c7a3d735c5bd99e31b3d052420641888b322af9ff6a245f85901f08a5a07319187407f
|
7
|
+
data.tar.gz: a01f74beb1a0b3db1c588b9f2bf321354d40860289ea06cc59c7b7f2236dac98f1b20f97dc4a0735f962d7f4f86e4fc6bee192142700d477e5d14ea656778383
|
data/README.md
CHANGED
data/lib/ims/lti/models.rb
CHANGED
@@ -27,5 +27,9 @@ module IMS::LTI
|
|
27
27
|
require_relative 'models/base_url_selector'
|
28
28
|
require_relative 'models/tool_setting'
|
29
29
|
require_relative 'models/tool_setting_container'
|
30
|
+
require_relative 'models/content_items'
|
31
|
+
require_relative 'models/content_item_placement'
|
32
|
+
require_relative 'models/content_item_container'
|
33
|
+
require_relative 'models/image'
|
30
34
|
end
|
31
35
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module IMS::LTI::Models
|
2
|
+
class ContentItemContainer < IMS::LTI::Models::LTIModel
|
3
|
+
add_attribute :context, json_key: '@context'
|
4
|
+
add_attribute :graph, json_key: '@graph', relation: 'IMS::LTI::Models::ContentItems::ContentItem'
|
5
|
+
|
6
|
+
CONTENT_ITEM_CONTAINER_CONTEXT = 'http://purl.imsglobal.org/ctx/lti/v1/ContentItem'
|
7
|
+
|
8
|
+
def initialize(opts = {})
|
9
|
+
super(opts)
|
10
|
+
self.context = CONTENT_ITEM_CONTAINER_CONTEXT
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module IMS::LTI::Models
|
2
|
+
class ContentItemPlacement < LTIModel
|
3
|
+
|
4
|
+
DOCUMENT_TARGETS = {
|
5
|
+
embed: 'http://purl.imsglobal.org/vocab/lti/v2/lti#embed',
|
6
|
+
frame: 'http://purl.imsglobal.org/vocab/lti/v2/lti#frame',
|
7
|
+
iframe: 'http://purl.imsglobal.org/vocab/lti/v2/lti#iframe',
|
8
|
+
none: 'http://purl.imsglobal.org/vocab/lti/v2/lti#none',
|
9
|
+
overlay: 'http://purl.imsglobal.org/vocab/lti/v2/lti#overlay',
|
10
|
+
popup: 'http://purl.imsglobal.org/vocab/lti/v2/lti#popup',
|
11
|
+
window: 'http://purl.imsglobal.org/vocab/lti/v2/lti#window'
|
12
|
+
}
|
13
|
+
|
14
|
+
add_attributes :display_height, :display_width, :window_target
|
15
|
+
add_attribute :presentation_document_target
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module IMS::LTI::Models::ContentItems
|
2
|
+
class ContentItem < IMS::LTI::Models::LTIModel
|
3
|
+
|
4
|
+
add_attributes :media_type, :text, :title, :url
|
5
|
+
add_attribute :type, json_key: '@type'
|
6
|
+
add_attribute :id, json_key: '@id'
|
7
|
+
add_attribute :icon, relation: 'IMS::LTI::Models::Image'
|
8
|
+
add_attribute :placement_advice, relation: 'IMS::LTI::Models::ContentItemPlacement'
|
9
|
+
add_attribute :thumbnail, relation: 'IMS::LTI::Models::Image'
|
10
|
+
|
11
|
+
|
12
|
+
def self.from_json(json)
|
13
|
+
data = json.is_a?(String) ? JSON.parse(json) : json
|
14
|
+
case data['@type']
|
15
|
+
when 'ContentItem'
|
16
|
+
ContentItem.new.from_json(data)
|
17
|
+
when 'FileItem'
|
18
|
+
FileItem.new.from_json(data)
|
19
|
+
when 'LtiLink'
|
20
|
+
LtiLink.new.from_json(data)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -48,7 +48,7 @@ module IMS::LTI::Models
|
|
48
48
|
def attributes=(attrs)
|
49
49
|
attrs.each do |k, v|
|
50
50
|
if self.class.attributes.include?(k.to_sym)
|
51
|
-
|
51
|
+
send(("#{k}=").to_sym, v)
|
52
52
|
elsif k.to_s =~ /^ext_/
|
53
53
|
@ext_attributes[k.to_sym] = v
|
54
54
|
else
|
@@ -62,7 +62,11 @@ module IMS::LTI::Models
|
|
62
62
|
serialization_attrs_for(:json_key).each { |attr| json_hash.delete(attr.to_s) }
|
63
63
|
serialization_attrs_for(:relation).each do |attr|
|
64
64
|
val = attributes[attr.to_s]
|
65
|
-
|
65
|
+
if val && val.is_a?(Array)
|
66
|
+
json_hash[json_key(attr)] = val.map {|v| v.as_json }
|
67
|
+
elsif val
|
68
|
+
json_hash[json_key(attr)] = val.as_json
|
69
|
+
end
|
66
70
|
end
|
67
71
|
json_hash = @ext_attributes.merge(json_hash)
|
68
72
|
json_hash.merge! to_json_conversions
|
@@ -120,7 +124,8 @@ module IMS::LTI::Models
|
|
120
124
|
result = {}
|
121
125
|
if attrs = serialization_attrs_for(:json_key)
|
122
126
|
conversion_attrs = serialization_attrs_for(:json_converter)
|
123
|
-
|
127
|
+
relation_attrs = serialization_attrs_for(:relation)
|
128
|
+
attrs.each { |attr| result[json_key(attr)] = attributes[attr.to_s] unless (conversion_attrs | relation_attrs).include?(attr) || attributes[attr.to_s].nil? }
|
124
129
|
end
|
125
130
|
result
|
126
131
|
end
|
@@ -171,8 +176,12 @@ module IMS::LTI::Models
|
|
171
176
|
@attributes = attribs
|
172
177
|
end
|
173
178
|
|
174
|
-
def self.serialization_options
|
175
|
-
|
179
|
+
def self.serialization_options()
|
180
|
+
if name == "IMS::LTI::Models::LTIModel"
|
181
|
+
@serialization_options || {}
|
182
|
+
else
|
183
|
+
superclass.send(:serialization_options).merge(@serialization_options || {})
|
184
|
+
end
|
176
185
|
end
|
177
186
|
|
178
187
|
def serialization_options
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module IMS::LTI::Models
|
2
2
|
module Messages
|
3
3
|
require_relative 'messages/message'
|
4
|
+
require_relative 'messages/request_message'
|
4
5
|
require_relative 'messages/registration_request'
|
5
6
|
require_relative 'messages/basic_lti_launch_request'
|
7
|
+
require_relative 'messages/content_item_selection_request'
|
8
|
+
require_relative 'messages/content_item_selection'
|
6
9
|
end
|
7
10
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module IMS::LTI::Models::Messages
|
2
|
+
class ContentItemSelection < Message
|
3
|
+
add_optional_params :content_items, :data, :lti_msg, :lti_log, :lti_errormsg, :lti_errorlog
|
4
|
+
|
5
|
+
def content_items=(ci)
|
6
|
+
if ci.instance_of? String
|
7
|
+
container = IMS::LTI::Models::ContentItemContainer.from_json ci
|
8
|
+
@content_items = container.graph
|
9
|
+
else
|
10
|
+
@content_items = ci
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def parameters
|
15
|
+
if content_items
|
16
|
+
params = self.class.send("parameters")
|
17
|
+
params.delete('content_items')
|
18
|
+
collect_attributes(params).merge({'content_items' => IMS::LTI::Models::ContentItemContainer.new(graph: content_items).to_json})
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module IMS::LTI::Models::Messages
|
2
|
+
class ContentItemSelectionRequest < RequestMessage
|
3
|
+
|
4
|
+
add_required_params :accept_media_types, :accept_presentation_document_targets, :content_item_return_url
|
5
|
+
add_recommended_params :context_id, :tool_consumer_instance_guid
|
6
|
+
add_optional_params :context_type, :role_scope_mentor, :user_image, :accept_unsigned, :accept_multiple,
|
7
|
+
:accept_copy_advice, :text, :title, :data
|
8
|
+
add_deprecated_params :context_title, :context_label,
|
9
|
+
:lis_person_name_given, :lis_person_name_family, :lis_person_name_full,
|
10
|
+
:lis_person_contact_email_primary, :user_image, :lis_person_sourcedid,
|
11
|
+
:lis_course_offering_sourcedid, :lis_course_section_sourcedid,
|
12
|
+
:tool_consumer_info_product_family_code, :tool_consumer_info_product_family_version,
|
13
|
+
:tool_consumer_instance_name, :tool_consumer_instance_description,
|
14
|
+
:tool_consumer_instance_url, :tool_consumer_instance_contact_email,
|
15
|
+
:tool_consumer_info_version
|
16
|
+
|
17
|
+
MESSAGE_TYPE = 'ContentItemSelectionRequest'
|
18
|
+
|
19
|
+
def initialize(attrs = {})
|
20
|
+
super(attrs)
|
21
|
+
self.lti_message_type = MESSAGE_TYPE
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module IMS::LTI::Models::Messages
|
2
2
|
class Message
|
3
|
+
|
3
4
|
class << self
|
4
5
|
|
5
6
|
def required_params
|
@@ -48,7 +49,11 @@ module IMS::LTI::Models::Messages
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def supers_params(instance_variable)
|
51
|
-
|
52
|
+
if name == "IMS::LTI::Models::Messages::Message"
|
53
|
+
[]
|
54
|
+
else
|
55
|
+
(superclass.instance_variable_get(instance_variable) || []) | superclass.send(:supers_params, instance_variable)
|
56
|
+
end
|
52
57
|
end
|
53
58
|
|
54
59
|
end
|
@@ -66,8 +71,6 @@ module IMS::LTI::Models::Messages
|
|
66
71
|
attr_reader :unknown_params, :custom_params, :ext_params
|
67
72
|
|
68
73
|
add_required_params :lti_message_type, :lti_version
|
69
|
-
add_recommended_params :user_id, :roles, :launch_presentation_document_target, :launch_presentation_width, :launch_presentation_height
|
70
|
-
add_optional_params :launch_presentation_locale, :launch_presentation_css_url
|
71
74
|
|
72
75
|
def self.generate(params)
|
73
76
|
case params['lti_message_type']
|
@@ -75,6 +78,8 @@ module IMS::LTI::Models::Messages
|
|
75
78
|
BasicLTILaunchRequest.new(params)
|
76
79
|
when RegistrationRequest::MESSAGE_TYPE
|
77
80
|
RegistrationRequest.new(params)
|
81
|
+
when ContentItemSelectionRequest::MESSAGE_TYPE
|
82
|
+
ContentItemSelectionRequest.new(params)
|
78
83
|
else
|
79
84
|
self.new(params)
|
80
85
|
end
|
@@ -93,7 +98,8 @@ module IMS::LTI::Models::Messages
|
|
93
98
|
elsif str_key.start_with?(CUSTOM_PREFIX)
|
94
99
|
@custom_params[str_key] = v
|
95
100
|
elsif !v.nil? && self.respond_to?(k.to_sym)
|
96
|
-
|
101
|
+
send(("#{k}=").to_sym, v)
|
102
|
+
|
97
103
|
else
|
98
104
|
warn "Unknown parameter #{k}"
|
99
105
|
@unknown_params[str_key] = v
|
@@ -120,6 +126,7 @@ module IMS::LTI::Models::Messages
|
|
120
126
|
end
|
121
127
|
|
122
128
|
def valid_signature?(secret)
|
129
|
+
params = collect_attributes(OAUTH_KEYS)
|
123
130
|
params = OAUTH_KEYS.inject({}) do |hash, k|
|
124
131
|
value = instance_variable_get("@#{k}")
|
125
132
|
hash[k] = value if value
|
@@ -152,6 +159,10 @@ module IMS::LTI::Models::Messages
|
|
152
159
|
collect_attributes(self.class.deprecated_params)
|
153
160
|
end
|
154
161
|
|
162
|
+
def oauth_params
|
163
|
+
collect_attributes(OAUTH_KEYS)
|
164
|
+
end
|
165
|
+
|
155
166
|
def method_missing(meth, *args, &block)
|
156
167
|
if match = /^(custom|ext)_([^=$]*)/.match(meth)
|
157
168
|
param_type, key = match.captures
|
@@ -178,8 +189,8 @@ module IMS::LTI::Models::Messages
|
|
178
189
|
|
179
190
|
def collect_attributes(attributes)
|
180
191
|
attributes.inject({}) do |h, param|
|
181
|
-
value = instance_variable_get("@#{param
|
182
|
-
h[param.to_s] = value
|
192
|
+
value = instance_variable_get("@#{param}")
|
193
|
+
h[param.to_s] = value if value
|
183
194
|
h
|
184
195
|
end
|
185
196
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module IMS::LTI::Models::Messages
|
2
|
+
class RequestMessage < Message
|
3
|
+
|
4
|
+
add_recommended_params :user_id, :roles, :launch_presentation_document_target, :launch_presentation_width, :launch_presentation_height
|
5
|
+
add_optional_params :launch_presentation_locale, :launch_presentation_css_url
|
6
|
+
|
7
|
+
def initialize(attrs = {})
|
8
|
+
super(attrs)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -6,8 +6,8 @@ module IMS::LTI::Models
|
|
6
6
|
TOOL_SETTING_CONTAINER_CONTEXT = 'http://purl.imsglobal.org/ctx/lti/v2/ToolSettings'
|
7
7
|
|
8
8
|
def initialize(opts = {})
|
9
|
-
self.context = TOOL_SETTING_CONTAINER_CONTEXT
|
10
9
|
super(opts)
|
10
|
+
self.context = TOOL_SETTING_CONTAINER_CONTEXT
|
11
11
|
end
|
12
12
|
|
13
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ims-lti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.beta.
|
4
|
+
version: 2.0.0.beta.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Instructure
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simple_oauth
|
@@ -72,42 +72,28 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 10.4.2
|
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
|
-
version:
|
82
|
+
version: 10.4.2
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 3.2.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
96
|
+
version: 3.2.0
|
111
97
|
description:
|
112
98
|
email:
|
113
99
|
executables: []
|
@@ -127,16 +113,26 @@ files:
|
|
127
113
|
- lib/ims/lti/models/base_url_choice.rb
|
128
114
|
- lib/ims/lti/models/base_url_selector.rb
|
129
115
|
- lib/ims/lti/models/contact.rb
|
116
|
+
- lib/ims/lti/models/content_item_container.rb
|
117
|
+
- lib/ims/lti/models/content_item_placement.rb
|
118
|
+
- lib/ims/lti/models/content_items.rb
|
119
|
+
- lib/ims/lti/models/content_items/content_item.rb
|
120
|
+
- lib/ims/lti/models/content_items/file_item.rb
|
121
|
+
- lib/ims/lti/models/content_items/lti_link.rb
|
130
122
|
- lib/ims/lti/models/icon_endpoint.rb
|
131
123
|
- lib/ims/lti/models/icon_info.rb
|
124
|
+
- lib/ims/lti/models/image.rb
|
132
125
|
- lib/ims/lti/models/localized_name.rb
|
133
126
|
- lib/ims/lti/models/localized_text.rb
|
134
127
|
- lib/ims/lti/models/lti_model.rb
|
135
128
|
- lib/ims/lti/models/message_handler.rb
|
136
129
|
- lib/ims/lti/models/messages.rb
|
137
130
|
- lib/ims/lti/models/messages/basic_lti_launch_request.rb
|
131
|
+
- lib/ims/lti/models/messages/content_item_selection.rb
|
132
|
+
- lib/ims/lti/models/messages/content_item_selection_request.rb
|
138
133
|
- lib/ims/lti/models/messages/message.rb
|
139
134
|
- lib/ims/lti/models/messages/registration_request.rb
|
135
|
+
- lib/ims/lti/models/messages/request_message.rb
|
140
136
|
- lib/ims/lti/models/parameter.rb
|
141
137
|
- lib/ims/lti/models/product_family.rb
|
142
138
|
- lib/ims/lti/models/product_info.rb
|