canvas-api 1.0 → 1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/canvas-api.rb +66 -30
  3. metadata +18 -29
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 95c34739c1dbdc8b69b65bfa291bd1fa318825b4
4
+ data.tar.gz: ddcdac8157ef3ad82ef6a94d96d5bf668c07937c
5
+ SHA512:
6
+ metadata.gz: be00b864dfa100429fe449662aacf43a492b3bf35ad5f64015d11406ba37e1e557c4ad3a9718786aaf95a0a5ee13ae51b6a1c4c72c4eb81903934f34057dbf7a
7
+ data.tar.gz: 0fdf7e6e0f638a8fd07f43d923b4fd72f85e191bd852e6dab464016dc563b1b8b1513b66ae9e529588582c7af738e81465e6d36fa6ecaa8d7754aa232a29e13f
@@ -1,9 +1,8 @@
1
1
  require 'uri'
2
2
  require 'cgi'
3
3
  require 'net/http'
4
- require 'net/http/post/multipart'
5
4
  require 'json'
6
-
5
+ require 'typhoeus'
7
6
 
8
7
  module Canvas
9
8
  class API
@@ -104,25 +103,28 @@ module Canvas
104
103
  end
105
104
 
106
105
  def retrieve_response(request)
107
- request['User-Agent'] = "CanvasAPI Ruby"
106
+ request.options[:headers]['User-Agent'] = "CanvasAPI Ruby"
108
107
  begin
109
- response = @http.request(request)
108
+ response = request.run
109
+ raise ApiError.new("request timed out") if response.timed_out?
110
110
  rescue Timeout::Error => e
111
111
  raise ApiError.new("request timed out")
112
112
  end
113
- raise ApiError.new("unexpected redirect to #{response.location}") if response.code.to_s.match(/3\d\d/)
113
+ raise ApiError.new("unexpected redirect to #{response.headers['Location']}") if response.code.to_s.match(/3\d\d/)
114
114
  json = JSON.parse(response.body) rescue {'error' => 'invalid JSON'}
115
115
  if !json.is_a?(Array)
116
116
  raise ApiError.new(json['error']) if json['error']
117
+ raise ApiError.new(json['errors']) if json['errors']
117
118
  if !response.code.to_s.match(/2\d\d/)
118
119
  json['message'] ||= "unexpected error"
120
+ json['status'] ||= response.code.to_s
119
121
  raise ApiError.new("#{json['status']} #{json['message']}")
120
122
  end
121
123
  else
122
124
  json = ResultSet.new(self, json)
123
- if response['link']
124
- json.link = response['link']
125
- json.next_endpoint = response['link'].split(/,/).detect{|rel| rel.match(/rel="next"/) }.split(/;/).first.strip[1..-2].sub(/https?:\/\/[^\/]+/, '') rescue nil
125
+ if response.headers['Link']
126
+ json.link = response.headers['Link']
127
+ json.next_endpoint = response.headers['Link'].split(/,/).detect{|rel| rel.match(/rel="next"/) }.split(/;/).first.strip[1..-2].sub(/https?:\/\/[^\/]+/, '') rescue nil
126
128
  end
127
129
  end
128
130
  json
@@ -130,7 +132,7 @@ module Canvas
130
132
 
131
133
  # Semi-hack so I can write better specs
132
134
  def get_request(endpoint)
133
- Net::HTTP::Get.new(@uri.request_uri)
135
+ Typhoeus::Request.new(@uri.to_s, method: :get)
134
136
  end
135
137
 
136
138
  def get(endpoint, params=nil)
@@ -141,28 +143,29 @@ module Canvas
141
143
 
142
144
  def delete(endpoint, params={})
143
145
  generate_uri(endpoint, params['query_parameters'] || params[:query_parameters])
144
- request = Net::HTTP::Delete.new(@uri.request_uri)
145
- request.set_form_data(clean_params(params))
146
+ request = Typhoeus::Request.new(@uri.to_s, method: :delete)
147
+ request.options[:body] = clean_params(params)
146
148
  retrieve_response(request)
147
149
  end
148
150
 
149
151
  def put(endpoint, params={})
150
152
  generate_uri(endpoint, params['query_parameters'] || params[:query_parameters])
151
- request = Net::HTTP::Put.new(@uri.request_uri)
152
- request.set_form_data(clean_params(params))
153
+ request = Typhoeus::Request.new(@uri.to_s, method: :put)
154
+ request.options[:body] = clean_params(params)
153
155
  retrieve_response(request)
154
156
  end
155
157
 
156
158
  def post(endpoint, params={})
157
159
  generate_uri(endpoint, params['query_parameters'] || params[:query_parameters])
158
- request = Net::HTTP::Post.new(@uri.request_uri)
159
- request.set_form_data(clean_params(params))
160
+ request = Typhoeus::Request.new(@uri.to_s, method: :post)
161
+ request.options[:body] = params #clean_params(params)
160
162
  retrieve_response(request)
161
163
  end
162
164
 
163
165
  def post_multi(endpoint, params={})
164
166
  generate_uri(endpoint, params['query_parameters'] || params[:query_parameters])
165
- request = Net::HTTP::Post::Multipart.new(@uri.request_uri, params)
167
+ request = Typhoeus::Request.new(@uri.to_s, method: :post)
168
+ request.options[:body] = clean_params(params)
166
169
  retrieve_response(request)
167
170
  end
168
171
 
@@ -171,12 +174,12 @@ module Canvas
171
174
  return params if params.is_a?(Array)
172
175
  return nil unless params.is_a?(Hash)
173
176
  params.delete(:query_parameters)
174
- res = []
177
+ res = PairArray.new
175
178
  params.each do |key, val|
176
179
  if val.is_a?(Array)
177
180
  raise "No support for nested array parameters currently"
178
181
  elsif val.is_a?(Hash)
179
- res += clean_params(val, prefix ? (prefix + "[" + key.to_s + "]") : key.to_s)
182
+ res.concat clean_params(val, prefix ? (prefix + "[" + key.to_s + "]") : key.to_s)
180
183
  else
181
184
  if prefix
182
185
  res << [prefix + "[" + key.to_s + "]", val.to_s]
@@ -194,10 +197,14 @@ module Canvas
194
197
  :size => file.size,
195
198
  :name => opts[:name] || opts['name'] || File.basename(file.path),
196
199
  :content_type => opts[:content_type] || opts['content_type'] || "application/octet-stream",
197
- :parent_folder_id => opts[:parent_folder_id] || opts['parent_folder_id'],
198
- :parent_folder_path => opts[:parent_folder_path] || opts['parent_folder_path'],
199
200
  :on_duplicate => opts[:on_duplicate] || opts['on_duplicate']
200
201
  }
202
+ if opts[:parent_folder_id] || opts['parent_folder_id']
203
+ params[:parent_folder_id] = opts[:parent_folder_id] || opts['parent_folder_id']
204
+ elsif opts[:parent_folder_path] || opts['parent_folder_path']
205
+ params[:parent_folder_path] = opts[:parent_folder_path] || opts['parent_folder_path']
206
+ end
207
+
201
208
  res = post(endpoint, params)
202
209
  if !res['upload_url']
203
210
  raise ApiError.new("Unexpected error: #{res['message'] || 'no upload URL returned'}")
@@ -209,17 +216,16 @@ module Canvas
209
216
  end
210
217
 
211
218
  def multipart_upload(url, upload_params, params, file)
212
- uri = URI.parse(url)
213
- @multipart_args = upload_params.merge({})
214
- @multipart_args['file'] = UploadIO.new(file, params[:content_type], params[:name])
215
- http = Net::HTTP.new(uri.host, uri.port)
216
- http.use_ssl = uri.scheme == 'https'
217
- req = Net::HTTP::Post::Multipart.new(uri.path, @multipart_args)
218
- res = http.start do |stream_http|
219
- stream_http.request(req)
219
+ req = Typhoeus::Request.new(url, method: :post)
220
+ upload_params.each do |k, v|
221
+ upload_params[k] = v.to_s if v
220
222
  end
221
- raise ApiError.new("Unexpected error: #{res.body}") if !res['Location']
222
- res['Location']
223
+ upload_params['file'] = file
224
+ req.options[:body] = upload_params
225
+ @multi_request = req
226
+ res = req.run
227
+ raise ApiError.new("Unexpected error: #{res.body}") if !res.headers['Location']
228
+ res.headers['Location']
223
229
  end
224
230
 
225
231
  def upload_file_from_url(endpoint, opts)
@@ -277,4 +283,34 @@ module Canvas
277
283
  more
278
284
  end
279
285
  end
286
+ class PairArray < Array
287
+ end
288
+ end
289
+
290
+
291
+ # TODO: this is a hack that digs into the bowels of typhoeus
292
+ module Ethon
293
+ class Easy
294
+ module Queryable
295
+ def recursively_generate_pairs(h, prefix, pairs)
296
+ case h
297
+ when Hash
298
+ h.each_pair do |k,v|
299
+ key = prefix.nil? ? k : "#{prefix}[#{k}]"
300
+ pairs_for(v, key, pairs)
301
+ end
302
+ when Canvas::PairArray
303
+ h.each do |k, v|
304
+ key = prefix.nil? ? k : "#{prefix}[#{k}]"
305
+ pairs_for(v, key, pairs)
306
+ end
307
+ when Array
308
+ h.each_with_index do |v, i|
309
+ key = "#{prefix}[#{i}]"
310
+ pairs_for(v, key, pairs)
311
+ end
312
+ end
313
+ end
314
+ end
315
+ end
280
316
  end
metadata CHANGED
@@ -1,78 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas-api
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.0'
5
- prerelease:
4
+ version: '1.1'
6
5
  platform: ruby
7
6
  authors:
8
7
  - Instructure
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-03-05 00:00:00.000000000 Z
11
+ date: 2014-05-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: json
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
- name: multipart-post
28
+ name: typhoeus
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
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
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
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: :development
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: ruby-debug
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
  description:
@@ -82,33 +73,31 @@ extensions: []
82
73
  extra_rdoc_files:
83
74
  - LICENSE
84
75
  files:
85
- - lib/canvas-api.rb
76
+ - Changelog
86
77
  - LICENSE
87
78
  - README.md
88
- - Changelog
79
+ - lib/canvas-api.rb
89
80
  homepage: http://github.com/whitmer/canvas-api
90
81
  licenses: []
82
+ metadata: {}
91
83
  post_install_message:
92
84
  rdoc_options: []
93
85
  require_paths:
94
86
  - lib
95
87
  required_ruby_version: !ruby/object:Gem::Requirement
96
- none: false
97
88
  requirements:
98
- - - ! '>='
89
+ - - ">="
99
90
  - !ruby/object:Gem::Version
100
91
  version: '0'
101
92
  required_rubygems_version: !ruby/object:Gem::Requirement
102
- none: false
103
93
  requirements:
104
- - - ! '>='
94
+ - - ">="
105
95
  - !ruby/object:Gem::Version
106
96
  version: '0'
107
97
  requirements: []
108
98
  rubyforge_project:
109
- rubygems_version: 1.8.24
99
+ rubygems_version: 2.2.2
110
100
  signing_key:
111
- specification_version: 3
101
+ specification_version: 4
112
102
  summary: Ruby library for accessing the Canvas API
113
103
  test_files: []
114
- has_rdoc: