Class: Aspera::Cli::TransferProgress

Inherits:
Object
  • Object
show all
Defined in:
lib/aspera/cli/transfer_progress.rb

Overview

Progress bar for transfers. Supports multi-session.

Instance Method Summary collapse

Constructor Details

#initializeTransferProgress

Returns a new instance of TransferProgress.

[View source]

12
13
14
# File 'lib/aspera/cli/transfer_progress.rb', line 12

def initialize
  reset
end

Instance Method Details

#event(type, session_id:, info: nil) ⇒ Object

Called by user of progress bar with a status on a transfer session

Parameters:

  • session_id

    the unique identifier of a transfer session

  • type

    one of: pre_start, session_start, session_size, transfer, end

  • info (defaults to: nil)

    optional specific additional info for the given event type

[View source]

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/aspera/cli/transfer_progress.rb', line 29

def event(type, session_id:, info: nil)
  Log.log.trace1{"progress: #{type} #{session_id} #{info}"}
  return if @completed
  if @progress_bar.nil?
    @progress_bar = ProgressBar.create(
      format:      '%t %a %B %p%% %r Mbps %E',
      rate_scale:  lambda{|rate|rate / Environment::BYTES_PER_MEBIBIT},
      title:       '',
      total:       nil)
  end
  progress_provided = false
  case type
  when :pre_start
    # give opportunity to show progress of initialization with multiple status
    Aspera.assert(session_id.nil?)
    Aspera.assert_type(info, String)
    # initialization of progress bar
    @title = info
  when :session_start
    Aspera.assert_type(session_id, String)
    Aspera.assert(info.nil?)
    raise "Session #{session_id} already started" if @sessions[session_id]
    @sessions[session_id] = {
      job_size: 0, # total size of transfer (pre-calc)
      current:  0
    }
    # remove last pre-start message if any
    @title = nil
  when :session_size
    Aspera.assert_type(session_id, String)
    Aspera.assert(!info.nil?)
    @sessions[session_id][:job_size] = info.to_i
    current_total = total(:job_size)
    @progress_bar.total = current_total unless current_total.eql?(@progress_bar.total) || current_total < @progress_bar.progress
  when :transfer
    Aspera.assert_type(session_id, String)
    if !@progress_bar.total.nil? && !info.nil?
      progress_provided = true
      @sessions[session_id][:current] = info.to_i
      current_total = total(:current)
      @progress_bar.progress = current_total unless @progress_bar.progress.eql?(current_total)
    end
  when :end
    Aspera.assert(session_id, String)
    Aspera.assert(info.nil?)
    @title = nil
    @completed = true
    @progress_bar.finish
  else Aspera.error_unexpected_value(type){'event type'}
  end
  new_title = @sessions.length < 2 ? @title.to_s : "[#{@sessions.length}] #{@title}"
  @progress_bar.title = new_title unless @progress_bar.title.eql?(new_title)
  @progress_bar.increment if !progress_provided && !@completed
rescue ProgressBar::InvalidProgressError => e
  Log.log.error{"Progress error: #{e}"}
end

#resetObject

Reset progress bar, to re-use it.

[View source]

17
18
19
20
21
22
23
# File 'lib/aspera/cli/transfer_progress.rb', line 17

def reset
  @progress_bar = nil
  # key is session id
  @sessions = {}
  @completed = false
  @title = nil
end