Class: Sidekiq::TUI::BaseTab

Inherits:
Object
  • Object
show all
Includes:
Controls
Defined in:
lib/sidekiq/tui/tabs/base_tab.rb

Constant Summary

Constants included from Controls

Controls::GLOBAL, Controls::SHARED

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Controls

#controls, #features

Constructor Details

#initialize(parent) ⇒ BaseTab

Returns a new instance of BaseTab.



9
10
11
12
13
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 9

def initialize(parent)
  @parent = parent
  @name = self.class.name.split("::").last
  reset_data
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



7
8
9
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 7

def data
  @data
end

#nameObject (readonly)

Returns the value of attribute name.



6
7
8
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 6

def name
  @name
end

Instance Method Details

#each_selection(unselect: true) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 39

def each_selection(unselect: true, &)
  sel = @data[:selected]
  finished = []
  if !sel.empty?
    sel.each do |id|
      yield id
      # When processing multiple items in bulk, we want to unselect
      # each row if its operation succeeds so our UI will not
      # re-process rows 1-3 if row 4 fails.
      finished << id
    end
  else
    ids = @data.dig(:table, :row_ids)
    return if !ids || ids.empty?
    yield ids[@data[:selected_row_index]]
  end
ensure
  @data[:selected] = sel - finished if unselect
end

#errorObject



23
24
25
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 23

def error
  @data[:error]
end

#error=(e) ⇒ Object



27
28
29
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 27

def error=(e)
  @data[:error] = e
end

#filtering?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 35

def filtering?
  false
end

#format_memory(rss_kb) ⇒ Object



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 174

def format_memory(rss_kb)
  return "0" if rss_kb.nil? || rss_kb == 0

  if rss_kb < 100_000
    "#{number_with_delimiter(rss_kb)} KB"
  elsif rss_kb < 10_000_000
    "#{number_with_delimiter((rss_kb / 1024.0).to_i)} MB"
  else
    "#{number_with_delimiter(rss_kb / (1024.0 * 1024.0), precision: 1)} GB"
  end
end

Navigate the row selection up or down in the current tab’s table.

Parameters:

  • direction (Symbol)

    :up or :down



61
62
63
64
65
66
67
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 61

def navigate_row(direction)
  ids = @data.dig(:table, :row_ids)
  return if !ids || ids.empty?

  index_change = (direction == :down) ? 1 : -1
  @data[:selected_row_index] = (@data[:selected_row_index] + index_change) % ids.count
end

#next_pageObject



77
78
79
80
81
82
83
84
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 77

def next_page
  np = @data.dig(:table, :next_page)
  return unless np
  opts = @data.dig(:table, :pager)
  return unless opts

  @data[:table][:pager] = Sidekiq::TUI::PageOptions.new(np, opts.size)
end

#number_with_delimiter(number, options = {}) ⇒ Object

TODO Implement I18n delimiter



169
170
171
172
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 169

def number_with_delimiter(number, options = {})
  precision = options[:precision] || 0
  number.round(precision)
end

#prev_pageObject



69
70
71
72
73
74
75
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 69

def prev_page
  opts = @data.dig(:table, :pager)
  return unless opts
  return if opts.page < 2

  @data[:table][:pager] = Sidekiq::TUI::PageOptions.new(opts.page - 1, opts.size)
end

#refresh_data_for_statsObject



104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 104

def refresh_data_for_stats
  stats = Sidekiq::Stats.new
  @data[:stats] = {
    processed: stats.processed,
    failed: stats.failed,
    busy: stats.workers_size,
    enqueued: stats.enqueued,
    retries: stats.retry_size,
    scheduled: stats.scheduled_size,
    dead: stats.dead_size
  }
end

#render_stats_section(tui, frame, area) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 141

def render_stats_section(tui, frame, area)
  stats = @data[:stats]

  keys = ["Processed", "Failed", "Busy", "Enqueued", "Retries", "Scheduled", "Dead"]
  values = [
    stats[:processed],
    stats[:failed],
    stats[:busy],
    stats[:enqueued],
    stats[:retries],
    stats[:scheduled],
    stats[:dead]
  ]

  # Format keys and values with spacing
  keys_line = keys.map { |k| t(k).to_s.ljust(12) }.join("  ")
  values_line = values.map { |v| v.to_s.ljust(12) }.join("  ")

  frame.render_widget(
    tui.paragraph(
      text: [keys_line, values_line],
      block: tui.block(title: "Statistics", borders: [:all])
    ),
    area
  )
end

#render_table(tui, frame, area) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 117

def render_table(tui, frame, area)
  page = @data.dig(:table, :current_page) || 1
  rows = @data.dig(:table, :rows) || []
  total = @data.dig(:table, :total) || 0
  footer = ["", "Page: #{page}", "Count: #{rows.size}", "Total: #{total}"]
  footer << "Selected: #{@data[:selected].size}" unless @data[:selected].empty?

  defaults = {
    title: "TableName",
    footer: footer
  }
  if features.include?(:selectable)
    defaults.merge!({
      highlight_symbol: "➡️",
      selected_row: @data[:selected_row_index],
      row_highlight_style: tui.style(fg: :white, bg: :blue)
    })
  end
  hash = defaults.merge(yield)
  hash[:block] ||= tui.block(title: hash.delete(:title), borders: :all)
  table = tui.table(**hash)
  frame.render_widget(table, area)
end

#reset_dataObject



19
20
21
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 19

def reset_data
  @data = {selected: [], selected_row_index: 0}
end

#selected?(entry) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 31

def selected?(entry)
  @data[:selected].index(entry.id)
end

#tObject



15
16
17
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 15

def t(*)
  @parent.t(*)
end

#toggle_select(which = :current) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/sidekiq/tui/tabs/base_tab.rb', line 86

def toggle_select(which = :current)
  sel = @data[:selected]
  # log(which, sel)
  if which == :current
    x = @data[:table][:row_ids][@data[:selected_row_index]]
    if sel.index(x)
      # already checked, uncheck it
      sel.delete(x)
    else
      sel << x
    end
  elsif sel.empty?
    @data[:selected] = @data[:table][:row_ids]
  else
    sel.clear
  end
end