Class: Aidp::Harness::UI::ProgressDisplay

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

Overview

Handles progress display using CLI UI progress bars

Defined Under Namespace

Classes: DisplayError, InvalidProgressError, ProgressError

Constant Summary

Constants included from MessageDisplay

MessageDisplay::COLOR_MAP

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MessageDisplay

#in_test_environment?, included, #message_display_prompt, #suppress_display_message?

Constructor Details

#initialize(ui_components = {}) ⇒ ProgressDisplay

Returns a new instance of ProgressDisplay.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/aidp/harness/ui/progress_display.rb', line 23

def initialize(ui_components = {})
  super()
  @progress = ui_components[:progress] || TTY::ProgressBar
  @pastel = Pastel.new
  @formatter = ui_components[:formatter] || ProgressFormatter.new
  @display_history = []
  @auto_refresh_enabled = false
  @refresh_interval = 1.0
  @refresh_thread = nil
  @output = ui_components[:output]
  @prompt = ui_components[:prompt] || TTY::Prompt.new
  @spinner_class = begin
    ui_components[:spinner] || TTY::Spinner
  rescue
    nil
  end
  @spinner = nil
end

Instance Attribute Details

#refresh_intervalObject (readonly)

Returns the value of attribute refresh_interval.



21
22
23
# File 'lib/aidp/harness/ui/progress_display.rb', line 21

def refresh_interval
  @refresh_interval
end

Instance Method Details

#auto_refresh_enabled?Boolean

Returns:

  • (Boolean)


160
161
162
# File 'lib/aidp/harness/ui/progress_display.rb', line 160

def auto_refresh_enabled?
  @auto_refresh_enabled
end

#clear_display_historyObject



137
138
139
# File 'lib/aidp/harness/ui/progress_display.rb', line 137

def clear_display_history
  @display_history = []
end

#display_multiple_progress(progress_items, display_type = :standard) ⇒ Object

Raises:

  • (ArgumentError)


120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/aidp/harness/ui/progress_display.rb', line 120

def display_multiple_progress(progress_items, display_type = :standard)
  raise ArgumentError, "Progress items must be an array" unless progress_items.is_a?(Array)

  if progress_items.empty?
    display_message(@pastel.dim("No progress items to display."), type: :muted)
    return
  end

  progress_items.each do |item|
    display_progress(item, display_type)
  end
end

#display_progress(progress_data, display_type = :standard) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/aidp/harness/ui/progress_display.rb', line 100

def display_progress(progress_data, display_type = :standard)
  validate_progress_data(progress_data)
  validate_display_type(display_type)

  case display_type
  when :standard
    display_standard_progress(progress_data)
  when :detailed
    display_detailed_progress(progress_data)
  when :minimal
    display_minimal_progress(progress_data)
  end

  record_display_history(progress_data, display_type)
rescue InvalidProgressError => e
  raise e
rescue => e
  raise DisplayError, "Failed to display progress: #{e.message}"
end

#get_display_historyObject



133
134
135
# File 'lib/aidp/harness/ui/progress_display.rb', line 133

def get_display_history
  @display_history.dup
end

#show_indeterminate_progress(message) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/aidp/harness/ui/progress_display.rb', line 89

def show_indeterminate_progress(message)
  validate_message(message)

  @progress.progress do |bar|
    bar.update_title(message)
    yield(bar) if block_given?
  end
rescue => e
  raise DisplayError, "Failed to display indeterminate progress: #{e.message}"
end

#show_progress(total_steps, &block) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/aidp/harness/ui/progress_display.rb', line 54

def show_progress(total_steps, &block)
  validate_total_steps(total_steps)

  progress_bar = @progress.new(
    "[:bar] :percent% :current/:total",
    total: total_steps,
    width: 30,
    output: @output
  )

  execute_progress_steps(progress_bar, total_steps, &block)
rescue => e
  raise DisplayError, "Failed to display progress: #{e.message}"
end

#show_step_progress(step_name, total_substeps, &block) ⇒ Object



78
79
80
81
82
83
84
85
86
87
# File 'lib/aidp/harness/ui/progress_display.rb', line 78

def show_step_progress(step_name, total_substeps, &block)
  validate_step_inputs(step_name, total_substeps)

  formatted_title = @formatter.format_step_title(step_name)
  @progress.progress do |bar|
    execute_substeps(bar, total_substeps, formatted_title, &block)
  end
rescue => e
  raise DisplayError, "Failed to display step progress: #{e.message}"
end

#start_auto_refresh(interval) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/aidp/harness/ui/progress_display.rb', line 141

def start_auto_refresh(interval)
  return if @auto_refresh_enabled

  @refresh_interval = interval
  @auto_refresh_enabled = true
  @refresh_thread = Thread.new do
    while @auto_refresh_enabled
      yield if block_given?
      sleep @refresh_interval
    end
  end
end

#start_spinner(message = "Loading...") ⇒ Object

Simple spinner management used by component specs



43
44
45
46
47
# File 'lib/aidp/harness/ui/progress_display.rb', line 43

def start_spinner(message = "Loading...")
  return unless @spinner_class
  @spinner = @spinner_class.new("#{message} :spinner", format: :dots, output: @output)
  @spinner.start
end

#stop_auto_refreshObject



154
155
156
157
158
# File 'lib/aidp/harness/ui/progress_display.rb', line 154

def stop_auto_refresh
  @auto_refresh_enabled = false
  @refresh_thread&.join
  @refresh_thread = nil
end

#stop_spinnerObject



49
50
51
52
# File 'lib/aidp/harness/ui/progress_display.rb', line 49

def stop_spinner
  @spinner&.stop
  @spinner = nil
end

#update_progress(bar, message = nil) ⇒ Object



69
70
71
72
73
74
75
76
# File 'lib/aidp/harness/ui/progress_display.rb', line 69

def update_progress(bar, message = nil)
  validate_progress_bar(bar)

  bar.tick
  bar.update_title(message) if message
rescue => e
  raise DisplayError, "Failed to update progress: #{e.message}"
end