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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a8a87deb869d776663b7fa4a32a87fcf73ffe2434e2fbe4fdef1ce7d6e48cf55
4
- data.tar.gz: 294efe7598f57309b0cbc3a3190685663384c9b3374c9afa621e728205bc367e
3
+ metadata.gz: 9658c84910478f3dfce33c56625fe4e60ad4099afdceeef9288355d8bc43ba26
4
+ data.tar.gz: 4009abef1c18006798565de452a7472a418cdda49d5c736fc262bb7cc058855c
5
5
  SHA512:
6
- metadata.gz: 1d7d3f067b9de755a9976d572e668cad8d39e38968da71f209a5044debd3b0db14c7f70bf96b4237eae1da73178cdcafd454f28cc1bba34e6d92f02194ee94e0
7
- data.tar.gz: 9638590a3e4ee48ccd9c6409aadd140182315a0a648896b52a14fd5419c67bba1a4266cf00e51ec9dca6b17e77520373373ef7693d8155bfeb5409078c3ca9f6
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], [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", "< 2.0.0"
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
@@ -33,9 +33,9 @@ module Down
33
33
  end
34
34
 
35
35
 
36
- # 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
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 HTTP.rb options via a hash
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(&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
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..299).include?(response.status)
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 = 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.2"
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.2
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: 2024-04-19 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'
88
+ version: '1.0'
76
89
  - - "<"
77
90
  - !ruby/object:Gem::Version
78
- version: 2.0.0
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: 2.0.0
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.5.3
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: []