diff options
| author | Павел Жуков <33721692+LeaveMyYard@users.noreply.github.com> | 2023-05-26 23:02:47 +0300 |
|---|---|---|
| committer | Павел Жуков <33721692+LeaveMyYard@users.noreply.github.com> | 2023-05-26 23:02:47 +0300 |
| commit | ed73cfbd95b9222c57950ff727397e251ebca247 (patch) | |
| tree | 3c0bd4a24db102f73a9843cea5e63ebd0b77e056 /robusta_krr/formatters/table.py | |
| parent | 0609ae5b62947b0d55505dec23b9b4d3a5909d89 (diff) | |
Refactor Formatters, use functional approach
Diffstat (limited to 'robusta_krr/formatters/table.py')
| -rw-r--r-- | robusta_krr/formatters/table.py | 171 |
1 files changed, 83 insertions, 88 deletions
diff --git a/robusta_krr/formatters/table.py b/robusta_krr/formatters/table.py index 8ef1696..9776d80 100644 --- a/robusta_krr/formatters/table.py +++ b/robusta_krr/formatters/table.py @@ -1,10 +1,8 @@ -from __future__ import annotations - import itertools from rich.table import Table -from robusta_krr.core.abstract.formatters import BaseFormatter +from robusta_krr.core.abstract import formatters from robusta_krr.core.models.allocations import RecommendationValue from robusta_krr.core.models.result import ResourceScan, ResourceType, Result from robusta_krr.utils import resource_units @@ -13,88 +11,85 @@ NONE_LITERAL = "unset" NAN_LITERAL = "?" -class TableFormatter(BaseFormatter): - """Formatter for text output.""" - - __display_name__ = "table" - __rich_console__ = True - - def _format(self, value: RecommendationValue) -> str: - if value is None: - return NONE_LITERAL - elif isinstance(value, str): - return NAN_LITERAL - else: - return resource_units.format(value) - - def _format_request_str(self, item: ResourceScan, resource: ResourceType, selector: str) -> str: - allocated = getattr(item.object.allocations, selector)[resource] - recommended = getattr(item.recommended, selector)[resource] - severity = recommended.severity - - return ( - f"[{severity.color}]" - + self._format(allocated) - + " -> " - + self._format(recommended.value) - + f"[/{severity.color}]" - ) - - def format(self, result: Result) -> Table: - """Format the result as text. - - :param result: The result to format. - :type result: :class:`core.result.Result` - :returns: The formatted results. - :rtype: str - """ - - table = Table( - show_header=True, - header_style="bold magenta", - title=f"\n{result.description}\n" if result.description else None, - title_justify="left", - title_style="", - # TODO: Fix points calculation at [MAIN-270] - # caption=f"Scan result ({result.score} points)", - ) - - table.add_column("Number", justify="right", no_wrap=True) - table.add_column("Cluster", style="cyan") - table.add_column("Namespace", style="cyan") - table.add_column("Name", style="cyan") - table.add_column("Pods", style="cyan") - table.add_column("Old Pods", style="cyan") - table.add_column("Type", style="cyan") - table.add_column("Container", style="cyan") - for resource in ResourceType: - table.add_column(f"{resource.name} Requests") - table.add_column(f"{resource.name} Limits") - - for _, group in itertools.groupby( - enumerate(result.scans), key=lambda x: (x[1].object.cluster, x[1].object.namespace, x[1].object.name) - ): - group_items = list(group) - - for j, (i, item) in enumerate(group_items): - last_row = j == len(group_items) - 1 - full_info_row = j == 0 - - table.add_row( - f"[{item.severity.color}]{i + 1}.[/{item.severity.color}]", - item.object.cluster if full_info_row else "", - item.object.namespace if full_info_row else "", - item.object.name if full_info_row else "", - f"{item.object.current_pods_count}" if full_info_row else "", - f"{item.object.deleted_pods_count}" if full_info_row else "", - item.object.kind if full_info_row else "", - item.object.container, - *[ - self._format_request_str(item, resource, selector) - for resource in ResourceType - for selector in ["requests", "limits"] - ], - end_section=last_row, - ) - - return table +def _format(value: RecommendationValue) -> str: + if value is None: + return NONE_LITERAL + elif isinstance(value, str): + return NAN_LITERAL + else: + return resource_units.format(value) + + +def _format_request_str(item: ResourceScan, resource: ResourceType, selector: str) -> str: + allocated = getattr(item.object.allocations, selector)[resource] + recommended = getattr(item.recommended, selector)[resource] + severity = recommended.severity + + return ( + f"[{severity.color}]" + + _format(allocated) + + " -> " + + _format(recommended.value) + + f"[/{severity.color}]" + ) + + +@formatters.register(rich_console=True) +def table(result: Result) -> Table: + """Format the result as text. + + :param result: The result to format. + :type result: :class:`core.result.Result` + :returns: The formatted results. + :rtype: str + """ + + table = Table( + show_header=True, + header_style="bold magenta", + title=f"\n{result.description}\n" if result.description else None, + title_justify="left", + title_style="", + # TODO: Fix points calculation at [MAIN-270] + # caption=f"Scan result ({result.score} points)", + ) + + table.add_column("Number", justify="right", no_wrap=True) + table.add_column("Cluster", style="cyan") + table.add_column("Namespace", style="cyan") + table.add_column("Name", style="cyan") + table.add_column("Pods", style="cyan") + table.add_column("Old Pods", style="cyan") + table.add_column("Type", style="cyan") + table.add_column("Container", style="cyan") + for resource in ResourceType: + table.add_column(f"{resource.name} Requests") + table.add_column(f"{resource.name} Limits") + + for _, group in itertools.groupby( + enumerate(result.scans), key=lambda x: (x[1].object.cluster, x[1].object.namespace, x[1].object.name) + ): + group_items = list(group) + + for j, (i, item) in enumerate(group_items): + last_row = j == len(group_items) - 1 + full_info_row = j == 0 + + table.add_row( + f"[{item.severity.color}]{i + 1}.[/{item.severity.color}]", + item.object.cluster if full_info_row else "", + item.object.namespace if full_info_row else "", + item.object.name if full_info_row else "", + f"{item.object.current_pods_count}" if full_info_row else "", + f"{item.object.deleted_pods_count}" if full_info_row else "", + item.object.kind if full_info_row else "", + item.object.container, + *[ + _format_request_str(item, resource, selector) + for resource in ResourceType + for selector in ["requests", "limits"] + ], + end_section=last_row, + ) + + return table |
