open-uriによるダウンロード状況をプログレスバーで可視化する

日本語での情報があまりなかったのでまとめておく。

なお、プログレスバーのライブラリとして ruby-progressbar を使用した。

require 'open-uri'
require 'ruby-progressbar'

URL = "http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz"

content_length = nil
progress_bar = nil

open(URL, "rb",
  :content_length_proc => lambda{ |content_length| 
    if content_length
      # プログレスバーの最大長にcontent-lengthを指定
      progress_bar = ProgressBar.create(:total => content_length)
    end
  },
  :progress_proc => lambda{ |transferred_bytes|
    if progress_bar
      # プログレスバーの進捗状況にこれまで転送されたバイト数を代入する
      progress_bar.progress = transferred_bytes
    else
      puts "#{transferred_bytes} / Total size is unknown"
    end
  }
) { |file| 
  # do something...
}

実行結果

Progress: |===========================================================|