Skip to content

Commit 4d79cc1

Browse files
authored
probe tabulate version for preserve_whitespace (#109)
Somehow, users are able to have installations of newer mycli/cli_helpers with older versions of tabulate, before a breaking change in the way preserve_whitespace is specified for tabulate. Here we probe the tabulate version to determine how to specify the value.
1 parent 3968fa3 commit 4d79cc1

File tree

4 files changed

+53
-3
lines changed

4 files changed

+53
-3
lines changed

CHANGELOG

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Version 2.12.0
4+
5+
(released on 2025-03-21)
6+
7+
- Probe tabulate version for `preserve_whitespace` keyword support.
8+
39
## Version 2.11.0
410

511
(released on 2025-03-05)

cli_helpers/tabular_output/tabulate_adapter.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import os
77

8-
from cli_helpers.utils import filter_dict_by_key
8+
from cli_helpers.utils import filter_dict_by_key, version_as_tuple
99
from cli_helpers.compat import (
1010
Terminal256Formatter,
1111
TerminalTrueColorFormatter,
@@ -141,6 +141,10 @@
141141
headless_formats = ("minimal",)
142142

143143

144+
def has_new_preserve_whitespace_arg():
145+
return version_as_tuple(tabulate.__version__) >= (0, 10, 0)
146+
147+
144148
def get_preprocessors(format_name):
145149
common_formatters = (
146150
override_missing_value,
@@ -249,7 +253,10 @@ def adapter(data, headers, table_format=None, preserve_whitespace=False, **kwarg
249253
if table_format in supported_markup_formats:
250254
tkwargs.update(numalign=None, stralign=None)
251255

252-
tkwargs.update(preserve_whitespace=preserve_whitespace)
256+
if has_new_preserve_whitespace_arg():
257+
tkwargs.update(preserve_whitespace=preserve_whitespace)
258+
else:
259+
tabulate.PRESERVE_WHITESPACE = preserve_whitespace
253260

254261
tkwargs.update(default_kwargs.get(table_format, {}))
255262
if table_format in headless_formats:

cli_helpers/utils.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import os
66
import re
77
from functools import lru_cache
8-
from typing import Dict, Union
8+
from typing import Dict, Tuple, Union
99

1010
from typing import TYPE_CHECKING
1111

@@ -146,3 +146,15 @@ def filter_style_table(style: "StyleMeta", *relevant_styles: str) -> Dict:
146146
_styles_iter = ((key, val) for key, val in getattr(style, "styles", {}).items())
147147
_relevant_styles_iter = filter(lambda tpl: tpl[0] in relevant_styles, _styles_iter)
148148
return {key: val for key, val in _relevant_styles_iter}
149+
150+
151+
@lru_cache()
152+
def version_as_tuple(version: str) -> Tuple:
153+
try:
154+
list_s = [re.sub(r'(rc|alpha|beta|test|dev|post).*$', '', x) for x in version.split('.')]
155+
list_s = [re.sub(r'[^\d]', '', x) for x in list_s]
156+
list_i = [int(x) for x in list_s if x]
157+
list_i.extend([0, 0, 0])
158+
return tuple(list_i[:3])
159+
except ValueError:
160+
return (0, 0, 0)

tests/test_utils.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,28 @@ def test_filter_dict_by_key():
7575
fd = utils.filter_dict_by_key(d, keys)
7676
assert len(fd) == 1
7777
assert all([k in keys for k in fd])
78+
79+
80+
def test_version_as_tuple_01():
81+
"""Test version_as_tuple() in the usual case."""
82+
assert utils.version_as_tuple('0.10.0') == (0, 10, 0)
83+
84+
85+
def test_version_as_tuple_02():
86+
"""Test version_as_tuple() with leading v."""
87+
assert utils.version_as_tuple('v0.10.0') == (0, 10, 0)
88+
89+
90+
def test_version_as_tuple_03():
91+
"""Test version_as_tuple() trailing padding."""
92+
assert utils.version_as_tuple('0.10') == (0, 10, 0)
93+
94+
95+
def test_version_as_tuple_04():
96+
"""Test version_as_tuple() stripping rc suffixes."""
97+
assert utils.version_as_tuple('0.10.0rc1') == (0, 10, 0)
98+
99+
100+
def test_version_as_tuple_05():
101+
"""Test version_as_tuple() deleting post1 elements."""
102+
assert utils.version_as_tuple('0.10.0.post1') == (0, 10, 0)

0 commit comments

Comments
 (0)