Class: HaveAPI::CLI::ActionState

Inherits:
Object
  • Object
show all
Defined in:
lib/haveapi/cli/action_state.rb

Overview

This class can watch action’s state and show it’s progress with a progress bar.

When interrupted, the user is asked whether he wishes to cancel the action, then it shows the progress of cancellation.

Methods from this class may invoke ‘exit()` whenever appropriate.

Instance Method Summary collapse

Constructor Details

#initialize(opts, client, id) ⇒ ActionState

Returns a new instance of ActionState.

Parameters:



14
15
16
17
18
# File 'lib/haveapi/cli/action_state.rb', line 14

def initialize(opts, client, id)
  @opts = opts
  @client = client
  @id = id
end

Instance Method Details

#cancel_action(timeout: nil) ⇒ Object

Ask the user if he wishes to cancel the action. If so, execute cancel and call self.wait_for_completion on the cancellation, if it is blocking operation.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/haveapi/cli/action_state.rb', line 72

def cancel_action(timeout: nil)
  STDOUT.write("Do you wish to cancel the action? [y/N]: ")
  STDOUT.flush

  if STDIN.readline.strip.downcase == 'y'
    begin
      res = HaveAPI::Client::Action.cancel(@client, @id)

    rescue HaveAPI::Client::ActionFailed => e
      res = e.response
    end

    if res.is_a?(HaveAPI::Client::Response) && res.ok?
      puts "Cancelled"
      exit

    elsif res
      @pb.resume

      wait_for_completion(
          id: res,
          timeout: timeout,
          cancel: true,
      )
      exit
    end

    warn "Cancel failed: #{res.message}"
    exit(false)
  end
end


104
105
106
107
108
109
110
111
112
# File 'lib/haveapi/cli/action_state.rb', line 104

def print_help(id = nil)
  id ||= @id

  puts "Run"
  puts "  #{$0} action_state show #{id}"
  puts "or"
  puts "  #{$0} action_state wait #{id}"
  puts "to check the action's progress."
end

#wait_for_completion(id: nil, timeout: nil, cancel: false) ⇒ Object

Block until the action is finished or timeout is reached. Progress is shown with a progress bar. Offers cancellation on interrupt.

Parameters:

  • timeout (Float) (defaults to: nil)
  • cancel (Boolean) (defaults to: false)

    determines whether we’re waiting for a cancel to finish



25
26
27
28
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
# File 'lib/haveapi/cli/action_state.rb', line 25

def wait_for_completion(id: nil, timeout: nil, cancel: false)
  id ||= @id

  if cancel
    puts "Waiting for the action to cancel (hit Ctrl+C to skip)..."
  else
    puts "Waiting for the action to complete (hit Ctrl+C to skip)..."
  end
  
  last_status = false
  can_cancel = false

  begin
    ret = HaveAPI::Client::Action.wait_for_completion(
        @client,
        id,
        timeout: timeout,
    ) do |state|
      last_status = state.status
      can_cancel = state.can_cancel?
      
      update_progress(state, cancel)
    end

  rescue Interrupt
    @pb && @pb.stop
    puts

    cancel_action(timeout: timeout) if can_cancel && !cancel && last_status

    puts
    print_help(id)
    exit(false)
  end

  if ret
    @pb && @pb.finish
  else
    @pb && @pb.stop
  end

  ret
end