use humanize library instead of custom implementation
This commit is contained in:
parent
047af4b27d
commit
342bebbd0e
1
setup.py
1
setup.py
|
@ -33,6 +33,7 @@ setup(name="magic-wormhole",
|
||||||
"autobahn[twisted] >= 0.14.1",
|
"autobahn[twisted] >= 0.14.1",
|
||||||
"hkdf", "tqdm",
|
"hkdf", "tqdm",
|
||||||
"click",
|
"click",
|
||||||
|
"humanize",
|
||||||
],
|
],
|
||||||
extras_require={
|
extras_require={
|
||||||
':sys_platform=="win32"': ["pypiwin32"],
|
':sys_platform=="win32"': ["pypiwin32"],
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import os, sys, six, tempfile, zipfile, hashlib
|
import os, sys, six, tempfile, zipfile, hashlib
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
from humanize import naturalsize
|
||||||
from twisted.internet import reactor
|
from twisted.internet import reactor
|
||||||
from twisted.internet.defer import inlineCallbacks, returnValue
|
from twisted.internet.defer import inlineCallbacks, returnValue
|
||||||
from twisted.python import log
|
from twisted.python import log
|
||||||
from ..wormhole import wormhole
|
from ..wormhole import wormhole
|
||||||
from ..transit import TransitReceiver
|
from ..transit import TransitReceiver
|
||||||
from ..errors import TransferError, WormholeClosedError
|
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"
|
APPID = u"lothar.com/wormhole/text-or-file-xfer"
|
||||||
|
|
||||||
|
@ -195,7 +196,7 @@ class TwistedReceiver:
|
||||||
self.xfersize = file_data["filesize"]
|
self.xfersize = file_data["filesize"]
|
||||||
|
|
||||||
self._msg(u"Receiving file (%s) into: %s" %
|
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()
|
self._ask_permission()
|
||||||
tmp_destname = self.abs_destname + ".tmp"
|
tmp_destname = self.abs_destname + ".tmp"
|
||||||
return open(tmp_destname, "wb")
|
return open(tmp_destname, "wb")
|
||||||
|
@ -211,9 +212,9 @@ class TwistedReceiver:
|
||||||
self.xfersize = file_data["zipsize"]
|
self.xfersize = file_data["zipsize"]
|
||||||
|
|
||||||
self._msg(u"Receiving directory (%s) into: %s/" %
|
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)" %
|
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()
|
self._ask_permission()
|
||||||
return tempfile.SpooledTemporaryFile()
|
return tempfile.SpooledTemporaryFile()
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import os, sys, six, tempfile, zipfile, hashlib
|
import os, sys, six, tempfile, zipfile, hashlib
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
from humanize import naturalsize
|
||||||
from twisted.python import log
|
from twisted.python import log
|
||||||
from twisted.protocols import basic
|
from twisted.protocols import basic
|
||||||
from twisted.internet import reactor
|
from twisted.internet import reactor
|
||||||
|
@ -8,7 +9,7 @@ from twisted.internet.defer import inlineCallbacks, returnValue
|
||||||
from ..errors import TransferError, WormholeClosedError
|
from ..errors import TransferError, WormholeClosedError
|
||||||
from ..wormhole import wormhole
|
from ..wormhole import wormhole
|
||||||
from ..transit import TransitSender
|
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"
|
APPID = u"lothar.com/wormhole/text-or-file-xfer"
|
||||||
|
|
||||||
|
@ -167,7 +168,7 @@ class Sender:
|
||||||
text = six.moves.input("Text to send: ")
|
text = six.moves.input("Text to send: ")
|
||||||
|
|
||||||
if text is not None:
|
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)
|
file=args.stdout)
|
||||||
offer = { "message": text }
|
offer = { "message": text }
|
||||||
fd_to_send = None
|
fd_to_send = None
|
||||||
|
@ -188,7 +189,7 @@ class Sender:
|
||||||
"filesize": filesize,
|
"filesize": filesize,
|
||||||
}
|
}
|
||||||
print(u"Sending %s file named '%s'"
|
print(u"Sending %s file named '%s'"
|
||||||
% (sizeof_fmt_iec(filesize), basename),
|
% (naturalsize(filesize), basename),
|
||||||
file=args.stdout)
|
file=args.stdout)
|
||||||
fd_to_send = open(what, "rb")
|
fd_to_send = open(what, "rb")
|
||||||
return offer, fd_to_send
|
return offer, fd_to_send
|
||||||
|
@ -224,7 +225,7 @@ class Sender:
|
||||||
"numfiles": num_files,
|
"numfiles": num_files,
|
||||||
}
|
}
|
||||||
print(u"Sending directory (%s compressed) named '%s'"
|
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
|
return offer, fd_to_send
|
||||||
|
|
||||||
raise TypeError("'%s' is neither file nor directory" % args.what)
|
raise TypeError("'%s' is neither file nor directory" % args.what)
|
||||||
|
|
|
@ -2,8 +2,8 @@ from __future__ import print_function, unicode_literals
|
||||||
import os, time, json
|
import os, time, json
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
import click
|
import click
|
||||||
|
from humanize import naturalsize
|
||||||
from .database import get_db
|
from .database import get_db
|
||||||
from ..util import sizeof_fmt_iec
|
|
||||||
|
|
||||||
def abbrev(t):
|
def abbrev(t):
|
||||||
if t is None:
|
if t is None:
|
||||||
|
@ -25,7 +25,7 @@ def print_event(event):
|
||||||
abbrev(total_time),
|
abbrev(total_time),
|
||||||
abbrev(waiting_time),
|
abbrev(waiting_time),
|
||||||
abbrev(followthrough),
|
abbrev(followthrough),
|
||||||
sizeof_fmt_iec(total_bytes),
|
naturalsize(total_bytes),
|
||||||
time.ctime(started),
|
time.ctime(started),
|
||||||
))
|
))
|
||||||
|
|
||||||
|
@ -84,8 +84,8 @@ def show_usage(args):
|
||||||
print(" %d events in %s (%.2f per hour)" % (total, abbrev(elapsed),
|
print(" %d events in %s (%.2f per hour)" % (total, abbrev(elapsed),
|
||||||
(3600 * total / elapsed)))
|
(3600 * total / elapsed)))
|
||||||
rate = total_transit_bytes / elapsed
|
rate = total_transit_bytes / elapsed
|
||||||
print(" %s total bytes, %sps" % (sizeof_fmt_iec(total_transit_bytes),
|
print(" %s total bytes, %sps" % (naturalsize(total_transit_bytes),
|
||||||
sizeof_fmt_iec(rate)))
|
naturalsize(rate)))
|
||||||
print("", ", ".join(["%s=%d (%d%%)" %
|
print("", ", ".join(["%s=%d (%d%%)" %
|
||||||
(k, counters[k], (100.0 * counters[k] / total))
|
(k, counters[k], (100.0 * counters[k] / total))
|
||||||
for k in sorted(counters)
|
for k in sorted(counters)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import print_function, unicode_literals
|
from __future__ import print_function, unicode_literals
|
||||||
import os, sys, re, io, zipfile, six, stat
|
import os, sys, re, io, zipfile, six, stat
|
||||||
|
from humanize import naturalsize
|
||||||
import mock
|
import mock
|
||||||
from twisted.trial import unittest
|
from twisted.trial import unittest
|
||||||
from twisted.python import procutils, log
|
from twisted.python import procutils, log
|
||||||
|
@ -9,7 +10,6 @@ from .. import __version__
|
||||||
from .common import ServerBase, config
|
from .common import ServerBase, config
|
||||||
from ..cli import cmd_send, cmd_receive
|
from ..cli import cmd_send, cmd_receive
|
||||||
from ..errors import TransferError, WrongPasswordError, WelcomeError
|
from ..errors import TransferError, WrongPasswordError, WelcomeError
|
||||||
from ..util import sizeof_fmt_iec
|
|
||||||
|
|
||||||
|
|
||||||
def build_offer(args):
|
def build_offer(args):
|
||||||
|
@ -378,7 +378,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
self.failUnlessEqual(send_stdout, expected)
|
self.failUnlessEqual(send_stdout, expected)
|
||||||
elif mode == "file":
|
elif mode == "file":
|
||||||
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
||||||
.format(size=sizeof_fmt_iec(len(message)),
|
.format(size=naturalsize(len(message)),
|
||||||
name=send_filename,
|
name=send_filename,
|
||||||
NL=NL), send_stdout)
|
NL=NL), send_stdout)
|
||||||
self.failUnlessIn("On the other computer, please run: "
|
self.failUnlessIn("On the other computer, please run: "
|
||||||
|
@ -405,7 +405,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
self.failUnlessEqual(receive_stdout, message+NL)
|
self.failUnlessEqual(receive_stdout, message+NL)
|
||||||
elif mode == "file":
|
elif mode == "file":
|
||||||
self.failUnlessIn("Receiving file ({size:s}) into: {name}"
|
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)
|
name=receive_filename), receive_stdout)
|
||||||
self.failUnlessIn("Received file written to ", receive_stdout)
|
self.failUnlessIn("Received file written to ", receive_stdout)
|
||||||
fn = os.path.join(receive_dir, receive_filename)
|
fn = os.path.join(receive_dir, receive_filename)
|
||||||
|
@ -514,7 +514,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
|
||||||
|
|
||||||
# check sender
|
# check sender
|
||||||
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
|
||||||
.format(size=sizeof_fmt_iec(len(message)),
|
.format(size=naturalsize(len(message)),
|
||||||
name=send_filename,
|
name=send_filename,
|
||||||
NL=NL), send_stdout)
|
NL=NL), send_stdout)
|
||||||
self.failUnlessIn("On the other computer, please run: "
|
self.failUnlessIn("On the other computer, please run: "
|
||||||
|
|
|
@ -38,31 +38,3 @@ class Utils(unittest.TestCase):
|
||||||
d = util.bytes_to_dict(b)
|
d = util.bytes_to_dict(b)
|
||||||
self.assertIsInstance(d, dict)
|
self.assertIsInstance(d, dict)
|
||||||
self.assertEqual(d, {"a": "b", "c": 2})
|
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)
|
|
||||||
|
|
|
@ -24,22 +24,3 @@ def bytes_to_dict(b):
|
||||||
d = json.loads(b.decode("utf-8"))
|
d = json.loads(b.decode("utf-8"))
|
||||||
assert isinstance(d, dict)
|
assert isinstance(d, dict)
|
||||||
return d
|
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)
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user