diff --git a/setup.py b/setup.py index 0a23c6d..d945d6c 100644 --- a/setup.py +++ b/setup.py @@ -33,6 +33,7 @@ setup(name="magic-wormhole", "autobahn[twisted] >= 0.14.1", "hkdf", "tqdm", "click", + "humanize", ], extras_require={ ':sys_platform=="win32"': ["pypiwin32"], diff --git a/src/wormhole/cli/cmd_receive.py b/src/wormhole/cli/cmd_receive.py index 89caba2..c759ed0 100644 --- a/src/wormhole/cli/cmd_receive.py +++ b/src/wormhole/cli/cmd_receive.py @@ -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.internet import reactor from twisted.internet.defer import inlineCallbacks, returnValue from twisted.python import log @@ -194,8 +195,8 @@ class TwistedReceiver: file_data["filename"]) self.xfersize = file_data["filesize"] - self._msg(u"Receiving file (%d bytes) into: %s" % - (self.xfersize, os.path.basename(self.abs_destname))) + self._msg(u"Receiving file (%s) into: %s" % + (naturalsize(self.xfersize), os.path.basename(self.abs_destname))) self._ask_permission() tmp_destname = self.abs_destname + ".tmp" return open(tmp_destname, "wb") @@ -210,10 +211,10 @@ class TwistedReceiver: file_data["dirname"]) self.xfersize = file_data["zipsize"] - self._msg(u"Receiving directory (%d bytes) into: %s/" % - (self.xfersize, os.path.basename(self.abs_destname))) - self._msg(u"%d files, %d bytes (uncompressed)" % - (file_data["numfiles"], file_data["numbytes"])) + self._msg(u"Receiving directory (%s) into: %s/" % + (naturalsize(self.xfersize), os.path.basename(self.abs_destname))) + self._msg(u"%d files, %s (uncompressed)" % + (file_data["numfiles"], naturalsize(file_data["numbytes"]))) self._ask_permission() return tempfile.SpooledTemporaryFile() diff --git a/src/wormhole/cli/cmd_send.py b/src/wormhole/cli/cmd_send.py index a610b36..6fa7446 100644 --- a/src/wormhole/cli/cmd_send.py +++ b/src/wormhole/cli/cmd_send.py @@ -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 @@ -167,7 +168,7 @@ class Sender: text = six.moves.input("Text to send: ") if text is not None: - print(u"Sending text message (%d bytes)" % len(text), + print(u"Sending text message (%s)" % naturalsize(len(text)), file=args.stdout) offer = { "message": text } fd_to_send = None @@ -187,7 +188,8 @@ class Sender: "filename": basename, "filesize": filesize, } - print(u"Sending %d byte file named '%s'" % (filesize, basename), + print(u"Sending %s file named '%s'" + % (naturalsize(filesize), basename), file=args.stdout) fd_to_send = open(what, "rb") return offer, fd_to_send @@ -222,8 +224,8 @@ class Sender: "numbytes": num_bytes, "numfiles": num_files, } - print(u"Sending directory (%d bytes compressed) named '%s'" - % (filesize, basename), file=args.stdout) + print(u"Sending directory (%s compressed) named '%s'" + % (naturalsize(filesize), basename), file=args.stdout) return offer, fd_to_send raise TypeError("'%s' is neither file nor directory" % args.what) diff --git a/src/wormhole/server/cmd_usage.py b/src/wormhole/server/cmd_usage.py index c314313..227a220 100644 --- a/src/wormhole/server/cmd_usage.py +++ b/src/wormhole/server/cmd_usage.py @@ -2,6 +2,7 @@ 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 def abbrev(t): @@ -13,31 +14,6 @@ def abbrev(t): return "%.1fms" % (t*1e3) return "%.1fus" % (t*1e6) -def abbreviate_space(s, SI=True): - if s is None: - return "-" - if SI: - U = 1000.0 - isuffix = "B" - else: - U = 1024.0 - isuffix = "iB" - def r(count, suffix): - return "%.2f %s%s" % (count, suffix, isuffix) - - if s < 1024: # 1000-1023 get emitted as bytes, even in SI mode - return "%d B" % s - if s < U*U: - return r(s/U, "k") - if s < U*U*U: - return r(s/(U*U), "M") - if s < U*U*U*U: - return r(s/(U*U*U), "G") - if s < U*U*U*U*U: - return r(s/(U*U*U*U), "T") - if s < U*U*U*U*U*U: - return r(s/(U*U*U*U*U), "P") - return r(s/(U*U*U*U*U*U), "E") def print_event(event): event_type, started, result, total_bytes, waiting_time, total_time = event @@ -49,7 +25,7 @@ def print_event(event): abbrev(total_time), abbrev(waiting_time), abbrev(followthrough), - abbreviate_space(total_bytes), + naturalsize(total_bytes), time.ctime(started), )) @@ -108,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" % (abbreviate_space(total_transit_bytes), - abbreviate_space(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) diff --git a/src/wormhole/test/test_scripts.py b/src/wormhole/test/test_scripts.py index 3a45b0d..ea6c4fc 100644 --- a/src/wormhole/test/test_scripts.py +++ b/src/wormhole/test/test_scripts.py @@ -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 @@ -367,7 +368,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase): # check sender if mode == "text": - expected = ("Sending text message ({bytes:d} bytes){NL}" + expected = ("Sending text message ({bytes:d} Bytes){NL}" "On the other computer, please run: " "wormhole receive{NL}" "Wormhole code is: {code}{NL}{NL}" @@ -376,8 +377,9 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase): NL=NL) self.failUnlessEqual(send_stdout, expected) elif mode == "file": - self.failUnlessIn("Sending {bytes:d} byte file named '{name}'{NL}" - .format(bytes=len(message), name=send_filename, + self.failUnlessIn("Sending {size:s} file named '{name}'{NL}" + .format(size=naturalsize(len(message)), + name=send_filename, NL=NL), send_stdout) self.failUnlessIn("On the other computer, please run: " "wormhole receive{NL}" @@ -402,8 +404,8 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase): if mode == "text": self.failUnlessEqual(receive_stdout, message+NL) elif mode == "file": - self.failUnlessIn("Receiving file ({bytes:d} bytes) into: {name}" - .format(bytes=len(message), + self.failUnlessIn("Receiving file ({size:s}) into: {name}" + .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) @@ -411,7 +413,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase): with open(fn, "r") as f: self.failUnlessEqual(f.read(), message) elif mode == "directory": - want = (r"Receiving directory \(\d+ bytes\) into: {name}/" + want = (r"Receiving directory \(\d+ \w+\) into: {name}/" .format(name=receive_dirname)) self.failUnless(re.search(want, receive_stdout), (want, receive_stdout)) @@ -511,8 +513,9 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase): (receive_stdout, receive_stderr)) # check sender - self.failUnlessIn("Sending {bytes:d} byte file named '{name}'{NL}" - .format(bytes=len(message), name=send_filename, + self.failUnlessIn("Sending {size:s} file named '{name}'{NL}" + .format(size=naturalsize(len(message)), + name=send_filename, NL=NL), send_stdout) self.failUnlessIn("On the other computer, please run: " "wormhole receive{NL}"