canvas-api 1.0 → 1.1

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.
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: