mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-06 22:54:16 +02:00
[commons] fix: human size string conversion from bytes
This commit is contained in:
@@ -3,9 +3,6 @@ from typing import Tuple, Optional, Iterable
|
|||||||
|
|
||||||
from bauh.api.abstract.view import SelectViewType, InputOption, SingleSelectComponent
|
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,
|
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):
|
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:
|
if int_size == 0:
|
||||||
return '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 < 1000:
|
||||||
|
|
||||||
if size_unit < 1024:
|
|
||||||
size_unit = size_unit if size > 0 else size_unit * -1
|
size_unit = size_unit if size > 0 else size_unit * -1
|
||||||
localized_size = locale.format_string('%.2f', size_unit)
|
localized_size = locale.format_string('%.2f', size_unit)
|
||||||
size_str = f'{int(size_unit)} {unit}' if unit == 'B' else f"{localized_size} {unit}"
|
size_str = f'{int(size_unit)} {unit}' if unit == 'B' else f"{localized_size} {unit}"
|
||||||
|
|||||||
@@ -13,39 +13,44 @@ class GetHumanSizeStrTest(TestCase):
|
|||||||
print("Error: could not set locale.LC_NUMERIC to None")
|
print("Error: could not set locale.LC_NUMERIC to None")
|
||||||
|
|
||||||
def test__must_properly_display_B(self):
|
def test__must_properly_display_B(self):
|
||||||
self.assertEqual('1023 B', get_human_size_str(1023))
|
self.assertEqual('1 B', get_human_size_str(1))
|
||||||
self.assertEqual('-1023 B', get_human_size_str(-1023))
|
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):
|
def test__must_properly_convert_to_kB(self):
|
||||||
self.assertEqual('1.00 kB', get_human_size_str(1024))
|
self.assertEqual('1.00 kB', get_human_size_str(1000))
|
||||||
self.assertEqual('1.50 kB', get_human_size_str(1536))
|
self.assertEqual('-1.00 kB', get_human_size_str(-1000))
|
||||||
self.assertEqual('1.75 kB', get_human_size_str(1792))
|
self.assertEqual('1.50 kB', get_human_size_str(1500))
|
||||||
self.assertEqual('57.30 kB', get_human_size_str(58675.2))
|
self.assertEqual('1.75 kB', get_human_size_str(1750))
|
||||||
self.assertEqual('-1.00 kB', get_human_size_str(-1024))
|
self.assertEqual('57.30 kB', get_human_size_str(57300))
|
||||||
|
|
||||||
def test__must_properly_convert_to_MB(self):
|
def test__must_properly_convert_to_MB(self):
|
||||||
self.assertEqual('1.00 MB', get_human_size_str(1048576))
|
self.assertEqual('1.00 MB', get_human_size_str(1000 ** 2))
|
||||||
self.assertEqual('1.20 MB', get_human_size_str(1258291))
|
self.assertEqual('-1.00 MB', get_human_size_str(1000 ** 2 * -1))
|
||||||
self.assertEqual('1.50 MB', get_human_size_str(1572864))
|
self.assertEqual('1.20 MB', get_human_size_str(1000 ** 2 * 1.2))
|
||||||
self.assertEqual('57.30 MB', get_human_size_str(60083404.8))
|
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):
|
def test__must_properly_convert_to_GB(self):
|
||||||
self.assertEqual('1.00 GB', get_human_size_str(1073741824))
|
self.assertEqual('1.00 GB', get_human_size_str(1000 ** 3))
|
||||||
self.assertEqual('57.30 GB', get_human_size_str(61525406515.2))
|
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):
|
def test__must_properly_convert_to_TB(self):
|
||||||
self.assertEqual('1.00 TB', get_human_size_str(1099511627776))
|
self.assertEqual('1.00 TB', get_human_size_str(1000 ** 4))
|
||||||
self.assertEqual('57.30 TB', get_human_size_str(63002016271564.8))
|
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):
|
def test__must_properly_convert_to_PB(self):
|
||||||
self.assertEqual('1.00 PB', get_human_size_str(1125899906842624))
|
self.assertEqual('1.00 PB', get_human_size_str(1000 ** 5))
|
||||||
self.assertEqual('57.30 PB', get_human_size_str(64514064662082350))
|
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):
|
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('+999 B', get_human_size_str(999, positive_sign=True))
|
||||||
self.assertEqual('+1.00 kB', get_human_size_str(1024, 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):
|
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('-999 B', get_human_size_str(-999, positive_sign=True))
|
||||||
self.assertEqual('-1.00 kB', get_human_size_str(-1024, positive_sign=True))
|
self.assertEqual('-1.00 kB', get_human_size_str(-1000, positive_sign=True))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user