uploadcare-ruby 4.3.6 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +3 -4
- data/.rubocop.yml +1 -5
- data/CHANGELOG.md +18 -0
- data/Gemfile +6 -6
- data/README.md +6 -6
- data/lib/uploadcare/client/conversion/base_conversion_client.rb +2 -2
- data/lib/uploadcare/client/file_client.rb +2 -2
- data/lib/uploadcare/client/rest_client.rb +5 -2
- data/lib/uploadcare/client/rest_group_client.rb +1 -1
- data/lib/uploadcare/client/uploader_client.rb +22 -11
- data/lib/uploadcare/exception/request_error.rb +1 -2
- data/lib/uploadcare/exception/retry_error.rb +8 -0
- data/lib/uploadcare/param/secure_auth_header.rb +27 -13
- data/lib/uploadcare/ruby/version.rb +1 -1
- data/lib/uploadcare.rb +1 -12
- data/uploadcare-ruby.gemspec +2 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35dc34779d62684051b582e460d75f4e58acaa5f2c7372869b9fa753eea117e6
|
4
|
+
data.tar.gz: ac06dcf3b4921a8199849111bbd38d1ae7cfad4ad1f5d0adb43a06c885102045
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f189a6b962f27441c40f40f56db9fda78aa492e8d1ad1703663b85a6f6eb7df35f23fdab89c475ecbaec5701c0fc838d8d80f68ca7ee780c9037843906ade31c
|
7
|
+
data.tar.gz: cf4a88871447ed9733cfc777486ee77d6113a55f523b3a6e6eac0ec9340f0652ec85c01434544352094f7672283879a130d6816df31c2a1ba5d8897176ed7dbb
|
data/.github/workflows/ruby.yml
CHANGED
@@ -16,17 +16,17 @@ jobs:
|
|
16
16
|
strategy:
|
17
17
|
matrix:
|
18
18
|
ruby-version:
|
19
|
-
- 2.7
|
20
19
|
- 3.0
|
21
20
|
- 3.1
|
22
21
|
- 3.2
|
22
|
+
- 3.3
|
23
23
|
|
24
24
|
steps:
|
25
25
|
- uses: actions/checkout@v3
|
26
26
|
- name: Set up Ruby
|
27
27
|
uses: ruby/setup-ruby@v1
|
28
28
|
with:
|
29
|
-
bundler:
|
29
|
+
bundler: latest
|
30
30
|
ruby-version: ${{ matrix.ruby-version }}
|
31
31
|
bundler-cache: true
|
32
32
|
- name: Run tests
|
@@ -41,8 +41,7 @@ jobs:
|
|
41
41
|
strategy:
|
42
42
|
matrix:
|
43
43
|
ruby-version:
|
44
|
-
-
|
45
|
-
- 3.2
|
44
|
+
- 3.3
|
46
45
|
steps:
|
47
46
|
- uses: actions/checkout@v3
|
48
47
|
- name: Set up Ruby
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
AllCops:
|
2
2
|
NewCops: enable
|
3
|
-
TargetRubyVersion:
|
3
|
+
TargetRubyVersion: 3.0
|
4
4
|
|
5
5
|
Layout/LineLength:
|
6
6
|
Max: 120
|
@@ -14,10 +14,6 @@ Style/HashTransformKeys:
|
|
14
14
|
- 'lib/uploadcare/client/conversion/video_conversion_client.rb'
|
15
15
|
- 'lib/uploadcare/entity/file.rb'
|
16
16
|
|
17
|
-
Gemspec/RequiredRubyVersion:
|
18
|
-
Exclude:
|
19
|
-
- 'uploadcare-ruby.gemspec'
|
20
|
-
|
21
17
|
Metrics/BlockLength:
|
22
18
|
Exclude:
|
23
19
|
- 'bin/'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 4.4.0 — 2024-03-09
|
4
|
+
|
5
|
+
### Breaking
|
6
|
+
|
7
|
+
* Drop support of unmaintainable Ruby versions < 3.x.
|
8
|
+
|
9
|
+
### Fixed
|
10
|
+
|
11
|
+
* Update locations where Dry::Monads structure has changed.
|
12
|
+
* Sign URL uploads if configured (#139).
|
13
|
+
* Start returning proper error message when raising RequestError in poll_upload_response, to hint to users what is going on. Fixes #141.
|
14
|
+
* When polling, raise if an error is returned (#142).
|
15
|
+
* Fix documentation about original file url on simple file upload.
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
* Support params in Rest client and in file info method, to allow passing custom params like "include=appdata" in `Uploadcare::File.file` calls. Closes #132.
|
19
|
+
|
20
|
+
|
3
21
|
## 4.3.6 — 2023-11-18
|
4
22
|
|
5
23
|
### Fixed
|
data/Gemfile
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
source 'https://rubygems.org'
|
4
4
|
|
5
|
-
gem 'byebug'
|
6
|
-
gem 'rake'
|
7
|
-
gem 'rspec'
|
8
|
-
gem 'rubocop'
|
9
|
-
gem 'vcr'
|
10
|
-
gem 'webmock'
|
5
|
+
gem 'byebug'
|
6
|
+
gem 'rake'
|
7
|
+
gem 'rspec'
|
8
|
+
gem 'rubocop'
|
9
|
+
gem 'vcr'
|
10
|
+
gem 'webmock'
|
11
11
|
|
12
12
|
# Specify your gem's dependencies in uploadcare-ruby.gemspec
|
13
13
|
gemspec
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ wrapping Upload and REST APIs.
|
|
34
34
|
* [Useful links](#useful-links)
|
35
35
|
|
36
36
|
## Requirements
|
37
|
-
* ruby
|
37
|
+
* ruby 3.0+
|
38
38
|
|
39
39
|
## Compatibility
|
40
40
|
|
@@ -101,8 +101,8 @@ Using Uploadcare is simple, and here are the basics of handling files.
|
|
101
101
|
# => "dc99200d-9bd6-4b43-bfa9-aa7bfaefca40"
|
102
102
|
|
103
103
|
# URL for the file, can be used with your website or app right away
|
104
|
-
@uc_file.
|
105
|
-
# => "https://ucarecdn.com/dc99200d-9bd6-4b43-bfa9-aa7bfaefca40/"
|
104
|
+
@uc_file.original_file_url
|
105
|
+
# => "https://ucarecdn.com/dc99200d-9bd6-4b43-bfa9-aa7bfaefca40/your-file.png"
|
106
106
|
```
|
107
107
|
|
108
108
|
Your might then want to store or delete the uploaded file. Storing files could
|
@@ -134,7 +134,7 @@ Uploadcare::Uploader.upload("https://placekitten.com/96/139")
|
|
134
134
|
There are explicit ways to select upload type:
|
135
135
|
|
136
136
|
```ruby
|
137
|
-
files = [File.open("1.jpg"), File.open("1.jpg"]
|
137
|
+
files = [File.open("1.jpg"), File.open("1.jpg")]
|
138
138
|
Uploadcare::Uploader.upload_files(files)
|
139
139
|
|
140
140
|
Uploadcare::Uploader.upload_from_url("https://placekitten.com/96/139")
|
@@ -208,10 +208,10 @@ Entities are representations of objects in Uploadcare cloud.
|
|
208
208
|
|
209
209
|
#### File
|
210
210
|
|
211
|
-
File entity contains its metadata.
|
211
|
+
File entity contains its metadata. It also supports `include` param to include additional fields to the file object, such as: "appdata".
|
212
212
|
|
213
213
|
```ruby
|
214
|
-
@file = Uploadcare::File.file("FILE_ID_IN_YOUR_PROJECT")
|
214
|
+
@file = Uploadcare::File.file("FILE_ID_IN_YOUR_PROJECT", include: "appdata")
|
215
215
|
{
|
216
216
|
"datetime_removed"=>nil,
|
217
217
|
"datetime_stored"=>"2018-11-26T12:49:10.477888Z",
|
@@ -37,9 +37,9 @@ module Uploadcare
|
|
37
37
|
|
38
38
|
parsed_body = JSON.parse(response_body, symbolize_names: true)
|
39
39
|
errors = parsed_body[:error] || parsed_body[:problems]
|
40
|
-
return Dry::Monads::Failure(errors) unless errors.nil? || errors.empty?
|
40
|
+
return Dry::Monads::Result::Failure.call(errors) unless errors.nil? || errors.empty?
|
41
41
|
|
42
|
-
Dry::Monads::Success(parsed_body)
|
42
|
+
Dry::Monads::Result::Success.call(parsed_body)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Prepares body for convert_many method
|
@@ -16,8 +16,8 @@ module Uploadcare
|
|
16
16
|
|
17
17
|
# Acquire file info
|
18
18
|
# @see https://uploadcare.com/api-refs/rest-api/v0.7.0/#operation/fileInfo
|
19
|
-
def info(uuid)
|
20
|
-
get(uri: "/files/#{uuid}/")
|
19
|
+
def info(uuid, params = {})
|
20
|
+
get(uri: "/files/#{uuid}/", params: params)
|
21
21
|
end
|
22
22
|
alias file info
|
23
23
|
|
@@ -27,8 +27,11 @@ module Uploadcare
|
|
27
27
|
request_headers = Param::AuthenticationHeader.call(method: method.upcase, uri: uri,
|
28
28
|
content_type: headers[:'Content-Type'], **options)
|
29
29
|
handle_throttling do
|
30
|
-
send("api_struct_#{method.downcase}",
|
31
|
-
|
30
|
+
send("api_struct_#{method.downcase}",
|
31
|
+
path: remove_trailing_slash(uri),
|
32
|
+
headers: request_headers,
|
33
|
+
body: options[:content],
|
34
|
+
params: options[:params])
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative 'upload_client'
|
4
4
|
require 'retries'
|
5
5
|
require 'param/upload/upload_params_generator'
|
6
|
+
require 'param/upload/signature_generator'
|
6
7
|
|
7
8
|
module Uploadcare
|
8
9
|
module Client
|
@@ -42,7 +43,7 @@ module Uploadcare
|
|
42
43
|
uploaded_response = poll_upload_response(token_response.success[:token])
|
43
44
|
return uploaded_response if uploaded_response.success[:status] == 'error'
|
44
45
|
|
45
|
-
Dry::Monads::Success(files: [uploaded_response.success])
|
46
|
+
Dry::Monads::Result::Success.call(files: [uploaded_response.success])
|
46
47
|
end
|
47
48
|
|
48
49
|
# Check upload status
|
@@ -75,12 +76,22 @@ module Uploadcare
|
|
75
76
|
def poll_upload_response(token)
|
76
77
|
with_retries(max_tries: Uploadcare.config.max_request_tries,
|
77
78
|
base_sleep_seconds: Uploadcare.config.base_request_sleep,
|
78
|
-
max_sleep_seconds: Uploadcare.config.max_request_sleep
|
79
|
+
max_sleep_seconds: Uploadcare.config.max_request_sleep,
|
80
|
+
rescue: RetryError) do
|
79
81
|
response = get_upload_from_url_status(token)
|
80
|
-
|
82
|
+
handle_polling_response(response)
|
83
|
+
end
|
84
|
+
end
|
81
85
|
|
82
|
-
|
86
|
+
def handle_polling_response(response)
|
87
|
+
case response.success[:status]
|
88
|
+
when 'error'
|
89
|
+
raise RequestError, response.success[:error]
|
90
|
+
when 'progress', 'waiting', 'unknown'
|
91
|
+
raise RetryError, response.success[:error] || 'Upload is taking longer than expected. Try increasing the max_request_tries config if you know your file uploads will take more time.' # rubocop:disable Layout/LineLength
|
83
92
|
end
|
93
|
+
|
94
|
+
response
|
84
95
|
end
|
85
96
|
|
86
97
|
# Prepares body for upload_many method
|
@@ -96,13 +107,13 @@ module Uploadcare
|
|
96
107
|
|
97
108
|
# Prepare upload_from_url initial request body
|
98
109
|
def upload_from_url_body(url, options = {})
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
)
|
110
|
+
opts = {
|
111
|
+
'pub_key' => Uploadcare.config.public_key,
|
112
|
+
'source_url' => url,
|
113
|
+
'store' => store_value(options[:store])
|
114
|
+
}
|
115
|
+
opts.merge!(Param::Upload::SignatureGenerator.call) if Uploadcare.config.sign_uploads
|
116
|
+
HTTP::FormData::Multipart.new(options.merge(opts))
|
106
117
|
end
|
107
118
|
|
108
119
|
def store_value(store)
|
@@ -1,26 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'digest/md5'
|
4
|
+
require 'addressable/uri'
|
4
5
|
|
5
6
|
module Uploadcare
|
6
7
|
module Param
|
7
8
|
# This object returns headers needed for authentication
|
8
9
|
# This authentication method is more secure, but more tedious
|
9
10
|
class SecureAuthHeader
|
10
|
-
# @see https://uploadcare.com/docs/api_reference/rest/requests_auth/#auth-uploadcare
|
11
|
-
def self.call(options = {})
|
12
|
-
@method = options[:method]
|
13
|
-
@body = options[:content] || ''
|
14
|
-
@content_type = options[:content_type]
|
15
|
-
@uri = options[:uri]
|
16
|
-
@date_for_header = timestamp
|
17
|
-
{
|
18
|
-
Date: @date_for_header,
|
19
|
-
Authorization: "Uploadcare #{Uploadcare.config.public_key}:#{signature}"
|
20
|
-
}
|
21
|
-
end
|
22
|
-
|
23
11
|
class << self
|
12
|
+
# @see https://uploadcare.com/docs/api_reference/rest/requests_auth/#auth-uploadcare
|
13
|
+
def call(options = {})
|
14
|
+
@method = options[:method]
|
15
|
+
@body = options[:content] || ''
|
16
|
+
@content_type = options[:content_type]
|
17
|
+
@uri = make_uri(options)
|
18
|
+
|
19
|
+
@date_for_header = timestamp
|
20
|
+
{
|
21
|
+
Date: @date_for_header,
|
22
|
+
Authorization: "Uploadcare #{Uploadcare.config.public_key}:#{signature}"
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
24
26
|
def signature
|
25
27
|
content_md5 = Digest::MD5.hexdigest(@body)
|
26
28
|
sign_string = [@method, content_md5, @content_type, @date_for_header, @uri].join("\n")
|
@@ -31,6 +33,18 @@ module Uploadcare
|
|
31
33
|
def timestamp
|
32
34
|
Time.now.gmtime.strftime('%a, %d %b %Y %H:%M:%S GMT')
|
33
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def make_uri(options)
|
40
|
+
if options[:params] && !options[:params].empty?
|
41
|
+
uri = Addressable::URI.parse options[:uri]
|
42
|
+
uri.query_values = uri.query_values(Array).to_a.concat(options[:params].to_a)
|
43
|
+
uri.to_s
|
44
|
+
else
|
45
|
+
options[:uri]
|
46
|
+
end
|
47
|
+
end
|
34
48
|
end
|
35
49
|
end
|
36
50
|
end
|
data/lib/uploadcare.rb
CHANGED
@@ -6,6 +6,7 @@ require 'ruby/version'
|
|
6
6
|
# Exceptions
|
7
7
|
require 'exception/throttle_error'
|
8
8
|
require 'exception/request_error'
|
9
|
+
require 'exception/retry_error'
|
9
10
|
|
10
11
|
# Entities
|
11
12
|
require 'entity/entity'
|
@@ -33,18 +34,6 @@ require 'signed_url_generators/base_generator'
|
|
33
34
|
module Uploadcare
|
34
35
|
extend Dry::Configurable
|
35
36
|
|
36
|
-
# NOTE: The dry-configurable gem has introduced the `default` keyword argument
|
37
|
-
# and deprecated the positional default argument in v0.13.0, which requires
|
38
|
-
# Ruby >= 2.6.0. In order to provide backwards compatibility and not disable
|
39
|
-
# deprecation warnings, we override the dry-configurable's `setting` DSL method.
|
40
|
-
def self.setting(name, default:, **options, &block)
|
41
|
-
if RUBY_VERSION < '2.6'
|
42
|
-
super name, default, &block
|
43
|
-
else
|
44
|
-
super
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
37
|
setting :public_key, default: ENV.fetch('UPLOADCARE_PUBLIC_KEY', '')
|
49
38
|
setting :secret_key, default: ENV.fetch('UPLOADCARE_SECRET_KEY', '')
|
50
39
|
setting :auth_type, default: 'Uploadcare'
|
data/uploadcare-ruby.gemspec
CHANGED
@@ -43,6 +43,8 @@ Gem::Specification.new do |spec|
|
|
43
43
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
44
44
|
spec.require_paths = ['lib', 'lib/uploadcare', 'lib/uploadcare/rest']
|
45
45
|
|
46
|
+
spec.required_ruby_version = '>= 3.0'
|
47
|
+
|
46
48
|
spec.add_dependency 'mimemagic', '~> 0.4'
|
47
49
|
spec.add_dependency 'parallel', '~> 1.22'
|
48
50
|
spec.add_dependency 'retries', '~> 0.0'
|
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: 4.
|
4
|
+
version: 4.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "@dmitrijivanchenko (Dmitrij Ivanchenko), @T0mbery (Andrey Aksenov)"
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-03-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mimemagic
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- lib/uploadcare/entity/webhook.rb
|
133
133
|
- lib/uploadcare/exception/conversion_error.rb
|
134
134
|
- lib/uploadcare/exception/request_error.rb
|
135
|
+
- lib/uploadcare/exception/retry_error.rb
|
135
136
|
- lib/uploadcare/exception/throttle_error.rb
|
136
137
|
- lib/uploadcare/param/authentication_header.rb
|
137
138
|
- lib/uploadcare/param/conversion/document/processing_job_url_builder.rb
|
@@ -168,14 +169,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
168
169
|
requirements:
|
169
170
|
- - ">="
|
170
171
|
- !ruby/object:Gem::Version
|
171
|
-
version: '0'
|
172
|
+
version: '3.0'
|
172
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
174
|
requirements:
|
174
175
|
- - ">="
|
175
176
|
- !ruby/object:Gem::Version
|
176
177
|
version: '0'
|
177
178
|
requirements: []
|
178
|
-
rubygems_version: 3.
|
179
|
+
rubygems_version: 3.5.3
|
179
180
|
signing_key:
|
180
181
|
specification_version: 4
|
181
182
|
summary: Ruby wrapper for uploadcare API
|