shrine-url 0.2.1 → 0.3.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 +45 -13
- data/lib/shrine/storage/url.rb +58 -3
- data/shrine-url.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05b3f6c5186e58f0cf26662a88f33a956d17d2fc
|
4
|
+
data.tar.gz: 321ba3cf1043b2913a6dccf3056d024582072f69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c99cdb69217eef960d553f69d1d7b4191c527bf599eeb05432e80d093d3d26325a7807b9797cc7df9021e2acd99193e41cbd8431ad0c139b812d735572d9d0a5
|
7
|
+
data.tar.gz: 6e9589ed93f23b8e578177b1b7e67e87241374b3c424259c0458af361309530190b1141b091c0656e62911d87d9997ab31f2ed0ee7fbb02693508c4e8c6f8263
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Shrine::Storage::Url
|
2
2
|
|
3
|
-
Provides a "storage" which allows you to
|
3
|
+
Provides a "storage" which allows you to attach uploaded files defined by a
|
4
4
|
custom URL.
|
5
5
|
|
6
6
|
## Installation
|
@@ -17,16 +17,23 @@ require "shrine/storage/url"
|
|
17
17
|
Shrine.storages[:cache] = Shrine::Storage::Url.new
|
18
18
|
```
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
The custom URL should be assigned to the `id` field in the Shrine uploaded file
|
21
|
+
JSON representation:
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
```rb
|
24
|
+
{
|
25
|
+
"id": "http://example.com/image.jpg",
|
26
|
+
"storage": "cache",
|
27
|
+
"metadata": {
|
28
|
+
# ...
|
29
|
+
}
|
27
30
|
}
|
31
|
+
```
|
28
32
|
|
29
|
-
|
33
|
+
Now you can assign this data as the cached attachment:
|
34
|
+
|
35
|
+
```rb
|
36
|
+
photo = Photo.new(image: data)
|
30
37
|
photo.image #=> #<Shrine::UploadedFile>
|
31
38
|
|
32
39
|
photo.image.url #=> "http://example.com/image.jpg"
|
@@ -36,12 +43,34 @@ photo.image.exists? # Sends a HEAD request and returns true if it's 2xx
|
|
36
43
|
photo.image.delete # Sends a DELETE request
|
37
44
|
```
|
38
45
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
46
|
+
No HTTP requests are made at this point. When the cached file is uploaded to
|
47
|
+
permanent storage, `shrine-url` will by default use [Down] to download the file
|
48
|
+
from the given URL, before uploading it to permanent storage.
|
49
|
+
|
50
|
+
Note that Down doesn't yet support resuming the download in case of network
|
51
|
+
failures, so if you're expecting large files to be attached, you might want to
|
52
|
+
tell `Shrine::Storage::Url` to use `wget` instead of Down.
|
53
|
+
|
54
|
+
```rb
|
55
|
+
Shrine::Storage::Url.new(downloader: :wget)
|
56
|
+
```
|
57
|
+
|
58
|
+
Just note that using `wget` won't work well with the `restore_cached_data`
|
59
|
+
Shrine plugin from the performance standpoint, because `wget` doesn't support
|
60
|
+
partial downloads, so the file would first be fully downloaded before
|
61
|
+
extracting metadata.
|
62
|
+
|
63
|
+
If you're using permanent storage that supports uploading from remote URL (like
|
64
|
+
[shrine-cloudinary] or [shrine-uploadcare]), downloading will be completely
|
65
|
+
skipped and the permanent storage will use only the custom URL for uploading
|
66
|
+
the file.
|
67
|
+
|
68
|
+
## Advantages and Use Cases
|
43
69
|
|
44
|
-
|
70
|
+
The main advantage of using `shrine-url` over the `remote_url` Shrine plugin is
|
71
|
+
that you can put downloading from the URL into a background job by loading the
|
72
|
+
`backgrounding` Shrine plugin. Another advantage is that you can assign
|
73
|
+
multiple remote URLs as multiple versions.
|
45
74
|
|
46
75
|
This storage can be used with [shrine-transloadit] for direct uploads, where a
|
47
76
|
temporary URL of the uploaded file is returned, and we want to use that URL for
|
@@ -64,3 +93,6 @@ $ rake test
|
|
64
93
|
|
65
94
|
[shrine-transloadit]: https://github.com/janko-m/shrine-transloadit
|
66
95
|
[shrine-tus-demo]: https://github.com/janko-m/shrine-tus-demo
|
96
|
+
[shrine-cloudinary]: https://github.com/janko-m/shrine-cloudinary
|
97
|
+
[shrine-uploadcare]: https://github.com/janko-m/shrine-uploadcare
|
98
|
+
[Down]: https://github.com/janko-m/down
|
data/lib/shrine/storage/url.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
1
|
require "shrine"
|
2
|
-
require "down"
|
3
2
|
require "net/http"
|
4
3
|
|
5
4
|
class Shrine
|
6
5
|
module Storage
|
7
6
|
class Url
|
7
|
+
def initialize(downloader: :down)
|
8
|
+
@downloader = Downloader.new(downloader)
|
9
|
+
end
|
10
|
+
|
8
11
|
def upload(io, id, **)
|
9
12
|
id.replace(io.url)
|
10
13
|
end
|
11
14
|
|
12
15
|
def download(id)
|
13
|
-
|
16
|
+
@downloader.download(id)
|
14
17
|
end
|
15
18
|
|
16
19
|
def open(id)
|
17
|
-
|
20
|
+
@downloader.open(id)
|
18
21
|
end
|
19
22
|
|
20
23
|
def exists?(id)
|
@@ -44,6 +47,58 @@ class Shrine
|
|
44
47
|
|
45
48
|
response
|
46
49
|
end
|
50
|
+
|
51
|
+
class Downloader
|
52
|
+
SUPPORTED_TOOLS = [:down, :wget]
|
53
|
+
|
54
|
+
def initialize(tool)
|
55
|
+
raise ArgumentError, "unsupported downloading tool: #{tool}" unless SUPPORTED_TOOLS.include?(tool)
|
56
|
+
|
57
|
+
@tool = tool
|
58
|
+
end
|
59
|
+
|
60
|
+
def download(url)
|
61
|
+
send(:"download_with_#{@tool}", url)
|
62
|
+
end
|
63
|
+
|
64
|
+
def open(url)
|
65
|
+
send(:"open_with_#{@tool}", url)
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def download_with_down(url)
|
71
|
+
require "down"
|
72
|
+
Down.download(url)
|
73
|
+
end
|
74
|
+
|
75
|
+
def open_with_down(url)
|
76
|
+
require "down"
|
77
|
+
Down.open(url)
|
78
|
+
end
|
79
|
+
|
80
|
+
def download_with_wget(url)
|
81
|
+
require "tempfile"
|
82
|
+
require "open3"
|
83
|
+
|
84
|
+
tempfile = Tempfile.new("shrine-url", binmode: true)
|
85
|
+
cmd = %W[wget --no-verbose #{url} -O #{tempfile.path}]
|
86
|
+
stdout, stderr, status = Open3.capture3(*cmd)
|
87
|
+
|
88
|
+
if !status.success?
|
89
|
+
tempfile.close!
|
90
|
+
raise "downloading from #{url} failed: #{stderr}"
|
91
|
+
end
|
92
|
+
|
93
|
+
tempfile.tap(&:open)
|
94
|
+
end
|
95
|
+
|
96
|
+
def open_with_wget(url)
|
97
|
+
tempfile = download_with_wget(url)
|
98
|
+
tempfile.instance_eval { def close(unlink_now=true) super end } # delete tempfile when it's closed
|
99
|
+
tempfile
|
100
|
+
end
|
101
|
+
end
|
47
102
|
end
|
48
103
|
end
|
49
104
|
end
|
data/shrine-url.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shrine-url
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.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: 2017-
|
11
|
+
date: 2017-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shrine
|