From c91c9542d4cb62349956f3f369f4814da5720709 Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Mon, 11 Apr 2022 09:59:03 -0300 Subject: [PATCH] [commons] fix: human size string conversion from bytes --- bauh/commons/view_utils.py | 10 +++---- tests/common/test_view_utils.py | 47 ++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/bauh/commons/view_utils.py b/bauh/commons/view_utils.py index 082e1d19..726e99b6 100644 --- a/bauh/commons/view_utils.py +++ b/bauh/commons/view_utils.py @@ -3,9 +3,6 @@ from typing import Tuple, Optional, Iterable from bauh.api.abstract.view import SelectViewType, InputOption, SingleSelectComponent -SIZE_UNITS = ((1, 'B'), (1024, 'kB'), (1048576, 'MB'), (1073741824, 'GB'), - (1099511627776, 'TB'), (1125899906842624, 'PB')) - def new_select(label: str, tip: Optional[str], id_: str, opts: Iterable[Tuple[Optional[str], object, Optional[str]]], value: object, max_width: int, type_: SelectViewType = SelectViewType.RADIO, capitalize_label: bool = True): @@ -29,11 +26,10 @@ def get_human_size_str(size, positive_sign: bool = False) -> Optional[str]: if int_size == 0: return '0' - for div, unit in SIZE_UNITS: + for power, unit in enumerate(('B', 'kB', 'MB', 'GB', 'TB', 'PB')): + size_unit = int_size / (1000 ** power) - size_unit = int_size / div - - if size_unit < 1024: + if size_unit < 1000: size_unit = size_unit if size > 0 else size_unit * -1 localized_size = locale.format_string('%.2f', size_unit) size_str = f'{int(size_unit)} {unit}' if unit == 'B' else f"{localized_size} {unit}" diff --git a/tests/common/test_view_utils.py b/tests/common/test_view_utils.py index f715585e..afd62be5 100644 --- a/tests/common/test_view_utils.py +++ b/tests/common/test_view_utils.py @@ -13,39 +13,44 @@ class GetHumanSizeStrTest(TestCase): print("Error: could not set locale.LC_NUMERIC to None") def test__must_properly_display_B(self): - self.assertEqual('1023 B', get_human_size_str(1023)) - self.assertEqual('-1023 B', get_human_size_str(-1023)) + self.assertEqual('1 B', get_human_size_str(1)) + self.assertEqual('999 B', get_human_size_str(999)) + self.assertEqual('-999 B', get_human_size_str(-999)) def test__must_properly_convert_to_kB(self): - self.assertEqual('1.00 kB', get_human_size_str(1024)) - self.assertEqual('1.50 kB', get_human_size_str(1536)) - self.assertEqual('1.75 kB', get_human_size_str(1792)) - self.assertEqual('57.30 kB', get_human_size_str(58675.2)) - self.assertEqual('-1.00 kB', get_human_size_str(-1024)) + self.assertEqual('1.00 kB', get_human_size_str(1000)) + self.assertEqual('-1.00 kB', get_human_size_str(-1000)) + self.assertEqual('1.50 kB', get_human_size_str(1500)) + self.assertEqual('1.75 kB', get_human_size_str(1750)) + self.assertEqual('57.30 kB', get_human_size_str(57300)) def test__must_properly_convert_to_MB(self): - self.assertEqual('1.00 MB', get_human_size_str(1048576)) - self.assertEqual('1.20 MB', get_human_size_str(1258291)) - self.assertEqual('1.50 MB', get_human_size_str(1572864)) - self.assertEqual('57.30 MB', get_human_size_str(60083404.8)) + self.assertEqual('1.00 MB', get_human_size_str(1000 ** 2)) + self.assertEqual('-1.00 MB', get_human_size_str(1000 ** 2 * -1)) + self.assertEqual('1.20 MB', get_human_size_str(1000 ** 2 * 1.2)) + self.assertEqual('1.50 MB', get_human_size_str(1000 ** 2 * 1.5)) + self.assertEqual('57.30 MB', get_human_size_str(1000 ** 2 * 57.3)) def test__must_properly_convert_to_GB(self): - self.assertEqual('1.00 GB', get_human_size_str(1073741824)) - self.assertEqual('57.30 GB', get_human_size_str(61525406515.2)) + self.assertEqual('1.00 GB', get_human_size_str(1000 ** 3)) + self.assertEqual('-1.00 GB', get_human_size_str(1000 ** 3 * -1)) + self.assertEqual('57.30 GB', get_human_size_str(1000 ** 3 * 57.3)) def test__must_properly_convert_to_TB(self): - self.assertEqual('1.00 TB', get_human_size_str(1099511627776)) - self.assertEqual('57.30 TB', get_human_size_str(63002016271564.8)) + self.assertEqual('1.00 TB', get_human_size_str(1000 ** 4)) + self.assertEqual('-1.00 TB', get_human_size_str(1000 ** 4 * -1)) + self.assertEqual('57.30 TB', get_human_size_str(1000 ** 4 * 57.3)) def test__must_properly_convert_to_PB(self): - self.assertEqual('1.00 PB', get_human_size_str(1125899906842624)) - self.assertEqual('57.30 PB', get_human_size_str(64514064662082350)) + self.assertEqual('1.00 PB', get_human_size_str(1000 ** 5)) + self.assertEqual('-1.00 PB', get_human_size_str(1000 ** 5 * -1)) + self.assertEqual('57.30 PB', get_human_size_str(1000 ** 5 * 57.3)) def test__must_concatenate_the_plus_sign_if_positive_sign_is_true_and_value_is_positive(self): - self.assertEqual('+1023 B', get_human_size_str(1023, positive_sign=True)) - self.assertEqual('+1.00 kB', get_human_size_str(1024, positive_sign=True)) + self.assertEqual('+999 B', get_human_size_str(999, positive_sign=True)) + self.assertEqual('+1.00 kB', get_human_size_str(1000, positive_sign=True)) def test__must_not_concatenate_the_plus_sign_if_positive_sign_is_true_and_value_is_negative(self): - self.assertEqual('-1023 B', get_human_size_str(-1023, positive_sign=True)) - self.assertEqual('-1.00 kB', get_human_size_str(-1024, positive_sign=True)) + self.assertEqual('-999 B', get_human_size_str(-999, positive_sign=True)) + self.assertEqual('-1.00 kB', get_human_size_str(-1000, positive_sign=True))