lms-api 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/Rakefile +10 -10
- data/lib/lms/canvas.rb +51 -36
- data/lib/lms/version.rb +1 -1
- data/lib/tasks/canvas_api.rake +5 -5
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32377199608ae195be9f19c7f77dd605ead04f14
|
4
|
+
data.tar.gz: b85788d8c68781b28c35469ae45ff9d081315f72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7240adaed7b9ff946afddafa74134b034b2325d8d0bd024b1e5ad0ff0fa1e95db78e7bbe2500c3f260dd08b493b87dd47473ae0cc84e4fffa642250d4cef212
|
7
|
+
data.tar.gz: 9a4d9bb8f56e159a3db8fe391dfa8eedd1f673b37abf51cf0a2a0caf34cbe625b930868dc05789bf30d978fee7493e099a2ffab90cb71e7b1354f58b665b97ee
|
data/MIT-LICENSE
CHANGED
data/Rakefile
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
begin
|
2
|
-
require
|
2
|
+
require "bundler/setup"
|
3
3
|
rescue LoadError
|
4
|
-
puts
|
4
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
5
5
|
end
|
6
6
|
|
7
|
-
require
|
7
|
+
require "rdoc/task"
|
8
8
|
|
9
9
|
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
-
rdoc.rdoc_dir =
|
11
|
-
rdoc.title =
|
12
|
-
rdoc.options <<
|
13
|
-
rdoc.rdoc_files.include(
|
14
|
-
rdoc.rdoc_files.include(
|
10
|
+
rdoc.rdoc_dir = "rdoc"
|
11
|
+
rdoc.title = "LMS API"
|
12
|
+
rdoc.options << "--line-numbers"
|
13
|
+
rdoc.rdoc_files.include("README.rdoc")
|
14
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
15
15
|
end
|
16
16
|
|
17
|
-
load
|
17
|
+
load "./lib/tasks/canvas_api.rake"
|
18
18
|
|
19
19
|
Bundler::GemHelper.install_tasks
|
20
20
|
|
21
21
|
begin
|
22
|
-
require
|
22
|
+
require "rspec/core/rake_task"
|
23
23
|
RSpec::Core::RakeTask.new(:spec)
|
24
24
|
|
25
25
|
task default: :spec
|
data/lib/lms/canvas.rb
CHANGED
@@ -3,6 +3,7 @@ require "active_support"
|
|
3
3
|
require "active_support/core_ext/object/blank"
|
4
4
|
require "active_support/core_ext/object/to_query"
|
5
5
|
require "active_support/core_ext/hash/keys"
|
6
|
+
require "active_support/core_ext/hash/indifferent_access"
|
6
7
|
|
7
8
|
require "lms/canvas_urls"
|
8
9
|
|
@@ -33,7 +34,7 @@ module LMS
|
|
33
34
|
# set up a default auth callback. It assumes that #auth_state_model
|
34
35
|
# is set. If #auth_state_model will not be set, the client app must
|
35
36
|
# define a custom on_auth callback.
|
36
|
-
|
37
|
+
on_auth do |api|
|
37
38
|
api.lock do |record|
|
38
39
|
if record.token == api.authentication.token
|
39
40
|
record.update token: api.refresh_token
|
@@ -52,18 +53,24 @@ module LMS
|
|
52
53
|
@per_page = 100
|
53
54
|
@lms_uri = lms_uri
|
54
55
|
@refresh_token_options = refresh_token_options
|
55
|
-
if authentication.is_a?(String)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
@authentication = if authentication.is_a?(String)
|
57
|
+
OpenStruct.new(token: authentication)
|
58
|
+
else
|
59
|
+
authentication
|
60
|
+
end
|
60
61
|
|
61
62
|
if refresh_token_options.present?
|
62
63
|
required_options = [:client_id, :client_secret, :redirect_uri, :refresh_token]
|
63
64
|
extra_options = @refresh_token_options.keys - required_options
|
64
|
-
|
65
|
+
unless extra_options.empty?
|
66
|
+
raise InvalidRefreshOptionsException,
|
67
|
+
"Invalid option(s) provided: #{extra_options.join(', ')}"
|
68
|
+
end
|
65
69
|
missing_options = required_options - @refresh_token_options.keys
|
66
|
-
|
70
|
+
unless missing_options.empty?
|
71
|
+
raise InvalidRefreshOptionsException,
|
72
|
+
"Missing required option(s): #{missing_options.join(', ')}"
|
73
|
+
end
|
67
74
|
end
|
68
75
|
end
|
69
76
|
|
@@ -93,12 +100,10 @@ module LMS
|
|
93
100
|
def full_url(api_url, use_api_prefix = true)
|
94
101
|
if api_url[0...4] == "http"
|
95
102
|
api_url
|
103
|
+
elsif use_api_prefix
|
104
|
+
"#{@lms_uri}/api/v1/#{api_url}"
|
96
105
|
else
|
97
|
-
|
98
|
-
"#{@lms_uri}/api/v1/#{api_url}"
|
99
|
-
else
|
100
|
-
"#{@lms_uri}/#{api_url}"
|
101
|
-
end
|
106
|
+
"#{@lms_uri}/#{api_url}"
|
102
107
|
end
|
103
108
|
end
|
104
109
|
|
@@ -141,7 +146,7 @@ module LMS
|
|
141
146
|
def api_get_blocks_request(api_url, additional_headers = {})
|
142
147
|
connector = api_url.include?("?") ? "&" : "?"
|
143
148
|
next_url = "#{api_url}#{connector}per_page=#{@per_page}"
|
144
|
-
while next_url
|
149
|
+
while next_url
|
145
150
|
result = api_get_request(next_url, additional_headers)
|
146
151
|
yield result
|
147
152
|
next_url = get_next_url(result.headers["link"])
|
@@ -163,7 +168,9 @@ module LMS
|
|
163
168
|
}.merge(@refresh_token_options)
|
164
169
|
url = full_url("login/oauth2/token", false)
|
165
170
|
result = HTTParty.post(url, headers: headers, body: payload)
|
166
|
-
|
171
|
+
unless [200, 201].include?(result.response.code.to_i)
|
172
|
+
raise LMS::Canvas::RefreshTokenFailedException, api_error(result)
|
173
|
+
end
|
167
174
|
result["access_token"]
|
168
175
|
end
|
169
176
|
|
@@ -187,7 +194,7 @@ module LMS
|
|
187
194
|
|
188
195
|
def get_next_url(link)
|
189
196
|
return nil if link.blank?
|
190
|
-
if url = link.split(",").
|
197
|
+
if url = link.split(",").detect { |l| l.split(";")[1].strip == 'rel="next"' }
|
191
198
|
url.split(";")[0].gsub(/[\<\>\s]/, "")
|
192
199
|
end
|
193
200
|
end
|
@@ -199,9 +206,10 @@ module LMS
|
|
199
206
|
payload = {} if payload.blank?
|
200
207
|
payload_json = payload.is_a?(String) ? payload : payload.to_json
|
201
208
|
parsed_payload = payload.is_a?(String) ? JSON.parse(payload) : payload
|
209
|
+
parsed_payload = parsed_payload.with_indifferent_access
|
202
210
|
|
203
211
|
method = LMS::CANVAS_URLs[type][:method]
|
204
|
-
url = LMS::Canvas.lms_url(type, params,
|
212
|
+
url = LMS::Canvas.lms_url(type, params, parsed_payload)
|
205
213
|
|
206
214
|
case method
|
207
215
|
when "GET"
|
@@ -250,32 +258,36 @@ module LMS
|
|
250
258
|
|
251
259
|
# Make sure all required parameters are present
|
252
260
|
missing = []
|
253
|
-
if !
|
254
|
-
parameters.
|
261
|
+
if !ignore_required(type)
|
262
|
+
parameters.select { |p| p["required"] }.map { |p| p["name"] }.each do |p|
|
255
263
|
if p.include?("[") && p.include?("]")
|
256
|
-
parts = p.split(
|
264
|
+
parts = p.split("[")
|
257
265
|
parent = parts[0].to_sym
|
258
266
|
child = parts[1].gsub("]", "").to_sym
|
259
267
|
missing << p unless (params[parent].present? && params[parent][child].present?) ||
|
260
|
-
|
268
|
+
(payload.present? && payload[parent].present? && payload[parent][child].present?)
|
261
269
|
else
|
262
|
-
missing << p unless params[p.to_sym].present? ||
|
270
|
+
missing << p unless params[p.to_sym].present? ||
|
271
|
+
(payload.present? && !payload.is_a?(String) && payload[p.to_sym].present?)
|
263
272
|
end
|
264
273
|
end
|
265
274
|
end
|
266
275
|
|
267
|
-
if missing.
|
268
|
-
raise LMS::Canvas::MissingRequiredParameterException,
|
276
|
+
if !missing.empty?
|
277
|
+
raise LMS::Canvas::MissingRequiredParameterException,
|
278
|
+
"Missing required parameter(s): #{missing.join(', ')}"
|
269
279
|
end
|
270
280
|
|
271
281
|
# Generate the uri. Only allow path parameters
|
272
282
|
uri_proc = endpoint[:uri]
|
273
|
-
path_parameters = parameters.
|
283
|
+
path_parameters = parameters.select { |p| p["paramType"] == "path" }.
|
284
|
+
map { |p| p["name"].to_sym }
|
274
285
|
args = params.slice(*path_parameters).symbolize_keys
|
275
286
|
uri = args.blank? ? uri_proc.call : uri_proc.call(**args)
|
276
287
|
|
277
288
|
# Generate the query string
|
278
|
-
query_parameters = parameters.
|
289
|
+
query_parameters = parameters.select { |p| p["paramType"] == "query" }.
|
290
|
+
map { |p| p["name"].to_sym }
|
279
291
|
|
280
292
|
# always allow paging parameters
|
281
293
|
query_parameters << :per_page
|
@@ -297,9 +309,12 @@ module LMS
|
|
297
309
|
# Get all accounts including sub accounts
|
298
310
|
def all_accounts
|
299
311
|
all = []
|
300
|
-
|
312
|
+
proxy("LIST_ACCOUNTS", {}, nil, true).each do |account|
|
301
313
|
all << account
|
302
|
-
sub_accounts =
|
314
|
+
sub_accounts = proxy("GET_SUB_ACCOUNTS_OF_ACCOUNT",
|
315
|
+
{ account_id: account["id"] },
|
316
|
+
nil,
|
317
|
+
true)
|
303
318
|
all = all.concat(sub_accounts)
|
304
319
|
end
|
305
320
|
all
|
@@ -309,28 +324,28 @@ module LMS
|
|
309
324
|
# Exceptions
|
310
325
|
#
|
311
326
|
|
312
|
-
class
|
327
|
+
class CanvasException < RuntimeError
|
313
328
|
end
|
314
329
|
|
315
|
-
class RefreshTokenRequired <
|
330
|
+
class RefreshTokenRequired < CanvasException
|
316
331
|
end
|
317
332
|
|
318
|
-
class InvalidRefreshOptionsException <
|
333
|
+
class InvalidRefreshOptionsException < CanvasException
|
319
334
|
end
|
320
335
|
|
321
|
-
class RefreshTokenFailedException <
|
336
|
+
class RefreshTokenFailedException < CanvasException
|
322
337
|
end
|
323
338
|
|
324
|
-
class InvalidAPIRequestException <
|
339
|
+
class InvalidAPIRequestException < CanvasException
|
325
340
|
end
|
326
341
|
|
327
|
-
class InvalidAPIRequestFailedException <
|
342
|
+
class InvalidAPIRequestFailedException < CanvasException
|
328
343
|
end
|
329
344
|
|
330
|
-
class InvalidAPIMethodRequestException <
|
345
|
+
class InvalidAPIMethodRequestException < CanvasException
|
331
346
|
end
|
332
347
|
|
333
|
-
class MissingRequiredParameterException <
|
348
|
+
class MissingRequiredParameterException < CanvasException
|
334
349
|
end
|
335
350
|
|
336
351
|
end
|
data/lib/lms/version.rb
CHANGED
data/lib/tasks/canvas_api.rake
CHANGED
@@ -16,11 +16,11 @@ namespace :canvas do
|
|
16
16
|
graphql_primitive(type, property["format"])
|
17
17
|
when "array"
|
18
18
|
begin
|
19
|
-
if property["items"]["$ref"]
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
type = if property["items"]["$ref"]
|
20
|
+
property["items"]["$ref"]
|
21
|
+
else
|
22
|
+
graphql_primitive(property["items"]["type"], property["items"]["format"])
|
23
|
+
end
|
24
24
|
rescue
|
25
25
|
type = "GraphQLString"
|
26
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lms-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Atomic Jolt
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-01-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -82,6 +82,20 @@ dependencies:
|
|
82
82
|
- - ">="
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: byebug
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
85
99
|
description: Wrapper for the Instructure Canvas API
|
86
100
|
email:
|
87
101
|
- jamis@jamisbuck.org
|
@@ -130,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
144
|
version: '0'
|
131
145
|
requirements: []
|
132
146
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.
|
147
|
+
rubygems_version: 2.6.8
|
134
148
|
signing_key:
|
135
149
|
specification_version: 4
|
136
150
|
summary: Wrapper for the Instructure Canvas API
|