Module: BenchmarkRunner::Term
- Defined in:
- lib/tasks/benchmark_runner.rb
Overview
Pretty terminal formatting for benchmark output
Constant Summary collapse
- CLEAR =
"\e[0m"- BOLD =
"\e[1m"- DIM =
"\e[2m"- BLACK =
"\e[30m"- RED =
"\e[31m"- GREEN =
"\e[32m"- YELLOW =
"\e[33m"- BLUE =
"\e[34m"- MAGENTA =
"\e[35m"- CYAN =
"\e[36m"- WHITE =
"\e[37m"- BG_RED =
"\e[41m"- BG_GREEN =
"\e[42m"- HL =
Box-drawing
"─"- VL =
"│"- TL =
"┌"- TR =
"┐"- BL =
"└"- BR =
"┘"- TT =
"┬"- BT =
"┴"- LT =
"├"- RT =
"┤"- CROSS =
"┼"- SPINNER =
Spinner frames
%w[⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏].freeze
Class Method Summary collapse
-
.category(title, icon:, description:, failure_means:, compare_against: nil) ⇒ Object
Category section with description.
- .clear_spinner ⇒ Object
- .env_info(ruby_version, platform) ⇒ Object
- .fail(msg = nil) ⇒ Object
- .header(title, color: CYAN) ⇒ Object
- .hint(msg) ⇒ Object
- .info(msg) ⇒ Object
- .ok ⇒ Object
- .sep(char: HL, width: 78) ⇒ Object
- .speedup_badge(factor, label) ⇒ Object
- .spin ⇒ Object
-
.summary_card(results) ⇒ Object
Summary card using TableTennis.
-
.table(results) ⇒ Object
Results table for a category using TableTennis.
Class Method Details
.category(title, icon:, description:, failure_means:, compare_against: nil) ⇒ Object
Category section with description
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/tasks/benchmark_runner.rb', line 109 def self.category(title, icon:, description:, failure_means:, compare_against: nil) puts puts "#{CYAN}#{VL}#{CLEAR} #{BOLD}#{MAGENTA}#{icon} #{title}#{CLEAR}" puts # Description puts " #{DIM}#{description}#{CLEAR}" puts # What we compare if compare_against puts " #{CYAN}Comparing against:#{CLEAR} #{compare_against}" puts end # What failure means puts " #{YELLOW}⚠️ Failure means:#{CLEAR} #{failure_means}" puts sep(width: 76) puts end |
.clear_spinner ⇒ Object
61 62 63 64 |
# File 'lib/tasks/benchmark_runner.rb', line 61 def self.clear_spinner print "\b \b" $stdout.flush end |
.env_info(ruby_version, platform) ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/tasks/benchmark_runner.rb', line 96 def self.env_info(ruby_version, platform) puts puts " #{DIM}Environment:#{CLEAR}" engine = Canon::XmlBackend.active engine_info = "XML engine: #{engine}" engine_info += " (forced)" unless ENV["CANON_XML_BACKEND"].to_s.empty? puts " #{VL} Ruby #{ruby_version} on #{platform}#{' ' * (60 - ruby_version.length - platform.length)}#{VL}" puts " #{VL} #{engine_info}#{' ' * (60 - engine_info.length)}#{VL}" puts " #{DIM}#{BL}#{HL * 76}#{BR}#{CLEAR}" puts end |
.fail(msg = nil) ⇒ Object
70 71 72 73 |
# File 'lib/tasks/benchmark_runner.rb', line 70 def self.fail(msg = nil) puts " #{RED}✗#{CLEAR}" puts " #{RED}#{msg}#{CLEAR}" if msg end |
.header(title, color: CYAN) ⇒ Object
87 88 89 90 91 92 93 94 |
# File 'lib/tasks/benchmark_runner.rb', line 87 def self.header(title, color: CYAN) width = 78 line = HL * width puts puts "#{color}#{TL}#{line}#{TR}#{CLEAR}" puts "#{color}#{VL}#{CLEAR} #{BOLD}#{color}#{title}#{CLEAR}#{' ' * (width - title.length - 4)}#{color}#{VL}#{CLEAR}" puts "#{color}#{BL}#{line}#{BR}#{CLEAR}" end |
.hint(msg) ⇒ Object
79 80 81 |
# File 'lib/tasks/benchmark_runner.rb', line 79 def self.hint(msg) puts " #{CYAN}→#{CLEAR} #{DIM}#{msg}#{CLEAR}" end |
.info(msg) ⇒ Object
75 76 77 |
# File 'lib/tasks/benchmark_runner.rb', line 75 def self.info(msg) puts " #{DIM}#{msg}#{CLEAR}" end |
.ok ⇒ Object
66 67 68 |
# File 'lib/tasks/benchmark_runner.rb', line 66 def self.ok puts " #{GREEN}✓#{CLEAR}" end |
.sep(char: HL, width: 78) ⇒ Object
83 84 85 |
# File 'lib/tasks/benchmark_runner.rb', line 83 def self.sep(char: HL, width: 78) puts "#{DIM}#{char * width}#{CLEAR}" end |
.speedup_badge(factor, label) ⇒ Object
150 151 152 153 |
# File 'lib/tasks/benchmark_runner.rb', line 150 def self.speedup_badge(factor, label) puts " #{GREEN}⚡ #{label}#{CLEAR}" puts " #{GREEN} #{factor.round(2)}x faster#{CLEAR}" end |
.spin ⇒ Object
55 56 57 58 59 |
# File 'lib/tasks/benchmark_runner.rb', line 55 def self.spin print "\b#{SPINNER[@spinner_idx % SPINNER.length]} " $stdout.flush @spinner_idx += 1 end |
.summary_card(results) ⇒ Object
Summary card using TableTennis
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/tasks/benchmark_runner.rb', line 156 def self.summary_card(results) puts sep(width: 78) puts puts " #{BOLD}#{MAGENTA}SUMMARY#{CLEAR}" puts rows = results.map do |r| { benchmark: r[:label], ips: r[:ips]&.round(1), } end return if rows.empty? table = TableTennis.new(rows, title: "Performance Results", theme: :dark, headers: { benchmark: "Benchmark", ips: "IPS" }) table.render puts puts " #{DIM}#{results.length} benchmarks completed#{CLEAR}" puts end |
.table(results) ⇒ Object
Results table for a category using TableTennis
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/tasks/benchmark_runner.rb', line 134 def self.table(results) rows = results.map do |r| { test: r[:name], ips: r[:ips], deviation: "#{r[:deviation].round(1)}%", status: r[:is_best] ? "BEST" : "", } end return if rows.empty? table = TableTennis.new(rows, theme: :dark) table.render end |