From fd6305a5f7c19a24304a20e7841d147075b42fec Mon Sep 17 00:00:00 2001 From: 3coma3 <3coma3@gmail.com> Date: Sat, 15 Jul 2023 03:07:03 +0100 Subject: [PATCH 1/3] Add k8s segment to show context and namespace info I added this to avoid making mistakes when using multiple contexts, hope you find it useful. Requirements kubectx and kubens from https://github.com/ahmetb/kubectx in PATH Configuration "k8s": { "ltrim": bool, "rtrim": bool, "symbol": bool, "max_context": number, "max_namespace": number, "colorize": bool, "colorize_symbol": bool }, ltrim, rtrim: do not add space at left or right (compatibility with some theme mods) symbol: show k8s symbol max_context, max_namespace: cut with an ellipsis context or namespace, use 0 to supress output colorize, colorize_symbol: auto-colorize based on the information string Theme K8S_FG = 57 K8S_BG = 7 K8S_SYMBOL_FG = 57 --- powerline_shell/segments/k8s.py | 65 +++++++++++++++++++++++++++++++ powerline_shell/themes/default.py | 4 ++ 2 files changed, 69 insertions(+) create mode 100644 powerline_shell/segments/k8s.py diff --git a/powerline_shell/segments/k8s.py b/powerline_shell/segments/k8s.py new file mode 100644 index 00000000..f6e8c889 --- /dev/null +++ b/powerline_shell/segments/k8s.py @@ -0,0 +1,65 @@ +import os +import subprocess +from ..utils import BasicSegment +from ..colortrans import rgb2short +from ..color_compliment import stringToHashToColorAndOpposite + + +def kube_info(cmd): + try: + p = subprocess.Popen(cmd.split(), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=os.environ.copy()) + except OSError: + return '' + + pdata = p.communicate() + if p.returncode != 0: + return '' + + return ''.join(pdata[0].decode("utf-8").splitlines()) + + +def ellipse(string, length): + if length > 0: + return (string[:length] + '~') if len(string) > length else string + else: + return '' + + +class Segment(BasicSegment): + def add_to_powerline(self): + powerline = self.powerline + + kctx = kube_info("kubectl-ctx -c") + if not kctx: # without context there's nothing to do + return + + kctx = ellipse(kctx, + powerline.segment_conf("k8s", "max_context")) + + kns = ellipse(kube_info("kubectl-ns -c"), + powerline.segment_conf("k8s", "max_namespace")) + + status = kctx + ('|' if kctx and kns else '') + kns + + bg = powerline.theme.K8S_BG + fg = powerline.theme.K8S_FG + sym_fg = powerline.theme.K8S_SYMBOL_FG + + if powerline.segment_conf("k8s", "colorize"): + bg, fg = stringToHashToColorAndOpposite(status) + fg, bg = (rgb2short(*color) for color in [fg, bg]) + + if powerline.segment_conf("k8s", "colorize_symbol"): + sym_fg = fg + + lspace = '' if powerline.segment_conf("k8s", "ltrim") else ' ' + rspace = '' if powerline.segment_conf("k8s", "rtrim") else ' ' + + if powerline.segment_conf("k8s", "symbol"): + powerline.append(lspace + U'\U0001F578' + ' ', sym_fg, bg) + powerline.append(status + rspace, fg, bg) + else: + powerline.append(lspace + status + rspace, fg, bg) diff --git a/powerline_shell/themes/default.py b/powerline_shell/themes/default.py index da0c0034..350e1ba0 100644 --- a/powerline_shell/themes/default.py +++ b/powerline_shell/themes/default.py @@ -72,6 +72,10 @@ class DefaultColor(object): AWS_PROFILE_FG = 39 AWS_PROFILE_BG = 238 + K8S_FG = 57 + K8S_BG = 7 + K8S_SYMBOL_FG = 57 + TIME_FG = 250 TIME_BG = 238 From 27faf9e0c3fcaab2167d8f5d6bcf00b9883eb364 Mon Sep 17 00:00:00 2001 From: 3coma3 <3coma3@gmail.com> Date: Sat, 15 Jul 2023 19:10:58 +0100 Subject: [PATCH 2/3] Cleanup expressions --- powerline_shell/segments/k8s.py | 37 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/powerline_shell/segments/k8s.py b/powerline_shell/segments/k8s.py index f6e8c889..c2c05ab1 100644 --- a/powerline_shell/segments/k8s.py +++ b/powerline_shell/segments/k8s.py @@ -4,6 +4,7 @@ from ..colortrans import rgb2short from ..color_compliment import stringToHashToColorAndOpposite +EMPTY = '' def kube_info(cmd): try: @@ -12,53 +13,53 @@ def kube_info(cmd): stderr=subprocess.PIPE, env=os.environ.copy()) except OSError: - return '' + return EMPTY - pdata = p.communicate() - if p.returncode != 0: - return '' + data = p.communicate() + if p.returncode: + return EMPTY - return ''.join(pdata[0].decode("utf-8").splitlines()) + return data[0].decode('utf-8').splitlines()[0] def ellipse(string, length): if length > 0: return (string[:length] + '~') if len(string) > length else string else: - return '' + return EMPTY class Segment(BasicSegment): def add_to_powerline(self): - powerline = self.powerline + kctx = kube_info('kubectl-ctx -c') + if not kctx: + return # no context, nothing to do - kctx = kube_info("kubectl-ctx -c") - if not kctx: # without context there's nothing to do - return + powerline = self.powerline kctx = ellipse(kctx, - powerline.segment_conf("k8s", "max_context")) + powerline.segment_conf('k8s', 'max_context')) kns = ellipse(kube_info("kubectl-ns -c"), - powerline.segment_conf("k8s", "max_namespace")) + powerline.segment_conf('k8s', 'max_namespace')) - status = kctx + ('|' if kctx and kns else '') + kns + status = kctx + ('|' if kctx and kns else EMPTY) + kns bg = powerline.theme.K8S_BG fg = powerline.theme.K8S_FG sym_fg = powerline.theme.K8S_SYMBOL_FG - if powerline.segment_conf("k8s", "colorize"): + if powerline.segment_conf('k8s', 'colorize'): bg, fg = stringToHashToColorAndOpposite(status) fg, bg = (rgb2short(*color) for color in [fg, bg]) - if powerline.segment_conf("k8s", "colorize_symbol"): + if powerline.segment_conf('k8s', 'colorize_symbol'): sym_fg = fg - lspace = '' if powerline.segment_conf("k8s", "ltrim") else ' ' - rspace = '' if powerline.segment_conf("k8s", "rtrim") else ' ' + lspace = EMPTY if powerline.segment_conf('k8s', 'ltrim') else ' ' + rspace = EMPTY if powerline.segment_conf('k8s', 'rtrim') else ' ' - if powerline.segment_conf("k8s", "symbol"): + if powerline.segment_conf('k8s', 'symbol'): powerline.append(lspace + U'\U0001F578' + ' ', sym_fg, bg) powerline.append(status + rspace, fg, bg) else: From bc86f69950a90f2f4ee39348cc1ca8898e7afc50 Mon Sep 17 00:00:00 2001 From: 3coma3 <3coma3@gmail.com> Date: Sun, 16 Jul 2023 01:29:22 +0100 Subject: [PATCH 3/3] Expression cleanup #2 --- powerline_shell/segments/k8s.py | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/powerline_shell/segments/k8s.py b/powerline_shell/segments/k8s.py index c2c05ab1..88257ea0 100644 --- a/powerline_shell/segments/k8s.py +++ b/powerline_shell/segments/k8s.py @@ -4,8 +4,10 @@ from ..colortrans import rgb2short from ..color_compliment import stringToHashToColorAndOpposite + EMPTY = '' + def kube_info(cmd): try: p = subprocess.Popen(cmd.split(), @@ -22,9 +24,9 @@ def kube_info(cmd): return data[0].decode('utf-8').splitlines()[0] -def ellipse(string, length): +def ellipse(s, length): if length > 0: - return (string[:length] + '~') if len(string) > length else string + return (s[:length] + '~') if len(s) > length else s else: return EMPTY @@ -36,31 +38,29 @@ def add_to_powerline(self): return # no context, nothing to do powerline = self.powerline + conf = lambda key: powerline.segment_conf('k8s', key) - kctx = ellipse(kctx, - powerline.segment_conf('k8s', 'max_context')) - - kns = ellipse(kube_info("kubectl-ns -c"), - powerline.segment_conf('k8s', 'max_namespace')) - - status = kctx + ('|' if kctx and kns else EMPTY) + kns + kctx = ellipse(kctx, conf('max_context')) + kns = ellipse(kube_info("kubectl-ns -c"), conf('max_namespace')) + status = f"{kctx}{'|' if kctx and kns else EMPTY}{kns}" + # the symbol and separator can be themed too bg = powerline.theme.K8S_BG fg = powerline.theme.K8S_FG sym_fg = powerline.theme.K8S_SYMBOL_FG - if powerline.segment_conf('k8s', 'colorize'): + if conf('colorize'): bg, fg = stringToHashToColorAndOpposite(status) fg, bg = (rgb2short(*color) for color in [fg, bg]) - if powerline.segment_conf('k8s', 'colorize_symbol'): + if conf('colorize_symbol'): sym_fg = fg - lspace = EMPTY if powerline.segment_conf('k8s', 'ltrim') else ' ' - rspace = EMPTY if powerline.segment_conf('k8s', 'rtrim') else ' ' + lspace = EMPTY if conf('ltrim') else ' ' + rspace = EMPTY if conf('rtrim') else ' ' - if powerline.segment_conf('k8s', 'symbol'): - powerline.append(lspace + U'\U0001F578' + ' ', sym_fg, bg) - powerline.append(status + rspace, fg, bg) + if conf('symbol'): + powerline.append(f"{lspace}\U0001F578 ", sym_fg, bg) + powerline.append(f"{status}{rspace}", fg, bg) else: - powerline.append(lspace + status + rspace, fg, bg) + powerline.append(f"{lspace}{status}{rspace}", fg, bg)