From c40512275308e939710a4fa7c71b5fbd806780e9 Mon Sep 17 00:00:00 2001 From: Lauri Niskanen Date: Thu, 24 Mar 2016 11:18:34 +0200 Subject: [PATCH] Add option for an explicit sign in sizeof_fmt functions in helpers --- borg/helpers.py | 24 ++++++++++++++---------- borg/testsuite/helpers.py | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/borg/helpers.py b/borg/helpers.py index a53023ae5..b5b3faec8 100644 --- a/borg/helpers.py +++ b/borg/helpers.py @@ -619,29 +619,33 @@ def format_timedelta(td): return txt -def format_file_size(v, precision=2): +def format_file_size(v, precision=2, sign=False): """Format file size into a human friendly format """ - return sizeof_fmt_decimal(v, suffix='B', sep=' ', precision=precision) + return sizeof_fmt_decimal(v, suffix='B', sep=' ', precision=precision, sign=sign) -def sizeof_fmt(num, suffix='B', units=None, power=None, sep='', precision=2): +def sizeof_fmt(num, suffix='B', units=None, power=None, sep='', precision=2, sign=False): + prefix = '+' if sign and num > 0 else '' + for unit in units[:-1]: if abs(round(num, precision)) < power: if isinstance(num, int): - return "{}{}{}{}".format(num, sep, unit, suffix) + return "{}{}{}{}{}".format(prefix, num, sep, unit, suffix) else: - return "{:3.{}f}{}{}{}".format(num, precision, sep, unit, suffix) + return "{}{:3.{}f}{}{}{}".format(prefix, num, precision, sep, unit, suffix) num /= float(power) - return "{:.{}f}{}{}{}".format(num, precision, sep, units[-1], suffix) + return "{}{:.{}f}{}{}{}".format(prefix, num, precision, sep, units[-1], suffix) -def sizeof_fmt_iec(num, suffix='B', sep='', precision=2): - return sizeof_fmt(num, suffix=suffix, sep=sep, precision=precision, units=['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi'], power=1024) +def sizeof_fmt_iec(num, suffix='B', sep='', precision=2, sign=False): + return sizeof_fmt(num, suffix=suffix, sep=sep, precision=precision, sign=sign, + units=['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi'], power=1024) -def sizeof_fmt_decimal(num, suffix='B', sep='', precision=2): - return sizeof_fmt(num, suffix=suffix, sep=sep, precision=precision, units=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'], power=1000) +def sizeof_fmt_decimal(num, suffix='B', sep='', precision=2, sign=False): + return sizeof_fmt(num, suffix=suffix, sep=sep, precision=precision, sign=sign, + units=['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'], power=1000) def format_archive(archive): diff --git a/borg/testsuite/helpers.py b/borg/testsuite/helpers.py index 3a3f2361d..d54bc7e23 100644 --- a/borg/testsuite/helpers.py +++ b/borg/testsuite/helpers.py @@ -692,6 +692,8 @@ def test_file_size(): 10**18: '1.00 EB', # exabytes 10**21: '1.00 ZB', # zottabytes 10**24: '1.00 YB', # yottabytes + -1: '-1 B', # negative value + -1010: '-1.01 kB', # negative value with rounding } for size, fmt in si_size_map.items(): assert format_file_size(size) == fmt @@ -703,6 +705,18 @@ def test_file_size_precision(): assert format_file_size(999990000, precision=1) == '1.0 GB' # and not 999.9 MB or 1000.0 MB +def test_file_size_sign(): + si_size_map = { + 0: '0 B', + 1: '+1 B', + 1234: '+1.23 kB', + -1: '-1 B', + -1234: '-1.23 kB', + } + for size, fmt in si_size_map.items(): + assert format_file_size(size, sign=True) == fmt + + def test_is_slow_msgpack(): saved_packer = msgpack.Packer try: