down 5.4.2 → 5.5.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/CHANGELOG.md +14 -0
- data/README.md +10 -50
- data/down.gemspec +8 -13
- data/lib/down/http.rb +14 -6
- data/lib/down/httpx.rb +14 -7
- data/lib/down/net_http.rb +25 -11
- data/lib/down/version.rb +1 -1
- data/lib/down/wget.rb +2 -0
- metadata +29 -33
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9658c84910478f3dfce33c56625fe4e60ad4099afdceeef9288355d8bc43ba26
|
|
4
|
+
data.tar.gz: 4009abef1c18006798565de452a7472a418cdda49d5c736fc262bb7cc058855c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3181b47973db1b65ea4c9c3a7f6d39beed4d4cdd2e37bdf3218a3924204f64a1c98b0df70e4c6b7176a99d32396840f094f89b26c50d39e263277d11f7472840
|
|
7
|
+
data.tar.gz: 906c4e18bb4576aa5985e2da38ddbbcc0dff228255773fc3a2f3c9ced301f65bcf4dacd6529d1c293eec1502b719ca4ce99b7b07cfab3d8cf70012b97fc6ce97
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## 5.5.0 (2026-03-18)
|
|
2
|
+
|
|
3
|
+
* Add support for http.rb 6.0 (@sferik)
|
|
4
|
+
|
|
5
|
+
* Fix `Down::TooManyRedirects` error with `Down::Httpx` happening on first redirect (@artrybalko)
|
|
6
|
+
|
|
7
|
+
* Add `:auth_on_redirect` option to `Down::NetHttp` backend for skipping authentication on redirects (@makrsmark)
|
|
8
|
+
|
|
9
|
+
* Add `:tempfile_name` keyword argument to `.download` for overriding tempfile prefix (@softwaregravy)
|
|
10
|
+
|
|
11
|
+
* Drop support for Ruby 2.6 and older (@janko)
|
|
12
|
+
|
|
13
|
+
* Deprecate wget backend (@janko)
|
|
14
|
+
|
|
1
15
|
## 5.4.2 (2024-04-19)
|
|
2
16
|
|
|
3
17
|
* Add support for HTTPX 1.x (@HoneyryderChuck)
|
data/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Down
|
|
2
2
|
|
|
3
3
|
Down is a utility tool for streaming, flexible and safe downloading of remote
|
|
4
|
-
files. It can use [open-uri] + `Net::HTTP`, [http.rb]
|
|
5
|
-
|
|
4
|
+
files. It can use [open-uri] + `Net::HTTP`, [http.rb] or [HTTPX] as the backend
|
|
5
|
+
HTTP library.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -70,6 +70,13 @@ tempfile = Down.download("http://example.com/some/file", extension: "txt")
|
|
|
70
70
|
File.extname(tempfile.path) #=> ".txt"
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
+
You can also override the default tempfile prefix:
|
|
74
|
+
|
|
75
|
+
```rb
|
|
76
|
+
tempfile = Down.download("http://example.com/image.jpg", tempfile_name: "custom-prefix")
|
|
77
|
+
File.basename(tempfile.path) #=> "custom-prefix20150925-55456-z7vxqz.jpg"
|
|
78
|
+
```
|
|
79
|
+
|
|
73
80
|
### Basic authentication
|
|
74
81
|
|
|
75
82
|
`Down.download` and `Down.open` will automatically detect and apply HTTP basic
|
|
@@ -235,7 +242,6 @@ The following backends are available:
|
|
|
235
242
|
* [Down::NetHttp](#downnethttp) (default)
|
|
236
243
|
* [Down::Http](#downhttp)
|
|
237
244
|
* [Down::Httpx](#downhttpx)
|
|
238
|
-
* [Down::Wget](#downwget)
|
|
239
245
|
|
|
240
246
|
You can use the backend directly:
|
|
241
247
|
|
|
@@ -450,7 +456,7 @@ supports the HTTP/2 protocol, in addition to many other features.
|
|
|
450
456
|
|
|
451
457
|
```rb
|
|
452
458
|
gem "down", "~> 5.0"
|
|
453
|
-
gem "httpx", "~> 0
|
|
459
|
+
gem "httpx", "~> 1.0"
|
|
454
460
|
```
|
|
455
461
|
```rb
|
|
456
462
|
require "down/httpx"
|
|
@@ -465,52 +471,6 @@ io #=> #<Down::ChunkedIO ...>
|
|
|
465
471
|
It's implemented in much of the same way as `Down::Http`, so be sure to check
|
|
466
472
|
its docs for ways to pass additional options.
|
|
467
473
|
|
|
468
|
-
### Down::Wget (experimental)
|
|
469
|
-
|
|
470
|
-
The `Down::Wget` backend implements downloads using the `wget` command line
|
|
471
|
-
utility.
|
|
472
|
-
|
|
473
|
-
```rb
|
|
474
|
-
gem "down", "~> 5.0"
|
|
475
|
-
gem "posix-spawn" # omit if on JRuby
|
|
476
|
-
gem "http_parser.rb"
|
|
477
|
-
```
|
|
478
|
-
```rb
|
|
479
|
-
require "down/wget"
|
|
480
|
-
|
|
481
|
-
tempfile = Down::Wget.download("http://nature.com/forest.jpg")
|
|
482
|
-
tempfile #=> #<Tempfile:/var/folders/k7/6zx6dx6x7ys3rv3srh0nyfj00000gn/T/20150925-55456-z7vxqz.jpg>
|
|
483
|
-
|
|
484
|
-
io = Down::Wget.open("http://nature.com/forest.jpg")
|
|
485
|
-
io #=> #<Down::ChunkedIO ...>
|
|
486
|
-
```
|
|
487
|
-
|
|
488
|
-
One major advantage of `wget` is that it automatically resumes downloads that
|
|
489
|
-
were interrupted due to network failures, which is very useful when you're
|
|
490
|
-
downloading large files.
|
|
491
|
-
|
|
492
|
-
However, the Wget backend should still be considered experimental, as it wasn't
|
|
493
|
-
easy to implement a CLI wrapper that streams output, so it's possible that I've
|
|
494
|
-
made mistakes. Let me know how it's working out for you 😉.
|
|
495
|
-
|
|
496
|
-
#### Additional arguments
|
|
497
|
-
|
|
498
|
-
You can pass additional arguments to the underlying `wget` commmand via symbols:
|
|
499
|
-
|
|
500
|
-
```rb
|
|
501
|
-
Down::Wget.download("http://nature.com/forest.jpg", :no_proxy, connect_timeout: 3)
|
|
502
|
-
Down::Wget.open("http://nature.com/forest.jpg", user: "janko", password: "secret")
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
You can also initialize the backend with default arguments:
|
|
506
|
-
|
|
507
|
-
```rb
|
|
508
|
-
wget = Down::Wget.new(:no_proxy, connect_timeout: 3)
|
|
509
|
-
|
|
510
|
-
wget.download("http://nature.com/forest.jpg")
|
|
511
|
-
wget.open("http://nature.com/forest.jpg")
|
|
512
|
-
```
|
|
513
|
-
|
|
514
474
|
## Development
|
|
515
475
|
|
|
516
476
|
Tests require that a [httpbin] server is running locally, which you can do via Docker:
|
data/down.gemspec
CHANGED
|
@@ -4,9 +4,9 @@ Gem::Specification.new do |spec|
|
|
|
4
4
|
spec.name = "down"
|
|
5
5
|
spec.version = Down::VERSION
|
|
6
6
|
|
|
7
|
-
spec.required_ruby_version = ">= 2.
|
|
7
|
+
spec.required_ruby_version = ">= 2.7"
|
|
8
8
|
|
|
9
|
-
spec.summary = "Robust streaming downloads using Net::HTTP,
|
|
9
|
+
spec.summary = "Robust streaming downloads using Net::HTTP, http.rb or HTTPX."
|
|
10
10
|
spec.homepage = "https://github.com/janko/down"
|
|
11
11
|
spec.authors = ["Janko Marohnić"]
|
|
12
12
|
spec.email = ["janko.marohnic@gmail.com"]
|
|
@@ -16,18 +16,13 @@ Gem::Specification.new do |spec|
|
|
|
16
16
|
spec.require_path = "lib"
|
|
17
17
|
|
|
18
18
|
spec.add_dependency "addressable", "~> 2.8"
|
|
19
|
+
spec.add_dependency "base64", "~> 0.3"
|
|
19
20
|
|
|
20
|
-
spec.add_development_dependency "minitest", "~>
|
|
21
|
+
spec.add_development_dependency "minitest", "~> 6.0"
|
|
21
22
|
spec.add_development_dependency "mocha", "~> 1.5"
|
|
22
23
|
spec.add_development_dependency "rake"
|
|
23
|
-
spec.add_development_dependency "httpx", "~> 0", "<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
else
|
|
28
|
-
spec.add_development_dependency "http", "~> 4.3"
|
|
29
|
-
end
|
|
30
|
-
spec.add_development_dependency "posix-spawn" unless RUBY_ENGINE == "jruby"
|
|
31
|
-
spec.add_development_dependency "http_parser.rb" unless RUBY_ENGINE == "jruby"
|
|
32
|
-
spec.add_development_dependency "warning" if RUBY_VERSION >= "2.4"
|
|
24
|
+
spec.add_development_dependency "httpx", "~> 1.0", "< 1.4.4"
|
|
25
|
+
spec.add_development_dependency "http", RUBY_VERSION >= "3.2" ? "~> 6.0" : "~> 5.0"
|
|
26
|
+
spec.add_development_dependency "warning"
|
|
27
|
+
spec.add_development_dependency "csv"
|
|
33
28
|
end
|
data/lib/down/http.rb
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
gem "http", ">= 2.1.0", "<
|
|
3
|
+
gem "http", ">= 2.1.0", "< 7"
|
|
4
4
|
|
|
5
5
|
require "http"
|
|
6
|
+
require "addressable/uri"
|
|
6
7
|
|
|
7
8
|
require "down/backend"
|
|
8
9
|
|
|
@@ -19,13 +20,16 @@ module Down
|
|
|
19
20
|
.follow(max_hops: 2)
|
|
20
21
|
.timeout(connect: 30, write: 30, read: 30)
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
if options.any?
|
|
24
|
+
client_class = defined?(HTTP::Session) ? HTTP::Session : HTTP::Client
|
|
25
|
+
@client = client_class.new(@client.default_options.merge(options))
|
|
26
|
+
end
|
|
23
27
|
@client = block.call(@client) if block
|
|
24
28
|
end
|
|
25
29
|
|
|
26
30
|
# Downlods the remote file to disk. Accepts HTTP.rb options via a hash or a
|
|
27
31
|
# block, and some additional options as well.
|
|
28
|
-
def download(url, max_size: nil, progress_proc: nil, content_length_proc: nil, destination: nil, extension: nil, **options, &block)
|
|
32
|
+
def download(url, max_size: nil, progress_proc: nil, content_length_proc: nil, destination: nil, extension: nil, tempfile_name: nil, **options, &block)
|
|
29
33
|
response = request(url, **options, &block)
|
|
30
34
|
|
|
31
35
|
content_length_proc.call(response.content_length) if content_length_proc && response.content_length
|
|
@@ -35,7 +39,7 @@ module Down
|
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
extname = extension ? ".#{extension}" : File.extname(response.uri.path)
|
|
38
|
-
tempfile = Tempfile.new(["down-http", extname], binmode: true)
|
|
42
|
+
tempfile = Tempfile.new([tempfile_name || "down-http", extname], binmode: true)
|
|
39
43
|
|
|
40
44
|
stream_body(response) do |chunk|
|
|
41
45
|
tempfile.write(chunk)
|
|
@@ -94,7 +98,7 @@ module Down
|
|
|
94
98
|
client = client.basic_auth(user: uri.user, pass: uri.password) if uri.user || uri.password
|
|
95
99
|
client = block.call(client) if block
|
|
96
100
|
|
|
97
|
-
client.request(method, url, options)
|
|
101
|
+
client.request(method, url, **options)
|
|
98
102
|
rescue => exception
|
|
99
103
|
request_error!(exception)
|
|
100
104
|
end
|
|
@@ -123,7 +127,7 @@ module Down
|
|
|
123
127
|
# Re-raise HTTP.rb exceptions as Down::Error exceptions.
|
|
124
128
|
def request_error!(exception)
|
|
125
129
|
case exception
|
|
126
|
-
when HTTP::Request::UnsupportedSchemeError, Addressable::URI::InvalidURIError
|
|
130
|
+
when HTTP::Request::UnsupportedSchemeError, Addressable::URI::InvalidURIError, *invalid_url_errors
|
|
127
131
|
raise Down::InvalidUrl, exception.message
|
|
128
132
|
when HTTP::ConnectionError
|
|
129
133
|
raise Down::ConnectionError, exception.message
|
|
@@ -138,6 +142,10 @@ module Down
|
|
|
138
142
|
end
|
|
139
143
|
end
|
|
140
144
|
|
|
145
|
+
def invalid_url_errors
|
|
146
|
+
defined?(HTTP::URI::InvalidError) ? [HTTP::URI::InvalidError] : []
|
|
147
|
+
end
|
|
148
|
+
|
|
141
149
|
# Defines some additional attributes for the returned Tempfile.
|
|
142
150
|
module DownloadedFile
|
|
143
151
|
attr_accessor :url, :headers
|
data/lib/down/httpx.rb
CHANGED
|
@@ -33,9 +33,9 @@ module Down
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
#
|
|
36
|
+
# Downloads the remote file to disk. Accepts HTTPX options via a hash or a
|
|
37
37
|
# block, and some additional options as well.
|
|
38
|
-
def download(url, max_size: nil, progress_proc: nil, content_length_proc: nil, destination: nil, extension: nil, **options, &block)
|
|
38
|
+
def download(url, max_size: nil, progress_proc: nil, content_length_proc: nil, destination: nil, extension: nil, tempfile_name: nil, **options, &block)
|
|
39
39
|
client = @client
|
|
40
40
|
|
|
41
41
|
response = request(client, url, **options, &block)
|
|
@@ -54,7 +54,7 @@ module Down
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
extname = extension ? ".#{extension}" : File.extname(response.uri.path)
|
|
57
|
-
tempfile = Tempfile.new(["down-http", extname], binmode: true)
|
|
57
|
+
tempfile = Tempfile.new([tempfile_name || "down-http", extname], binmode: true)
|
|
58
58
|
|
|
59
59
|
stream_body(response) do |chunk|
|
|
60
60
|
tempfile.write(chunk)
|
|
@@ -82,7 +82,7 @@ module Down
|
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
# Starts retrieving the remote file and returns an IO-like object which
|
|
85
|
-
# downloads the response body on-demand. Accepts
|
|
85
|
+
# downloads the response body on-demand. Accepts HTTPX options via a hash
|
|
86
86
|
# or a block.
|
|
87
87
|
def open(url, rewindable: true, **options, &block)
|
|
88
88
|
response = request(@client, url, stream: true, **options, &block)
|
|
@@ -105,7 +105,15 @@ module Down
|
|
|
105
105
|
|
|
106
106
|
# Yields chunks of the response body to the block.
|
|
107
107
|
def stream_body(response, &block)
|
|
108
|
-
response.each
|
|
108
|
+
response.each do |chunk|
|
|
109
|
+
next if (300..399).include?(response.status)
|
|
110
|
+
|
|
111
|
+
block.call(chunk)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
if (300..399).include?(response.status)
|
|
115
|
+
raise Down::TooManyRedirects, "too many redirects"
|
|
116
|
+
end
|
|
109
117
|
rescue => exception
|
|
110
118
|
request_error!(exception)
|
|
111
119
|
end
|
|
@@ -113,7 +121,7 @@ module Down
|
|
|
113
121
|
def request(client, url, method: @method, **options, &block)
|
|
114
122
|
response = send_request(client, method, url, **options, &block)
|
|
115
123
|
response.raise_for_status
|
|
116
|
-
response_error!(response) unless (200..
|
|
124
|
+
response_error!(response) unless (200..399).include?(response.status)
|
|
117
125
|
response
|
|
118
126
|
rescue HTTPX::HTTPError
|
|
119
127
|
response_error!(response)
|
|
@@ -140,7 +148,6 @@ module Down
|
|
|
140
148
|
args = [response.status.to_s, response]
|
|
141
149
|
|
|
142
150
|
case response.status
|
|
143
|
-
when 300..399 then raise Down::TooManyRedirects, "too many redirects"
|
|
144
151
|
when 404 then raise Down::NotFound.new(*args)
|
|
145
152
|
when 400..499 then raise Down::ClientError.new(*args)
|
|
146
153
|
when 500..599 then raise Down::ServerError.new(*args)
|
data/lib/down/net_http.rb
CHANGED
|
@@ -41,6 +41,8 @@ module Down
|
|
|
41
41
|
headers = options.delete(:headers)
|
|
42
42
|
uri_normalizer = options.delete(:uri_normalizer)
|
|
43
43
|
extension = options.delete(:extension)
|
|
44
|
+
auth_on_redirect = options.delete(:auth_on_redirect)
|
|
45
|
+
tempfile_name = options.delete(:tempfile_name)
|
|
44
46
|
|
|
45
47
|
# Use open-uri's :content_lenth_proc or :progress_proc to raise an
|
|
46
48
|
# exception early if the file is too large.
|
|
@@ -91,11 +93,11 @@ module Down
|
|
|
91
93
|
uri.password = nil
|
|
92
94
|
end
|
|
93
95
|
|
|
94
|
-
open_uri_file = open_uri(uri, open_uri_options, follows_remaining: max_redirects)
|
|
96
|
+
open_uri_file = open_uri(uri, open_uri_options, follows_remaining: max_redirects, auth_on_redirect: auth_on_redirect)
|
|
95
97
|
|
|
96
98
|
# Handle the fact that open-uri returns StringIOs for small files.
|
|
97
99
|
extname = extension ? ".#{extension}" : File.extname(open_uri_file.base_uri.path)
|
|
98
|
-
tempfile = ensure_tempfile(open_uri_file, extname)
|
|
100
|
+
tempfile = ensure_tempfile(open_uri_file, extname, tempfile_name)
|
|
99
101
|
OpenURI::Meta.init tempfile, open_uri_file # add back open-uri methods
|
|
100
102
|
tempfile.extend Down::NetHttp::DownloadedFile
|
|
101
103
|
|
|
@@ -107,14 +109,15 @@ module Down
|
|
|
107
109
|
def open(url, *args, **options)
|
|
108
110
|
options = merge_options(@options, *args, **options)
|
|
109
111
|
|
|
110
|
-
max_redirects
|
|
111
|
-
uri_normalizer
|
|
112
|
+
max_redirects = options.delete(:max_redirects)
|
|
113
|
+
uri_normalizer = options.delete(:uri_normalizer)
|
|
114
|
+
auth_on_redirect = options.delete(:auth_on_redirect)
|
|
112
115
|
|
|
113
116
|
uri = ensure_uri(normalize_uri(url, uri_normalizer: uri_normalizer))
|
|
114
117
|
|
|
115
118
|
# Create a Fiber that halts when response headers are received.
|
|
116
119
|
request = Fiber.new do
|
|
117
|
-
net_http_request(uri, options, follows_remaining: max_redirects) do |response|
|
|
120
|
+
net_http_request(uri, options, follows_remaining: max_redirects, auth_on_redirect: auth_on_redirect) do |response|
|
|
118
121
|
Fiber.yield response
|
|
119
122
|
end
|
|
120
123
|
end
|
|
@@ -141,7 +144,7 @@ module Down
|
|
|
141
144
|
private
|
|
142
145
|
|
|
143
146
|
# Calls open-uri's URI::HTTP#open method. Additionally handles redirects.
|
|
144
|
-
def open_uri(uri, options, follows_remaining:)
|
|
147
|
+
def open_uri(uri, options, follows_remaining:, auth_on_redirect:)
|
|
145
148
|
uri.open(options)
|
|
146
149
|
rescue OpenURI::HTTPRedirect => exception
|
|
147
150
|
raise Down::TooManyRedirects, "too many redirects" if follows_remaining == 0
|
|
@@ -155,6 +158,10 @@ module Down
|
|
|
155
158
|
raise ResponseError.new("Invalid Redirect URI: #{exception.uri}", response: response)
|
|
156
159
|
end
|
|
157
160
|
|
|
161
|
+
# do not leak credentials on redirect
|
|
162
|
+
options.delete("Authorization") unless auth_on_redirect
|
|
163
|
+
options.delete(:http_basic_authentication) unless auth_on_redirect
|
|
164
|
+
|
|
158
165
|
# forward cookies on the redirect
|
|
159
166
|
if !exception.io.meta["set-cookie"].to_s.empty?
|
|
160
167
|
options["Cookie"] ||= ''
|
|
@@ -182,8 +189,8 @@ module Down
|
|
|
182
189
|
# Converts the given IO into a Tempfile if it isn't one already (open-uri
|
|
183
190
|
# returns a StringIO when there is less than 10KB of content), and gives
|
|
184
191
|
# it the specified file extension.
|
|
185
|
-
def ensure_tempfile(io, extension)
|
|
186
|
-
tempfile = Tempfile.new(["down-net_http", extension], binmode: true)
|
|
192
|
+
def ensure_tempfile(io, extension, tempfile_name = nil)
|
|
193
|
+
tempfile = Tempfile.new([tempfile_name || "down-net_http", extension], binmode: true)
|
|
187
194
|
|
|
188
195
|
if io.is_a?(Tempfile)
|
|
189
196
|
# Windows requires file descriptors to be closed before files are moved
|
|
@@ -200,7 +207,7 @@ module Down
|
|
|
200
207
|
end
|
|
201
208
|
|
|
202
209
|
# Makes a Net::HTTP request and follows redirects.
|
|
203
|
-
def net_http_request(uri, options, follows_remaining:, &block)
|
|
210
|
+
def net_http_request(uri, options, follows_remaining:, auth_on_redirect:, &block)
|
|
204
211
|
http, request = create_net_http(uri, options)
|
|
205
212
|
|
|
206
213
|
begin
|
|
@@ -231,10 +238,17 @@ module Down
|
|
|
231
238
|
raise ResponseError.new("Invalid Redirect URI: #{response["Location"]}", response: response)
|
|
232
239
|
end
|
|
233
240
|
|
|
241
|
+
# do not leak credentials on redirect
|
|
242
|
+
options[:headers].delete("Authorization") unless auth_on_redirect
|
|
243
|
+
|
|
234
244
|
# handle relative redirects
|
|
235
|
-
|
|
245
|
+
if location.relative?
|
|
246
|
+
location = uri + location
|
|
247
|
+
uri.user = nil unless auth_on_redirect
|
|
248
|
+
uri.password = nil unless auth_on_redirect
|
|
249
|
+
end
|
|
236
250
|
|
|
237
|
-
net_http_request(location, options, follows_remaining: follows_remaining - 1, &block)
|
|
251
|
+
net_http_request(location, options, follows_remaining: follows_remaining - 1, auth_on_redirect: auth_on_redirect, &block)
|
|
238
252
|
end
|
|
239
253
|
end
|
|
240
254
|
|
data/lib/down/version.rb
CHANGED
data/lib/down/wget.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: down
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
4
|
+
version: 5.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Janko Marohnić
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: addressable
|
|
@@ -24,20 +23,34 @@ dependencies:
|
|
|
24
23
|
- - "~>"
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
25
|
version: '2.8'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: base64
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0.3'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0.3'
|
|
27
40
|
- !ruby/object:Gem::Dependency
|
|
28
41
|
name: minitest
|
|
29
42
|
requirement: !ruby/object:Gem::Requirement
|
|
30
43
|
requirements:
|
|
31
44
|
- - "~>"
|
|
32
45
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
46
|
+
version: '6.0'
|
|
34
47
|
type: :development
|
|
35
48
|
prerelease: false
|
|
36
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
50
|
requirements:
|
|
38
51
|
- - "~>"
|
|
39
52
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
53
|
+
version: '6.0'
|
|
41
54
|
- !ruby/object:Gem::Dependency
|
|
42
55
|
name: mocha
|
|
43
56
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -72,50 +85,36 @@ dependencies:
|
|
|
72
85
|
requirements:
|
|
73
86
|
- - "~>"
|
|
74
87
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
88
|
+
version: '1.0'
|
|
76
89
|
- - "<"
|
|
77
90
|
- !ruby/object:Gem::Version
|
|
78
|
-
version:
|
|
91
|
+
version: 1.4.4
|
|
79
92
|
type: :development
|
|
80
93
|
prerelease: false
|
|
81
94
|
version_requirements: !ruby/object:Gem::Requirement
|
|
82
95
|
requirements:
|
|
83
96
|
- - "~>"
|
|
84
97
|
- !ruby/object:Gem::Version
|
|
85
|
-
version: '0'
|
|
98
|
+
version: '1.0'
|
|
86
99
|
- - "<"
|
|
87
100
|
- !ruby/object:Gem::Version
|
|
88
|
-
version:
|
|
101
|
+
version: 1.4.4
|
|
89
102
|
- !ruby/object:Gem::Dependency
|
|
90
103
|
name: http
|
|
91
104
|
requirement: !ruby/object:Gem::Requirement
|
|
92
105
|
requirements:
|
|
93
106
|
- - "~>"
|
|
94
107
|
- !ruby/object:Gem::Version
|
|
95
|
-
version: '
|
|
108
|
+
version: '6.0'
|
|
96
109
|
type: :development
|
|
97
110
|
prerelease: false
|
|
98
111
|
version_requirements: !ruby/object:Gem::Requirement
|
|
99
112
|
requirements:
|
|
100
113
|
- - "~>"
|
|
101
114
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: '
|
|
103
|
-
- !ruby/object:Gem::Dependency
|
|
104
|
-
name: posix-spawn
|
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - ">="
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0'
|
|
110
|
-
type: :development
|
|
111
|
-
prerelease: false
|
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
113
|
-
requirements:
|
|
114
|
-
- - ">="
|
|
115
|
-
- !ruby/object:Gem::Version
|
|
116
|
-
version: '0'
|
|
115
|
+
version: '6.0'
|
|
117
116
|
- !ruby/object:Gem::Dependency
|
|
118
|
-
name:
|
|
117
|
+
name: warning
|
|
119
118
|
requirement: !ruby/object:Gem::Requirement
|
|
120
119
|
requirements:
|
|
121
120
|
- - ">="
|
|
@@ -129,7 +128,7 @@ dependencies:
|
|
|
129
128
|
- !ruby/object:Gem::Version
|
|
130
129
|
version: '0'
|
|
131
130
|
- !ruby/object:Gem::Dependency
|
|
132
|
-
name:
|
|
131
|
+
name: csv
|
|
133
132
|
requirement: !ruby/object:Gem::Requirement
|
|
134
133
|
requirements:
|
|
135
134
|
- - ">="
|
|
@@ -142,7 +141,6 @@ dependencies:
|
|
|
142
141
|
- - ">="
|
|
143
142
|
- !ruby/object:Gem::Version
|
|
144
143
|
version: '0'
|
|
145
|
-
description:
|
|
146
144
|
email:
|
|
147
145
|
- janko.marohnic@gmail.com
|
|
148
146
|
executables: []
|
|
@@ -167,7 +165,6 @@ homepage: https://github.com/janko/down
|
|
|
167
165
|
licenses:
|
|
168
166
|
- MIT
|
|
169
167
|
metadata: {}
|
|
170
|
-
post_install_message:
|
|
171
168
|
rdoc_options: []
|
|
172
169
|
require_paths:
|
|
173
170
|
- lib
|
|
@@ -175,15 +172,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
175
172
|
requirements:
|
|
176
173
|
- - ">="
|
|
177
174
|
- !ruby/object:Gem::Version
|
|
178
|
-
version: '2.
|
|
175
|
+
version: '2.7'
|
|
179
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
177
|
requirements:
|
|
181
178
|
- - ">="
|
|
182
179
|
- !ruby/object:Gem::Version
|
|
183
180
|
version: '0'
|
|
184
181
|
requirements: []
|
|
185
|
-
rubygems_version: 3.
|
|
186
|
-
signing_key:
|
|
182
|
+
rubygems_version: 3.6.7
|
|
187
183
|
specification_version: 4
|
|
188
|
-
summary: Robust streaming downloads using Net::HTTP,
|
|
184
|
+
summary: Robust streaming downloads using Net::HTTP, http.rb or HTTPX.
|
|
189
185
|
test_files: []
|