X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=lib%2Fmcollective%2Frpc%2Fprogress.rb;fp=lib%2Fmcollective%2Frpc%2Fprogress.rb;h=8c2f50bb887674ec5b2646dde3f76fdb5787dda5;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/lib/mcollective/rpc/progress.rb b/lib/mcollective/rpc/progress.rb new file mode 100644 index 0000000..8c2f50b --- /dev/null +++ b/lib/mcollective/rpc/progress.rb @@ -0,0 +1,63 @@ +module MCollective + module RPC + # Class that shows a progress bar, currently only supports a twirling + # progress bar. + # + # You can specify a size for the progress bar if you want if you dont + # it will use the helper functions to figure out terminal dimensions + # and draw an appropriately sized bar + # + # p = Progress.new + # 100.times {|i| print p.twirl(i+1, 100) + "\r"};puts + # + # * [ ==================================================> ] 100 / 100 + class Progress + def initialize(size=nil) + @twirl = ['|', '/', '-', "\\", '|', '/', '-', "\\"] + @twirldex = 0 + + if size + @size = size + else + cols = Util.terminal_dimensions[0] - 22 + + # Defaults back to old behavior if it + # couldn't figure out the size or if + # its more than 60 wide + if cols <= 0 + @size = 0 + elsif cols > 60 + @size = 60 + else + @size = cols + end + end + end + + def twirl(current, total) + # if the size is negative there is just not enough + # space on the terminal, return a simpler version + return "\r#{current} / #{total}" if @size == 0 + + if current == total + txt = "\r %s [ " % Util.colorize(:green, "*") + else + txt = "\r %s [ " % Util.colorize(:red, @twirl[@twirldex]) + end + + dashes = ((current.to_f / total) * @size).round + + dashes.times { txt << "=" } + txt << ">" + + (@size - dashes).times { txt << " " } + + txt << " ] #{current} / #{total}" + + @twirldex == 7 ? @twirldex = 0 : @twirldex += 1 + + return txt + end + end + end +end