Class: Aidp::Harness::UI::StatusWidget

Inherits:
Base
  • Object
show all
Defined in:
lib/aidp/harness/ui/status_widget.rb

Overview

Handles status display using CLI UI spinners

Defined Under Namespace

Classes: DisplayError, InvalidStatusError, StatusError

Instance Method Summary collapse

Constructor Details

#initialize(ui_components = {}) ⇒ StatusWidget

Returns a new instance of StatusWidget.



18
19
20
21
22
23
24
25
26
27
# File 'lib/aidp/harness/ui/status_widget.rb', line 18

def initialize(ui_components = {})
  super()
  @spinner = ui_components[:spinner] || TTY::Spinner
  @pastel = Pastel.new
  @formatter = ui_components[:formatter] || StatusFormatter.new
  @output = ui_components[:output]
  @status_history = []
  @current_spinner = nil
  @spinner_active = false
end

Instance Method Details

#clear_status_historyObject



155
156
157
# File 'lib/aidp/harness/ui/status_widget.rb', line 155

def clear_status_history
  @status_history.clear
end

#current_spinner_messageObject



180
181
182
183
# File 'lib/aidp/harness/ui/status_widget.rb', line 180

def current_spinner_message
  return nil unless @spinner_active
  @current_spinner&.message&.to_s&.gsub(/⏳\s+|\s+:spinner/, "")
end

#display_multiple_status(status_items) ⇒ Object



143
144
145
146
147
148
149
# File 'lib/aidp/harness/ui/status_widget.rb', line 143

def display_multiple_status(status_items)
  return if status_items.empty?

  status_items.each do |item|
    display_status(item[:type], item[:message], item[:error_data])
  end
end

#display_status(status_type, message, error_data = nil) ⇒ Object

Methods expected by tests



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/aidp/harness/ui/status_widget.rb', line 86

def display_status(status_type, message, error_data = nil)
  validate_status_type(status_type)
  validate_message(message)

  case status_type
  when :loading
    display_loading_status(message)
  when :success
    display_success_status(message)
  when :error
    display_error_status(message, error_data)
  when :warning
    display_warning_status(message)
  end

  record_status_history(status_type, message, error_data)
rescue InvalidStatusError => e
  raise e
rescue => e
  raise DisplayError, "Failed to display status: #{e.message}"
end

#display_status_with_duration(status_type, message, duration) ⇒ Object



134
135
136
137
138
139
140
141
# File 'lib/aidp/harness/ui/status_widget.rb', line 134

def display_status_with_duration(status_type, message, duration)
  validate_status_type(status_type)
  validate_message(message)

  formatted_duration = format_duration(duration)
  message_with_duration = "#{message} (#{formatted_duration})"
  display_status(status_type, message_with_duration)
end

#format_duration(seconds) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/aidp/harness/ui/status_widget.rb', line 159

def format_duration(seconds)
  return "0s" if seconds <= 0

  if seconds < 60
    "#{seconds.round(1)}s"
  elsif seconds < 3600
    minutes = (seconds / 60).floor
    remaining_seconds = (seconds % 60).floor
    "#{minutes}m #{remaining_seconds}s"
  else
    hours = (seconds / 3600).floor
    minutes = ((seconds % 3600) / 60).floor
    remaining_seconds = (seconds % 60).floor
    "#{hours}h #{minutes}m #{remaining_seconds}s"
  end
end

#get_status_historyObject



151
152
153
# File 'lib/aidp/harness/ui/status_widget.rb', line 151

def get_status_history
  @status_history.dup
end

#show_error_status(message) ⇒ Object



67
68
69
70
71
72
73
74
# File 'lib/aidp/harness/ui/status_widget.rb', line 67

def show_error_status(message)
  validate_message(message)

  formatted_message = @formatter.format_error_message(message)
  display_message(formatted_message)
rescue => e
  raise DisplayError, "Failed to show error status: #{e.message}"
end

#show_loading_status(operation_name, &block) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/aidp/harness/ui/status_widget.rb', line 49

def show_loading_status(operation_name, &block)
  validate_operation_name(operation_name)

  message = @formatter.format_loading_message(operation_name)
  show_status(message, &block)
rescue => e
  raise DisplayError, "Failed to show loading status: #{e.message}"
end

#show_status(message, &block) ⇒ Object



29
30
31
32
33
34
35
36
37
38
# File 'lib/aidp/harness/ui/status_widget.rb', line 29

def show_status(message, &block)
  validate_message(message)

  formatted_message = @formatter.format_status_message(message)
  @spinner.spin(formatted_message) do |spinner|
    yield(spinner) if block
  end
rescue => e
  raise DisplayError, "Failed to show status: #{e.message}"
end

#show_success_status(message) ⇒ Object



58
59
60
61
62
63
64
65
# File 'lib/aidp/harness/ui/status_widget.rb', line 58

def show_success_status(message)
  validate_message(message)

  formatted_message = @formatter.format_success_message(message)
  display_message(formatted_message)
rescue => e
  raise DisplayError, "Failed to show success status: #{e.message}"
end

#show_warning_status(message) ⇒ Object



76
77
78
79
80
81
82
83
# File 'lib/aidp/harness/ui/status_widget.rb', line 76

def show_warning_status(message)
  validate_message(message)

  formatted_message = @formatter.format_warning_message(message)
  display_message(formatted_message)
rescue => e
  raise DisplayError, "Failed to show warning status: #{e.message}"
end

#spinner_active?Boolean

Returns:

  • (Boolean)


176
177
178
# File 'lib/aidp/harness/ui/status_widget.rb', line 176

def spinner_active?
  @spinner_active
end

#start_spinner(message) ⇒ Object



108
109
110
111
112
113
114
115
# File 'lib/aidp/harness/ui/status_widget.rb', line 108

def start_spinner(message)
  validate_message(message)
  stop_spinner if @spinner_active

  @spinner_active = true
  @current_spinner = @spinner.new("#{message} :spinner", format: :pulse)
  @current_spinner.start
end

#stop_spinnerObject



117
118
119
120
121
122
123
# File 'lib/aidp/harness/ui/status_widget.rb', line 117

def stop_spinner
  return unless @spinner_active

  @current_spinner&.stop
  @spinner_active = false
  @current_spinner = nil
end

#update_spinner_message(message) ⇒ Object

Raises:



125
126
127
128
129
130
131
132
# File 'lib/aidp/harness/ui/status_widget.rb', line 125

def update_spinner_message(message)
  validate_message(message)
  raise DisplayError, "No active spinner to update" unless @spinner_active

  @current_spinner&.stop
  @current_spinner = @spinner.new("#{message} :spinner", format: :pulse)
  @current_spinner.start
end

#update_status(spinner, message) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/aidp/harness/ui/status_widget.rb', line 40

def update_status(spinner, message)
  validate_spinner_and_message(spinner, message)

  formatted_message = @formatter.format_status_message(message)
  spinner.update_title(formatted_message)
rescue => e
  raise DisplayError, "Failed to update status: #{e.message}"
end