document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-21006\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\">#\n<\/div><div class=\"line\" id=\"LC2\"># Ruby/ProgressBar - a text progress bar library\n<\/div><div class=\"line\" id=\"LC3\">#\n<\/div><div class=\"line\" id=\"LC4\"># Copyright (C) 2001-2005 Satoru Takabayashi &lt;satoru@namazu.org&gt;\n<\/div><div class=\"line\" id=\"LC5\">#     All rights reserved.\n<\/div><div class=\"line\" id=\"LC6\">#     This is free software with ABSOLUTELY NO WARRANTY.\n<\/div><div class=\"line\" id=\"LC7\">#\n<\/div><div class=\"line\" id=\"LC8\"># You can redistribute it and/or modify it under the terms\n<\/div><div class=\"line\" id=\"LC9\"># of Ruby\'s license.\n<\/div><div class=\"line\" id=\"LC10\">#\n<\/div><div class=\"line\" id=\"LC11\">&nbsp;<\/div><div class=\"line\" id=\"LC12\">class ProgressBar\n<\/div><div class=\"line\" id=\"LC13\">&nbsp;&nbsp;VERSION = &quot;0.9&quot;\n<\/div><div class=\"line\" id=\"LC14\">&nbsp;<\/div><div class=\"line\" id=\"LC15\">&nbsp;&nbsp;def initialize (title, total, out = STDERR)\n<\/div><div class=\"line\" id=\"LC16\">&nbsp;&nbsp;&nbsp;&nbsp;@title = title\n<\/div><div class=\"line\" id=\"LC17\">&nbsp;&nbsp;&nbsp;&nbsp;@total = total\n<\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;&nbsp;&nbsp;@out = out\n<\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;&nbsp;&nbsp;@terminal_width = 80\n<\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;@bar_mark = &quot;o&quot;\n<\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;@current = 0\n<\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;@previous = 0\n<\/div><div class=\"line\" id=\"LC23\">&nbsp;&nbsp;&nbsp;&nbsp;@finished_p = false\n<\/div><div class=\"line\" id=\"LC24\">&nbsp;&nbsp;&nbsp;&nbsp;@start_time = Time.now\n<\/div><div class=\"line\" id=\"LC25\">&nbsp;&nbsp;&nbsp;&nbsp;@previous_time = @start_time\n<\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;&nbsp;&nbsp;@title_width = 14\n<\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;&nbsp;&nbsp;@format = &quot;%-#{@title_width}s %3d%% %s %s&quot;\n<\/div><div class=\"line\" id=\"LC28\">&nbsp;&nbsp;&nbsp;&nbsp;@format_arguments = [:title, :percentage, :bar, :stat]\n<\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;&nbsp;&nbsp;clear\n<\/div><div class=\"line\" id=\"LC30\">&nbsp;&nbsp;&nbsp;&nbsp;show\n<\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC32\">&nbsp;&nbsp;attr_reader   :title\n<\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;attr_reader   :current\n<\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;attr_reader   :total\n<\/div><div class=\"line\" id=\"LC35\">&nbsp;&nbsp;attr_accessor :start_time\n<\/div><div class=\"line\" id=\"LC36\">&nbsp;<\/div><div class=\"line\" id=\"LC37\">&nbsp;&nbsp;private\n<\/div><div class=\"line\" id=\"LC38\">&nbsp;&nbsp;def fmt_bar\n<\/div><div class=\"line\" id=\"LC39\">&nbsp;&nbsp;&nbsp;&nbsp;bar_width = do_percentage * @terminal_width / 100\n<\/div><div class=\"line\" id=\"LC40\">&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;|%s%s|&quot;, \n<\/div><div class=\"line\" id=\"LC41\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@bar_mark * bar_width, \n<\/div><div class=\"line\" id=\"LC42\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot; &quot; *  (@terminal_width - bar_width))\n<\/div><div class=\"line\" id=\"LC43\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC44\">&nbsp;<\/div><div class=\"line\" id=\"LC45\">&nbsp;&nbsp;def fmt_percentage\n<\/div><div class=\"line\" id=\"LC46\">&nbsp;&nbsp;&nbsp;&nbsp;do_percentage\n<\/div><div class=\"line\" id=\"LC47\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC48\">&nbsp;<\/div><div class=\"line\" id=\"LC49\">&nbsp;&nbsp;def fmt_stat\n<\/div><div class=\"line\" id=\"LC50\">&nbsp;&nbsp;&nbsp;&nbsp;if @finished_p then elapsed else eta end\n<\/div><div class=\"line\" id=\"LC51\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC52\">&nbsp;<\/div><div class=\"line\" id=\"LC53\">&nbsp;&nbsp;def fmt_stat_for_file_transfer\n<\/div><div class=\"line\" id=\"LC54\">&nbsp;&nbsp;&nbsp;&nbsp;if @finished_p then \n<\/div><div class=\"line\" id=\"LC55\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%s %s %s&quot;, bytes, transfer_rate, elapsed)\n<\/div><div class=\"line\" id=\"LC56\">&nbsp;&nbsp;&nbsp;&nbsp;else \n<\/div><div class=\"line\" id=\"LC57\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%s %s %s&quot;, bytes, transfer_rate, eta)\n<\/div><div class=\"line\" id=\"LC58\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC59\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC60\">&nbsp;<\/div><div class=\"line\" id=\"LC61\">&nbsp;&nbsp;def fmt_title\n<\/div><div class=\"line\" id=\"LC62\">&nbsp;&nbsp;&nbsp;&nbsp;@title[0,(@title_width - 1)] + &quot;:&quot;\n<\/div><div class=\"line\" id=\"LC63\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC64\">&nbsp;<\/div><div class=\"line\" id=\"LC65\">&nbsp;&nbsp;def convert_bytes (bytes)\n<\/div><div class=\"line\" id=\"LC66\">&nbsp;&nbsp;&nbsp;&nbsp;if bytes &lt; 1024\n<\/div><div class=\"line\" id=\"LC67\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%6dB&quot;, bytes)\n<\/div><div class=\"line\" id=\"LC68\">&nbsp;&nbsp;&nbsp;&nbsp;elsif bytes &lt; 1024 * 1000 # 1000kb\n<\/div><div class=\"line\" id=\"LC69\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%5.1fKB&quot;, bytes.to_f / 1024)\n<\/div><div class=\"line\" id=\"LC70\">&nbsp;&nbsp;&nbsp;&nbsp;elsif bytes &lt; 1024 * 1024 * 1000  # 1000mb\n<\/div><div class=\"line\" id=\"LC71\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%5.1fMB&quot;, bytes.to_f / 1024 / 1024)\n<\/div><div class=\"line\" id=\"LC72\">&nbsp;&nbsp;&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC73\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%5.1fGB&quot;, bytes.to_f / 1024 / 1024 / 1024)\n<\/div><div class=\"line\" id=\"LC74\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC75\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC76\">&nbsp;<\/div><div class=\"line\" id=\"LC77\">&nbsp;&nbsp;def transfer_rate\n<\/div><div class=\"line\" id=\"LC78\">&nbsp;&nbsp;&nbsp;&nbsp;bytes_per_second = @current.to_f / (Time.now - @start_time)\n<\/div><div class=\"line\" id=\"LC79\">&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%s/s&quot;, convert_bytes(bytes_per_second))\n<\/div><div class=\"line\" id=\"LC80\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC81\">&nbsp;<\/div><div class=\"line\" id=\"LC82\">&nbsp;&nbsp;def bytes\n<\/div><div class=\"line\" id=\"LC83\">&nbsp;&nbsp;&nbsp;&nbsp;convert_bytes(@current)\n<\/div><div class=\"line\" id=\"LC84\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC85\">&nbsp;<\/div><div class=\"line\" id=\"LC86\">&nbsp;&nbsp;def format_time (t)\n<\/div><div class=\"line\" id=\"LC87\">&nbsp;&nbsp;&nbsp;&nbsp;t = t.to_i\n<\/div><div class=\"line\" id=\"LC88\">&nbsp;&nbsp;&nbsp;&nbsp;sec = t % 60\n<\/div><div class=\"line\" id=\"LC89\">&nbsp;&nbsp;&nbsp;&nbsp;min  = (t / 60) % 60\n<\/div><div class=\"line\" id=\"LC90\">&nbsp;&nbsp;&nbsp;&nbsp;hour = t / 3600\n<\/div><div class=\"line\" id=\"LC91\">&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;%02d:%02d:%02d&quot;, hour, min, sec);\n<\/div><div class=\"line\" id=\"LC92\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC93\">&nbsp;<\/div><div class=\"line\" id=\"LC94\">&nbsp;&nbsp;# ETA stands for Estimated Time of Arrival.\n<\/div><div class=\"line\" id=\"LC95\">&nbsp;&nbsp;def eta\n<\/div><div class=\"line\" id=\"LC96\">&nbsp;&nbsp;&nbsp;&nbsp;if @current == 0\n<\/div><div class=\"line\" id=\"LC97\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;ETA:  --:--:--&quot;\n<\/div><div class=\"line\" id=\"LC98\">&nbsp;&nbsp;&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC99\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elapsed = Time.now - @start_time\n<\/div><div class=\"line\" id=\"LC100\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eta = elapsed * @total / @current - elapsed;\n<\/div><div class=\"line\" id=\"LC101\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;ETA:  %s&quot;, format_time(eta))\n<\/div><div class=\"line\" id=\"LC102\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC103\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC104\">&nbsp;<\/div><div class=\"line\" id=\"LC105\">&nbsp;&nbsp;def elapsed\n<\/div><div class=\"line\" id=\"LC106\">&nbsp;&nbsp;&nbsp;&nbsp;elapsed = Time.now - @start_time\n<\/div><div class=\"line\" id=\"LC107\">&nbsp;&nbsp;&nbsp;&nbsp;sprintf(&quot;Time: %s&quot;, format_time(elapsed))\n<\/div><div class=\"line\" id=\"LC108\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC109\">&nbsp;&nbsp;\n<\/div><div class=\"line\" id=\"LC110\">&nbsp;&nbsp;def eol\n<\/div><div class=\"line\" id=\"LC111\">&nbsp;&nbsp;&nbsp;&nbsp;if @finished_p then &quot;\\n&quot; else &quot;\\r&quot; end\n<\/div><div class=\"line\" id=\"LC112\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC113\">&nbsp;<\/div><div class=\"line\" id=\"LC114\">&nbsp;&nbsp;def do_percentage\n<\/div><div class=\"line\" id=\"LC115\">&nbsp;&nbsp;&nbsp;&nbsp;if @total.zero?\n<\/div><div class=\"line\" id=\"LC116\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100\n<\/div><div class=\"line\" id=\"LC117\">&nbsp;&nbsp;&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC118\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@current  * 100 / @total\n<\/div><div class=\"line\" id=\"LC119\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC120\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC121\">&nbsp;<\/div><div class=\"line\" id=\"LC122\">&nbsp;&nbsp;def get_width\n<\/div><div class=\"line\" id=\"LC123\">&nbsp;&nbsp;&nbsp;&nbsp;# FIXME: I don\'t know how portable it is.\n<\/div><div class=\"line\" id=\"LC124\">&nbsp;&nbsp;&nbsp;&nbsp;default_width = 80\n<\/div><div class=\"line\" id=\"LC125\">&nbsp;&nbsp;&nbsp;&nbsp;begin\n<\/div><div class=\"line\" id=\"LC126\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tiocgwinsz = 0x5413\n<\/div><div class=\"line\" id=\"LC127\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = [0, 0, 0, 0].pack(&quot;SSSS&quot;)\n<\/div><div class=\"line\" id=\"LC128\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @out.ioctl(tiocgwinsz, data) &gt;= 0 then\n<\/div><div class=\"line\" id=\"LC129\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows, cols, xpixels, ypixels = data.unpack(&quot;SSSS&quot;)\n<\/div><div class=\"line\" id=\"LC130\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cols &gt;= 0 then cols else default_width end\n<\/div><div class=\"line\" id=\"LC131\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC132\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default_width\n<\/div><div class=\"line\" id=\"LC133\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC134\">&nbsp;&nbsp;&nbsp;&nbsp;rescue Exception\n<\/div><div class=\"line\" id=\"LC135\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default_width\n<\/div><div class=\"line\" id=\"LC136\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC137\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC138\">&nbsp;<\/div><div class=\"line\" id=\"LC139\">&nbsp;&nbsp;def show\n<\/div><div class=\"line\" id=\"LC140\">&nbsp;&nbsp;&nbsp;&nbsp;arguments = @format_arguments.map {|method| \n<\/div><div class=\"line\" id=\"LC141\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method = sprintf(&quot;fmt_%s&quot;, method)\n<\/div><div class=\"line\" id=\"LC142\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send(method)\n<\/div><div class=\"line\" id=\"LC143\">&nbsp;&nbsp;&nbsp;&nbsp;}\n<\/div><div class=\"line\" id=\"LC144\">&nbsp;&nbsp;&nbsp;&nbsp;line = sprintf(@format, *arguments)\n<\/div><div class=\"line\" id=\"LC145\">&nbsp;<\/div><div class=\"line\" id=\"LC146\">&nbsp;&nbsp;&nbsp;&nbsp;width = get_width\n<\/div><div class=\"line\" id=\"LC147\">&nbsp;&nbsp;&nbsp;&nbsp;if line.length == width - 1 \n<\/div><div class=\"line\" id=\"LC148\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@out.print(line + eol)\n<\/div><div class=\"line\" id=\"LC149\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@out.flush\n<\/div><div class=\"line\" id=\"LC150\">&nbsp;&nbsp;&nbsp;&nbsp;elsif line.length &gt;= width\n<\/div><div class=\"line\" id=\"LC151\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@terminal_width = [@terminal_width - (line.length - width + 1), 0].max\n<\/div><div class=\"line\" id=\"LC152\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if @terminal_width == 0 then @out.print(line + eol) else show end\n<\/div><div class=\"line\" id=\"LC153\">&nbsp;&nbsp;&nbsp;&nbsp;else # line.length &lt; width - 1\n<\/div><div class=\"line\" id=\"LC154\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@terminal_width += width - line.length + 1\n<\/div><div class=\"line\" id=\"LC155\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show\n<\/div><div class=\"line\" id=\"LC156\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC157\">&nbsp;&nbsp;&nbsp;&nbsp;@previous_time = Time.now\n<\/div><div class=\"line\" id=\"LC158\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC159\">&nbsp;<\/div><div class=\"line\" id=\"LC160\">&nbsp;&nbsp;def show_if_needed\n<\/div><div class=\"line\" id=\"LC161\">&nbsp;&nbsp;&nbsp;&nbsp;if @total.zero?\n<\/div><div class=\"line\" id=\"LC162\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur_percentage = 100\n<\/div><div class=\"line\" id=\"LC163\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_percentage = 0\n<\/div><div class=\"line\" id=\"LC164\">&nbsp;&nbsp;&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC165\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur_percentage  = (@current  * 100 / @total).to_i\n<\/div><div class=\"line\" id=\"LC166\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_percentage = (@previous * 100 / @total).to_i\n<\/div><div class=\"line\" id=\"LC167\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC168\">&nbsp;<\/div><div class=\"line\" id=\"LC169\">&nbsp;&nbsp;&nbsp;&nbsp;# Use &quot;!=&quot; instead of &quot;&gt;&quot; to support negative changes\n<\/div><div class=\"line\" id=\"LC170\">&nbsp;&nbsp;&nbsp;&nbsp;if cur_percentage != prev_percentage || \n<\/div><div class=\"line\" id=\"LC171\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Time.now - @previous_time &gt;= 1 || @finished_p\n<\/div><div class=\"line\" id=\"LC172\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show\n<\/div><div class=\"line\" id=\"LC173\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC174\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC175\">&nbsp;<\/div><div class=\"line\" id=\"LC176\">&nbsp;&nbsp;public\n<\/div><div class=\"line\" id=\"LC177\">&nbsp;&nbsp;def clear\n<\/div><div class=\"line\" id=\"LC178\">&nbsp;&nbsp;&nbsp;&nbsp;@out.print &quot;\\r&quot;\n<\/div><div class=\"line\" id=\"LC179\">&nbsp;&nbsp;&nbsp;&nbsp;@out.print(&quot; &quot; * (get_width - 1))\n<\/div><div class=\"line\" id=\"LC180\">&nbsp;&nbsp;&nbsp;&nbsp;@out.print &quot;\\r&quot;\n<\/div><div class=\"line\" id=\"LC181\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC182\">&nbsp;<\/div><div class=\"line\" id=\"LC183\">&nbsp;&nbsp;def finish\n<\/div><div class=\"line\" id=\"LC184\">&nbsp;&nbsp;&nbsp;&nbsp;@current = @total\n<\/div><div class=\"line\" id=\"LC185\">&nbsp;&nbsp;&nbsp;&nbsp;@finished_p = true\n<\/div><div class=\"line\" id=\"LC186\">&nbsp;&nbsp;&nbsp;&nbsp;show\n<\/div><div class=\"line\" id=\"LC187\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC188\">&nbsp;<\/div><div class=\"line\" id=\"LC189\">&nbsp;&nbsp;def finished?\n<\/div><div class=\"line\" id=\"LC190\">&nbsp;&nbsp;&nbsp;&nbsp;@finished_p\n<\/div><div class=\"line\" id=\"LC191\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC192\">&nbsp;<\/div><div class=\"line\" id=\"LC193\">&nbsp;&nbsp;def file_transfer_mode\n<\/div><div class=\"line\" id=\"LC194\">&nbsp;&nbsp;&nbsp;&nbsp;@format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]\n<\/div><div class=\"line\" id=\"LC195\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC196\">&nbsp;<\/div><div class=\"line\" id=\"LC197\">&nbsp;&nbsp;def format= (format)\n<\/div><div class=\"line\" id=\"LC198\">&nbsp;&nbsp;&nbsp;&nbsp;@format = format\n<\/div><div class=\"line\" id=\"LC199\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC200\">&nbsp;<\/div><div class=\"line\" id=\"LC201\">&nbsp;&nbsp;def format_arguments= (arguments)\n<\/div><div class=\"line\" id=\"LC202\">&nbsp;&nbsp;&nbsp;&nbsp;@format_arguments = arguments\n<\/div><div class=\"line\" id=\"LC203\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC204\">&nbsp;<\/div><div class=\"line\" id=\"LC205\">&nbsp;&nbsp;def halt\n<\/div><div class=\"line\" id=\"LC206\">&nbsp;&nbsp;&nbsp;&nbsp;@finished_p = true\n<\/div><div class=\"line\" id=\"LC207\">&nbsp;&nbsp;&nbsp;&nbsp;show\n<\/div><div class=\"line\" id=\"LC208\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC209\">&nbsp;<\/div><div class=\"line\" id=\"LC210\">&nbsp;&nbsp;def inc (step = 1)\n<\/div><div class=\"line\" id=\"LC211\">&nbsp;&nbsp;&nbsp;&nbsp;@current += step\n<\/div><div class=\"line\" id=\"LC212\">&nbsp;&nbsp;&nbsp;&nbsp;@current = @total if @current &gt; @total\n<\/div><div class=\"line\" id=\"LC213\">&nbsp;&nbsp;&nbsp;&nbsp;show_if_needed\n<\/div><div class=\"line\" id=\"LC214\">&nbsp;&nbsp;&nbsp;&nbsp;@previous = @current\n<\/div><div class=\"line\" id=\"LC215\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC216\">&nbsp;<\/div><div class=\"line\" id=\"LC217\">&nbsp;&nbsp;def set (count)\n<\/div><div class=\"line\" id=\"LC218\">&nbsp;&nbsp;&nbsp;&nbsp;if count &lt; 0 || count &gt; @total\n<\/div><div class=\"line\" id=\"LC219\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise &quot;invalid count: #{count} (total: #{@total})&quot;\n<\/div><div class=\"line\" id=\"LC220\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC221\">&nbsp;&nbsp;&nbsp;&nbsp;@current = count\n<\/div><div class=\"line\" id=\"LC222\">&nbsp;&nbsp;&nbsp;&nbsp;show_if_needed\n<\/div><div class=\"line\" id=\"LC223\">&nbsp;&nbsp;&nbsp;&nbsp;@previous = @current\n<\/div><div class=\"line\" id=\"LC224\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC225\">&nbsp;<\/div><div class=\"line\" id=\"LC226\">&nbsp;&nbsp;def inspect\n<\/div><div class=\"line\" id=\"LC227\">&nbsp;&nbsp;&nbsp;&nbsp;&quot;#&lt;ProgressBar:#{@current}/#{@total}&gt;&quot;\n<\/div><div class=\"line\" id=\"LC228\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC229\">end\n<\/div><div class=\"line\" id=\"LC230\">&nbsp;<\/div><div class=\"line\" id=\"LC231\">&nbsp;<\/div><div class=\"line\" id=\"LC232\">&nbsp;<\/div><div class=\"line\" id=\"LC233\"># Detect Duplicates\n<\/div><div class=\"line\" id=\"LC234\"># Copyright (C) 2008 Matthew Ford &lt;matt@new-bamboo.co.uk&gt;\n<\/div><div class=\"line\" id=\"LC235\">#     All rights reserved.\n<\/div><div class=\"line\" id=\"LC236\">#     This is free software with ABSOLUTELY NO WARRANTY.\n<\/div><div class=\"line\" id=\"LC237\">#\n<\/div><div class=\"line\" id=\"LC238\"># You can redistribute it and/or modify it under the terms\n<\/div><div class=\"line\" id=\"LC239\"># of Ruby\'s license.\n<\/div><div class=\"line\" id=\"LC240\">&nbsp;<\/div><div class=\"line\" id=\"LC241\"># In the case where id is unique and it do not matter to you (i.e. it\'s not in permalinks)\n<\/div><div class=\"line\" id=\"LC242\"># used to detect duplicate objects, returns nil, if no objects are duplicated\n<\/div><div class=\"line\" id=\"LC243\"># arguments: array of objects, the object you\'re checking, and keys to be deleted from attributes hash\n<\/div><div class=\"line\" id=\"LC244\"># pass {:default =&gt; false} in the ops hash to not use the default keys\n<\/div><div class=\"line\" id=\"LC245\"># USE: delete_dups_for(Comment, :post_id)\n<\/div><div class=\"line\" id=\"LC246\">def detect_dup(keep_array, obj,opts={:keys =&gt; [], :default=&gt;[\'id\',\'created_at\',\'updated_at\']})\n<\/div><div class=\"line\" id=\"LC247\">&nbsp;&nbsp;return unless keep_array &amp;&amp; obj\n<\/div><div class=\"line\" id=\"LC248\">&nbsp;&nbsp;if opts[:default]\n<\/div><div class=\"line\" id=\"LC249\">&nbsp;&nbsp;&nbsp;&nbsp;delete_keys = opts[:keys] + opts[:default] \n<\/div><div class=\"line\" id=\"LC250\">&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC251\">&nbsp;&nbsp;&nbsp;&nbsp;delete_keys = opts[:keys]\n<\/div><div class=\"line\" id=\"LC252\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC253\">&nbsp;&nbsp;tmp_obj=obj.attributes\n<\/div><div class=\"line\" id=\"LC254\">&nbsp;&nbsp;delete_keys.each do |k|\n<\/div><div class=\"line\" id=\"LC255\">&nbsp;&nbsp;&nbsp;&nbsp;tmp_obj.delete(k)\n<\/div><div class=\"line\" id=\"LC256\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC257\">&nbsp;&nbsp;keep_array.detect do |o|\n<\/div><div class=\"line\" id=\"LC258\">&nbsp;&nbsp;tmp_o=o.attributes\n<\/div><div class=\"line\" id=\"LC259\">&nbsp;&nbsp;&nbsp;&nbsp;delete_keys.each do |k|\n<\/div><div class=\"line\" id=\"LC260\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp_o.delete(k)\n<\/div><div class=\"line\" id=\"LC261\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC262\">&nbsp;&nbsp;tmp_o == tmp_obj\n<\/div><div class=\"line\" id=\"LC263\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC264\">end\n<\/div><div class=\"line\" id=\"LC265\">&nbsp;<\/div><div class=\"line\" id=\"LC266\">def delete_dups_for(model, collect_by)\n<\/div><div class=\"line\" id=\"LC267\">&nbsp;&nbsp;keep_array = Hash.new { |h,k| h[k] = [] }\n<\/div><div class=\"line\" id=\"LC268\">&nbsp;&nbsp;delete_array = []\n<\/div><div class=\"line\" id=\"LC269\">&nbsp;&nbsp;model_name = model.name\n<\/div><div class=\"line\" id=\"LC270\">&nbsp;&nbsp;all_objects = model.all.reverse #so we add newest first, sort of\n<\/div><div class=\"line\" id=\"LC271\">&nbsp;&nbsp;pbar = ProgressBar.new(model_name.pluralize, all_objects.count)\n<\/div><div class=\"line\" id=\"LC272\">&nbsp;&nbsp;all_objects.each do |obj|\n<\/div><div class=\"line\" id=\"LC273\">&nbsp;&nbsp;&nbsp;&nbsp;if detect_dup((keep_array[obj.send(collect_by)]), obj).nil?\n<\/div><div class=\"line\" id=\"LC274\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keep_array[obj.send(collect_by)] &lt;&lt; obj \n<\/div><div class=\"line\" id=\"LC275\">&nbsp;&nbsp;&nbsp;&nbsp;else\n<\/div><div class=\"line\" id=\"LC276\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete_array &lt;&lt; obj.id\n<\/div><div class=\"line\" id=\"LC277\">&nbsp;&nbsp;&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC278\">&nbsp;&nbsp;pbar.inc\n<\/div><div class=\"line\" id=\"LC279\">&nbsp;&nbsp;end\n<\/div><div class=\"line\" id=\"LC280\">&nbsp;&nbsp;sql = ActiveRecord::Base.connection();\n<\/div><div class=\"line\" id=\"LC281\">&nbsp;&nbsp;sql.execute &quot;DELETE FROM #{model.table_name} WHERE id IN(#{delete_array.join(\',\')})&quot; unless delete_array.empty?  \n<\/div><div class=\"line\" id=\"LC282\">&nbsp;&nbsp;pbar.finish\n<\/div><div class=\"line\" id=\"LC283\">end\n<\/div><div class=\"line\" id=\"LC284\">&nbsp;<\/div><div class=\"line\" id=\"LC285\">&nbsp;<\/div><\/pre><\/div>\n        \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/21006/553957bb152cb6d2b0f148ca81ca7b5fae3143a5/Detect%20Duplicates%20with%20progressbar\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/21006#file_detect duplicates with progressbar\" style=\"float:right;margin-right:10px;color:#666\">Detect Duplicates with progressbar<\/a>\n          <a href=\"http://gist.github.com/21006\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
