uploadcare-ruby 1.0.1.rc2 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/.gitignore +2 -0
- data/Gemfile +1 -0
- data/README.md +52 -0
- data/lib/uploadcare.rb +0 -14
- data/lib/uploadcare/api.rb +4 -1
- data/lib/uploadcare/api/file_api.rb +0 -2
- data/lib/uploadcare/api/group_api.rb +2 -2
- data/lib/uploadcare/api/raw_api.rb +6 -35
- data/lib/uploadcare/api/uploading_api.rb +39 -50
- data/lib/uploadcare/errors/errors.rb +64 -0
- data/lib/uploadcare/resources/file.rb +1 -9
- data/lib/uploadcare/resources/group.rb +1 -10
- data/lib/uploadcare/rest/connections/api_connection.rb +21 -0
- data/lib/uploadcare/rest/connections/upload_connection.rb +21 -0
- data/lib/uploadcare/rest/middlewares/parse_json_middleware.rb +31 -0
- data/lib/uploadcare/rest/middlewares/raise_error_middleware.rb +21 -0
- data/lib/uploadcare/{api → utils}/parser.rb +29 -0
- data/lib/uploadcare/version.rb +1 -1
- data/spec/parser_spec.rb +2 -2
- data/spec/rest/api_connection_spec.rb +19 -0
- data/spec/rest/errors_spec.rb +75 -0
- data/spec/rest/upload_connection_spec.rb +19 -0
- data/uploadcare-ruby.gemspec +2 -2
- metadata +24 -14
- data/lib/uploadcare/api/connections.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af26486fc47d098d6568263844e15b5d6f6a4fca
|
4
|
+
data.tar.gz: fc9b11f7d79f0ee2b95f3e88e2f7588972f1df2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fb9293930f8af75f06ee7c3cce438c01dc8115634a0b2634a79ef796c1c9c2816642a6d06f61c1b8f3e99e98ab5bd5a5d981480a922e162f485b14a1b942f89
|
7
|
+
data.tar.gz: ce565ece9f629a809d5142380b7704ece6b0175f9257a894e92ee0ed59141ef4d602f2e2299be12dec12257b26afe890d44281b3601070e890a99a1aaeb6f383
|
data/.DS_Store
CHANGED
Binary file
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -371,6 +371,58 @@ New groups created by :create_group method is loaded by default.
|
|
371
371
|
# #<Uploadcare::Api::File uuid="7bb9efa4-05c0-4f36-b0ef-11a4221867f6" ...>]
|
372
372
|
```
|
373
373
|
|
374
|
+
## Errors handling
|
375
|
+
From version 1.0.2 we have a custom exceptions which will raise when Uploadcare service return something with 4xx or 5xx HTTP status.
|
376
|
+
|
377
|
+
List of custom errors:
|
378
|
+
|
379
|
+
```ruby
|
380
|
+
400 => Uploadcare::Error::RequestError::BadRequest,
|
381
|
+
401 => Uploadcare::Error::RequestError::Unauthorized,
|
382
|
+
403 => Uploadcare::Error::RequestError::Forbidden,
|
383
|
+
404 => Uploadcare::Error::RequestError::NotFound,
|
384
|
+
406 => Uploadcare::Error::RequestError::NotAcceptable,
|
385
|
+
408 => Uploadcare::Error::RequestError::RequestTimeout,
|
386
|
+
422 => Uploadcare::Error::RequestError::UnprocessableEntity,
|
387
|
+
429 => Uploadcare::Error::RequestError::TooManyRequests,
|
388
|
+
500 => Uploadcare::Error::ServerError::InternalServerError,
|
389
|
+
502 => Uploadcare::Error::ServerError::BadGateway,
|
390
|
+
503 => Uploadcare::Error::ServerError::ServiceUnavailable,
|
391
|
+
504 => Uploadcare::Error::ServerError::GatewayTimeout
|
392
|
+
```
|
393
|
+
|
394
|
+
so now you could escape particular error (in that case 404: Not Found error):
|
395
|
+
|
396
|
+
```ruby
|
397
|
+
begin
|
398
|
+
@connection.send :get, '/random_url/', {}
|
399
|
+
rescue Uploadcare::Error::RequestError::NotFound => e
|
400
|
+
nil
|
401
|
+
end
|
402
|
+
```
|
403
|
+
|
404
|
+
... any request error (covers all 4xx status codes):
|
405
|
+
|
406
|
+
```ruby
|
407
|
+
begin
|
408
|
+
@connection.send :get, '/random_url/', {}
|
409
|
+
rescue Uploadcare::Error::RequestError => e
|
410
|
+
nil
|
411
|
+
end
|
412
|
+
```
|
413
|
+
|
414
|
+
...and actually any Uploadcare service errors:
|
415
|
+
|
416
|
+
```ruby
|
417
|
+
begin
|
418
|
+
@connection.send :get, '/random_url/', {}
|
419
|
+
rescue Uploadcare::Error => e
|
420
|
+
nil
|
421
|
+
end
|
422
|
+
```
|
423
|
+
|
424
|
+
Please note what almost all actions depends on Uploadcare servers and it will be wise of you to expect that servers will return error code (at least some times).
|
425
|
+
|
374
426
|
## Testing
|
375
427
|
|
376
428
|
Run `bundle exec rspec`.
|
data/lib/uploadcare.rb
CHANGED
@@ -26,18 +26,4 @@ module Uploadcare
|
|
26
26
|
def self.user_agent
|
27
27
|
USER_AGENT
|
28
28
|
end
|
29
|
-
|
30
|
-
UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
|
31
|
-
|
32
|
-
GROUP_UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}~(?<count>\d+)$/
|
33
|
-
|
34
|
-
CDN_URL_FILE_REGEX = /
|
35
|
-
(?<uuid>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})
|
36
|
-
(?:\/-\/(?<operations>.*?))?\/?$
|
37
|
-
/ix
|
38
|
-
|
39
|
-
CDN_URL_GROUP_REGEX = /
|
40
|
-
(?<uuid>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}~(?<count>\d+))
|
41
|
-
(?:\/-\/(?<operations>.*?))?\/?$
|
42
|
-
/ix
|
43
29
|
end
|
data/lib/uploadcare/api.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'ostruct'
|
3
|
-
|
3
|
+
Dir[File.dirname(__FILE__) + '/utils/*.rb'].each {|file| require file }
|
4
|
+
Dir[File.dirname(__FILE__) + '/errors/*.rb'].each {|file| require file }
|
5
|
+
Dir[File.dirname(__FILE__) + '/rest/middlewares/*.rb'].each {|file| require file }
|
6
|
+
Dir[File.dirname(__FILE__) + '/rest/connections/*.rb'].each {|file| require file }
|
4
7
|
Dir[File.dirname(__FILE__) + '/api/*.rb'].each {|file| require file }
|
5
8
|
Dir[File.dirname(__FILE__) + '/resources/*.rb'].each {|file| require file }
|
6
9
|
|
@@ -31,8 +31,8 @@ module Uploadcare
|
|
31
31
|
}
|
32
32
|
|
33
33
|
data.merge! files
|
34
|
-
post =
|
35
|
-
group = Uploadcare::Api::Group.new self, post["id"], post
|
34
|
+
post = @upload_connection.send :post, "/group/", data
|
35
|
+
group = Uploadcare::Api::Group.new self, post.body["id"], post.body
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
|
-
require 'uploadcare/api/connections'
|
4
|
-
|
5
3
|
module Uploadcare
|
6
4
|
module RawApi
|
7
5
|
|
8
6
|
def initialize options={}
|
9
|
-
@options = Uploadcare::default_settings.merge(options)
|
7
|
+
@options = Uploadcare::default_settings.merge(options)
|
8
|
+
@api_connection = Uploadcare::Connections::ApiConnection.new(@options)
|
9
|
+
@upload_connection = Uploadcare::Connections::UploadConnection.new(@options)
|
10
10
|
end
|
11
11
|
|
12
12
|
|
13
13
|
# basic request method
|
14
14
|
def request method = :get, path = "/files/", params = {}
|
15
|
-
response =
|
16
|
-
|
15
|
+
response = @api_connection.send method, path, params
|
16
|
+
response.body
|
17
17
|
end
|
18
18
|
alias_method :api_request, :request
|
19
19
|
|
@@ -29,6 +29,7 @@ module Uploadcare
|
|
29
29
|
request :post, path, params
|
30
30
|
end
|
31
31
|
|
32
|
+
|
32
33
|
# request with PUT verb
|
33
34
|
def put path= "/files/", params={}
|
34
35
|
request :put, path, params
|
@@ -39,35 +40,5 @@ module Uploadcare
|
|
39
40
|
def delete path= "/files/", params={}
|
40
41
|
request :delete, path, params
|
41
42
|
end
|
42
|
-
|
43
|
-
|
44
|
-
protected
|
45
|
-
def send_request method, path, params={}
|
46
|
-
connection = Uploadcare::Connections.api_connection(@options)
|
47
|
-
response = connection.send method, path, params
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
def parse response
|
52
|
-
begin
|
53
|
-
object = JSON.parse(response.body)
|
54
|
-
rescue JSON::ParserError
|
55
|
-
object = false
|
56
|
-
end
|
57
|
-
|
58
|
-
# and returning the object (file actually) or raise new error
|
59
|
-
if response.status < 300
|
60
|
-
object
|
61
|
-
else
|
62
|
-
message = "HTTP code #{response.status}"
|
63
|
-
if object # add active_support god damn it
|
64
|
-
message += ": #{object["detail"]}"
|
65
|
-
else
|
66
|
-
message += ": unknown error occured."
|
67
|
-
end
|
68
|
-
|
69
|
-
raise ArgumentError.new(message)
|
70
|
-
end
|
71
|
-
end
|
72
43
|
end
|
73
44
|
end
|
@@ -24,39 +24,33 @@ module Uploadcare
|
|
24
24
|
|
25
25
|
|
26
26
|
def upload_files files
|
27
|
-
if files.select {|f| !f.kind_of?(File)}.any?
|
28
|
-
raise ArgumentError.new "one or more of given files is not actually files"
|
29
|
-
else
|
30
|
-
data = {
|
31
|
-
UPLOADCARE_PUB_KEY: @options[:public_key],
|
32
|
-
}
|
33
|
-
|
34
|
-
files.each_with_index do |f, i|
|
35
|
-
data["file[#{i}]"] = Faraday::UploadIO.new(f.path, extract_mime_type(f))
|
36
|
-
end
|
27
|
+
raise ArgumentError.new "one or more of given files is not actually files" if files.select {|f| !f.kind_of?(File)}.any?
|
37
28
|
|
38
|
-
|
39
|
-
uuids = upload_parse(response)
|
29
|
+
data = {UPLOADCARE_PUB_KEY: @options[:public_key]}
|
40
30
|
|
41
|
-
|
31
|
+
files.each_with_index do |file, i|
|
32
|
+
data["file[#{i}]"] = build_upload_io(file)
|
42
33
|
end
|
34
|
+
|
35
|
+
response = @upload_connection.send :post, '/base/', data
|
36
|
+
uuids = response.body
|
37
|
+
|
38
|
+
files = uuids.values.map! {|f| Uploadcare::Api::File.new self, f }
|
43
39
|
end
|
44
40
|
|
45
41
|
|
46
42
|
# upload file to servise
|
47
43
|
def upload_file file
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
raise ArgumentError.new 'expecting File object'
|
59
|
-
end
|
44
|
+
raise ArgumentError.new 'expecting File object' unless file.kind_of?(File)
|
45
|
+
|
46
|
+
response = @upload_connection.send :post, '/base/', {
|
47
|
+
UPLOADCARE_PUB_KEY: @options[:public_key],
|
48
|
+
file: build_upload_io(file)
|
49
|
+
}
|
50
|
+
|
51
|
+
uuid = response.body["file"]
|
52
|
+
|
53
|
+
Uploadcare::Api::File.new self, uuid
|
60
54
|
end
|
61
55
|
|
62
56
|
# create file is the same as uplaod file
|
@@ -66,20 +60,19 @@ module Uploadcare
|
|
66
60
|
#upload from url
|
67
61
|
def upload_url url
|
68
62
|
uri = URI.parse(url)
|
63
|
+
|
64
|
+
raise ArgumentError.new 'invalid url was given' unless uri.kind_of?(URI::HTTP)
|
69
65
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
sleep 0.5
|
75
|
-
end
|
76
|
-
|
77
|
-
raise ArgumentError.new(response['error']) if response['status'] == 'error'
|
78
|
-
uuid = response['file_id']
|
79
|
-
Uploadcare::Api::File.new self, uuid
|
80
|
-
else
|
81
|
-
raise ArgumentError.new 'invalid url was given'
|
66
|
+
token = get_token(url)
|
67
|
+
|
68
|
+
while (response = get_status_response(token))['status'] == 'unknown'
|
69
|
+
sleep 0.5
|
82
70
|
end
|
71
|
+
|
72
|
+
raise ArgumentError.new(response['error']) if response['status'] == 'error'
|
73
|
+
|
74
|
+
uuid = response['file_id']
|
75
|
+
Uploadcare::Api::File.new self, uuid
|
83
76
|
end
|
84
77
|
alias_method :upload_from_url, :upload_url
|
85
78
|
|
@@ -87,33 +80,29 @@ module Uploadcare
|
|
87
80
|
|
88
81
|
|
89
82
|
protected
|
83
|
+
# DEPRECATRED but still works
|
90
84
|
def upload_request method, path, params = {}
|
91
|
-
|
92
|
-
response = connection.send method, path, params
|
85
|
+
response = @upload_connection.send method, path, params
|
93
86
|
end
|
94
87
|
|
95
|
-
|
96
|
-
|
97
|
-
raise ArgumentError.new(response.body) if response.status > 200
|
98
|
-
begin
|
99
|
-
JSON.parse(response.body)
|
100
|
-
rescue JSON::ParserError
|
101
|
-
response.body
|
102
|
-
end
|
88
|
+
def build_upload_io file
|
89
|
+
Faraday::UploadIO.new file.path, extract_mime_type(file)
|
103
90
|
end
|
104
91
|
|
105
92
|
|
106
93
|
private
|
107
94
|
def get_status_response token
|
108
|
-
|
95
|
+
response = @upload_connection.send :post, '/from_url/status/', {token: token}
|
96
|
+
response.body
|
109
97
|
end
|
110
98
|
|
111
99
|
|
112
100
|
def get_token url
|
113
|
-
response =
|
114
|
-
token =
|
101
|
+
response = @upload_connection.send :post, '/from_url/', { source_url: url, pub_key: @options[:public_key] }
|
102
|
+
token = response.body["token"]
|
115
103
|
end
|
116
104
|
|
105
|
+
|
117
106
|
def extract_mime_type file
|
118
107
|
types = MIME::Types.of(file.path)
|
119
108
|
types[0].content_type
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Uploadcare
|
2
|
+
class Error < ::StandardError
|
3
|
+
|
4
|
+
def self.define_error code, klass, message
|
5
|
+
class_eval <<-EOD
|
6
|
+
class #{klass} < self
|
7
|
+
def initialize( message = nil )
|
8
|
+
super( message || "HTTP #{code} - #{message}" )
|
9
|
+
end
|
10
|
+
end
|
11
|
+
EOD
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.errors
|
15
|
+
@errors ||= {
|
16
|
+
400 => Uploadcare::Error::RequestError::BadRequest,
|
17
|
+
401 => Uploadcare::Error::RequestError::Unauthorized,
|
18
|
+
403 => Uploadcare::Error::RequestError::Forbidden,
|
19
|
+
404 => Uploadcare::Error::RequestError::NotFound,
|
20
|
+
406 => Uploadcare::Error::RequestError::NotAcceptable,
|
21
|
+
408 => Uploadcare::Error::RequestError::RequestTimeout,
|
22
|
+
422 => Uploadcare::Error::RequestError::UnprocessableEntity,
|
23
|
+
429 => Uploadcare::Error::RequestError::TooManyRequests,
|
24
|
+
500 => Uploadcare::Error::ServerError::InternalServerError,
|
25
|
+
502 => Uploadcare::Error::ServerError::BadGateway,
|
26
|
+
503 => Uploadcare::Error::ServerError::ServiceUnavailable,
|
27
|
+
504 => Uploadcare::Error::ServerError::GatewayTimeout,
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# Overall service error so you could escape it no matter what code is return
|
33
|
+
|
34
|
+
# all 4xx error
|
35
|
+
class RequestError < self;
|
36
|
+
def initialize( message = nil )
|
37
|
+
super( message || "HTTP 4xx - a request error occured." )
|
38
|
+
end
|
39
|
+
|
40
|
+
define_error 400, "BadRequest", "the request cannot be fulfilled due to bad syntax."
|
41
|
+
define_error 401, "Unauthorized", "authentication is required and has failed or has not yet been provided."
|
42
|
+
define_error 403, "Forbidden", "the request was a valid request, but the server is refusing to respond to it."
|
43
|
+
define_error 404, "NotFound", "the requested resource could not be found."
|
44
|
+
define_error 406, "NotAcceptable", "the requested resource is only capable of generating content"
|
45
|
+
define_error 408, "RequestTimeout", "the server timed out waiting for the request."
|
46
|
+
define_error 422, "UnprocessableEntity", "the request was well-formed but was unable to be followed due to semantic errors."
|
47
|
+
define_error 429, "TooManyRequests", "too many requests in a given amount of time."
|
48
|
+
end
|
49
|
+
|
50
|
+
# all 5xx error
|
51
|
+
class ServerError < self;
|
52
|
+
def initialize( message = nil )
|
53
|
+
super( message || "HTTP 5xx - a server error occured." )
|
54
|
+
end
|
55
|
+
|
56
|
+
define_error 500, "InternalServerError", "some error occured on server."
|
57
|
+
define_error 502, "BadGateway", "received an invalid response from the upstream server."
|
58
|
+
define_error 503, "ServiceUnavailable", "the server is currently unavailable."
|
59
|
+
define_error 504, "GatewayTimeout", "the server did not receive a timely response from the upstream server."
|
60
|
+
end
|
61
|
+
|
62
|
+
# specific error
|
63
|
+
end
|
64
|
+
end
|
@@ -4,15 +4,7 @@ module Uploadcare
|
|
4
4
|
class Api
|
5
5
|
class File < OpenStruct
|
6
6
|
def initialize api, uuid_or_cdn_url, data=nil
|
7
|
-
result = Uploadcare::Parser.
|
8
|
-
|
9
|
-
unless result.is_a?(Uploadcare::Parser::File)
|
10
|
-
msg = "invalid CDN URL or UUID was given for file: #{uuid_or_cdn_url}."
|
11
|
-
if result.is_a?(Uploadcare::Parser::Group)
|
12
|
-
msg = msg + "\n Group UUID was given. Try call @api.group if it is what you intended."
|
13
|
-
end
|
14
|
-
raise msg
|
15
|
-
end
|
7
|
+
result = Uploadcare::Parser.parse_file_string uuid_or_cdn_url
|
16
8
|
|
17
9
|
file = {uuid: result["uuid"], operations: result["operations"]}
|
18
10
|
|
@@ -4,18 +4,9 @@ module Uploadcare
|
|
4
4
|
class Api
|
5
5
|
class Group < OpenStruct
|
6
6
|
def initialize api, uuid_or_cdn_url, data=nil
|
7
|
-
result = Uploadcare::Parser.
|
8
|
-
|
9
|
-
unless result.is_a?(Uploadcare::Parser::Group)
|
10
|
-
msg = "invalid CDN URL or UUID was given for group: #{uuid_or_cdn_url}."
|
11
|
-
if result.is_a?(Uploadcare::Parser::File)
|
12
|
-
msg = msg + "\n File UUID was given. Try call @api.file if it is what you intended."
|
13
|
-
end
|
14
|
-
raise msg
|
15
|
-
end
|
7
|
+
result = Uploadcare::Parser.parse_group_string(uuid_or_cdn_url)
|
16
8
|
|
17
9
|
@api = api
|
18
|
-
# self.files_count = result["count"]
|
19
10
|
group = {uuid: result["uuid"], files_count: result["count"]}
|
20
11
|
super group
|
21
12
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require "faraday_middleware"
|
3
|
+
module Uploadcare
|
4
|
+
module Connections
|
5
|
+
class ApiConnection < Faraday::Connection
|
6
|
+
def initialize options
|
7
|
+
super options[:api_url_base] do |frd|
|
8
|
+
frd.request :url_encoded
|
9
|
+
frd.use ::FaradayMiddleware::FollowRedirects, limit: 3
|
10
|
+
frd.adapter :net_http # actually, default adapter, just to be clear
|
11
|
+
frd.headers['Authorization'] = "Uploadcare.Simple #{options[:public_key]}:#{options[:private_key]}"
|
12
|
+
frd.headers['Accept'] = "application/vnd.uploadcare-v#{options[:api_version]}+json"
|
13
|
+
frd.headers['User-Agent'] = Uploadcare::user_agent
|
14
|
+
|
15
|
+
frd.response :raise_error
|
16
|
+
frd.response :parse_json
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "faraday"
|
2
|
+
|
3
|
+
module Uploadcare
|
4
|
+
module Connections
|
5
|
+
class UploadConnection < Faraday::Connection
|
6
|
+
def initialize options
|
7
|
+
ca_path = '/etc/ssl/certs' if File.exists?('/etc/ssl/certs')
|
8
|
+
|
9
|
+
super ssl: { ca_path: ca_path }, url: options[:upload_url_base] do |frd|
|
10
|
+
frd.request :multipart
|
11
|
+
frd.request :url_encoded
|
12
|
+
frd.adapter :net_http
|
13
|
+
frd.headers['User-Agent'] = Uploadcare::user_agent
|
14
|
+
|
15
|
+
frd.response :raise_error
|
16
|
+
frd.response :parse_json
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Uploadcare
|
5
|
+
module Connections
|
6
|
+
module Response
|
7
|
+
class ParseJson < Faraday::Response::Middleware
|
8
|
+
WHITESPACE_REGEX = /\A^\s*$\z/
|
9
|
+
|
10
|
+
def parse(body)
|
11
|
+
case body
|
12
|
+
when WHITESPACE_REGEX, nil
|
13
|
+
nil
|
14
|
+
else
|
15
|
+
JSON.parse(body)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def on_complete(response)
|
20
|
+
response[:body] = parse(response[:body]) if respond_to?(:parse) && !(response[:status] > 200) #!unparsable_status_codes.include?(response.status)
|
21
|
+
end
|
22
|
+
|
23
|
+
def unparsable_status_codes
|
24
|
+
[204, 301, 302, 304]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Faraday::Response.register_middleware :parse_json => Uploadcare::Connections::Response::ParseJson
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Uploadcare
|
4
|
+
module Connections
|
5
|
+
module Response
|
6
|
+
class RaiseError < Faraday::Response::Middleware
|
7
|
+
def on_complete(response)
|
8
|
+
@error_codes = Uploadcare::Error.errors.keys
|
9
|
+
@status = response[:status]
|
10
|
+
|
11
|
+
if @error_codes.include?(@status)
|
12
|
+
error = Uploadcare::Error.errors[@status].new
|
13
|
+
fail(error)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Faraday::Response.register_middleware :raise_error => Uploadcare::Connections::Response::RaiseError
|
@@ -9,6 +9,35 @@ module Uploadcare
|
|
9
9
|
(?:\/-\/(?<operations>.*?))?\/?$ # optional operations
|
10
10
|
/ix
|
11
11
|
|
12
|
+
def self.parse_file_string string
|
13
|
+
result = Uploadcare::Parser.parse(string)
|
14
|
+
|
15
|
+
unless result.is_a?(Uploadcare::Parser::File)
|
16
|
+
msg = "invalid CDN URL or UUID was given for file: #{uuid_or_cdn_url}."
|
17
|
+
if result.is_a?(Uploadcare::Parser::Group)
|
18
|
+
msg = msg + "\n Group UUID was given. Try call @api.group if it is what you intended."
|
19
|
+
end
|
20
|
+
raise msg
|
21
|
+
end
|
22
|
+
|
23
|
+
result
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def self.parse_group_string string
|
28
|
+
result = Uploadcare::Parser.parse(string)
|
29
|
+
|
30
|
+
unless result.is_a?(Uploadcare::Parser::Group)
|
31
|
+
msg = "invalid CDN URL or UUID was given for group: #{uuid_or_cdn_url}."
|
32
|
+
if result.is_a?(Uploadcare::Parser::File)
|
33
|
+
msg = msg + "\n File UUID was given. Try call @api.file if it is what you intended."
|
34
|
+
end
|
35
|
+
raise msg
|
36
|
+
end
|
37
|
+
|
38
|
+
result
|
39
|
+
end
|
40
|
+
|
12
41
|
def self.parse string
|
13
42
|
matched = META_URL.match(string)
|
14
43
|
|
data/lib/uploadcare/version.rb
CHANGED
data/spec/parser_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Uploadcare::
|
4
|
-
before :
|
3
|
+
describe Uploadcare::Parser do
|
4
|
+
before :all do
|
5
5
|
# http://www.ucarecdn.com/be4e24fb-2cad-476f-9417-ba95e3fefbf2~3/-/crop/123/-/fromat/png/
|
6
6
|
@uuid = "be4e24fb-2cad-476f-9417-ba95e3fefbf2"
|
7
7
|
@count = "12"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'uri'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
describe Uploadcare::Connections::ApiConnection do
|
6
|
+
before(:all) do
|
7
|
+
@settings = Uploadcare.default_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should initialize api connection' do
|
11
|
+
expect {Uploadcare::Connections::ApiConnection.new(@settings)}.to_not raise_error
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should use ParseJson and RaiseError middlewares' do
|
15
|
+
connection = Uploadcare::Connections::ApiConnection.new(@settings)
|
16
|
+
connection.builder.handlers.include?(Uploadcare::Connections::Response::ParseJson).should == true
|
17
|
+
connection.builder.handlers.include?(Uploadcare::Connections::Response::RaiseError).should == true
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'uri'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
describe Uploadcare::Error do
|
6
|
+
before(:all) do
|
7
|
+
@settings = Uploadcare.default_settings
|
8
|
+
@codes = [400,401,403,404,406,408,422,429,500,502,503,504]
|
9
|
+
@connection = Uploadcare::Connections::ApiConnection.new(@settings)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'Error codes should be accesbile' do
|
13
|
+
Uploadcare::Error.errors.keys.should == @codes
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'Errors should be kind of requested codes' do
|
17
|
+
not_found = Uploadcare::Error.errors[404]
|
18
|
+
not_found.new('File not found').should be_kind_of(Uploadcare::Error::RequestError::NotFound)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'errors should have meaningfull messages' do
|
22
|
+
not_found = Uploadcare::Error.errors[404]
|
23
|
+
error = not_found.new
|
24
|
+
error.message.should == "HTTP 404 - the requested resource could not be found."
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'Should raise an error' do
|
28
|
+
error = Uploadcare::Error::RequestError::NotFound
|
29
|
+
expect{ @connection.send :get, '/random_url/', {} }.to raise_error(error)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should escape particular error" do
|
33
|
+
error = Uploadcare::Error::RequestError::NotFound
|
34
|
+
expect do
|
35
|
+
begin
|
36
|
+
@connection.send :get, '/random_url/', {}
|
37
|
+
rescue error => e
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end.to_not raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should escape common request error' do
|
44
|
+
error = Uploadcare::Error::RequestError
|
45
|
+
expect do
|
46
|
+
begin
|
47
|
+
@connection.send :get, '/random_url/', {}
|
48
|
+
rescue error => e
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end.to_not raise_error
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should escape generic uploadcare service error' do
|
55
|
+
error = Uploadcare::Error
|
56
|
+
expect do
|
57
|
+
begin
|
58
|
+
@connection.send :get, '/random_url/', {}
|
59
|
+
rescue error => e
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
end.to_not raise_error
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should escape generic uploadcare service error' do
|
66
|
+
error = StandardError
|
67
|
+
expect do
|
68
|
+
begin
|
69
|
+
@connection.send :get, '/random_url/', {}
|
70
|
+
rescue error => e
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
end.to_not raise_error
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'uri'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
describe Uploadcare::Connections::UploadConnection do
|
6
|
+
before(:all) do
|
7
|
+
@settings = Uploadcare.default_settings
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should initialize upload connection' do
|
11
|
+
expect {Uploadcare::Connections::UploadConnection.new(@settings)}.to_not raise_error
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should use ParseJson and RaiseError middleware' do
|
15
|
+
connection = Uploadcare::Connections::UploadConnection.new(@settings)
|
16
|
+
connection.builder.handlers.include?(Uploadcare::Connections::Response::ParseJson).should == true
|
17
|
+
connection.builder.handlers.include?(Uploadcare::Connections::Response::RaiseError).should == true
|
18
|
+
end
|
19
|
+
end
|
data/uploadcare-ruby.gemspec
CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |gem|
|
|
25
25
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
26
26
|
gem.require_paths = ["lib"]
|
27
27
|
gem.version = Uploadcare::VERSION
|
28
|
-
gem.add_runtime_dependency 'faraday'
|
29
|
-
gem.add_runtime_dependency 'faraday_middleware'
|
28
|
+
gem.add_runtime_dependency 'faraday', '~> 0.8'
|
29
|
+
gem.add_runtime_dependency 'faraday_middleware', '~> 0.9'
|
30
30
|
gem.add_runtime_dependency 'multipart-post'
|
31
31
|
gem.add_runtime_dependency 'mime-types'
|
32
32
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uploadcare-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- '@rastyagaev (Vadim Rastyagaev)'
|
@@ -10,36 +10,36 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-04-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: faraday
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
21
|
+
version: '0.8'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '0'
|
28
|
+
version: '0.8'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: faraday_middleware
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ~>
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '0'
|
35
|
+
version: '0.9'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ~>
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '0'
|
42
|
+
version: '0.9'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: multipart-post
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,20 +113,24 @@ files:
|
|
113
113
|
- Rakefile
|
114
114
|
- lib/uploadcare.rb
|
115
115
|
- lib/uploadcare/api.rb
|
116
|
-
- lib/uploadcare/api/connections.rb
|
117
116
|
- lib/uploadcare/api/file_api.rb
|
118
117
|
- lib/uploadcare/api/file_list_api.rb
|
119
118
|
- lib/uploadcare/api/group_api.rb
|
120
119
|
- lib/uploadcare/api/group_list_api.rb
|
121
|
-
- lib/uploadcare/api/parser.rb
|
122
120
|
- lib/uploadcare/api/project_api.rb
|
123
121
|
- lib/uploadcare/api/raw_api.rb
|
124
122
|
- lib/uploadcare/api/uploading_api.rb
|
123
|
+
- lib/uploadcare/errors/errors.rb
|
125
124
|
- lib/uploadcare/resources/file.rb
|
126
125
|
- lib/uploadcare/resources/file_list.rb
|
127
126
|
- lib/uploadcare/resources/group.rb
|
128
127
|
- lib/uploadcare/resources/group_list.rb
|
129
128
|
- lib/uploadcare/resources/project.rb
|
129
|
+
- lib/uploadcare/rest/connections/api_connection.rb
|
130
|
+
- lib/uploadcare/rest/connections/upload_connection.rb
|
131
|
+
- lib/uploadcare/rest/middlewares/parse_json_middleware.rb
|
132
|
+
- lib/uploadcare/rest/middlewares/raise_error_middleware.rb
|
133
|
+
- lib/uploadcare/utils/parser.rb
|
130
134
|
- lib/uploadcare/version.rb
|
131
135
|
- spec/file_list_spec.rb
|
132
136
|
- spec/file_spec.rb
|
@@ -136,6 +140,9 @@ files:
|
|
136
140
|
- spec/parser_spec.rb
|
137
141
|
- spec/project_spec.rb
|
138
142
|
- spec/raw_api_spec.rb
|
143
|
+
- spec/rest/api_connection_spec.rb
|
144
|
+
- spec/rest/errors_spec.rb
|
145
|
+
- spec/rest/upload_connection_spec.rb
|
139
146
|
- spec/spec_helper.rb
|
140
147
|
- spec/uploading_multiple_spec.rb
|
141
148
|
- spec/uploading_spec.rb
|
@@ -159,9 +166,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
166
|
version: '0'
|
160
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
168
|
requirements:
|
162
|
-
- - '
|
169
|
+
- - '>='
|
163
170
|
- !ruby/object:Gem::Version
|
164
|
-
version:
|
171
|
+
version: '0'
|
165
172
|
requirements: []
|
166
173
|
rubyforge_project:
|
167
174
|
rubygems_version: 2.0.6
|
@@ -177,6 +184,9 @@ test_files:
|
|
177
184
|
- spec/parser_spec.rb
|
178
185
|
- spec/project_spec.rb
|
179
186
|
- spec/raw_api_spec.rb
|
187
|
+
- spec/rest/api_connection_spec.rb
|
188
|
+
- spec/rest/errors_spec.rb
|
189
|
+
- spec/rest/upload_connection_spec.rb
|
180
190
|
- spec/spec_helper.rb
|
181
191
|
- spec/uploading_multiple_spec.rb
|
182
192
|
- spec/uploading_spec.rb
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'faraday_middleware'
|
3
|
-
|
4
|
-
module Uploadcare
|
5
|
-
class Connections
|
6
|
-
def self.api_connection options
|
7
|
-
connection = Faraday.new url: options[:api_url_base] do |frd|
|
8
|
-
frd.request :url_encoded
|
9
|
-
frd.use FaradayMiddleware::FollowRedirects, limit: 3
|
10
|
-
frd.adapter :net_http # actually, default adapter, just to be clear
|
11
|
-
frd.headers['Authorization'] = "Uploadcare.Simple #{options[:public_key]}:#{options[:private_key]}"
|
12
|
-
frd.headers['Accept'] = "application/vnd.uploadcare-v#{options[:api_version]}+json"
|
13
|
-
frd.headers['User-Agent'] = Uploadcare::user_agent
|
14
|
-
end
|
15
|
-
|
16
|
-
connection
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.upload_connection options
|
20
|
-
ca_path = '/etc/ssl/certs' if File.exists?('/etc/ssl/certs')
|
21
|
-
|
22
|
-
connection = Faraday.new ssl: { ca_path: ca_path }, url: options[:upload_url_base] do |frd|
|
23
|
-
frd.request :multipart
|
24
|
-
frd.request :url_encoded
|
25
|
-
frd.adapter Faraday.default_adapter
|
26
|
-
frd.headers['User-Agent'] = Uploadcare::user_agent
|
27
|
-
end
|
28
|
-
|
29
|
-
connection
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|