shrine-cloudinary 1.0.2 → 1.1.0
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.
- checksums.yaml +4 -4
- data/README.md +18 -46
- data/lib/shrine/storage/cloudinary.rb +41 -26
- data/shrine-cloudinary.gemspec +4 -4
- metadata +20 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fd427e7ba7152f8dcaa9d77157e5d6ab22ab48074ba06a3ed00523f81849ff7
|
4
|
+
data.tar.gz: 3b0c58833d9d2894b23633c365c9feff1fdf0e123f47cef0e8727e295ed96cfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cf2577f5450d758fcedd96b64a10daf73316d2842a7d1bc16c0c7e44dbb96a3562af4ba77da0721e333e93e2456a0426f535d4cff6f28d224ee22069aced825
|
7
|
+
data.tar.gz: 92e263bf7b5cd8905f7834f4ed12a64b892e36adc8a3bc7235db464cd43c33edb390ba10e366068cc5b9c556b75ce004200a11be2c269f432ce5c78f1060d180
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ an HTML widget for direct uploads.
|
|
9
9
|
## Installation
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem "shrine-cloudinary"
|
12
|
+
gem "shrine-cloudinary", "~> 1.1"
|
13
13
|
```
|
14
14
|
|
15
15
|
## Usage
|
@@ -29,47 +29,17 @@ Cloudinary.config(
|
|
29
29
|
|
30
30
|
Shrine.storages = {
|
31
31
|
cache: Shrine::Storage::Cloudinary.new(prefix: "cache"), # for direct uploads
|
32
|
-
store: Shrine::Storage::Cloudinary.new
|
32
|
+
store: Shrine::Storage::Cloudinary.new,
|
33
33
|
}
|
34
34
|
```
|
35
35
|
|
36
36
|
### Direct uploads
|
37
37
|
|
38
|
-
Cloudinary
|
39
|
-
|
40
|
-
can do direct uploads:
|
38
|
+
The `Shrine::Storage::Cloudinary` class implements the `#presign` method, so it
|
39
|
+
should work with Shrine's [presign_endpoint] plugin and Uppy's [AwsS3] plugin.
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
* [signed uploads via jQuery](http://cloudinary.com/documentation/jquery_image_upload)
|
45
|
-
|
46
|
-
The first one is the simplest, you can see the [demo] app with complete
|
47
|
-
implementation using shrine-cloudinary. Unsigned uploads don't require
|
48
|
-
communicating with the server, you just need to set up an "upload preset".
|
49
|
-
|
50
|
-
If you would prefer that the server controlls who is allowed to upload,
|
51
|
-
shrine-cloudinary also supports generating presigns, which works with the
|
52
|
-
direct_upload plugin in the same way that S3 does. When rendering on the server
|
53
|
-
side, you can generate a presign inline:
|
54
|
-
|
55
|
-
```erb
|
56
|
-
<input name="file" type="file"
|
57
|
-
class="cloudinary-fileupload" data-cloudinary-field="image_id"
|
58
|
-
data-form-data="<%= Shrine.storages[:cache].presign.fields.to_json %>">
|
59
|
-
```
|
60
|
-
|
61
|
-
Alternatively you can add an endpoint to your app which can generate presigns
|
62
|
-
on request, which is suitable for apps where templates are rendered on the
|
63
|
-
client-side (see [direct_upload] documentation):
|
64
|
-
|
65
|
-
```rb
|
66
|
-
Shrine.plugin :direct_upload, presign: true
|
67
|
-
```
|
68
|
-
```rb
|
69
|
-
Rails.application.routes.draw do
|
70
|
-
mount ImageUploader::UploadEndpoint => "/attachments/images"
|
71
|
-
end
|
72
|
-
```
|
41
|
+
If that doesn't work, you can always use Shrine's [upload_endpoint] plugin with
|
42
|
+
Uppy's [XHRUpload] plugin.
|
73
43
|
|
74
44
|
### Copying
|
75
45
|
|
@@ -109,7 +79,7 @@ If you want some [Cloudinary options] to be applied to all uploads, you can
|
|
109
79
|
specify `:upload_options`:
|
110
80
|
|
111
81
|
```rb
|
112
|
-
Shrine::Storage::Cloudinary.new(upload_options: {backup: true})
|
82
|
+
Shrine::Storage::Cloudinary.new(upload_options: { backup: true })
|
113
83
|
```
|
114
84
|
|
115
85
|
You can also apply upload options dynamically per upload using the
|
@@ -122,8 +92,8 @@ class MyUploader < Shrine
|
|
122
92
|
{
|
123
93
|
format: "png",
|
124
94
|
eager: [
|
125
|
-
{width: 500, height: 500, crop: :scale},
|
126
|
-
{width: 300, height: 300, crop: :crop, gravity: :south},
|
95
|
+
{ width: 500, height: 500, crop: :scale },
|
96
|
+
{ width: 300, height: 300, crop: :crop, gravity: :south },
|
127
97
|
]
|
128
98
|
}
|
129
99
|
end
|
@@ -133,7 +103,7 @@ end
|
|
133
103
|
Finally, you can pass upload options when using the uploader directly:
|
134
104
|
|
135
105
|
```rb
|
136
|
-
uploader.upload(file, upload_options: {format: "png"})
|
106
|
+
uploader.upload(file, upload_options: { format: "png" })
|
137
107
|
```
|
138
108
|
|
139
109
|
### URLs
|
@@ -189,7 +159,7 @@ for images. In Shrine you can leverage this via `:upload_options` and
|
|
189
159
|
|
190
160
|
```rb
|
191
161
|
Shrine::Storage::Cloudinary.new(
|
192
|
-
upload_options: {responsive_breakpoints: {...}},
|
162
|
+
upload_options: { responsive_breakpoints: {...} },
|
193
163
|
store_data: true,
|
194
164
|
)
|
195
165
|
```
|
@@ -218,7 +188,7 @@ If the `:responsive_breakpoints` value needs to be dynamic, you can use the
|
|
218
188
|
|
219
189
|
```rb
|
220
190
|
Shrine.plugin :upload_options, store: -> (io, context) do
|
221
|
-
{responsive_breakpoints: {...}}
|
191
|
+
{ responsive_breakpoints: {...} }
|
222
192
|
end
|
223
193
|
```
|
224
194
|
|
@@ -238,8 +208,8 @@ The default chunk size is 20 MB, but you can change that by passing
|
|
238
208
|
|
239
209
|
```rb
|
240
210
|
Shrine::Storage::Cloudinary.new(
|
241
|
-
large: 100*1024*1024
|
242
|
-
upload_options: {chunk_size: 5*1024*1204} # 5 MB
|
211
|
+
large: 100*1024*1024 # 100 MB
|
212
|
+
upload_options: { chunk_size: 5*1024*1204 } # 5 MB
|
243
213
|
)
|
244
214
|
```
|
245
215
|
|
@@ -298,6 +268,8 @@ This gem has been inspired by Cloudinary's [CarrierWave integration].
|
|
298
268
|
[Rails image manipulation]: http://cloudinary.com/documentation/rails_image_manipulation
|
299
269
|
[responsive breakpoints]: http://cloudinary.com/blog/introducing_intelligent_responsive_image_breakpoints_solutions
|
300
270
|
[explicit API]: http://cloudinary.com/documentation/image_upload_api_reference#explicit
|
301
|
-
[demo]: /demo
|
302
271
|
[control access]: http://cloudinary.com/documentation/upload_images#control_access_to_images
|
303
|
-
[
|
272
|
+
[presign_endpoint]: https://github.com/shrinerb/shrine/blob/master/doc/plugins/presign_endpoint.md#readme
|
273
|
+
[upload_endpoint]: https://github.com/shrinerb/shrine/blob/master/doc/plugins/upload_endpoint.md#readme
|
274
|
+
[AwsS3]: https://uppy.io/docs/aws-s3/
|
275
|
+
[XHRUpload]: https://uppy.io/docs/xhr-upload/
|
@@ -18,9 +18,8 @@ class Shrine
|
|
18
18
|
|
19
19
|
def upload(io, id, shrine_metadata: {}, **upload_options)
|
20
20
|
options = { public_id: public_id(id) }
|
21
|
-
options.
|
22
|
-
options.
|
23
|
-
options.update(upload_options)
|
21
|
+
options.merge!(@upload_options)
|
22
|
+
options.merge!(upload_options)
|
24
23
|
|
25
24
|
result = store(io, **options)
|
26
25
|
|
@@ -31,52 +30,47 @@ class Shrine
|
|
31
30
|
end
|
32
31
|
|
33
32
|
def update(id, **options)
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
def move(io, id, shrine_metadata: {}, **upload_options)
|
38
|
-
::Cloudinary::Uploader.rename(io.storage.public_id(io.id), public_id(id), default_options)
|
39
|
-
end
|
40
|
-
|
41
|
-
def movable?(io, id)
|
42
|
-
io.is_a?(UploadedFile) && io.storage.is_a?(Storage::Cloudinary)
|
33
|
+
uploader.explicit(public_id(id), **options)
|
43
34
|
end
|
44
35
|
|
45
36
|
def open(id, **options)
|
46
37
|
Down::Http.open(url(id, sign_url: true), **options)
|
38
|
+
rescue Down::NotFound
|
39
|
+
raise Shrine::FileNotFound, "file #{id.inspect} not found on storage"
|
47
40
|
end
|
48
41
|
|
49
42
|
def exists?(id)
|
50
|
-
result =
|
43
|
+
result = api.resources_by_ids([public_id(id)])
|
51
44
|
result.fetch("resources").any?
|
52
45
|
end
|
53
46
|
|
54
47
|
def delete(id)
|
55
|
-
|
48
|
+
uploader.destroy(public_id(id))
|
56
49
|
end
|
57
50
|
|
58
51
|
def url(id, **options)
|
59
|
-
|
52
|
+
utils.cloudinary_url(path(id), secure: true, **options)
|
60
53
|
end
|
61
54
|
|
62
55
|
def clear!(**options)
|
63
56
|
if prefix
|
64
|
-
|
57
|
+
api.delete_resources_by_prefix(prefix, **options)
|
65
58
|
else
|
66
|
-
|
59
|
+
api.delete_all_resources(**options)
|
67
60
|
end
|
68
61
|
end
|
69
62
|
|
70
|
-
def presign(id = nil, **
|
71
|
-
|
72
|
-
|
63
|
+
def presign(id = nil, **presign_options)
|
64
|
+
options = id ? { public_id: public_id(id) } : { folder: prefix }
|
65
|
+
options.merge!(@upload_options)
|
66
|
+
options.merge!(presign_options)
|
73
67
|
|
74
|
-
fields = ::Cloudinary::Uploader.build_upload_params(
|
68
|
+
fields = ::Cloudinary::Uploader.build_upload_params(options)
|
75
69
|
fields.reject! { |key, value| value.nil? || value == "" }
|
76
70
|
fields[:signature] = ::Cloudinary::Utils.api_sign_request(fields, ::Cloudinary.config.api_secret)
|
77
|
-
fields[:api_key]
|
71
|
+
fields[:api_key] = ::Cloudinary.config.api_key
|
78
72
|
|
79
|
-
url =
|
73
|
+
url = utils.cloudinary_api_url("upload")
|
80
74
|
|
81
75
|
{ method: :post, url: url, fields: fields }
|
82
76
|
end
|
@@ -99,18 +93,22 @@ class Shrine
|
|
99
93
|
|
100
94
|
def store(io, chunk_size: nil, **options)
|
101
95
|
if remote?(io)
|
102
|
-
|
96
|
+
uploader.upload(io.url, **options)
|
103
97
|
else
|
104
98
|
make_rest_client_recognize_as_file!(io)
|
105
99
|
if large?(io)
|
106
100
|
io.instance_eval { def match(*); false; end } # https://github.com/cloudinary/cloudinary_gem/pull/260
|
107
|
-
|
101
|
+
uploader.upload_large(io, chunk_size: chunk_size, **options)
|
108
102
|
else
|
109
|
-
|
103
|
+
uploader.upload(io, **options)
|
110
104
|
end
|
111
105
|
end
|
112
106
|
end
|
113
107
|
|
108
|
+
def uploader; Delegator.new(::Cloudinary::Uploader, default_options); end
|
109
|
+
def api; Delegator.new(::Cloudinary::Api, default_options); end
|
110
|
+
def utils; Delegator.new(::Cloudinary::Utils, default_options); end
|
111
|
+
|
114
112
|
def remote?(io)
|
115
113
|
io.is_a?(UploadedFile) && io.url.to_s =~ /^ftp:|^https?:/
|
116
114
|
end
|
@@ -175,6 +173,23 @@ class Shrine
|
|
175
173
|
"mpeg" => "video/mpeg",
|
176
174
|
"avi" => "video/x-msvideo",
|
177
175
|
}
|
176
|
+
|
177
|
+
# Delegates each method call to the specified klass, but passing
|
178
|
+
# specified default options.
|
179
|
+
class Delegator
|
180
|
+
def initialize(klass, default_options)
|
181
|
+
@klass = klass
|
182
|
+
@default_options = default_options
|
183
|
+
end
|
184
|
+
|
185
|
+
def method_missing(name, *args, **options, &block)
|
186
|
+
@klass.public_send(name, *args, **@default_options, **options, &block)
|
187
|
+
end
|
188
|
+
|
189
|
+
def respond_to_missing?(name, include_private = false)
|
190
|
+
@klass.respond_to?(name, include_private)
|
191
|
+
end
|
192
|
+
end
|
178
193
|
end
|
179
194
|
end
|
180
195
|
end
|
data/shrine-cloudinary.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "shrine-cloudinary"
|
3
|
-
gem.version = "1.0
|
3
|
+
gem.version = "1.1.0"
|
4
4
|
|
5
5
|
gem.required_ruby_version = ">= 2.1"
|
6
6
|
|
@@ -13,10 +13,10 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.files = Dir["README.md", "LICENSE.txt", "lib/**/*.rb", "*.gemspec"]
|
14
14
|
gem.require_path = "lib"
|
15
15
|
|
16
|
-
gem.add_dependency "shrine", "
|
16
|
+
gem.add_dependency "shrine", ">= 3.0.0.rc", "< 4"
|
17
17
|
gem.add_dependency "cloudinary", "< 2"
|
18
|
-
gem.add_dependency "down", "~>
|
19
|
-
gem.add_dependency "http", ">= 3.2"
|
18
|
+
gem.add_dependency "down", "~> 5.0"
|
19
|
+
gem.add_dependency "http", ">= 3.2", "< 5"
|
20
20
|
|
21
21
|
gem.add_development_dependency "rake"
|
22
22
|
gem.add_development_dependency "minitest"
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shrine-cloudinary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Janko Marohnić
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shrine
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0.rc
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
22
|
+
version: '4'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
29
|
+
version: 3.0.0.rc
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '4'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: cloudinary
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +50,14 @@ dependencies:
|
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
53
|
+
version: '5.0'
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
60
|
+
version: '5.0'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: http
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +65,9 @@ dependencies:
|
|
59
65
|
- - ">="
|
60
66
|
- !ruby/object:Gem::Version
|
61
67
|
version: '3.2'
|
68
|
+
- - "<"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '5'
|
62
71
|
type: :runtime
|
63
72
|
prerelease: false
|
64
73
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -66,6 +75,9 @@ dependencies:
|
|
66
75
|
- - ">="
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '3.2'
|
78
|
+
- - "<"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '5'
|
69
81
|
- !ruby/object:Gem::Dependency
|
70
82
|
name: rake
|
71
83
|
requirement: !ruby/object:Gem::Requirement
|