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. Note that we can have this case: 2 sessions (-C x:2), but one session fails and restarts…

Instance Method Summary collapse

Constructor Details

#initializeTransferProgress

Returns a new instance of TransferProgress.



14
15
16
17
18
19
20
# File 'lib/aspera/cli/transfer_progress.rb', line 14

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

Instance Method Details

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

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

Parameters:

  • session_id (defaults to: nil)

    the unique identifier of a transfer session

  • type (Symbol)

    one of: sessions_init, session_start, session_size, transfer, session_end and end

  • info (defaults to: nil)

    optional specific additional info for the given event type



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
85
86
87
88
89
90
91
92
93
# File 'lib/aspera/cli/transfer_progress.rb', line 31

def event(type, session_id: nil, 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 :sessions_init
    # 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,
      running:  true
    }
    # Remove last pre-start message if any
    @title = nil
  when :session_size
    Aspera.assert_type(session_id, String)
    Aspera.assert(!info.nil?)
    Aspera.assert_type(@sessions[session_id], Hash)
    @sessions[session_id][:job_size] = info.to_i
    sessions_total = total(:job_size)
    @progress_bar.total = sessions_total unless sessions_total.eql?(@progress_bar.total) || sessions_total < @progress_bar.progress
  when :transfer
    Aspera.assert_type(session_id, String)
    Aspera.assert_type(@sessions[session_id], Hash)
    if !@progress_bar.total.nil? && !info.nil?
      progress_provided = true
      @sessions[session_id][:current] = info.to_i
      sessions_current = total(:current)
      @progress_bar.progress = sessions_current unless @progress_bar.progress.eql?(sessions_current) || sessions_current > total(:job_size)
    end
  when :session_end
    Aspera.assert_type(session_id, String)
    Aspera.assert(info.nil?)
    # A session may be too short and finish before it has been started
    @sessions[session_id][:running] = false if @sessions[session_id].is_a?(Hash)
  when :end
    Aspera.assert(session_id.nil?)
    Aspera.assert(info.nil?)
    @progress_bar.finish
  else Aspera.error_unexpected_value(type){'event type'}
  end
  new_title = @sessions.length < 2 ? @title.to_s : "[#{@sessions.count{ |_i, d| d[:running]}}] #{@title}"
  @progress_bar&.title = new_title unless @progress_bar&.title.eql?(new_title)
  @progress_bar&.increment if !progress_provided && @progress_bar.progress.nil?
rescue ProgressBar::InvalidProgressError => e
  Log.log.error{"Progress error: #{e}"}
end

#resetObject

Reset progress bar, to re-use it.



23
24
25
# File 'lib/aspera/cli/transfer_progress.rb', line 23

def reset
  send(:initialize)
end