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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0bcf94db095c67ba98ec3812f19f8c8c31a8a86d
4
- data.tar.gz: 98f29e780c98723f7ad66c87bb242de83e3f41e4
3
+ metadata.gz: f9efa243962781962b68c7d0fff8fd999ced4968
4
+ data.tar.gz: 5c219ef0195c7dcb97540f97500bf176a2307445
5
5
  SHA512:
6
- metadata.gz: bf3b2ec04f3537773b4a3c4c4591a416920b35017fe2485cf2ccafd1641c23a4370a092024203ff0b010e3334a67d06fb7dc04bfacc5b02bb6e3be639ec5eb2a
7
- data.tar.gz: 06912f014181ce1d03277864abc6c22440c84ff9f521b64da5a49ce8fb9864352a30223af7186d7d3d6f073bfc9036ccdbd4556d9cd0c3b3b9fa25537f852195
6
+ metadata.gz: c8137fa5cd4f7170773094e8b533c79701a97ef58555a84f9b033c5998c7a3d735c5bd99e31b3d052420641888b322af9ff6a245f85901f08a5a07319187407f
7
+ data.tar.gz: a01f74beb1a0b3db1c588b9f2bf321354d40860289ea06cc59c7b7f2236dac98f1b20f97dc4a0735f962d7f4f86e4fc6bee192142700d477e5d14ea656778383
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # IMS LTI
2
2
 
3
+ [![Build Status](https://travis-ci.org/instructure/ims-lti.svg?branch=2.0.x)](https://travis-ci.org/instructure/ims-lti)
4
+
3
5
  #Version 2.x is currently BETA
4
6
 
5
7
  LTI ruby implementation
@@ -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,7 @@
1
+ module IMS::LTI::Models
2
+ module ContentItems
3
+ require_relative 'content_items/content_item'
4
+ require_relative 'content_items/file_item'
5
+ require_relative 'content_items/lti_link'
6
+ end
7
+ 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
@@ -0,0 +1,7 @@
1
+ module IMS::LTI::Models::ContentItems
2
+ class FileItem < ContentItem
3
+
4
+ add_attributes :copyAdvice, :expires_at
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module IMS::LTI::Models::ContentItems
2
+ class LtiLink < ContentItem
3
+
4
+ add_attributes :custom
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module IMS::LTI::Models
2
+ class Image < LTIModel
3
+ add_attribute :id, json_key: '@id'
4
+ add_attributes :height, :width
5
+
6
+ end
7
+ 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
- instance_variable_set("@#{k.to_s}", v)
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
- json_hash[json_key(attr)] = val.as_json if val
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
- attrs.each { |attr| result[json_key(attr)] = attributes[attr.to_s] unless conversion_attrs.include?(attr) || attributes[attr.to_s].nil? }
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
- @serialization_options ||= {}
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
@@ -1,5 +1,5 @@
1
1
  module IMS::LTI::Models::Messages
2
- class BasicLTILaunchRequest < Message
2
+ class BasicLTILaunchRequest < RequestMessage
3
3
 
4
4
  add_required_params :resource_link_id
5
5
  add_recommended_params :context_id, :launch_presentation_return_url, :tool_consumer_instance_guid
@@ -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
- superclass == Object ? [] : superclass.instance_variable_get(instance_variable) || []
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
- instance_variable_set("@#{k}", v)
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.to_s}")
182
- h[param.to_s] = value unless value.nil?
192
+ value = instance_variable_get("@#{param}")
193
+ h[param.to_s] = value if value
183
194
  h
184
195
  end
185
196
  end
@@ -1,5 +1,5 @@
1
1
  module IMS::LTI::Models::Messages
2
- class RegistrationRequest < Message
2
+ class RegistrationRequest < RequestMessage
3
3
 
4
4
  add_required_params :reg_key, :reg_password, :tc_profile_url, :launch_presentation_return_url
5
5
 
@@ -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.20
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-14 00:00:00.000000000 Z
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: '0'
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: '0'
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: '0'
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: '0'
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