qalam_ims_lti 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog.txt +0 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +39 -0
  5. data/lib/ims/lis/context_type/handles.rb +10 -0
  6. data/lib/ims/lis/context_type/urns.rb +10 -0
  7. data/lib/ims/lis/roles/context/handles.rb +60 -0
  8. data/lib/ims/lis/roles/context/urns.rb +60 -0
  9. data/lib/ims/lis/roles/institution/handles.rb +22 -0
  10. data/lib/ims/lis/roles/institution/urns.rb +22 -0
  11. data/lib/ims/lis/roles/system/handles.rb +15 -0
  12. data/lib/ims/lis/roles/system/urns.rb +15 -0
  13. data/lib/ims/lis/statuses/simple_names.rb +9 -0
  14. data/lib/ims/lis/statuses/uris.rb +9 -0
  15. data/lib/ims/lis.rb +14 -0
  16. data/lib/ims/lti/converters/time_json_converter.rb +13 -0
  17. data/lib/ims/lti/converters.rb +5 -0
  18. data/lib/ims/lti/deprecated_role_checks.rb +52 -0
  19. data/lib/ims/lti/errors/authentication_failed_error.rb +11 -0
  20. data/lib/ims/lti/errors/invalid_lti_config_error.rb +4 -0
  21. data/lib/ims/lti/errors/invalid_tool_consumer_profile.rb +4 -0
  22. data/lib/ims/lti/errors/tool_proxy_registration_error.rb +15 -0
  23. data/lib/ims/lti/errors.rb +8 -0
  24. data/lib/ims/lti/extensions/canvas.rb +125 -0
  25. data/lib/ims/lti/extensions/content.rb +209 -0
  26. data/lib/ims/lti/extensions/outcome_data.rb +216 -0
  27. data/lib/ims/lti/extensions.rb +45 -0
  28. data/lib/ims/lti/launch_params.rb +166 -0
  29. data/lib/ims/lti/models/base_url_choice.rb +15 -0
  30. data/lib/ims/lti/models/base_url_selector.rb +5 -0
  31. data/lib/ims/lti/models/contact.rb +5 -0
  32. data/lib/ims/lti/models/content_item_container.rb +14 -0
  33. data/lib/ims/lti/models/content_item_placement.rb +20 -0
  34. data/lib/ims/lti/models/content_items/content_item.rb +32 -0
  35. data/lib/ims/lti/models/content_items/file_item.rb +15 -0
  36. data/lib/ims/lti/models/content_items/lti_link_item.rb +14 -0
  37. data/lib/ims/lti/models/content_items.rb +7 -0
  38. data/lib/ims/lti/models/icon_endpoint.rb +5 -0
  39. data/lib/ims/lti/models/icon_info.rb +6 -0
  40. data/lib/ims/lti/models/image.rb +7 -0
  41. data/lib/ims/lti/models/localized_name.rb +12 -0
  42. data/lib/ims/lti/models/localized_text.rb +12 -0
  43. data/lib/ims/lti/models/lti_model.rb +227 -0
  44. data/lib/ims/lti/models/membership_service/agent.rb +11 -0
  45. data/lib/ims/lti/models/membership_service/container.rb +11 -0
  46. data/lib/ims/lti/models/membership_service/context.rb +11 -0
  47. data/lib/ims/lti/models/membership_service/lis_membership_container.rb +13 -0
  48. data/lib/ims/lti/models/membership_service/lis_person.rb +14 -0
  49. data/lib/ims/lti/models/membership_service/membership.rb +14 -0
  50. data/lib/ims/lti/models/membership_service/organization.rb +14 -0
  51. data/lib/ims/lti/models/membership_service/page.rb +16 -0
  52. data/lib/ims/lti/models/membership_service/person.rb +13 -0
  53. data/lib/ims/lti/models/membership_service.rb +16 -0
  54. data/lib/ims/lti/models/message_handler.rb +14 -0
  55. data/lib/ims/lti/models/messages/basic_lti_launch_request.rb +24 -0
  56. data/lib/ims/lti/models/messages/content_item_selection.rb +32 -0
  57. data/lib/ims/lti/models/messages/content_item_selection_request.rb +26 -0
  58. data/lib/ims/lti/models/messages/message.rb +222 -0
  59. data/lib/ims/lti/models/messages/registration_request.rb +20 -0
  60. data/lib/ims/lti/models/messages/request_message.rb +12 -0
  61. data/lib/ims/lti/models/messages/tool_proxy_update_request.rb +15 -0
  62. data/lib/ims/lti/models/messages.rb +11 -0
  63. data/lib/ims/lti/models/parameter.rb +28 -0
  64. data/lib/ims/lti/models/product_family.rb +8 -0
  65. data/lib/ims/lti/models/product_info.rb +26 -0
  66. data/lib/ims/lti/models/product_instance.rb +10 -0
  67. data/lib/ims/lti/models/resource_handler.rb +22 -0
  68. data/lib/ims/lti/models/resource_type.rb +6 -0
  69. data/lib/ims/lti/models/rest_service.rb +30 -0
  70. data/lib/ims/lti/models/rest_service_profile.rb +15 -0
  71. data/lib/ims/lti/models/security_contract.rb +21 -0
  72. data/lib/ims/lti/models/security_profile.rb +10 -0
  73. data/lib/ims/lti/models/serializable.rb +12 -0
  74. data/lib/ims/lti/models/service_owner.rb +26 -0
  75. data/lib/ims/lti/models/service_provider.rb +11 -0
  76. data/lib/ims/lti/models/tool_consumer_profile.rb +45 -0
  77. data/lib/ims/lti/models/tool_profile.rb +35 -0
  78. data/lib/ims/lti/models/tool_proxy.rb +21 -0
  79. data/lib/ims/lti/models/tool_setting.rb +12 -0
  80. data/lib/ims/lti/models/tool_setting_container.rb +14 -0
  81. data/lib/ims/lti/models/vendor.rb +28 -0
  82. data/lib/ims/lti/models.rb +38 -0
  83. data/lib/ims/lti/outcome_request.rb +225 -0
  84. data/lib/ims/lti/outcome_response.rb +166 -0
  85. data/lib/ims/lti/request_validator.rb +56 -0
  86. data/lib/ims/lti/role_checks.rb +101 -0
  87. data/lib/ims/lti/serializers/base.rb +125 -0
  88. data/lib/ims/lti/serializers/membership_service/agent_serializer.rb +5 -0
  89. data/lib/ims/lti/serializers/membership_service/container_serializer.rb +6 -0
  90. data/lib/ims/lti/serializers/membership_service/context_serializer.rb +9 -0
  91. data/lib/ims/lti/serializers/membership_service/lis_membership_container_serializer.rb +9 -0
  92. data/lib/ims/lti/serializers/membership_service/lis_person_serializer.rb +12 -0
  93. data/lib/ims/lti/serializers/membership_service/membership_serializer.rb +7 -0
  94. data/lib/ims/lti/serializers/membership_service/organization_serializer.rb +8 -0
  95. data/lib/ims/lti/serializers/membership_service/page_serializer.rb +10 -0
  96. data/lib/ims/lti/serializers/membership_service/person_serializer.rb +8 -0
  97. data/lib/ims/lti/serializers/membership_service.rb +13 -0
  98. data/lib/ims/lti/serializers.rb +6 -0
  99. data/lib/ims/lti/services/authentication_service.rb +67 -0
  100. data/lib/ims/lti/services/message_authenticator.rb +80 -0
  101. data/lib/ims/lti/services/oauth2_client.rb +18 -0
  102. data/lib/ims/lti/services/tool_config.rb +223 -0
  103. data/lib/ims/lti/services/tool_consumer_profile_service.rb +16 -0
  104. data/lib/ims/lti/services/tool_proxy_registration_service.rb +84 -0
  105. data/lib/ims/lti/services/tool_proxy_validator.rb +182 -0
  106. data/lib/ims/lti/services.rb +11 -0
  107. data/lib/ims/lti/tool_base.rb +29 -0
  108. data/lib/ims/lti/tool_config.rb +231 -0
  109. data/lib/ims/lti/tool_consumer.rb +86 -0
  110. data/lib/ims/lti/tool_provider.rb +143 -0
  111. data/lib/ims/lti/version.rb +5 -0
  112. data/lib/ims/lti.rb +61 -0
  113. data/lib/ims.rb +4 -0
  114. metadata +379 -0
@@ -0,0 +1,143 @@
1
+ module IMS::LTI
2
+
3
+ # Class for implementing an LTI Tool Provider
4
+ #
5
+ # # Initialize TP object with OAuth creds and post parameters
6
+ # provider = IMS::LTI::ToolProvider.new(consumer_key, consumer_secret, params)
7
+ #
8
+ # # Verify OAuth signature by passing the request object
9
+ # if provider.valid_request?(request)
10
+ # # success
11
+ # else
12
+ # # handle invalid OAuth
13
+ # end
14
+ #
15
+ # if provider.outcome_service?
16
+ # # ready for grade write-back
17
+ # else
18
+ # # normal tool launch without grade write-back
19
+ # end
20
+ #
21
+ # If the tool was launch as an outcome service you can POST a score to the TC.
22
+ # The POST calls all return an OutcomeResponse object which can be used to
23
+ # handle the response appropriately.
24
+ #
25
+ # # post the score to the TC, score should be a float >= 0.0 and <= 1.0
26
+ # # this returns an OutcomeResponse object
27
+ # response = provider.post_replace_result!(score)
28
+ # if response.success?
29
+ # # grade write worked
30
+ # elsif response.processing?
31
+ # elsif response.unsupported?
32
+ # else
33
+ # # failed
34
+ # end
35
+
36
+ class ToolProvider < ToolBase
37
+ # List of outcome requests made through this instance
38
+
39
+ include DeprecatedRoleChecks
40
+ include RoleChecks
41
+ attr_accessor :outcome_requests
42
+ # Message to be sent back to the ToolConsumer when the user returns
43
+ attr_accessor :lti_errormsg, :lti_errorlog, :lti_msg, :lti_log
44
+
45
+ # Create a new ToolProvider
46
+ #
47
+ # @param consumer_key [String] The OAuth consumer key
48
+ # @param consumer_secret [String] The OAuth consumer secret
49
+ # @param params [Hash] Set the launch parameters as described in LaunchParams
50
+ def initialize(consumer_key, consumer_secret, params={})
51
+ super(consumer_key, consumer_secret, params)
52
+ @outcome_requests = []
53
+ end
54
+
55
+ # Check if the request was an LTI Launch Request
56
+ def launch_request?
57
+ lti_message_type == 'basic-lti-launch-request'
58
+ end
59
+
60
+ # Check if the Tool Launch expects an Outcome Result
61
+ def outcome_service?
62
+ !!(lis_outcome_service_url && lis_result_sourcedid)
63
+ end
64
+
65
+ # Return the full, given, or family name if set
66
+ def username(default=nil)
67
+ lis_person_name_given || lis_person_name_family || lis_person_name_full || default
68
+ end
69
+
70
+ # POSTs the given score to the Tool Consumer with a replaceResult
71
+ #
72
+ # Creates a new OutcomeRequest object and stores it in @outcome_requests
73
+ #
74
+ # @return [OutcomeResponse] the response from the Tool Consumer
75
+ def post_replace_result!(score)
76
+ new_request.post_replace_result!(score)
77
+ end
78
+
79
+ # POSTs a delete request to the Tool Consumer
80
+ #
81
+ # Creates a new OutcomeRequest object and stores it in @outcome_requests
82
+ #
83
+ # @return [OutcomeResponse] the response from the Tool Consumer
84
+ def post_delete_result!
85
+ new_request.post_delete_result!
86
+ end
87
+
88
+ # POSTs the given score to the Tool Consumer with a replaceResult, the
89
+ # returned OutcomeResponse will have the score
90
+ #
91
+ # Creates a new OutcomeRequest object and stores it in @outcome_requests
92
+ #
93
+ # @return [OutcomeResponse] the response from the Tool Consumer
94
+ def post_read_result!
95
+ new_request.post_read_result!
96
+ end
97
+
98
+ # Returns the most recent OutcomeRequest
99
+ def last_outcome_request
100
+ @outcome_requests.last
101
+ end
102
+
103
+ # Convenience method for whether the last OutcomeRequest was successful
104
+ def last_outcome_success?
105
+ last_outcome_request && last_outcome_request.outcome_post_successful?
106
+ end
107
+
108
+ # If the Tool Consumer sent a URL for the user to return to this will add
109
+ # any set messages to the URL.
110
+ #
111
+ # Example:
112
+ #
113
+ # tc = IMS::LTI::tc.new
114
+ # tc.launch_presentation_return_url = "http://example.com/return"
115
+ # tc.lti_msg = "hi there"
116
+ # tc.lti_errorlog = "error happens"
117
+ #
118
+ # tc.build_return_url # => "http://example.com/return?lti_msg=hi%20there&lti_errorlog=error%20happens"
119
+ def build_return_url
120
+ return nil unless launch_presentation_return_url
121
+ messages = []
122
+ %w{lti_errormsg lti_errorlog lti_msg lti_log}.each do |m|
123
+ if message = self.send(m)
124
+ messages << "#{m}=#{URI.escape(message)}"
125
+ end
126
+ end
127
+ q_string = messages.any? ? ("?" + messages.join("&")) : ''
128
+ launch_presentation_return_url + q_string
129
+ end
130
+
131
+ private
132
+
133
+ def new_request
134
+ @outcome_requests << OutcomeRequest.new(:consumer_key => @consumer_key,
135
+ :consumer_secret => @consumer_secret,
136
+ :lis_outcome_service_url => lis_outcome_service_url,
137
+ :lis_result_sourcedid =>lis_result_sourcedid)
138
+
139
+ extend_outcome_request(@outcome_requests.last)
140
+ end
141
+
142
+ end
143
+ end
@@ -0,0 +1,5 @@
1
+ module IMS
2
+ module LTI
3
+ VERSION = "0.0.2"
4
+ end
5
+ end
data/lib/ims/lti.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'addressable/uri'
2
+ require 'builder'
3
+ require 'faraday'
4
+ require 'faraday_middleware'
5
+ require 'json'
6
+ require 'json/jwt'
7
+ require 'rexml/document'
8
+ require 'securerandom'
9
+ require 'simple_oauth'
10
+ require 'oauth'
11
+ require 'cgi'
12
+
13
+ module IMS
14
+ module LTI
15
+ require_relative 'lti/converters'
16
+ require_relative 'lti/errors'
17
+ require_relative 'lti/models'
18
+ require_relative 'lti/serializers'
19
+ require_relative 'lti/services'
20
+ end
21
+
22
+ # The versions of LTI this library supports
23
+ VERSIONS = %w{1.0 1.1}
24
+
25
+ class InvalidLTIConfigError < StandardError
26
+ end
27
+
28
+ class XMLParseError < StandardError
29
+ end
30
+
31
+ # POST a signed oauth request with the given key/secret/data
32
+ def self.post_service_request(key, secret, url, content_type, body)
33
+ raise IMS::LTI::InvalidLTIConfigError, "" unless key && secret
34
+
35
+ consumer = OAuth::Consumer.new(key, secret)
36
+ token = OAuth::AccessToken.new(consumer)
37
+ token.post(
38
+ url,
39
+ body,
40
+ 'Content-Type' => content_type
41
+ )
42
+ end
43
+
44
+ # Generates a unique identifier
45
+ def self.generate_identifier
46
+ SecureRandom.uuid
47
+ end
48
+ end
49
+
50
+
51
+ require 'ims/lti/extensions'
52
+ require 'ims/lti/launch_params'
53
+ require 'ims/lti/request_validator'
54
+ require 'ims/lti/tool_base'
55
+ require 'ims/lti/deprecated_role_checks'
56
+ require 'ims/lti/role_checks'
57
+ require 'ims/lti/tool_provider'
58
+ require 'ims/lti/tool_consumer'
59
+ require 'ims/lti/outcome_request'
60
+ require 'ims/lti/outcome_response'
61
+ require 'ims/lti/tool_config'
data/lib/ims.rb ADDED
@@ -0,0 +1,4 @@
1
+ module IMS
2
+ require 'ims/lti'
3
+ require 'ims/lis'
4
+ end
metadata ADDED
@@ -0,0 +1,379 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qalam_ims_lti
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Instructure
8
+ - Abdelhamid
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-08-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: addressable
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.5'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.5.1
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '2.5'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.5.1
34
+ - !ruby/object:Gem::Dependency
35
+ name: builder
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ - !ruby/object:Gem::Dependency
49
+ name: faraday
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: faraday_middleware
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "<"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ type: :runtime
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "<"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: json-jwt
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.7'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.7'
90
+ - !ruby/object:Gem::Dependency
91
+ name: oauth
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.4.5
97
+ - - "<"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.6'
100
+ type: :runtime
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 0.4.5
107
+ - - "<"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.6'
110
+ - !ruby/object:Gem::Dependency
111
+ name: simple_oauth
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 0.3.1
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 0.3.1
124
+ - !ruby/object:Gem::Dependency
125
+ name: byebug
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '9.0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '9.0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: guard
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.13'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '2.13'
152
+ - !ruby/object:Gem::Dependency
153
+ name: guard-rspec
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '4.6'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '4.6'
166
+ - !ruby/object:Gem::Dependency
167
+ name: listen
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.0'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: pry
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '0.10'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '0.10'
194
+ - !ruby/object:Gem::Dependency
195
+ name: rake
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '12.0'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '12.0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: rspec
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '3.2'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '3.2'
222
+ - !ruby/object:Gem::Dependency
223
+ name: timecop
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '0.8'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '0.8'
236
+ description:
237
+ email:
238
+ - opensource@instructure.com
239
+ - a.hamid@nezam.io
240
+ executables: []
241
+ extensions: []
242
+ extra_rdoc_files: []
243
+ files:
244
+ - Changelog.txt
245
+ - LICENSE.txt
246
+ - README.md
247
+ - lib/ims.rb
248
+ - lib/ims/lis.rb
249
+ - lib/ims/lis/context_type/handles.rb
250
+ - lib/ims/lis/context_type/urns.rb
251
+ - lib/ims/lis/roles/context/handles.rb
252
+ - lib/ims/lis/roles/context/urns.rb
253
+ - lib/ims/lis/roles/institution/handles.rb
254
+ - lib/ims/lis/roles/institution/urns.rb
255
+ - lib/ims/lis/roles/system/handles.rb
256
+ - lib/ims/lis/roles/system/urns.rb
257
+ - lib/ims/lis/statuses/simple_names.rb
258
+ - lib/ims/lis/statuses/uris.rb
259
+ - lib/ims/lti.rb
260
+ - lib/ims/lti/converters.rb
261
+ - lib/ims/lti/converters/time_json_converter.rb
262
+ - lib/ims/lti/deprecated_role_checks.rb
263
+ - lib/ims/lti/errors.rb
264
+ - lib/ims/lti/errors/authentication_failed_error.rb
265
+ - lib/ims/lti/errors/invalid_lti_config_error.rb
266
+ - lib/ims/lti/errors/invalid_tool_consumer_profile.rb
267
+ - lib/ims/lti/errors/tool_proxy_registration_error.rb
268
+ - lib/ims/lti/extensions.rb
269
+ - lib/ims/lti/extensions/canvas.rb
270
+ - lib/ims/lti/extensions/content.rb
271
+ - lib/ims/lti/extensions/outcome_data.rb
272
+ - lib/ims/lti/launch_params.rb
273
+ - lib/ims/lti/models.rb
274
+ - lib/ims/lti/models/base_url_choice.rb
275
+ - lib/ims/lti/models/base_url_selector.rb
276
+ - lib/ims/lti/models/contact.rb
277
+ - lib/ims/lti/models/content_item_container.rb
278
+ - lib/ims/lti/models/content_item_placement.rb
279
+ - lib/ims/lti/models/content_items.rb
280
+ - lib/ims/lti/models/content_items/content_item.rb
281
+ - lib/ims/lti/models/content_items/file_item.rb
282
+ - lib/ims/lti/models/content_items/lti_link_item.rb
283
+ - lib/ims/lti/models/icon_endpoint.rb
284
+ - lib/ims/lti/models/icon_info.rb
285
+ - lib/ims/lti/models/image.rb
286
+ - lib/ims/lti/models/localized_name.rb
287
+ - lib/ims/lti/models/localized_text.rb
288
+ - lib/ims/lti/models/lti_model.rb
289
+ - lib/ims/lti/models/membership_service.rb
290
+ - lib/ims/lti/models/membership_service/agent.rb
291
+ - lib/ims/lti/models/membership_service/container.rb
292
+ - lib/ims/lti/models/membership_service/context.rb
293
+ - lib/ims/lti/models/membership_service/lis_membership_container.rb
294
+ - lib/ims/lti/models/membership_service/lis_person.rb
295
+ - lib/ims/lti/models/membership_service/membership.rb
296
+ - lib/ims/lti/models/membership_service/organization.rb
297
+ - lib/ims/lti/models/membership_service/page.rb
298
+ - lib/ims/lti/models/membership_service/person.rb
299
+ - lib/ims/lti/models/message_handler.rb
300
+ - lib/ims/lti/models/messages.rb
301
+ - lib/ims/lti/models/messages/basic_lti_launch_request.rb
302
+ - lib/ims/lti/models/messages/content_item_selection.rb
303
+ - lib/ims/lti/models/messages/content_item_selection_request.rb
304
+ - lib/ims/lti/models/messages/message.rb
305
+ - lib/ims/lti/models/messages/registration_request.rb
306
+ - lib/ims/lti/models/messages/request_message.rb
307
+ - lib/ims/lti/models/messages/tool_proxy_update_request.rb
308
+ - lib/ims/lti/models/parameter.rb
309
+ - lib/ims/lti/models/product_family.rb
310
+ - lib/ims/lti/models/product_info.rb
311
+ - lib/ims/lti/models/product_instance.rb
312
+ - lib/ims/lti/models/resource_handler.rb
313
+ - lib/ims/lti/models/resource_type.rb
314
+ - lib/ims/lti/models/rest_service.rb
315
+ - lib/ims/lti/models/rest_service_profile.rb
316
+ - lib/ims/lti/models/security_contract.rb
317
+ - lib/ims/lti/models/security_profile.rb
318
+ - lib/ims/lti/models/serializable.rb
319
+ - lib/ims/lti/models/service_owner.rb
320
+ - lib/ims/lti/models/service_provider.rb
321
+ - lib/ims/lti/models/tool_consumer_profile.rb
322
+ - lib/ims/lti/models/tool_profile.rb
323
+ - lib/ims/lti/models/tool_proxy.rb
324
+ - lib/ims/lti/models/tool_setting.rb
325
+ - lib/ims/lti/models/tool_setting_container.rb
326
+ - lib/ims/lti/models/vendor.rb
327
+ - lib/ims/lti/outcome_request.rb
328
+ - lib/ims/lti/outcome_response.rb
329
+ - lib/ims/lti/request_validator.rb
330
+ - lib/ims/lti/role_checks.rb
331
+ - lib/ims/lti/serializers.rb
332
+ - lib/ims/lti/serializers/base.rb
333
+ - lib/ims/lti/serializers/membership_service.rb
334
+ - lib/ims/lti/serializers/membership_service/agent_serializer.rb
335
+ - lib/ims/lti/serializers/membership_service/container_serializer.rb
336
+ - lib/ims/lti/serializers/membership_service/context_serializer.rb
337
+ - lib/ims/lti/serializers/membership_service/lis_membership_container_serializer.rb
338
+ - lib/ims/lti/serializers/membership_service/lis_person_serializer.rb
339
+ - lib/ims/lti/serializers/membership_service/membership_serializer.rb
340
+ - lib/ims/lti/serializers/membership_service/organization_serializer.rb
341
+ - lib/ims/lti/serializers/membership_service/page_serializer.rb
342
+ - lib/ims/lti/serializers/membership_service/person_serializer.rb
343
+ - lib/ims/lti/services.rb
344
+ - lib/ims/lti/services/authentication_service.rb
345
+ - lib/ims/lti/services/message_authenticator.rb
346
+ - lib/ims/lti/services/oauth2_client.rb
347
+ - lib/ims/lti/services/tool_config.rb
348
+ - lib/ims/lti/services/tool_consumer_profile_service.rb
349
+ - lib/ims/lti/services/tool_proxy_registration_service.rb
350
+ - lib/ims/lti/services/tool_proxy_validator.rb
351
+ - lib/ims/lti/tool_base.rb
352
+ - lib/ims/lti/tool_config.rb
353
+ - lib/ims/lti/tool_consumer.rb
354
+ - lib/ims/lti/tool_provider.rb
355
+ - lib/ims/lti/version.rb
356
+ homepage: http://github.com/ahmedhamid13/qalam_ims_lti
357
+ licenses:
358
+ - MIT
359
+ metadata: {}
360
+ post_install_message:
361
+ rdoc_options: []
362
+ require_paths:
363
+ - lib
364
+ required_ruby_version: !ruby/object:Gem::Requirement
365
+ requirements:
366
+ - - ">="
367
+ - !ruby/object:Gem::Version
368
+ version: '0'
369
+ required_rubygems_version: !ruby/object:Gem::Requirement
370
+ requirements:
371
+ - - ">="
372
+ - !ruby/object:Gem::Version
373
+ version: '0'
374
+ requirements: []
375
+ rubygems_version: 3.2.21
376
+ signing_key:
377
+ specification_version: 4
378
+ summary: Ruby library for creating IMS LTI tool providers and consumers
379
+ test_files: []