Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Version 2.12.0

(released on 2025-03-21)

- Probe tabulate version for `preserve_whitespace` keyword support.

## Version 2.11.0

(released on 2025-03-05)
Expand Down
11 changes: 9 additions & 2 deletions cli_helpers/tabular_output/tabulate_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import os

from cli_helpers.utils import filter_dict_by_key
from cli_helpers.utils import filter_dict_by_key, version_as_tuple
from cli_helpers.compat import (
Terminal256Formatter,
TerminalTrueColorFormatter,
Expand Down Expand Up @@ -141,6 +141,10 @@
headless_formats = ("minimal",)


def has_new_preserve_whitespace_arg():
return version_as_tuple(tabulate.__version__) >= (0, 10, 0)


def get_preprocessors(format_name):
common_formatters = (
override_missing_value,
Expand Down Expand Up @@ -249,7 +253,10 @@ def adapter(data, headers, table_format=None, preserve_whitespace=False, **kwarg
if table_format in supported_markup_formats:
tkwargs.update(numalign=None, stralign=None)

tkwargs.update(preserve_whitespace=preserve_whitespace)
if has_new_preserve_whitespace_arg():
tkwargs.update(preserve_whitespace=preserve_whitespace)
else:
tabulate.PRESERVE_WHITESPACE = preserve_whitespace

tkwargs.update(default_kwargs.get(table_format, {}))
if table_format in headless_formats:
Expand Down
14 changes: 13 additions & 1 deletion cli_helpers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import os
import re
from functools import lru_cache
from typing import Dict, Union
from typing import Dict, Tuple, Union

from typing import TYPE_CHECKING

Expand Down Expand Up @@ -146,3 +146,15 @@ def filter_style_table(style: "StyleMeta", *relevant_styles: str) -> Dict:
_styles_iter = ((key, val) for key, val in getattr(style, "styles", {}).items())
_relevant_styles_iter = filter(lambda tpl: tpl[0] in relevant_styles, _styles_iter)
return {key: val for key, val in _relevant_styles_iter}


@lru_cache()
def version_as_tuple(version: str) -> Tuple:
try:
list_s = [re.sub(r'(rc|alpha|beta|test|dev|post).*$', '', x) for x in version.split('.')]
list_s = [re.sub(r'[^\d]', '', x) for x in list_s]
list_i = [int(x) for x in list_s if x]
list_i.extend([0, 0, 0])
return tuple(list_i[:3])
except ValueError:
return (0, 0, 0)
25 changes: 25 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,28 @@ def test_filter_dict_by_key():
fd = utils.filter_dict_by_key(d, keys)
assert len(fd) == 1
assert all([k in keys for k in fd])


def test_version_as_tuple_01():
"""Test version_as_tuple() in the usual case."""
assert utils.version_as_tuple('0.10.0') == (0, 10, 0)


def test_version_as_tuple_02():
"""Test version_as_tuple() with leading v."""
assert utils.version_as_tuple('v0.10.0') == (0, 10, 0)


def test_version_as_tuple_03():
"""Test version_as_tuple() trailing padding."""
assert utils.version_as_tuple('0.10') == (0, 10, 0)


def test_version_as_tuple_04():
"""Test version_as_tuple() stripping rc suffixes."""
assert utils.version_as_tuple('0.10.0rc1') == (0, 10, 0)


def test_version_as_tuple_05():
"""Test version_as_tuple() deleting post1 elements."""
assert utils.version_as_tuple('0.10.0.post1') == (0, 10, 0)
Loading