Записки Вредного программиста

enjoy, motherfuckers ;)

Ruby OpenURI::open и ProgressBar

Рыская по документации к методу open из набора OpenURI (мне нужно было установить большее значение timeout’а). Пролистав нужное место в документации натолкнулся на интересные параметры, с которыми можно вызывать метод open.

  • :content_length_proc => lambda {|content_length| ... } – если данный proc установлен, то в него передается Content-Length или nil, если данный параметр недоступен. В этот момент мы уже знаем полный размер файлы и можем нарисовать красивый ProgressBar.
  • :progress_proc => lambda {|size| ...} – данный proc вызывается с одним параметром (размер скаченного фрагмента в байтах), когда метод open получает очередной фрагмент из сети.
  • :read_timeout=>10 – это тот параметр, из-за которого я и полез в документацию, устанавливает таймаут на чтение для http соединения.

А теперь небольшой пример использования данных знаний. Нам понадобится большой файл, я взял трехмегабайтный файл и положил его в Dropbox/Public, чтобы легко было получить на него ссылку. Также понадобится установленный gem ruby-progressbar.

Вот и все, работающий пример готов.

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'ruby-progressbar'
require 'open-uri'

progress_bar = nil
open('https://dl.dropboxusercontent.com/u/11041525/DIX1.0Universal.dmg',
  content_length_proc: proc { |total|
    if total.to_i > 0
      progress_bar = ProgressBar.create(title: 'Downloaded', total: total)
    end
},
progress_proc: proc { |step|
  progress_bar.progress = step
}) { |file| puts "File #{file} successfully downloaded" }

Комментарии