down 5.4.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e25eaeebd866fe407bcb39282937568f1c5489feb0b3ac479d92c2b19d8920c
4
- data.tar.gz: 151e9d28039d7698a32e25ff7b1dae39c32e871ed295809f11a586c5f6221bcc
3
+ metadata.gz: 9658c84910478f3dfce33c56625fe4e60ad4099afdceeef9288355d8bc43ba26
4
+ data.tar.gz: 4009abef1c18006798565de452a7472a418cdda49d5c736fc262bb7cc058855c
5
5
  SHA512:
6
- metadata.gz: 3ee68adf94333adcb92f9453ec0c65e23437458e6586f0078471ba8b5691d3ca0b5e377656a16fb6750ee585f255cd5af38218dbf873fd6b7e5e9ec1997a8997
7
- data.tar.gz: 49f80f1b039ba67e86e1515aac927382249f2bdca33cb8d71e8be8753d82d6f69c56d010be4521c2e661a51662adb698478348949fc01ac22e1419212cfc640c
6
+ metadata.gz: 3181b47973db1b65ea4c9c3a7f6d39beed4d4cdd2e37bdf3218a3924204f64a1c98b0df70e4c6b7176a99d32396840f094f89b26c50d39e263277d11f7472840
7
+ data.tar.gz: 906c4e18bb4576aa5985e2da38ddbbcc0dff228255773fc3a2f3c9ced301f65bcf4dacd6529d1c293eec1502b719ca4ce99b7b07cfab3d8cf70012b97fc6ce97
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
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
+
15
+ ## 5.4.2 (2024-04-19)
16
+
17
+ * Add support for HTTPX 1.x (@HoneyryderChuck)
18
+
1
19
  ## 5.4.1 (2023-05-20)
2
20
 
3
21
  * Handle additional params in `Content-Disposition` header (@janko)
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], [HTTPX], or `wget` as
5
- the backend HTTP library.
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.22"
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.3"
7
+ spec.required_ruby_version = ">= 2.7"
8
8
 
9
- spec.summary = "Robust streaming downloads using Net::HTTP, HTTP.rb or wget."
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", "~> 5.8"
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.22", ">= 0.22.2"
24
- # http 5.0 drop support of ruby 2.3 and 2.4. We still support those versions.
25
- if RUBY_VERSION >= "2.5"
26
- spec.add_development_dependency "http", "~> 5.0"
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", "< 6"
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
- @client = HTTP::Client.new(@client.default_options.merge(options)) if options.any?
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
@@ -14,12 +14,14 @@ module Down
14
14
 
15
15
  USER_AGENT = "Down/#{Down::VERSION}"
16
16
 
17
+ BASIC_AUTH = HTTPX::VERSION >= "1.0.0" ? :basic_auth : :basic_authentication
18
+
17
19
  def initialize(**options, &block)
18
20
  @method = options.delete(:method) || :get
19
21
  headers = options.delete(:headers) || {}
20
22
  @client = HTTPX
21
23
  .plugin(:follow_redirects, max_redirects: 2)
22
- .plugin(:basic_authentication)
24
+ .plugin(BASIC_AUTH)
23
25
  .plugin(:stream)
24
26
  .with(
25
27
  headers: { "user-agent": USER_AGENT }.merge(headers),
@@ -31,9 +33,9 @@ module Down
31
33
  end
32
34
 
33
35
 
34
- # Downlods the remote file to disk. Accepts HTTPX options via a hash or a
36
+ # Downloads the remote file to disk. Accepts HTTPX options via a hash or a
35
37
  # block, and some additional options as well.
36
- 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)
37
39
  client = @client
38
40
 
39
41
  response = request(client, url, **options, &block)
@@ -52,7 +54,7 @@ module Down
52
54
  end
53
55
 
54
56
  extname = extension ? ".#{extension}" : File.extname(response.uri.path)
55
- tempfile = Tempfile.new(["down-http", extname], binmode: true)
57
+ tempfile = Tempfile.new([tempfile_name || "down-http", extname], binmode: true)
56
58
 
57
59
  stream_body(response) do |chunk|
58
60
  tempfile.write(chunk)
@@ -80,7 +82,7 @@ module Down
80
82
  end
81
83
 
82
84
  # Starts retrieving the remote file and returns an IO-like object which
83
- # downloads the response body on-demand. Accepts HTTP.rb options via a hash
85
+ # downloads the response body on-demand. Accepts HTTPX options via a hash
84
86
  # or a block.
85
87
  def open(url, rewindable: true, **options, &block)
86
88
  response = request(@client, url, stream: true, **options, &block)
@@ -103,7 +105,15 @@ module Down
103
105
 
104
106
  # Yields chunks of the response body to the block.
105
107
  def stream_body(response, &block)
106
- response.each(&block)
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
107
117
  rescue => exception
108
118
  request_error!(exception)
109
119
  end
@@ -111,7 +121,7 @@ module Down
111
121
  def request(client, url, method: @method, **options, &block)
112
122
  response = send_request(client, method, url, **options, &block)
113
123
  response.raise_for_status
114
- response_error!(response) unless (200..299).include?(response.status)
124
+ response_error!(response) unless (200..399).include?(response.status)
115
125
  response
116
126
  rescue HTTPX::HTTPError
117
127
  response_error!(response)
@@ -138,7 +148,6 @@ module Down
138
148
  args = [response.status.to_s, response]
139
149
 
140
150
  case response.status
141
- when 300..399 then raise Down::TooManyRedirects, "too many redirects"
142
151
  when 404 then raise Down::NotFound.new(*args)
143
152
  when 400..499 then raise Down::ClientError.new(*args)
144
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 = options.delete(:max_redirects)
111
- uri_normalizer = options.delete(: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
- location = uri + location if location.relative?
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
@@ -1,5 +1,5 @@
1
1
  # frozen-string-literal: true
2
2
 
3
3
  module Down
4
- VERSION = "5.4.1"
4
+ VERSION = "5.5.0"
5
5
  end
data/lib/down/wget.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen-string-literal: true
2
2
 
3
+ warn "The Down::Wget backend has been deprecated and will be removed in the next major version. Please use the Net::HTTP/open-uri, http.rb or HTTPX backend instead."
4
+
3
5
  begin
4
6
  require "posix-spawn"
5
7
  rescue LoadError
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.1
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: 2023-05-20 00:00:00.000000000 Z
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: '5.8'
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: '5.8'
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.22'
76
- - - ">="
88
+ version: '1.0'
89
+ - - "<"
77
90
  - !ruby/object:Gem::Version
78
- version: 0.22.2
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.22'
86
- - - ">="
98
+ version: '1.0'
99
+ - - "<"
87
100
  - !ruby/object:Gem::Version
88
- version: 0.22.2
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: '5.0'
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: '5.0'
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: http_parser.rb
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: warning
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.3'
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.4.12
186
- signing_key:
182
+ rubygems_version: 3.6.7
187
183
  specification_version: 4
188
- summary: Robust streaming downloads using Net::HTTP, HTTP.rb or wget.
184
+ summary: Robust streaming downloads using Net::HTTP, http.rb or HTTPX.
189
185
  test_files: []