浏览代码

Add option for an explicit sign in sizeof_fmt functions in helpers

Lauri Niskanen 9 年之前
父节点
当前提交
c405122753
共有 2 个文件被更改,包括 28 次插入10 次删除
  1. 14 10
      borg/helpers.py
  2. 14 0
      borg/testsuite/helpers.py

+ 14 - 10
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):

+ 14 - 0
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: