use humanize library instead of custom implementation

This commit is contained in:
Antoine Beaupré 2016-11-11 22:01:21 -05:00
parent 047af4b27d
commit 342bebbd0e
7 changed files with 19 additions and 63 deletions

View File

@ -33,6 +33,7 @@ setup(name="magic-wormhole",
"autobahn[twisted] >= 0.14.1",
"hkdf", "tqdm",
"click",
"humanize",
],
extras_require={
':sys_platform=="win32"': ["pypiwin32"],

View File

@ -1,13 +1,14 @@
from __future__ import print_function
import os, sys, six, tempfile, zipfile, hashlib
from tqdm import tqdm
from humanize import naturalsize
from twisted.internet import reactor
from twisted.internet.defer import inlineCallbacks, returnValue
from twisted.python import log
from ..wormhole import wormhole
from ..transit import TransitReceiver
from ..errors import TransferError, WormholeClosedError
from ..util import dict_to_bytes, bytes_to_dict, bytes_to_hexstr, sizeof_fmt_iec
from ..util import dict_to_bytes, bytes_to_dict, bytes_to_hexstr
APPID = u"lothar.com/wormhole/text-or-file-xfer"
@ -195,7 +196,7 @@ class TwistedReceiver:
self.xfersize = file_data["filesize"]
self._msg(u"Receiving file (%s) into: %s" %
(sizeof_fmt_iec(self.xfersize), os.path.basename(self.abs_destname)))
(naturalsize(self.xfersize), os.path.basename(self.abs_destname)))
self._ask_permission()
tmp_destname = self.abs_destname + ".tmp"
return open(tmp_destname, "wb")
@ -211,9 +212,9 @@ class TwistedReceiver:
self.xfersize = file_data["zipsize"]
self._msg(u"Receiving directory (%s) into: %s/" %
(sizeof_fmt_iec(self.xfersize), os.path.basename(self.abs_destname)))
(naturalsize(self.xfersize), os.path.basename(self.abs_destname)))
self._msg(u"%d files, %s (uncompressed)" %
(file_data["numfiles"], sizeof_fmt_iec(file_data["numbytes"])))
(file_data["numfiles"], naturalsize(file_data["numbytes"])))
self._ask_permission()
return tempfile.SpooledTemporaryFile()

View File

@ -1,6 +1,7 @@
from __future__ import print_function
import os, sys, six, tempfile, zipfile, hashlib
from tqdm import tqdm
from humanize import naturalsize
from twisted.python import log
from twisted.protocols import basic
from twisted.internet import reactor
@ -8,7 +9,7 @@ from twisted.internet.defer import inlineCallbacks, returnValue
from ..errors import TransferError, WormholeClosedError
from ..wormhole import wormhole
from ..transit import TransitSender
from ..util import dict_to_bytes, bytes_to_dict, bytes_to_hexstr, sizeof_fmt_iec
from ..util import dict_to_bytes, bytes_to_dict, bytes_to_hexstr
APPID = u"lothar.com/wormhole/text-or-file-xfer"
@ -167,7 +168,7 @@ class Sender:
text = six.moves.input("Text to send: ")
if text is not None:
print(u"Sending text message (%s)" % sizeof_fmt_iec(len(text), suffix='bytes'),
print(u"Sending text message (%s)" % naturalsize(len(text)),
file=args.stdout)
offer = { "message": text }
fd_to_send = None
@ -188,7 +189,7 @@ class Sender:
"filesize": filesize,
}
print(u"Sending %s file named '%s'"
% (sizeof_fmt_iec(filesize), basename),
% (naturalsize(filesize), basename),
file=args.stdout)
fd_to_send = open(what, "rb")
return offer, fd_to_send
@ -224,7 +225,7 @@ class Sender:
"numfiles": num_files,
}
print(u"Sending directory (%s compressed) named '%s'"
% (sizeof_fmt_iec(filesize), basename), file=args.stdout)
% (naturalsize(filesize), basename), file=args.stdout)
return offer, fd_to_send
raise TypeError("'%s' is neither file nor directory" % args.what)

View File

@ -2,8 +2,8 @@ from __future__ import print_function, unicode_literals
import os, time, json
from collections import defaultdict
import click
from humanize import naturalsize
from .database import get_db
from ..util import sizeof_fmt_iec
def abbrev(t):
if t is None:
@ -25,7 +25,7 @@ def print_event(event):
abbrev(total_time),
abbrev(waiting_time),
abbrev(followthrough),
sizeof_fmt_iec(total_bytes),
naturalsize(total_bytes),
time.ctime(started),
))
@ -84,8 +84,8 @@ def show_usage(args):
print(" %d events in %s (%.2f per hour)" % (total, abbrev(elapsed),
(3600 * total / elapsed)))
rate = total_transit_bytes / elapsed
print(" %s total bytes, %sps" % (sizeof_fmt_iec(total_transit_bytes),
sizeof_fmt_iec(rate)))
print(" %s total bytes, %sps" % (naturalsize(total_transit_bytes),
naturalsize(rate)))
print("", ", ".join(["%s=%d (%d%%)" %
(k, counters[k], (100.0 * counters[k] / total))
for k in sorted(counters)

View File

@ -1,5 +1,6 @@
from __future__ import print_function, unicode_literals
import os, sys, re, io, zipfile, six, stat
from humanize import naturalsize
import mock
from twisted.trial import unittest
from twisted.python import procutils, log
@ -9,7 +10,6 @@ from .. import __version__
from .common import ServerBase, config
from ..cli import cmd_send, cmd_receive
from ..errors import TransferError, WrongPasswordError, WelcomeError
from ..util import sizeof_fmt_iec
def build_offer(args):
@ -378,7 +378,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
self.failUnlessEqual(send_stdout, expected)
elif mode == "file":
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
.format(size=sizeof_fmt_iec(len(message)),
.format(size=naturalsize(len(message)),
name=send_filename,
NL=NL), send_stdout)
self.failUnlessIn("On the other computer, please run: "
@ -405,7 +405,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
self.failUnlessEqual(receive_stdout, message+NL)
elif mode == "file":
self.failUnlessIn("Receiving file ({size:s}) into: {name}"
.format(size=sizeof_fmt_iec(len(message)),
.format(size=naturalsize(len(message)),
name=receive_filename), receive_stdout)
self.failUnlessIn("Received file written to ", receive_stdout)
fn = os.path.join(receive_dir, receive_filename)
@ -514,7 +514,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
# check sender
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
.format(size=sizeof_fmt_iec(len(message)),
.format(size=naturalsize(len(message)),
name=send_filename,
NL=NL), send_stdout)
self.failUnlessIn("On the other computer, please run: "

View File

@ -38,31 +38,3 @@ class Utils(unittest.TestCase):
d = util.bytes_to_dict(b)
self.assertIsInstance(d, dict)
self.assertEqual(d, {"a": "b", "c": 2})
def test_size_fmt_decimal(self):
"""test the size formatting routines"""
si_size_map = {
0: '0 B', # no rounding necessary for those
1: '1 B',
142: '142 B',
999: '999 B',
1000: '1.00 kB', # rounding starts here
1001: '1.00 kB', # should be rounded away
1234: '1.23 kB', # should be rounded down
1235: '1.24 kB', # should be rounded up
1010: '1.01 kB', # rounded down as well
999990000: '999.99 MB', # rounded down
999990001: '999.99 MB', # rounded down
999995000: '1.00 GB', # rounded up to next unit
10**6: '1.00 MB', # and all the remaining units, megabytes
10**9: '1.00 GB', # gigabytes
10**12: '1.00 TB', # terabytes
10**15: '1.00 PB', # petabytes
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():
self.assertEqual(util.sizeof_fmt_decimal(size), fmt)

View File

@ -24,22 +24,3 @@ def bytes_to_dict(b):
d = json.loads(b.decode("utf-8"))
assert isinstance(d, dict)
return d
def sizeof_fmt(num, suffix='B', units=None, power=None, sep=' ', precision=2):
for unit in units[:-1]:
if abs(round(num, precision)) < power:
if isinstance(num, int):
return "{}{}{}{}".format(num, sep, unit, suffix)
else:
return "{:3.{}f}{}{}{}".format(num, precision, sep, unit, suffix)
num /= float(power)
return "{:.{}f}{}{}{}".format(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_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)