Class: Aidp::Harness::UI::StatusWidget
- Inherits:
-
Base
- Object
- Base
- Aidp::Harness::UI::StatusWidget
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_history ⇒ Object
155
156
157
|
# File 'lib/aidp/harness/ui/status_widget.rb', line 155
def clear_status_history
@status_history.clear
end
|
#current_spinner_message ⇒ Object
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
|
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_history ⇒ Object
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
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_spinner ⇒ Object
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
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
|