Skip to content

Commit

Permalink
cubestat: fix colors for non-256 color terminals
Browse files Browse the repository at this point in the history
  • Loading branch information
okuvshynov committed Sep 10, 2024
1 parent 7591e54 commit 6acbd4b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
46 changes: 36 additions & 10 deletions cubestat/colors.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import curses
import logging

from cubestat.common import DisplayMode

Expand Down Expand Up @@ -30,18 +31,26 @@ class ColorTheme(DisplayMode):
}


def prepare_cells():
def mono_cells():
chrs = [' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']
cells = {}
colorpair = 1
for name, colors in colors_ansi256.items():
cells[name] = []
for i, (fg, bg) in enumerate(zip(colors[1:], colors[:-1])):
return [(c, 0) for c in chrs]


def cells_for_colorscheme(colors, colorpair):
chrs = [' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']
res = []
for i, (fg, bg) in enumerate(zip(colors[1:], colors[:-1])):
try:
curses.init_pair(colorpair, fg, bg)
j = 0 if i == 0 else 1
cells[name].extend((chr, colorpair) for chr in chrs[j:])
colorpair += 1
return cells
except curses.error:
logging.error('curses.init_pair returned error.')
logging.error('Consider setting up 256 colors terminal:')
logging.error(' export TERM=xterm-256color')
return None, colorpair
j = 0 if i == 0 else 1
res.extend((chr, colorpair) for chr in chrs[j:])
colorpair += 1
return res, colorpair


def get_theme(metric, color_mode):
Expand All @@ -51,3 +60,20 @@ def get_theme(metric, color_mode):
ColorTheme.col: light_colormap.get(metric, 'green')
}
return res[color_mode]


class Colorschemes:
def __init__(self):
self.schemes = {}
colorpair = 1
for name, colors in colors_ansi256.items():
cells, colorpair = cells_for_colorscheme(colors, colorpair)
if cells is not None:
self.schemes[name] = cells
self.schemes['mono'] = mono_cells()

def get_cells(self, name):
if name in self.schemes:
return self.schemes[name]
logging.error(f'requested colorscheme {name}.')
return self.schemes['mono']
6 changes: 3 additions & 3 deletions cubestat/screen.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import curses
from math import floor

from cubestat.colors import prepare_cells
from cubestat.colors import Colorschemes


class Screen:
Expand All @@ -13,7 +13,7 @@ def __init__(self, stdscr):
curses.start_color()
curses.use_default_colors()
self.spacing = ' '
self.cells = prepare_cells()
self.colors = Colorschemes()

def write_string(self, row, col, s, color=0):
if col + len(s) > self.cols:
Expand Down Expand Up @@ -54,7 +54,7 @@ def render_ruler(self, indent, title, base_ruler, items, row):
self.write_string(row + 1, self.cols - len(bottomright_border), bottomright_border)

def render_chart(self, theme, max_value, data, row):
cells = self.cells[theme]
cells = self.colors.get_cells(theme)
scaler = len(cells) / max_value
col_start = self.cols - (len(data) + len(self.spacing)) - 1

Expand Down
6 changes: 3 additions & 3 deletions cubestat/tests/test_prepare_cells.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from cubestat.colors import prepare_cells
from cubestat.colors import Colorschemes

from unittest.mock import patch
import unittest
Expand All @@ -7,8 +7,8 @@
class TestPrepareCells(unittest.TestCase):
@patch('curses.init_pair')
def test_prepare_cells(self, mock_init_pair):
cells = prepare_cells()
self.assertEqual(len(cells['green']), 25)
colors = Colorschemes()
self.assertEqual(len(colors.schemes['green']), 25)
self.assertEqual(mock_init_pair.call_count, 18)


Expand Down

0 comments on commit 6acbd4b

Please sign in to comment.